diff --git a/.ci-operator.yaml b/.ci-operator.yaml
index 284a910090..461415cbc5 100644
--- a/.ci-operator.yaml
+++ b/.ci-operator.yaml
@@ -1,4 +1,4 @@
build_root_image:
name: release
namespace: openshift
- tag: rhel-9-release-golang-1.24-openshift-4.22
+ tag: rhel-9-release-golang-1.24-openshift-4.20
diff --git a/.github/workflows/weekly-security-scan.yaml b/.github/workflows/weekly-security-scan.yaml
index d69d9edcfd..723986b70c 100644
--- a/.github/workflows/weekly-security-scan.yaml
+++ b/.github/workflows/weekly-security-scan.yaml
@@ -13,12 +13,12 @@ jobs:
strategy:
fail-fast: false
matrix:
- branch: [ main, release-0.11, release-0.10 ]
+ branch: [ main, release-0.12, release-0.11 ]
name: Trivy
runs-on: ubuntu-24.04
steps:
- name: Check out code
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # tag=v4.2.2
+ uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # tag=v5.0.0
with:
ref: ${{ matrix.branch }}
- name: Calculate go version
diff --git a/.golangci.yml b/.golangci.yml
index 5a360bb4ee..f8626a6d54 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -196,6 +196,21 @@ linters:
- gocritic
path: _test\.go
text: 'deferInLoop: Possible resource leak, ''defer'' is called in the ''for'' loop'
+ - linters:
+ - staticcheck
+ text: 'SA1019: .*(i|s|m)\.IBMPowerVSCluster.Spec.ServiceInstanceID is deprecated: use ServiceInstance instead'
+ - linters:
+ - staticcheck
+ text: 'SA1019: .*(i|s|m)\.IBMPowerVSImage.Spec.ServiceInstanceID is deprecated: use ServiceInstance instead'
+ - linters:
+ - staticcheck
+ text: 'SA1019: .*(i|s|m|params)\.IBMPowerVSMachine.Spec.ServiceInstanceID is deprecated: use ServiceInstance instead'
+ - linters:
+ - staticcheck
+ text: 'SA1019: spec.ServiceInstanceID is deprecated: use ServiceInstance instead'
+ - linters:
+ - staticcheck
+ text: 'SA1019: endpoints.(FetchRCEndpoint|FetchPVSEndpoint) is deprecated: Use FetchEndpoints instead.'
paths:
- zz_generated.*\.go$
- third_party$
diff --git a/Makefile b/Makefile
index 880f09a808..da5e5cf020 100644
--- a/Makefile
+++ b/Makefile
@@ -84,7 +84,7 @@ RELEASE_NOTES_DIR := CHANGELOG
OUTPUT_TYPE ?= type=registry
# Go
-GO_VERSION ?=1.24.6
+GO_VERSION ?=1.24.11
GO_CONTAINER_IMAGE ?= golang:$(GO_VERSION)
# Trivy
@@ -105,7 +105,7 @@ PULL_POLICY ?= Always
# Set build time variables including version details
LDFLAGS := $(shell ./hack/version.sh)
-KUBEBUILDER_ENVTEST_KUBERNETES_VERSION ?= 1.33.0
+KUBEBUILDER_ENVTEST_KUBERNETES_VERSION ?= 1.34.0
# main controller
CORE_IMAGE_NAME ?= cluster-api-ibmcloud-controller
diff --git a/README.md b/README.md
index 6ae05f0bcc..134ab4e07e 100644
--- a/README.md
+++ b/README.md
@@ -45,11 +45,11 @@ cluster on IBM Cloud.
This provider's versions are compatible with the following versions of Cluster API:
-| |Cluster API v1alpha4 (v0.4) |Cluster API v1beta1 (v1.x) |
-|:----------------------------------------|:---------------:|:--------------:|
-| CAPIBM v1alpha4 (v0.1.x) | ✓ | |
-| CAPIBM v1beta1 (v0.2.x, v0.3.x) | | ✓ |
-| CAPIBM v1beta2 (v0.[4-11].x, main) | | ✓ |
+| |Cluster API v1alpha4 (v0.4) |Cluster API v1beta1 (v1.[0-11].x) |Cluster API v1beta2 (v1.11.x) |
+|:----------------------------------------|:---------------:|:--------------:|:--------------:|
+| CAPIBM v1alpha4 (v0.1.x) | ✓ | | |
+| CAPIBM v1beta1 (v0.2.x, v0.3.x) | | ✓ | |
+| CAPIBM v1beta2 (v0.[4-12].x, main) | | ✓ | |
(See [Kubernetes support matrix][cluster-api-supported-v] of Cluster API versions).
diff --git a/api/v1beta1/types.go b/api/v1beta1/types.go
index cfb61aae4f..9e2ee88642 100644
--- a/api/v1beta1/types.go
+++ b/api/v1beta1/types.go
@@ -92,8 +92,10 @@ type Subnet struct {
// VPCEndpoint describes a VPCEndpoint.
type VPCEndpoint struct {
Address *string `json:"address"`
- // +optional
+
// Deprecated: This field has no function and is going to be removed in the next release.
+ //
+ // +optional
FIPID *string `json:"floatingIPID,omitempty"`
// +optional
LBID *string `json:"loadBalancerIPID,omitempty"`
diff --git a/api/v1beta1/zz_generated.conversion.go b/api/v1beta1/zz_generated.conversion.go
index 1752c066ed..cace584572 100644
--- a/api/v1beta1/zz_generated.conversion.go
+++ b/api/v1beta1/zz_generated.conversion.go
@@ -1415,6 +1415,7 @@ func autoConvert_v1beta2_IBMVPCMachineSpec_To_v1beta1_IBMVPCMachineSpec(in *v1be
if err := Convert_Slice_Pointer_v1beta2_IBMVPCResourceReference_To_Slice_Pointer_string(&in.SSHKeys, &out.SSHKeys, s); err != nil {
return err
}
+ // WARNING: in.AdditionalVolumes requires manual conversion: does not exist in peer-type
return nil
}
diff --git a/api/v1beta2/ibmpowervscluster_types.go b/api/v1beta2/ibmpowervscluster_types.go
index bebd4d516b..2f4471e461 100644
--- a/api/v1beta2/ibmpowervscluster_types.go
+++ b/api/v1beta2/ibmpowervscluster_types.go
@@ -32,8 +32,10 @@ const (
// IBMPowerVSClusterSpec defines the desired state of IBMPowerVSCluster.
type IBMPowerVSClusterSpec struct {
- // ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
+
// Deprecated: use ServiceInstance instead
+ //
+ // ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
ServiceInstanceID string `json:"serviceInstanceID"`
// Network is the reference to the Network to use for this cluster.
diff --git a/api/v1beta2/ibmpowervsimage_types.go b/api/v1beta2/ibmpowervsimage_types.go
index 2cd33c8e35..98c5c6a41d 100644
--- a/api/v1beta2/ibmpowervsimage_types.go
+++ b/api/v1beta2/ibmpowervsimage_types.go
@@ -37,8 +37,9 @@ type IBMPowerVSImageSpec struct {
// +kubebuilder:validation:MinLength=1
ClusterName string `json:"clusterName"`
- // ServiceInstanceID is the id of the power cloud instance where the image will get imported.
// Deprecated: use ServiceInstance instead
+ //
+ // ServiceInstanceID is the id of the power cloud instance where the image will get imported.
ServiceInstanceID string `json:"serviceInstanceID"`
// serviceInstance is the reference to the Power VS workspace on which the server instance(VM) will be created.
diff --git a/api/v1beta2/ibmpowervsmachine_types.go b/api/v1beta2/ibmpowervsmachine_types.go
index 2e12ff2089..298bdf8bce 100644
--- a/api/v1beta2/ibmpowervsmachine_types.go
+++ b/api/v1beta2/ibmpowervsmachine_types.go
@@ -48,8 +48,9 @@ type IBMPowerVSMachineSpec struct {
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file
- // ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
// Deprecated: use ServiceInstance instead
+ //
+ // ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
ServiceInstanceID string `json:"serviceInstanceID"`
// serviceInstance is the reference to the Power VS workspace on which the server instance(VM) will be created.
diff --git a/api/v1beta2/ibmvpcmachine_types.go b/api/v1beta2/ibmvpcmachine_types.go
index 065ed282d7..9a0ea9f723 100644
--- a/api/v1beta2/ibmvpcmachine_types.go
+++ b/api/v1beta2/ibmvpcmachine_types.go
@@ -78,6 +78,14 @@ type IBMVPCMachineSpec struct {
// SSHKeys is the SSH pub keys that will be used to access VM.
// ID will take higher precedence over Name if both specified.
SSHKeys []*IBMVPCResourceReference `json:"sshKeys,omitempty"`
+
+ // additionalVolumes is the list of additional volumes attached to the instance
+ // There is a hard limit of 12 volume attachments per instance:
+ // https://cloud.ibm.com/docs/vpc?topic=vpc-attaching-block-storage&interface=api#vol-attach-limits
+ // +kubebuilder:validation:Optional
+ // +kubebuilder:validation:MaxItems=12
+ // +kubebuilder:validation:XValidation:rule="oldSelf.all(x, x in self)",message="Values may only be added"
+ AdditionalVolumes []*VPCVolume `json:"additionalVolumes,omitempty"`
}
// IBMVPCResourceReference is a reference to a specific VPC resource by ID or Name
@@ -95,7 +103,7 @@ type IBMVPCResourceReference struct {
Name *string `json:"name,omitempty"`
}
-// VPCVolume defines the volume information for the instance.
+// VPCVolume defines the volume information.
type VPCVolume struct {
// DeleteVolumeOnInstanceDelete If set to true, when deleting the instance the volume will also be deleted.
// Default is set as true
@@ -108,14 +116,15 @@ type VPCVolume struct {
// +optional
Name string `json:"name,omitempty"`
- // SizeGiB is the size of the virtual server's boot disk in GiB.
+ // SizeGiB is the size of the virtual server's disk in GiB.
// Default to the size of the image's `minimum_provisioned_size`.
// +optional
SizeGiB int64 `json:"sizeGiB,omitempty"`
- // Profile is the volume profile for the bootdisk, refer https://cloud.ibm.com/docs/vpc?topic=vpc-block-storage-profiles
+ // Profile is the volume profile for the disk, refer https://cloud.ibm.com/docs/vpc?topic=vpc-block-storage-profiles
// for more information.
// Default to general-purpose
+ // NOTE: If a profile other than custom is specified, the Iops and SizeGiB fields will be ignored
// +kubebuilder:validation:Enum="general-purpose";"5iops-tier";"10iops-tier";"custom"
// +kubebuilder:default=general-purpose
// +optional
@@ -190,6 +199,9 @@ type IBMVPCMachineV1Beta2Status struct {
// +listMapKey=type
// +kubebuilder:validation:MaxItems=32
Conditions []metav1.Condition `json:"conditions,omitempty"`
+ // AdditionalVolumeIDs is a list of Volume IDs as per IBMCloud
+ // +optional
+ AdditionalVolumeIDs []string `json:"additionalVolumeIDs,omitempty"`
}
// +kubebuilder:object:root=true
diff --git a/api/v1beta2/types.go b/api/v1beta2/types.go
index 237a7cf37a..228965f047 100644
--- a/api/v1beta2/types.go
+++ b/api/v1beta2/types.go
@@ -563,8 +563,9 @@ type Subnet struct {
// VPCEndpoint describes a VPCEndpoint.
type VPCEndpoint struct {
Address *string `json:"address"`
- // +optional
// Deprecated: This field has no function and is going to be removed in the next release.
+ //
+ // +optional
FIPID *string `json:"floatingIPID,omitempty"`
// +optional
LBID *string `json:"loadBalancerIPID,omitempty"`
diff --git a/api/v1beta2/zz_generated.deepcopy.go b/api/v1beta2/zz_generated.deepcopy.go
index faad447178..329d735798 100644
--- a/api/v1beta2/zz_generated.deepcopy.go
+++ b/api/v1beta2/zz_generated.deepcopy.go
@@ -1301,6 +1301,17 @@ func (in *IBMVPCMachineSpec) DeepCopyInto(out *IBMVPCMachineSpec) {
}
}
}
+ if in.AdditionalVolumes != nil {
+ in, out := &in.AdditionalVolumes, &out.AdditionalVolumes
+ *out = make([]*VPCVolume, len(*in))
+ for i := range *in {
+ if (*in)[i] != nil {
+ in, out := &(*in)[i], &(*out)[i]
+ *out = new(VPCVolume)
+ **out = **in
+ }
+ }
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IBMVPCMachineSpec.
@@ -1485,6 +1496,11 @@ func (in *IBMVPCMachineV1Beta2Status) DeepCopyInto(out *IBMVPCMachineV1Beta2Stat
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
+ if in.AdditionalVolumeIDs != nil {
+ in, out := &in.AdditionalVolumeIDs, &out.AdditionalVolumeIDs
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IBMVPCMachineV1Beta2Status.
diff --git a/cloud/scope/machine.go b/cloud/scope/machine.go
index 9e10883a2a..4edc9f7b4e 100644
--- a/cloud/scope/machine.go
+++ b/cloud/scope/machine.go
@@ -1162,3 +1162,80 @@ func (m *MachineScope) APIServerPort() int32 {
}
return infrav1.DefaultAPIServerPort
}
+
+// GetVolumeAttachments returns the volume attachments for the instance.
+func (m *MachineScope) GetVolumeAttachments() ([]vpcv1.VolumeAttachment, error) {
+ options := vpcv1.ListInstanceVolumeAttachmentsOptions{
+ InstanceID: &m.IBMVPCMachine.Status.InstanceID,
+ }
+ result, _, err := m.IBMVPCClient.GetVolumeAttachments(&options)
+ if err != nil {
+ return nil, fmt.Errorf("error while getting volume attachments: %w", err)
+ }
+ return result.VolumeAttachments, nil
+}
+
+// GetVolumeState returns the volume's state.
+func (m *MachineScope) GetVolumeState(volumeID string) (string, error) {
+ options := vpcv1.GetVolumeOptions{
+ ID: &volumeID,
+ }
+ result, _, err := m.IBMVPCClient.GetVolume(&options)
+ if err != nil {
+ return "", fmt.Errorf("could not fetch volume status: %w", err)
+ }
+ return *result.Status, err
+}
+
+// CreateVolume creates a new Volume and attaches it to the instance.
+func (m *MachineScope) CreateVolume(vpcVolume *infrav1.VPCVolume) (string, error) {
+ volumeOptions := vpcv1.CreateVolumeOptions{}
+ var resourceGroupID string
+ if m.IBMVPCCluster.Status.ResourceGroup != nil {
+ resourceGroupID = m.IBMVPCCluster.Status.ResourceGroup.ID
+ } else {
+ resourceGroupID = m.IBMVPCCluster.Spec.ResourceGroup
+ }
+ // TODO: EncryptionKeyCRN is not supported for now, the field is omitted from the manifest
+ volumeOptions.VolumePrototype = &vpcv1.VolumePrototype{
+ ResourceGroup: &vpcv1.ResourceGroupIdentityByID{
+ ID: &resourceGroupID,
+ },
+ Profile: &vpcv1.VolumeProfileIdentityByName{
+ Name: &vpcVolume.Profile,
+ },
+ Zone: &vpcv1.ZoneIdentity{
+ Name: &m.IBMVPCMachine.Spec.Zone,
+ },
+ Capacity: &vpcVolume.SizeGiB,
+ }
+
+ if vpcVolume.Profile == "custom" {
+ volumeOptions.VolumePrototype.(*vpcv1.VolumePrototype).Iops = &vpcVolume.Iops
+ }
+
+ volumeResult, _, err := m.IBMVPCClient.CreateVolume(&volumeOptions)
+ if err != nil {
+ return "", fmt.Errorf("error while creating volume: %w", err)
+ }
+
+ return *volumeResult.ID, nil
+}
+
+// AttachVolume attaches the given volume to the instance.
+func (m *MachineScope) AttachVolume(deleteOnInstanceDelete bool, volumeID, volumeName string) error {
+ attachmentOptions := vpcv1.CreateInstanceVolumeAttachmentOptions{
+ InstanceID: &m.IBMVPCMachine.Status.InstanceID,
+ Volume: &vpcv1.VolumeAttachmentPrototypeVolume{
+ ID: &volumeID,
+ },
+ DeleteVolumeOnInstanceDelete: &deleteOnInstanceDelete,
+ Name: &volumeName,
+ }
+
+ _, _, err := m.IBMVPCClient.AttachVolumeToInstance(&attachmentOptions)
+ if err != nil {
+ err = fmt.Errorf("error while attaching volume to instance: %w", err)
+ }
+ return err
+}
diff --git a/cloud/scope/machine_test.go b/cloud/scope/machine_test.go
index 70aa9645a7..865887afde 100644
--- a/cloud/scope/machine_test.go
+++ b/cloud/scope/machine_test.go
@@ -42,6 +42,11 @@ import (
. "github.com/onsi/gomega"
)
+var (
+ volumeName = "foo-volume"
+ volumeID = "foo-volume-id"
+)
+
func newVPCMachine(clusterName, machineName string) *infrav1.IBMVPCMachine {
return &infrav1.IBMVPCMachine{
ObjectMeta: metav1.ObjectMeta{
@@ -1094,3 +1099,183 @@ func TestDeleteVPCLoadBalancerPoolMember(t *testing.T) {
})
})
}
+
+func TestGetVolumeAttachments(t *testing.T) {
+ setup := func(t *testing.T) (*gomock.Controller, *mock.MockVpc) {
+ t.Helper()
+ return gomock.NewController(t), mock.NewMockVpc(gomock.NewController(t))
+ }
+
+ vpcMachine := infrav1.IBMVPCMachine{
+ Status: infrav1.IBMVPCMachineStatus{
+ InstanceID: "foo-instance-id",
+ },
+ }
+ volumeAttachmentName := "foo-volume-attachment"
+
+ testVolumeAttachments := vpcv1.VolumeAttachmentCollection{
+ VolumeAttachments: []vpcv1.VolumeAttachment{{
+ Name: &volumeAttachmentName,
+ },
+ {
+ Name: &volumeName,
+ }},
+ }
+
+ t.Run("Return List of Volume Attachments for Machine", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockVPC := setup(t)
+ t.Cleanup(mockController.Finish)
+ scope := setupMachineScope(clusterName, machineName, mockVPC)
+ scope.IBMVPCMachine.Status = vpcMachine.Status
+ mockVPC.EXPECT().GetVolumeAttachments(gomock.AssignableToTypeOf(&vpcv1.ListInstanceVolumeAttachmentsOptions{})).Return(&testVolumeAttachments, nil, nil)
+ attachments, err := scope.GetVolumeAttachments()
+ g.Expect(attachments).To(Equal(testVolumeAttachments.VolumeAttachments))
+ g.Expect(err).Should(Succeed())
+ })
+
+ t.Run("Return Error when GetVolumeAttachments fails", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockVPC := setup(t)
+ t.Cleanup(mockController.Finish)
+ scope := setupMachineScope(clusterName, machineName, mockVPC)
+ scope.IBMVPCMachine.Status = vpcMachine.Status
+ mockVPC.EXPECT().GetVolumeAttachments(gomock.AssignableToTypeOf(&vpcv1.ListInstanceVolumeAttachmentsOptions{})).Return(nil, nil, errors.New("Error when getting volume attachments"))
+ attachments, err := scope.GetVolumeAttachments()
+ g.Expect(attachments).To(BeNil())
+ g.Expect(err).ShouldNot(Succeed())
+ })
+}
+
+func TestGetVolumeState(t *testing.T) {
+ setup := func(t *testing.T) (*gomock.Controller, *mock.MockVpc) {
+ t.Helper()
+ return gomock.NewController(t), mock.NewMockVpc(gomock.NewController(t))
+ }
+
+ volumeStatus := vpcv1.VolumeStatusPendingConst
+
+ vpcMachine := infrav1.IBMVPCMachine{
+ Status: infrav1.IBMVPCMachineStatus{
+ InstanceID: "foo-instance-id",
+ },
+ }
+
+ vpcVolume := vpcv1.Volume{
+ Name: &volumeName,
+ ID: &volumeID,
+ Status: &volumeStatus,
+ }
+ volumeFetchError := errors.New("error while fetching volume")
+
+ t.Run("Return correct volume state", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockVPC := setup(t)
+ t.Cleanup(mockController.Finish)
+ scope := setupMachineScope(clusterName, machineName, mockVPC)
+ scope.IBMVPCMachine.Status = vpcMachine.Status
+ mockVPC.EXPECT().GetVolume(gomock.AssignableToTypeOf(&vpcv1.GetVolumeOptions{})).Return(&vpcVolume, nil, nil)
+ state, err := scope.GetVolumeState(volumeID)
+ g.Expect(err).To(BeNil())
+ g.Expect(state).To(Equal(volumeStatus))
+ })
+
+ t.Run("Return error when GetVolumeState returns error", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockVPC := setup(t)
+ t.Cleanup(mockController.Finish)
+ scope := setupMachineScope(clusterName, machineName, mockVPC)
+ scope.IBMVPCMachine.Status = vpcMachine.Status
+ mockVPC.EXPECT().GetVolume(gomock.AssignableToTypeOf(&vpcv1.GetVolumeOptions{})).Return(nil, nil, volumeFetchError)
+ state, err := scope.GetVolumeState(volumeID)
+ g.Expect(state).To(BeZero())
+ g.Expect(errors.Is(err, volumeFetchError)).To(BeTrue())
+ })
+}
+
+func TestCreateVolume(t *testing.T) {
+ setup := func(t *testing.T) (*gomock.Controller, *mock.MockVpc) {
+ t.Helper()
+ return gomock.NewController(t), mock.NewMockVpc(gomock.NewController(t))
+ }
+
+ vpcMachine := infrav1.IBMVPCMachine{
+ Status: infrav1.IBMVPCMachineStatus{
+ InstanceID: "foo-instance-id",
+ },
+ }
+
+ infraVolume := infrav1.VPCVolume{
+ Name: volumeName,
+ Profile: "custom",
+ Iops: 100,
+ SizeGiB: 50,
+ }
+ pendingState := vpcv1.VolumeStatusPendingConst
+
+ vpcVolume := vpcv1.Volume{
+ Name: &volumeName,
+ ID: &volumeID,
+ Status: &pendingState,
+ }
+
+ volumeCreationError := errors.New("error while creating volume")
+ t.Run("Volume creation is successful", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockVPC := setup(t)
+ t.Cleanup(mockController.Finish)
+ scope := setupMachineScope(clusterName, machineName, mockVPC)
+ mockVPC.EXPECT().CreateVolume(gomock.AssignableToTypeOf(&vpcv1.CreateVolumeOptions{})).Return(&vpcVolume, nil, nil)
+ id, err := scope.CreateVolume(&infraVolume)
+ g.Expect(err).Should(Succeed())
+ g.Expect(id).Should(Equal(volumeID))
+ })
+ t.Run("Volume creation fails", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockVPC := setup(t)
+ t.Cleanup(mockController.Finish)
+ scope := setupMachineScope(clusterName, machineName, mockVPC)
+ scope.IBMVPCMachine.Status = vpcMachine.Status
+ mockVPC.EXPECT().CreateVolume(gomock.AssignableToTypeOf(&vpcv1.CreateVolumeOptions{})).Return(nil, nil, volumeCreationError)
+ id, err := scope.CreateVolume(&infraVolume)
+ g.Expect(err).ShouldNot(Succeed())
+ g.Expect(errors.Is(err, volumeCreationError)).To(BeTrue())
+ g.Expect(id).To(BeZero())
+ })
+}
+
+func TestAttachVolume(t *testing.T) {
+ setup := func(t *testing.T) (*gomock.Controller, *mock.MockVpc) {
+ t.Helper()
+ return gomock.NewController(t), mock.NewMockVpc(gomock.NewController(t))
+ }
+
+ deleteOnInstanceDelete := true
+ vpcMachine := infrav1.IBMVPCMachine{
+ Status: infrav1.IBMVPCMachineStatus{
+ InstanceID: "foo-instance-id",
+ },
+ }
+ volumeAttachmentError := errors.New("error while attaching volume")
+ t.Run("Volume attachment is successful", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockVPC := setup(t)
+ t.Cleanup(mockController.Finish)
+ scope := setupMachineScope(clusterName, machineName, mockVPC)
+ scope.IBMVPCMachine.Status = vpcMachine.Status
+ mockVPC.EXPECT().AttachVolumeToInstance(gomock.AssignableToTypeOf(&vpcv1.CreateInstanceVolumeAttachmentOptions{})).Return(nil, nil, nil)
+ err := scope.AttachVolume(deleteOnInstanceDelete, volumeID, volumeName)
+ g.Expect(err).Should(Succeed())
+ })
+ t.Run("Volume attachment fails", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockVPC := setup(t)
+ t.Cleanup(mockController.Finish)
+ scope := setupMachineScope(clusterName, machineName, mockVPC)
+ scope.IBMVPCMachine.Status = vpcMachine.Status
+ mockVPC.EXPECT().AttachVolumeToInstance(gomock.AssignableToTypeOf(&vpcv1.CreateInstanceVolumeAttachmentOptions{})).Return(nil, nil, volumeAttachmentError)
+ err := scope.AttachVolume(deleteOnInstanceDelete, volumeID, volumeName)
+ g.Expect(err).ShouldNot(Succeed())
+ g.Expect(errors.Is(err, volumeAttachmentError)).To(BeTrue())
+ })
+}
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclusters.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclusters.yaml
index 75bbc06013..7a5b3b0b4f 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclusters.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclusters.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.18.0
+ controller-gen.kubebuilder.io/version: v0.19.0
name: ibmpowervsclusters.infrastructure.cluster.x-k8s.io
spec:
group: infrastructure.cluster.x-k8s.io
@@ -74,9 +74,6 @@ spec:
description: port is the port on which the API server is serving.
format: int32
type: integer
- required:
- - host
- - port
type: object
network:
description: Network is the reference to the Network to use for this
@@ -182,9 +179,6 @@ spec:
description: port is the port on which the API server is serving.
format: int32
type: integer
- required:
- - host
- - port
type: object
cosInstance:
description: |-
@@ -581,8 +575,9 @@ spec:
type: object
serviceInstanceID:
description: |-
- ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
Deprecated: use ServiceInstance instead
+
+ ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
type: string
transitGateway:
description: |-
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclustertemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclustertemplates.yaml
index 3faafe1bef..609ff90d9e 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclustertemplates.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclustertemplates.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.18.0
+ controller-gen.kubebuilder.io/version: v0.19.0
name: ibmpowervsclustertemplates.infrastructure.cluster.x-k8s.io
spec:
group: infrastructure.cluster.x-k8s.io
@@ -96,9 +96,6 @@ spec:
is serving.
format: int32
type: integer
- required:
- - host
- - port
type: object
network:
description: Network is the reference to the Network to use
@@ -216,9 +213,6 @@ spec:
is serving.
format: int32
type: integer
- required:
- - host
- - port
type: object
cosInstance:
description: |-
@@ -619,8 +613,9 @@ spec:
type: object
serviceInstanceID:
description: |-
- ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
Deprecated: use ServiceInstance instead
+
+ ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
type: string
transitGateway:
description: |-
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsimages.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsimages.yaml
index 9184e157e2..5bff3755cb 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsimages.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsimages.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.18.0
+ controller-gen.kubebuilder.io/version: v0.19.0
name: ibmpowervsimages.infrastructure.cluster.x-k8s.io
spec:
group: infrastructure.cluster.x-k8s.io
@@ -246,8 +246,9 @@ spec:
type: object
serviceInstanceID:
description: |-
- ServiceInstanceID is the id of the power cloud instance where the image will get imported.
Deprecated: use ServiceInstance instead
+
+ ServiceInstanceID is the id of the power cloud instance where the image will get imported.
type: string
storageType:
default: tier1
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsmachines.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsmachines.yaml
index 844ee8b471..95b82cfbdc 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsmachines.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsmachines.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.18.0
+ controller-gen.kubebuilder.io/version: v0.19.0
name: ibmpowervsmachines.infrastructure.cluster.x-k8s.io
spec:
group: infrastructure.cluster.x-k8s.io
@@ -485,8 +485,9 @@ spec:
type: object
serviceInstanceID:
description: |-
- ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
Deprecated: use ServiceInstance instead
+
+ ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
type: string
sshKey:
description: SSHKey is the name of the SSH key pair provided to the
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsmachinetemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsmachinetemplates.yaml
index fbdc364276..26fc73ec1f 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsmachinetemplates.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsmachinetemplates.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.18.0
+ controller-gen.kubebuilder.io/version: v0.19.0
name: ibmpowervsmachinetemplates.infrastructure.cluster.x-k8s.io
spec:
group: infrastructure.cluster.x-k8s.io
@@ -325,8 +325,9 @@ spec:
type: object
serviceInstanceID:
description: |-
- ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
Deprecated: use ServiceInstance instead
+
+ ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed.
type: string
sshKey:
description: SSHKey is the name of the SSH key pair provided
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcclusters.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcclusters.yaml
index a177ba0849..f9277a95d6 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcclusters.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcclusters.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.18.0
+ controller-gen.kubebuilder.io/version: v0.19.0
name: ibmvpcclusters.infrastructure.cluster.x-k8s.io
spec:
group: infrastructure.cluster.x-k8s.io
@@ -62,9 +62,6 @@ spec:
description: port is the port on which the API server is serving.
format: int32
type: integer
- required:
- - host
- - port
type: object
controlPlaneLoadBalancer:
description: ControlPlaneLoadBalancer is optional configuration for
@@ -252,9 +249,6 @@ spec:
description: port is the port on which the API server is serving.
format: int32
type: integer
- required:
- - host
- - port
type: object
controlPlaneLoadBalancer:
description: |-
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcclustertemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcclustertemplates.yaml
index 7aee807bb8..9376c7ae36 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcclustertemplates.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcclustertemplates.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.18.0
+ controller-gen.kubebuilder.io/version: v0.19.0
name: ibmvpcclustertemplates.infrastructure.cluster.x-k8s.io
spec:
group: infrastructure.cluster.x-k8s.io
@@ -94,9 +94,6 @@ spec:
is serving.
format: int32
type: integer
- required:
- - host
- - port
type: object
controlPlaneLoadBalancer:
description: |-
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcmachines.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcmachines.yaml
index 8539b241dc..75e066da27 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcmachines.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcmachines.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.18.0
+ controller-gen.kubebuilder.io/version: v0.19.0
name: ibmvpcmachines.infrastructure.cluster.x-k8s.io
spec:
group: infrastructure.cluster.x-k8s.io
@@ -206,6 +206,65 @@ spec:
spec:
description: IBMVPCMachineSpec defines the desired state of IBMVPCMachine.
properties:
+ additionalVolumes:
+ description: |-
+ additionalVolumes is the list of additional volumes attached to the instance
+ There is a hard limit of 12 volume attachments per instance:
+ https://cloud.ibm.com/docs/vpc?topic=vpc-attaching-block-storage&interface=api#vol-attach-limits
+ items:
+ description: VPCVolume defines the volume information.
+ properties:
+ deleteVolumeOnInstanceDelete:
+ default: true
+ description: |-
+ DeleteVolumeOnInstanceDelete If set to true, when deleting the instance the volume will also be deleted.
+ Default is set as true
+ type: boolean
+ encryptionKeyCRN:
+ description: |-
+ EncryptionKey is the root key to use to wrap the data encryption key for the volume and this points to the CRN
+ and possible values are as follows.
+ The CRN of the [Key Protect Root
+ Key](https://cloud.ibm.com/docs/key-protect?topic=key-protect-getting-started-tutorial) or [Hyper Protect Crypto
+ Service Root Key](https://cloud.ibm.com/docs/hs-crypto?topic=hs-crypto-get-started) for this resource.
+ If unspecified, the `encryption` type for the volume will be `provider_managed`.
+ type: string
+ iops:
+ description: |-
+ Iops is the maximum I/O operations per second (IOPS) to use for the volume. Applicable only to volumes using a profile
+ family of `custom`.
+ format: int64
+ type: integer
+ name:
+ description: |-
+ Name is the unique user-defined name for this volume.
+ Default will be autogenerated
+ type: string
+ profile:
+ default: general-purpose
+ description: |-
+ Profile is the volume profile for the disk, refer https://cloud.ibm.com/docs/vpc?topic=vpc-block-storage-profiles
+ for more information.
+ Default to general-purpose
+ NOTE: If a profile other than custom is specified, the Iops and SizeGiB fields will be ignored
+ enum:
+ - general-purpose
+ - 5iops-tier
+ - 10iops-tier
+ - custom
+ type: string
+ sizeGiB:
+ description: |-
+ SizeGiB is the size of the virtual server's disk in GiB.
+ Default to the size of the image's `minimum_provisioned_size`.
+ format: int64
+ type: integer
+ type: object
+ maxItems: 12
+ type: array
+ x-kubernetes-validations:
+ - message: Values may only be added
+ rule: oldSelf.all(x, x in self)
bootVolume:
description: BootVolume contains machines's boot volume configurations
like size, iops etc..
@@ -239,9 +298,10 @@ spec:
profile:
default: general-purpose
description: |-
- Profile is the volume profile for the bootdisk, refer https://cloud.ibm.com/docs/vpc?topic=vpc-block-storage-profiles
+ Profile is the volume profile for the disk, refer https://cloud.ibm.com/docs/vpc?topic=vpc-block-storage-profiles
for more information.
Default to general-purpose
+ NOTE: If a profile other than custom is specified, the Iops and SizeGiB fields will be ignored
enum:
- general-purpose
- 5iops-tier
@@ -250,7 +310,7 @@ spec:
type: string
sizeGiB:
description: |-
- SizeGiB is the size of the virtual server's boot disk in GiB.
+ SizeGiB is the size of the virtual server's disk in GiB.
Default to the size of the image's `minimum_provisioned_size`.
format: int64
type: integer
@@ -630,6 +690,12 @@ spec:
description: V1beta2 groups all the fields that will be added or modified
in IBMVPCMachine's status with the V1Beta2 version.
properties:
+ additionalVolumeIDs:
+ description: AdditionalVolumeIDs is a list of Volume IDs as per
+ IBMCloud
+ items:
+ type: string
+ type: array
conditions:
description: Conditions represents the observations of a IBMVPCMachine's
current state.
diff --git a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcmachinetemplates.yaml b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcmachinetemplates.yaml
index 2663fc4d5e..767b3be2d2 100644
--- a/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcmachinetemplates.yaml
+++ b/config/crd/bases/infrastructure.cluster.x-k8s.io_ibmvpcmachinetemplates.yaml
@@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.18.0
+ controller-gen.kubebuilder.io/version: v0.19.0
name: ibmvpcmachinetemplates.infrastructure.cluster.x-k8s.io
spec:
group: infrastructure.cluster.x-k8s.io
@@ -193,6 +193,65 @@ spec:
description: Spec is the specification of the desired behavior
of the machine.
properties:
+ additionalVolumes:
+ description: |-
+ additionalVolumes is the list of additional volumes attached to the instance
+ There is a hard limit of 12 volume attachments per instance:
+ https://cloud.ibm.com/docs/vpc?topic=vpc-attaching-block-storage&interface=api#vol-attach-limits
+ items:
+ description: VPCVolume defines the volume information.
+ properties:
+ deleteVolumeOnInstanceDelete:
+ default: true
+ description: |-
+ DeleteVolumeOnInstanceDelete If set to true, when deleting the instance the volume will also be deleted.
+ Default is set as true
+ type: boolean
+ encryptionKeyCRN:
+ description: |-
+ EncryptionKey is the root key to use to wrap the data encryption key for the volume and this points to the CRN
+ and possible values are as follows.
+ The CRN of the [Key Protect Root
+ Key](https://cloud.ibm.com/docs/key-protect?topic=key-protect-getting-started-tutorial) or [Hyper Protect Crypto
+ Service Root Key](https://cloud.ibm.com/docs/hs-crypto?topic=hs-crypto-get-started) for this resource.
+ If unspecified, the `encryption` type for the volume will be `provider_managed`.
+ type: string
+ iops:
+ description: |-
+ Iops is the maximum I/O operations per second (IOPS) to use for the volume. Applicable only to volumes using a profile
+ family of `custom`.
+ format: int64
+ type: integer
+ name:
+ description: |-
+ Name is the unique user-defined name for this volume.
+ Default will be autogenerated
+ type: string
+ profile:
+ default: general-purpose
+ description: |-
+ Profile is the volume profile for the disk, refer https://cloud.ibm.com/docs/vpc?topic=vpc-block-storage-profiles
+ for more information.
+ Default to general-purpose
+ NOTE: If a profile other than custom is specified, the Iops and SizeGiB fields will be ignored
+ enum:
+ - general-purpose
+ - 5iops-tier
+ - 10iops-tier
+ - custom
+ type: string
+ sizeGiB:
+ description: |-
+ SizeGiB is the size of the virtual server's disk in GiB.
+ Default to the size of the image's `minimum_provisioned_size`.
+ format: int64
+ type: integer
+ type: object
+ maxItems: 12
+ type: array
+ x-kubernetes-validations:
+ - message: Values may only be added
+ rule: oldSelf.all(x, x in self)
bootVolume:
description: BootVolume contains machines's boot volume configurations
like size, iops etc..
@@ -226,9 +285,10 @@ spec:
profile:
default: general-purpose
description: |-
- Profile is the volume profile for the bootdisk, refer https://cloud.ibm.com/docs/vpc?topic=vpc-block-storage-profiles
+ Profile is the volume profile for the disk, refer https://cloud.ibm.com/docs/vpc?topic=vpc-block-storage-profiles
for more information.
Default to general-purpose
+ NOTE: If a profile other than custom is specified, the Iops and SizeGiB fields will be ignored
enum:
- general-purpose
- 5iops-tier
@@ -237,7 +297,7 @@ spec:
type: string
sizeGiB:
description: |-
- SizeGiB is the size of the virtual server's boot disk in GiB.
+ SizeGiB is the size of the virtual server's disk in GiB.
Default to the size of the image's `minimum_provisioned_size`.
format: int64
type: integer
diff --git a/config/webhook/kustomization.yaml b/config/webhook/kustomization.yaml
index 9cf26134e4..36d4cc6e40 100644
--- a/config/webhook/kustomization.yaml
+++ b/config/webhook/kustomization.yaml
@@ -1,6 +1,3 @@
resources:
- manifests.yaml
- service.yaml
-
-configurations:
-- kustomizeconfig.yaml
diff --git a/config/webhook/kustomizeconfig.yaml b/config/webhook/kustomizeconfig.yaml
deleted file mode 100644
index 25e21e3c96..0000000000
--- a/config/webhook/kustomizeconfig.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-# the following config is for teaching kustomize where to look at when substituting vars.
-# It requires kustomize v2.1.0 or newer to work properly.
-nameReference:
-- kind: Service
- version: v1
- fieldSpecs:
- - kind: MutatingWebhookConfiguration
- group: admissionregistration.k8s.io
- path: webhooks/clientConfig/service/name
- - kind: ValidatingWebhookConfiguration
- group: admissionregistration.k8s.io
- path: webhooks/clientConfig/service/name
-
-namespace:
-- kind: MutatingWebhookConfiguration
- group: admissionregistration.k8s.io
- path: webhooks/clientConfig/service/namespace
- create: true
-- kind: ValidatingWebhookConfiguration
- group: admissionregistration.k8s.io
- path: webhooks/clientConfig/service/namespace
- create: true
-
-varReference:
-- path: metadata/annotations
diff --git a/controllers/ibmpowervscluster_controller.go b/controllers/ibmpowervscluster_controller.go
index c61ac7ffdf..763189fff8 100644
--- a/controllers/ibmpowervscluster_controller.go
+++ b/controllers/ibmpowervscluster_controller.go
@@ -201,8 +201,7 @@ func (r *IBMPowerVSClusterReconciler) reconcile(ctx context.Context, clusterScop
var errList []error
// receive return values from the channel and decide the requeue
for val := range ch {
- //nolint:staticcheck
- if val.Requeue {
+ if val.RequeueAfter > 0 {
requeue = true
}
if val.error != nil {
@@ -323,7 +322,7 @@ func (r *IBMPowerVSClusterReconciler) reconcilePowerVSResources(ctx context.Cont
return
} else if requeue {
log.Info("PowerVS service instance creation is pending, requeuing")
- ch <- reconcileResult{reconcile.Result{Requeue: true}, nil}
+ ch <- reconcileResult{reconcile.Result{RequeueAfter: 20 * time.Second}, nil}
return
}
powerVSCluster.updateCondition(clusterv1beta1.Condition{
@@ -399,7 +398,7 @@ func (r *IBMPowerVSClusterReconciler) reconcileVPCResources(ctx context.Context,
return
} else if requeue {
log.Info("VPC creation is pending, requeuing")
- ch <- reconcileResult{reconcile.Result{Requeue: true}, nil}
+ ch <- reconcileResult{reconcile.Result{RequeueAfter: 20 * time.Second}, nil}
return
}
powerVSCluster.updateCondition(clusterv1beta1.Condition{
@@ -432,7 +431,7 @@ func (r *IBMPowerVSClusterReconciler) reconcileVPCResources(ctx context.Context,
return
} else if requeue {
log.Info("VPC subnet creation is pending, requeuing")
- ch <- reconcileResult{reconcile.Result{Requeue: true}, nil}
+ ch <- reconcileResult{reconcile.Result{RequeueAfter: 20 * time.Second}, nil}
return
}
powerVSCluster.updateCondition(clusterv1beta1.Condition{
@@ -747,7 +746,7 @@ func (c *clusterDescendants) filterOwnedDescendants(cluster *infrav1.IBMPowerVSC
return nil //nolint:nilerr // We don't want to exit the EachListItem loop, just continue
}
- if util.IsOwnedByObject(acc, cluster) {
+ if util.IsOwnedByObject(acc, cluster, cluster.GroupVersionKind().GroupKind()) {
ownedDescendants = append(ownedDescendants, obj)
}
diff --git a/controllers/ibmpowervscluster_controller_test.go b/controllers/ibmpowervscluster_controller_test.go
index 9fbb7abec4..f52131f9f7 100644
--- a/controllers/ibmpowervscluster_controller_test.go
+++ b/controllers/ibmpowervscluster_controller_test.go
@@ -1370,7 +1370,7 @@ func TestReconcileVPCResources(t *testing.T) {
},
reconcileResult: reconcileResult{
Result: reconcile.Result{
- Requeue: true,
+ RequeueAfter: 20 * time.Second,
},
},
},
@@ -1443,7 +1443,7 @@ func TestReconcileVPCResources(t *testing.T) {
},
reconcileResult: reconcileResult{
Result: reconcile.Result{
- Requeue: true,
+ RequeueAfter: 20 * time.Second,
},
},
conditions: clusterv1beta1.Conditions{
@@ -1688,7 +1688,7 @@ func TestReconcilePowerVSResources(t *testing.T) {
},
reconcileResult: reconcileResult{
Result: reconcile.Result{
- Requeue: true,
+ RequeueAfter: 20 * time.Second,
},
},
},
diff --git a/controllers/ibmpowervsmachine_controller_test.go b/controllers/ibmpowervsmachine_controller_test.go
index 047dba2292..c3ec8a4d3c 100644
--- a/controllers/ibmpowervsmachine_controller_test.go
+++ b/controllers/ibmpowervsmachine_controller_test.go
@@ -570,8 +570,6 @@ func TestIBMPowerVSMachineReconciler_ReconcileOperations(t *testing.T) {
mockvpc.EXPECT().GetLoadBalancer(gomock.AssignableToTypeOf(&vpcv1.GetLoadBalancerOptions{})).Return(loadBalancer, &core.DetailedResponse{}, nil)
result, err := reconciler.reconcileNormal(ctx, machineScope)
g.Expect(err).ToNot(BeNil())
- //nolint:staticcheck
- g.Expect(result.Requeue).To(BeFalse())
g.Expect(result.RequeueAfter).To(BeZero())
g.Expect(machineScope.IBMPowerVSMachine.Finalizers).To(ContainElement(infrav1.IBMPowerVSMachineFinalizer))
expectConditions(g, machineScope.IBMPowerVSMachine, []conditionAssertion{{infrav1.InstanceReadyCondition, corev1.ConditionFalse, clusterv1beta1.ConditionSeverityWarning, infrav1.IBMPowerVSMachineInstanceLoadBalancerConfigurationFailedV1Beta2Reason}})
@@ -885,8 +883,6 @@ func TestIBMPowerVSMachineReconciler_ReconcileOperations(t *testing.T) {
mockpowervs.EXPECT().GetInstance(gomock.AssignableToTypeOf("capi-test-machine-id")).Return(instance, nil)
result, err := reconciler.reconcileNormal(ctx, machineScope)
g.Expect(err).To(BeNil())
- //nolint:staticcheck
- g.Expect(result.Requeue).To(BeFalse())
g.Expect(result.RequeueAfter).To(BeZero())
g.Expect(machineScope.IBMPowerVSMachine.Status.Ready).To(Equal(true))
g.Expect(machineScope.IBMPowerVSMachine.Finalizers).To(ContainElement(infrav1.IBMPowerVSMachineFinalizer))
diff --git a/controllers/ibmvpcmachine_controller.go b/controllers/ibmvpcmachine_controller.go
index 11efdcef63..38b4a91166 100644
--- a/controllers/ibmvpcmachine_controller.go
+++ b/controllers/ibmvpcmachine_controller.go
@@ -18,6 +18,7 @@ package controllers
import (
"context"
+ "errors"
"fmt"
"time"
@@ -28,7 +29,9 @@ import (
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/types"
kerrors "k8s.io/apimachinery/pkg/util/errors"
+ "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/tools/record"
"k8s.io/klog/v2"
@@ -322,6 +325,13 @@ func (r *IBMVPCMachineReconciler) reconcileNormal(ctx context.Context, machineSc
}
}
+ // Handle Additional Volumes
+ var result ctrl.Result
+ result, err = r.reconcileAdditionalVolumes(ctx, machineScope)
+ if err != nil {
+ return ctrl.Result{}, fmt.Errorf("error reconciling additional volumes: %w", err)
+ }
+
// With a running machine and all Load Balancer Pool Members reconciled, mark machine as ready.
machineScope.SetReady()
v1beta1conditions.MarkTrue(machineScope.IBMVPCMachine, infrav1.InstanceReadyCondition)
@@ -330,7 +340,8 @@ func (r *IBMVPCMachineReconciler) reconcileNormal(ctx context.Context, machineSc
Status: metav1.ConditionTrue,
Reason: infrav1.IBMVPCMachineInstanceReadyV1Beta2Reason,
})
- return ctrl.Result{}, nil
+ log.Info("Reconcile complete", "result", result)
+ return result, nil
}
func (r *IBMVPCMachineReconciler) getOrCreate(ctx context.Context, scope *scope.MachineScope) (*vpcv1.Instance, error) {
@@ -415,3 +426,71 @@ func patchIBMVPCMachine(ctx context.Context, patchHelper *v1beta1patch.Helper, i
clusterv1beta1.PausedV1Beta2Condition,
}})
}
+func (r *IBMVPCMachineReconciler) reconcileAdditionalVolumes(ctx context.Context, machineScope *scope.MachineScope) (ctrl.Result, error) {
+ log := ctrl.LoggerFrom(ctx)
+ // Return immediately if no additional volumes exist
+ if len(machineScope.IBMVPCMachine.Spec.AdditionalVolumes) == 0 {
+ return ctrl.Result{}, nil
+ }
+ err := r.Get(ctx, types.NamespacedName{
+ Namespace: machineScope.IBMVPCMachine.Namespace,
+ Name: machineScope.IBMVPCMachine.Name,
+ }, machineScope.IBMVPCMachine)
+ if err != nil {
+ log.Error(err, "Could not fetch machine status")
+ return ctrl.Result{}, err
+ }
+ machineVolumes := machineScope.IBMVPCMachine.Spec.AdditionalVolumes
+ result := ctrl.Result{}
+ if machineScope.IBMVPCMachine.Status.V1Beta2.AdditionalVolumeIDs == nil {
+ machineScope.IBMVPCMachine.Status.V1Beta2.AdditionalVolumeIDs = make([]string, len(machineScope.IBMVPCMachine.Spec.AdditionalVolumes))
+ }
+ volumeAttachmentList, err := machineScope.GetVolumeAttachments()
+ if err != nil {
+ return result, err
+ }
+ volumeAttachmentNames := sets.New[string]()
+ for i := range volumeAttachmentList {
+ sets.Insert(volumeAttachmentNames, *volumeAttachmentList[i].Name)
+ }
+ errList := []error{}
+ // Read through the list, checking if volume exists and create volume if it does not
+ for v := range machineVolumes {
+ if volumeAttachmentNames.Has(machineVolumes[v].Name) {
+ // volume attachment has been created so volume is already attached
+ continue
+ }
+ if machineScope.IBMVPCMachine.Status.V1Beta2.AdditionalVolumeIDs[v] != "" {
+ // volume was already created, fetch volume status and attach if possible
+ state, err := machineScope.GetVolumeState(machineScope.IBMVPCMachine.Status.V1Beta2.AdditionalVolumeIDs[v])
+ if err != nil {
+ errList = append(errList, err)
+ }
+ switch state {
+ case vpcv1.VolumeStatusPendingConst, vpcv1.VolumeStatusUpdatingConst:
+ result = ctrl.Result{RequeueAfter: 10 * time.Second}
+ case vpcv1.VolumeStatusFailedConst, vpcv1.VolumeStatusUnusableConst:
+ errList = append(errList, fmt.Errorf("volume in unexpected state: %s", state))
+ case vpcv1.VolumeStatusAvailableConst:
+ log.Info("Volume is in available state, trying to attach it", "VolumeID", machineScope.IBMVPCMachine.Status.V1Beta2.AdditionalVolumeIDs[v])
+ err = machineScope.AttachVolume(machineVolumes[v].DeleteVolumeOnInstanceDelete, machineScope.IBMVPCMachine.Status.V1Beta2.AdditionalVolumeIDs[v], machineVolumes[v].Name)
+ if err != nil {
+ log.Error(err, "Error while attaching volume", "VolumeID", machineScope.IBMVPCMachine.Status.V1Beta2.AdditionalVolumeIDs[v])
+ errList = append(errList, err)
+ }
+ log.Info("Successfully attached volume", "VolumeID", machineScope.IBMVPCMachine.Status.V1Beta2.AdditionalVolumeIDs[v])
+ }
+ } else {
+ // volume does not exist, create it and requeue so that it becomes available
+ volumeID, err := machineScope.CreateVolume(machineVolumes[v])
+ machineScope.IBMVPCMachine.Status.V1Beta2.AdditionalVolumeIDs[v] = volumeID
+ if err != nil {
+ log.Error(err, "Could not update Machine status. Created Volume needs to be cleaned up manually", "VolumeID", volumeID)
+ errList = append(errList, err)
+ }
+ log.Info("Created new volume", "name", machineVolumes[v].Name, "VolumeID", volumeID)
+ result = ctrl.Result{RequeueAfter: 10 * time.Second}
+ }
+ }
+ return result, errors.Join(errList...)
+}
diff --git a/controllers/ibmvpcmachine_controller_test.go b/controllers/ibmvpcmachine_controller_test.go
index 26189dc797..2c28f5bef1 100644
--- a/controllers/ibmvpcmachine_controller_test.go
+++ b/controllers/ibmvpcmachine_controller_test.go
@@ -17,6 +17,7 @@ limitations under the License.
package controllers
import (
+ "context"
"errors"
"fmt"
"testing"
@@ -27,6 +28,7 @@ import (
"github.com/IBM/vpc-go-sdk/vpcv1"
"go.uber.org/mock/gomock"
+ apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/klog/v2"
"k8s.io/utils/ptr"
@@ -296,6 +298,12 @@ func TestIBMVPCMachineLBReconciler_reconcile(t *testing.T) {
},
Finalizers: []string{infrav1.MachineFinalizer},
},
+ Spec: infrav1.IBMVPCMachineSpec{
+ Image: &infrav1.IBMVPCResourceReference{},
+ },
+ Status: infrav1.IBMVPCMachineStatus{
+ V1Beta2: &infrav1.IBMVPCMachineV1Beta2Status{},
+ },
},
Machine: &clusterv1.Machine{
Spec: clusterv1.MachineSpec{
@@ -831,3 +839,270 @@ func TestIBMVPCMachine_Reconcile_Conditions(t *testing.T) {
})
}
}
+func TestReconcileAdditionalVolumes(t *testing.T) {
+ volumeName := "foo-volume"
+ volumeID := "foo-volume-id"
+ volumeGeneratedName := "foo-generated-name"
+ clusterResourceGroup := "foo-resource-group"
+
+ setup := func(t *testing.T) (*gomock.Controller, *vpcmock.MockVpc, *scope.MachineScope, IBMVPCMachineReconciler) {
+ t.Helper()
+ mockvpc := vpcmock.NewMockVpc(gomock.NewController(t))
+ reconciler := IBMVPCMachineReconciler{
+ Client: testEnv.Client,
+ Log: klog.Background(),
+ }
+ machineScope := &scope.MachineScope{
+ IBMVPCCluster: &infrav1.IBMVPCCluster{
+ Spec: infrav1.IBMVPCClusterSpec{
+ ResourceGroup: clusterResourceGroup,
+ },
+ },
+ IBMVPCMachine: &infrav1.IBMVPCMachine{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "capi-machine",
+ Namespace: "default",
+ Labels: map[string]string{
+ clusterv1.MachineControlPlaneNameLabel: "capi-control-plane-machine",
+ },
+ },
+ Spec: infrav1.IBMVPCMachineSpec{
+ AdditionalVolumes: []*infrav1.VPCVolume{},
+ Image: &infrav1.IBMVPCResourceReference{},
+ },
+ Status: infrav1.IBMVPCMachineStatus{
+ V1Beta2: &infrav1.IBMVPCMachineV1Beta2Status{AdditionalVolumeIDs: nil},
+ },
+ },
+ IBMVPCClient: mockvpc,
+ }
+ return gomock.NewController(t), mockvpc, machineScope, reconciler
+ }
+
+ additionalVolumes := []*infrav1.VPCVolume{
+ {
+ Name: volumeName,
+ SizeGiB: 15,
+ Profile: "custom",
+ Iops: 150,
+ },
+ }
+
+ vpcVolume := vpcv1.Volume{
+ Name: &volumeName,
+ ID: &volumeID,
+ }
+
+ testVolumeAttachments := vpcv1.VolumeAttachmentCollection{
+ VolumeAttachments: []vpcv1.VolumeAttachment{{
+ Name: &volumeName,
+ },
+ {
+ Name: &volumeGeneratedName,
+ }},
+ }
+
+ testMachineStatus := infrav1.IBMVPCMachineStatus{
+ V1Beta2: &infrav1.IBMVPCMachineV1Beta2Status{
+ AdditionalVolumeIDs: []string{volumeID},
+ },
+ }
+
+ emptyVolumeAttachments := vpcv1.VolumeAttachmentCollection{}
+ volumeAvailableState := vpcv1.VolumeStatusAvailableConst
+ volumePendingState := vpcv1.VolumeStatusPendingConst
+ volumeUpdatingState := vpcv1.VolumeStatusUpdatingConst
+ volumeFailedState := vpcv1.VolumeStatusFailedConst
+ volumeUnusableState := vpcv1.VolumeStatusUnusableConst
+
+ t.Run("Should successfully return when no additional volumes are present in spec", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, _, machineScope, reconciler := setup(t)
+ t.Cleanup(mockController.Finish)
+ createObject(g, machineScope.IBMVPCMachine, machineScope.IBMVPCMachine.Namespace)
+ defer checkMachineDeleted(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ defer cleanupObject(g, machineScope.IBMVPCMachine)
+ waitTillMachineAvailable(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ setMachineStatus(ctx, g, machineScope.IBMVPCMachine, testMachineStatus)
+ waitTillMachineStatusUpdated(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ result, err := reconciler.reconcileAdditionalVolumes(ctx, machineScope)
+ g.Expect(err).Should(BeNil())
+ g.Expect(result).To(Equal(ctrl.Result{}))
+ })
+
+ t.Run("Should successfully attach volume when volume id is defined and volume is in available state", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockvpc, machineScope, reconciler := setup(t)
+ t.Cleanup(mockController.Finish)
+ machineScope.IBMVPCMachine.Spec.AdditionalVolumes = additionalVolumes
+ createObject(g, machineScope.IBMVPCMachine, machineScope.IBMVPCMachine.Namespace)
+ defer checkMachineDeleted(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ defer cleanupObject(g, machineScope.IBMVPCMachine)
+ waitTillMachineAvailable(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ setMachineStatus(ctx, g, machineScope.IBMVPCMachine, testMachineStatus)
+ waitTillMachineStatusUpdated(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ mockvpc.EXPECT().GetVolumeAttachments(gomock.AssignableToTypeOf(&vpcv1.ListInstanceVolumeAttachmentsOptions{})).Return(&emptyVolumeAttachments, nil, nil)
+ mockvpc.EXPECT().AttachVolumeToInstance(gomock.AssignableToTypeOf(&vpcv1.CreateInstanceVolumeAttachmentOptions{})).Return(nil, nil, nil)
+ vpcVolume.Status = &volumeAvailableState
+ mockvpc.EXPECT().GetVolume(gomock.AssignableToTypeOf(&vpcv1.GetVolumeOptions{})).Return(&vpcVolume, nil, nil)
+ result, err := reconciler.reconcileAdditionalVolumes(ctx, machineScope)
+ g.Expect(err).Should(BeNil())
+ g.Expect(result).To(Equal(ctrl.Result{}))
+ })
+
+ t.Run("Should requeue when volume is successfully created but in pending state", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockvpc, machineScope, reconciler := setup(t)
+ t.Cleanup(mockController.Finish)
+ machineScope.IBMVPCMachine.Spec.AdditionalVolumes = additionalVolumes
+ createObject(g, machineScope.IBMVPCMachine, machineScope.IBMVPCMachine.Namespace)
+ defer checkMachineDeleted(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ defer cleanupObject(g, machineScope.IBMVPCMachine)
+ waitTillMachineAvailable(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ setMachineStatus(ctx, g, machineScope.IBMVPCMachine, testMachineStatus)
+ waitTillMachineStatusUpdated(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ mockvpc.EXPECT().GetVolumeAttachments(gomock.AssignableToTypeOf(&vpcv1.ListInstanceVolumeAttachmentsOptions{})).Return(&emptyVolumeAttachments, nil, nil)
+ vpcVolume.Status = &volumePendingState
+ mockvpc.EXPECT().GetVolume(gomock.AssignableToTypeOf(&vpcv1.GetVolumeOptions{})).Return(&vpcVolume, nil, nil)
+ result, err := reconciler.reconcileAdditionalVolumes(ctx, machineScope)
+ g.Expect(err).Should(BeNil())
+ g.Expect(result.RequeueAfter).ToNot(BeZero())
+ })
+
+ t.Run("Should requeue when volume is successfully created but in updating state", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockvpc, machineScope, reconciler := setup(t)
+ t.Cleanup(mockController.Finish)
+ machineScope.IBMVPCMachine.Spec.AdditionalVolumes = additionalVolumes
+ machineScope.IBMVPCMachine.Status = testMachineStatus
+ createObject(g, machineScope.IBMVPCMachine, machineScope.IBMVPCMachine.Namespace)
+ defer checkMachineDeleted(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ defer cleanupObject(g, machineScope.IBMVPCMachine)
+ waitTillMachineAvailable(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ setMachineStatus(ctx, g, machineScope.IBMVPCMachine, testMachineStatus)
+ waitTillMachineStatusUpdated(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ mockvpc.EXPECT().GetVolumeAttachments(gomock.AssignableToTypeOf(&vpcv1.ListInstanceVolumeAttachmentsOptions{})).Return(&emptyVolumeAttachments, nil, nil)
+ vpcVolume.Status = &volumeUpdatingState
+ mockvpc.EXPECT().GetVolume(gomock.AssignableToTypeOf(&vpcv1.GetVolumeOptions{})).Return(&vpcVolume, nil, nil)
+ result, err := reconciler.reconcileAdditionalVolumes(ctx, machineScope)
+ g.Expect(err).Should(BeNil())
+ g.Expect(result.RequeueAfter).ToNot(BeZero())
+ })
+
+ t.Run("Should requeue when volume is in updating state", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockvpc, machineScope, reconciler := setup(t)
+ t.Cleanup(mockController.Finish)
+ machineScope.IBMVPCMachine.Spec.AdditionalVolumes = additionalVolumes
+ createObject(g, machineScope.IBMVPCMachine, machineScope.IBMVPCMachine.Namespace)
+ defer checkMachineDeleted(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ defer cleanupObject(g, machineScope.IBMVPCMachine)
+ waitTillMachineAvailable(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ setMachineStatus(ctx, g, machineScope.IBMVPCMachine, testMachineStatus)
+ waitTillMachineStatusUpdated(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ mockvpc.EXPECT().GetVolumeAttachments(gomock.AssignableToTypeOf(&vpcv1.ListInstanceVolumeAttachmentsOptions{})).Return(&emptyVolumeAttachments, nil, nil)
+ vpcVolume.Status = &volumeUpdatingState
+ mockvpc.EXPECT().GetVolume(gomock.AssignableToTypeOf(&vpcv1.GetVolumeOptions{})).Return(&vpcVolume, nil, nil)
+ result, err := reconciler.reconcileAdditionalVolumes(ctx, machineScope)
+ g.Expect(err).Should(BeNil())
+ g.Expect(result.RequeueAfter).ToNot(BeZero())
+ })
+
+ t.Run("Should return error when volume is in failed state", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockvpc, machineScope, reconciler := setup(t)
+ t.Cleanup(mockController.Finish)
+ machineScope.IBMVPCMachine.Spec.AdditionalVolumes = additionalVolumes
+ createObject(g, machineScope.IBMVPCMachine, machineScope.IBMVPCMachine.Namespace)
+ defer checkMachineDeleted(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ defer cleanupObject(g, machineScope.IBMVPCMachine)
+ waitTillMachineAvailable(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ setMachineStatus(ctx, g, machineScope.IBMVPCMachine, testMachineStatus)
+ waitTillMachineStatusUpdated(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ mockvpc.EXPECT().GetVolumeAttachments(gomock.AssignableToTypeOf(&vpcv1.ListInstanceVolumeAttachmentsOptions{})).Return(&emptyVolumeAttachments, nil, nil)
+ vpcVolume.Status = &volumeFailedState
+ mockvpc.EXPECT().GetVolume(gomock.AssignableToTypeOf(&vpcv1.GetVolumeOptions{})).Return(&vpcVolume, nil, nil)
+ result, err := reconciler.reconcileAdditionalVolumes(ctx, machineScope)
+ g.Expect(err).ShouldNot(BeNil())
+ g.Expect(result).To(BeZero())
+ })
+
+ t.Run("Should return error when volume is in unusable state", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockvpc, machineScope, reconciler := setup(t)
+ t.Cleanup(mockController.Finish)
+ machineScope.IBMVPCMachine.Spec.AdditionalVolumes = additionalVolumes
+ createObject(g, machineScope.IBMVPCMachine, machineScope.IBMVPCMachine.Namespace)
+ defer checkMachineDeleted(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ defer cleanupObject(g, machineScope.IBMVPCMachine)
+ waitTillMachineAvailable(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ mockvpc.EXPECT().GetVolumeAttachments(gomock.AssignableToTypeOf(&vpcv1.ListInstanceVolumeAttachmentsOptions{})).Return(&emptyVolumeAttachments, nil, nil)
+ setMachineStatus(ctx, g, machineScope.IBMVPCMachine, testMachineStatus)
+ waitTillMachineStatusUpdated(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ vpcVolume.Status = &volumeUnusableState
+ mockvpc.EXPECT().GetVolume(gomock.AssignableToTypeOf(&vpcv1.GetVolumeOptions{})).Return(&vpcVolume, nil, nil)
+ result, err := reconciler.reconcileAdditionalVolumes(ctx, machineScope)
+ g.Expect(err).ShouldNot(BeNil())
+ g.Expect(result).To(BeZero())
+ })
+
+ t.Run("Should not create new volume if it already exists", func(t *testing.T) {
+ g := NewWithT(t)
+ mockController, mockvpc, machineScope, reconciler := setup(t)
+ t.Cleanup(mockController.Finish)
+ machineScope.IBMVPCMachine.Spec.AdditionalVolumes = additionalVolumes
+ createObject(g, machineScope.IBMVPCMachine, machineScope.IBMVPCMachine.Namespace)
+ defer checkMachineDeleted(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ defer cleanupObject(g, machineScope.IBMVPCMachine)
+ waitTillMachineAvailable(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ setMachineStatus(ctx, g, machineScope.IBMVPCMachine, testMachineStatus)
+ waitTillMachineStatusUpdated(ctx, g, machineScope.IBMVPCMachine.Name, machineScope.IBMVPCMachine.Namespace)
+ mockvpc.EXPECT().GetVolumeAttachments(gomock.AssignableToTypeOf(&vpcv1.ListInstanceVolumeAttachmentsOptions{})).Return(&testVolumeAttachments, nil, nil)
+ result, err := reconciler.reconcileAdditionalVolumes(ctx, machineScope)
+ g.Expect(err).Should(BeNil())
+ g.Expect(result).To(Equal(ctrl.Result{}))
+ })
+}
+
+func setMachineStatus(ctx context.Context, g *WithT, machine *infrav1.IBMVPCMachine, status infrav1.IBMVPCMachineStatus) {
+ machine.Status = status
+ err := testEnv.Status().Update(ctx, machine)
+ g.Expect(err).Should(BeNil())
+}
+
+func waitTillMachineAvailable(ctx context.Context, g *WithT, machineName, machineNamespace string) {
+ g.Eventually(func() bool {
+ machine := &infrav1.IBMVPCMachine{}
+ key := client.ObjectKey{
+ Name: machineName,
+ Namespace: machineNamespace,
+ }
+ err := testEnv.Get(ctx, key, machine)
+ return err == nil
+ }, 10*time.Second).Should(Equal(true))
+}
+
+func waitTillMachineStatusUpdated(ctx context.Context, g *WithT, machineName, machineNamespace string) {
+ g.Eventually(func() bool {
+ machine := &infrav1.IBMVPCMachine{}
+ key := client.ObjectKey{
+ Name: machineName,
+ Namespace: machineNamespace,
+ }
+ err := testEnv.Get(ctx, key, machine)
+ g.Expect(err).To(BeNil())
+ return machine.Status.V1Beta2 != nil
+ }, 10*time.Second).Should(Equal(true))
+}
+
+func checkMachineDeleted(ctx context.Context, g *WithT, machineName, machineNamespace string) {
+ g.Eventually(func() bool {
+ machine := &infrav1.IBMVPCMachine{}
+ key := client.ObjectKey{
+ Name: machineName,
+ Namespace: machineNamespace,
+ }
+ err := testEnv.Get(ctx, key, machine)
+ return apierrors.IsNotFound(err)
+ }, 10*time.Second).Should(Equal(true))
+}
diff --git a/docs/book/src/developer/release-support-guidelines.md b/docs/book/src/developer/release-support-guidelines.md
index b9ee72244f..19f4ab97c7 100644
--- a/docs/book/src/developer/release-support-guidelines.md
+++ b/docs/book/src/developer/release-support-guidelines.md
@@ -34,8 +34,9 @@ standard [backport policy](https://github.com/kubernetes-sigs/cluster-api/blob/m
| Minor Release | API Version | Supported Until |
|---------------|-------------|----------------------------------------------------|
+| v0.12.x | **v1beta2** | when v0.14.0 will be released |
| v0.11.x | **v1beta2** | when v0.13.0 will be released |
-| v0.10.x | **v1beta2** | when v0.12.0 will be released |
+| v0.10.x | **v1beta2** | EOL since 2025-09-04 - v0.12.0 release date |
| v0.9.x | **v1beta2** | EOL since 2025-05-13 - v0.11.0 release date |
| v0.8.x | **v1beta2** | EOL since 2025-02-12 - v0.10.0 release date |
| v0.7.x | **v1beta2** | EOL since 2024-11-22 - v0.9.0 release date |
diff --git a/docs/book/src/developer/release.md b/docs/book/src/developer/release.md
index bdd7d4977e..c9f0609e1a 100644
--- a/docs/book/src/developer/release.md
+++ b/docs/book/src/developer/release.md
@@ -35,14 +35,14 @@
```
- Wait for the Google Cloudbuild to finish, which is triggered once the tag is created.
- The status of the build jobs can be tracked from: [https://prow.k8s.io/?job=post-cluster-api-provider-ibmcloud-push-images](https://prow.k8s.io/?job=post-cluster-api-provider-ibmcloud-push-images)
- - The built images are available here: [https://console.cloud.google.com/gcr/images/k8s-staging-capi-ibmcloud](https://console.cloud.google.com/gcr/images/k8s-staging-capi-ibmcloud)
+ - The built images are available here: [https://console.cloud.google.com/artifacts/docker/k8s-staging-capi-ibmcloud/us/gcr.io](https://console.cloud.google.com/artifacts/docker/k8s-staging-capi-ibmcloud/us/gcr.io)
- Create a draft release with release notes for the created tag.
- Use the `make release-notes` target to generate release notes. (Refer topic - [Prepare release notes](https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud/blob/main/docs/book/src/developer/release.md#prepare-release-notes))
- Update the controller image version towards the bottom of the release document.
- Perform the [image promotion process](https://github.com/kubernetes/k8s.io/tree/main/registry.k8s.io#image-promoter):
- Clone and pull down the latest from [kubernetes/k8s.io](https://github.com/kubernetes/k8s.io)
- Create a new branch in your fork of `kubernetes/k8s.io`.
- - The staging repository is [here](https://console.cloud.google.com/gcr/images/k8s-staging-capi-ibmcloud/GLOBAL).
+ - The staging repository is [here](https://console.cloud.google.com/artifacts/docker/k8s-staging-capi-ibmcloud/us/gcr.io).
- Once image is present in the above staging repository, find the sha256 tag for the image by following instructions
```shell
$ manifest-tool inspect --raw gcr.io/k8s-staging-capi-ibmcloud/cluster-api-ibmcloud-controller:v0.1.0 | jq '.digest'
diff --git a/docs/book/src/introduction.md b/docs/book/src/introduction.md
index dfabce8a7e..a45e7f2cc9 100644
--- a/docs/book/src/introduction.md
+++ b/docs/book/src/introduction.md
@@ -15,8 +15,9 @@ previous cluster managers such as [kops](https://github.com/kubernetes/kops) and
Cluster API Provider IBM Cloud documentation versions
-This book documents Cluster API Provider IBM Cloud v0.11. For other versions please see the corresponding documentation:
+This book documents Cluster API Provider IBM Cloud v0.12. For other versions please see the corresponding documentation:
* [main.cluster-api-ibmcloud.sigs.k8s.io](https://main.cluster-api-ibmcloud.sigs.k8s.io)
+* [release-0-12.cluster-api-ibmcloud.sigs.k8s.io](https://release-0-12.cluster-api-ibmcloud.sigs.k8s.io/)
* [release-0-11.cluster-api-ibmcloud.sigs.k8s.io](https://release-0-11.cluster-api-ibmcloud.sigs.k8s.io/)
* [release-0-10.cluster-api-ibmcloud.sigs.k8s.io](https://release-0-10.cluster-api-ibmcloud.sigs.k8s.io/)
* [release-0-9.cluster-api-ibmcloud.sigs.k8s.io](https://release-0-9.cluster-api-ibmcloud.sigs.k8s.io/)
diff --git a/docs/book/src/topics/capibmadm/index.md b/docs/book/src/topics/capibmadm/index.md
index 36e2130add..f14eb5dd79 100644
--- a/docs/book/src/topics/capibmadm/index.md
+++ b/docs/book/src/topics/capibmadm/index.md
@@ -4,14 +4,53 @@ Kubernetes Cluster API Provider IBM Cloud Management Utility
## Install capibmadm
-{{#tabs name:"install-ccapibmadm" tabs:"Linux/MacOS,Windows"}}
-{{#tab Linux/MacOS}}
+{{#tabs name:"install-capibmadm" tabs:"Linux,macOS,Windows"}}
+{{#tab Linux}}
-#### Install capibmadm binary with curl on Linux / MacOS
-Run the following command to download the capibmadm binary:
+#### Install capibmadm binary with curl on Linux
+If you are unsure you can determine your computers architecture by running `uname -a`
+Download for AMD64:
```bash
-curl -L "https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud/releases/download/v0.11.0/capibmadm-$(echo "$(uname -s)" | tr A-Z a-z)-$(uname -m)" -o capibmadm
+curl -L {{#releaselink repo:"https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud" gomodule:"sigs.k8s.io/cluster-api-provider-ibmcloud" asset:"capibmadm-linux-amd64" version:"0.12.x"}} -o capibmadm
+```
+
+Download for ARM64:
+```bash
+curl -L {{#releaselink repo:"https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud" gomodule:"sigs.k8s.io/cluster-api-provider-ibmcloud" asset:"capibmadm-linux-arm64" version:"0.12.x"}} -o capibmadm
+```
+
+Download for PPC64LE:
+```bash
+curl -L {{#releaselink repo:"https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud" gomodule:"sigs.k8s.io/cluster-api-provider-ibmcloud" asset:"capibmadm-linux-ppc64le" version:"0.12.x"}} -o capibmadm
+```
+Add the execute bit to the binary.
+```bash
+chmod +x ./capibmadm
+```
+Move the binary to $PATH.
+```bash
+sudo mv ./capibmadm /usr/local/bin/capibmadm
+```
+Test to ensure the version you installed is up-to-date:
+```bash
+capibmadm version -o short
+```
+
+{{#/tab }}
+{{#tab macOS}}
+
+#### Install capibmadm binary with curl on MacOS
+If you are unsure you can determine your computers architecture by running `uname -a`
+
+Download for AMD64:
+```bash
+curl -L {{#releaselink repo:"https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud" gomodule:"sigs.k8s.io/cluster-api-provider-ibmcloud" asset:"capibmadm-darwin-amd64" version:"0.12.x"}} -o capibmadm
+```
+
+Download for M1 CPU ("Apple Silicon") / ARM64:
+```bash
+curl -L {{#releaselink repo:"https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud" gomodule:"sigs.k8s.io/cluster-api-provider-ibmcloud" asset:"capibmadm-darwin-arm64" version:"0.12.x"}} -o capibmadm
```
Add the execute bit to the binary.
```bash
@@ -34,13 +73,13 @@ Go to the working directory where you want capibmadm downloaded.
Download the latest release on AMD64; on Windows, type:
```powershell
-curl.exe -L https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud/releases/download/v0.11.0/capibmadm-windows-amd64.exe -o capibmadm.exe
+curl.exe -L {{#releaselink repo:"https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud" gomodule:"sigs.k8s.io/cluster-api-provider-ibmcloud" asset:"capibmadm-windows-amd64.exe" version:"0.12.x"}} -o capibmadm.exe
```
Append or prepend the path of that directory to the `PATH` environment variable.
Download the latest release on ARM64; on Windows, type:
```powershell
-curl.exe -L https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud/releases/download/v0.11.0/capibmadm-windows-arm64.exe -o capibmadm.exe
+curl.exe -L {{#releaselink repo:"https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud" gomodule:"sigs.k8s.io/cluster-api-provider-ibmcloud" asset:"capibmadm-windows-amd64.exe" version:"0.12.x"}} -o capibmadm.exe
```
Append or prepend the path of that directory to the `PATH` environment variable.
diff --git a/docs/book/theme/css/custom.css b/docs/book/theme/css/custom.css
index 8036fbcfca..0564f274fc 100644
--- a/docs/book/theme/css/custom.css
+++ b/docs/book/theme/css/custom.css
@@ -50,7 +50,8 @@ aside.note.warning > h1::before {
}
.tabset > input:first-child:checked ~ .tab-panels > .tab-panel:first-child,
-.tabset > input:nth-child(3):checked ~ .tab-panels > .tab-panel:nth-child(2){
+.tabset > input:nth-child(3):checked ~ .tab-panels > .tab-panel:nth-child(2),
+.tabset > input:nth-child(5):checked ~ .tab-panels > .tab-panel:nth-child(3){
display: block;
}
diff --git a/docs/images/add-and-delete-tag.excalidraw b/docs/images/add-and-delete-tag.excalidraw
new file mode 100644
index 0000000000..7fa2bd265d
--- /dev/null
+++ b/docs/images/add-and-delete-tag.excalidraw
@@ -0,0 +1,8482 @@
+{
+ "type": "excalidraw",
+ "version": 2,
+ "source": "https://excalidraw.com",
+ "elements": [
+ {
+ "id": "nhwqbcpDK7ZN8yIxBW-P1",
+ "type": "rectangle",
+ "x": 526.3496979837712,
+ "y": 3681.720906640572,
+ "width": 298.2265625,
+ "height": 71.05566406249999,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0g",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 1330251172,
+ "version": 452,
+ "versionNonce": 1749072431,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707869,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "25SsIvWvR2kmSVXLh7FGh",
+ "type": "text",
+ "x": 583.5327444242843,
+ "y": 3708.4402135360774,
+ "width": 182.81190490722656,
+ "height": 37.800000000000004,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0h",
+ "roundness": null,
+ "seed": 511008028,
+ "version": 249,
+ "versionNonce": 1403493455,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707869,
+ "link": null,
+ "locked": false,
+ "text": "Delete Cluster",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "Delete Cluster",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "9VZxmpSGKAfbi-kpUeC9s",
+ "type": "diamond",
+ "x": 540.7007032897533,
+ "y": 3828.213647580144,
+ "width": 251.26171875000003,
+ "height": 236.921875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0i",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 884778020,
+ "version": 573,
+ "versionNonce": 271399535,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "7-OG79V8hxIbswEh4h3Ke"
+ },
+ {
+ "id": "5U2hUrLQzFJHH_keJF-7l",
+ "type": "arrow"
+ },
+ {
+ "id": "lsQ5WT7eW6M9v2eq-Shan",
+ "type": "arrow"
+ },
+ {
+ "id": "FE8sj5--D8auFuA1HAZki",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707869,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "7-OG79V8hxIbswEh4h3Ke",
+ "type": "text",
+ "x": 622.9261824157298,
+ "y": 3905.944116330144,
+ "width": 87.17990112304688,
+ "height": 81,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0j",
+ "roundness": null,
+ "seed": 170641444,
+ "version": 449,
+ "versionNonce": 1666315212,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756384336112,
+ "link": null,
+ "locked": false,
+ "text": "controller\ntags\nattached",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "9VZxmpSGKAfbi-kpUeC9s",
+ "originalText": "controller tags attached",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "5U2hUrLQzFJHH_keJF-7l",
+ "type": "arrow",
+ "x": 664.7006783678837,
+ "y": 3757.0492382349935,
+ "width": 0.37704103744806616,
+ "height": 77.87911727204983,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0k",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1369172764,
+ "version": 666,
+ "versionNonce": 1765960495,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599708602,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.37704103744806616,
+ 77.87911727204983
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "9VZxmpSGKAfbi-kpUeC9s",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.48651330664249454,
+ 0.5001
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "lsQ5WT7eW6M9v2eq-Shan",
+ "type": "arrow",
+ "x": 789.5880202938138,
+ "y": 3948.4144135211122,
+ "width": 369.8786477785867,
+ "height": 275.6080208535477,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0l",
+ "roundness": null,
+ "seed": 105222556,
+ "version": 2821,
+ "versionNonce": 255241071,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "EE9Ovr4PbL5vbRjkqzpok"
+ }
+ ],
+ "updated": 1748599708603,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 366.2618809379868,
+ 5.302025660747404
+ ],
+ [
+ 369.8786477785867,
+ 275.6080208535477
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "9VZxmpSGKAfbi-kpUeC9s",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.993624118264916,
+ 0.5001
+ ]
+ },
+ "endBinding": {
+ "elementId": "eYk5Jal5QnhVduMGA5Q06",
+ "mode": "inside",
+ "fixedPoint": [
+ 0.45488308867351857,
+ 0.06373485471969641
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "EE9Ovr4PbL5vbRjkqzpok",
+ "type": "text",
+ "x": 1044.0913133767892,
+ "y": 3242.622211014195,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0lV",
+ "roundness": null,
+ "seed": 2086052994,
+ "version": 6,
+ "versionNonce": 101188702,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748584323498,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "lsQ5WT7eW6M9v2eq-Shan",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "eYk5Jal5QnhVduMGA5Q06",
+ "type": "rectangle",
+ "x": 1022.8995709363749,
+ "y": 4221.49434282216,
+ "width": 298.2265625,
+ "height": 56.9296875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0m",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 375090460,
+ "version": 1252,
+ "versionNonce": 924523855,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "UIcsYWTZu-0yZEs38GM_5"
+ },
+ {
+ "id": "lsQ5WT7eW6M9v2eq-Shan",
+ "type": "arrow"
+ },
+ {
+ "id": "KQYdj2qVp-P7-w7bmSS01",
+ "type": "arrow"
+ },
+ {
+ "id": "7jdWESJ1if4Z5FQjs2PI3",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707869,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "UIcsYWTZu-0yZEs38GM_5",
+ "type": "text",
+ "x": 1068.4929699842264,
+ "y": 4236.45918657216,
+ "width": 207.03976440429688,
+ "height": 27,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0n",
+ "roundness": null,
+ "seed": 529763394,
+ "version": 802,
+ "versionNonce": 1042709967,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707869,
+ "link": null,
+ "locked": false,
+ "text": "Delete TransitGateway",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "eYk5Jal5QnhVduMGA5Q06",
+ "originalText": "Delete TransitGateway",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "YWnqpbubCSQtYu3EBKdCG",
+ "type": "diamond",
+ "x": 526.1365742674315,
+ "y": 4462.361123558322,
+ "width": 251.26171875000003,
+ "height": 236.921875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0p",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1549255332,
+ "version": 1293,
+ "versionNonce": 1532226543,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "a54P4WMQke2SfbGsOQynY"
+ },
+ {
+ "id": "s246hlOX-y5imRXCkb8cU",
+ "type": "arrow"
+ },
+ {
+ "id": "bPecrO0kAzIHqfBjDtax_",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707869,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "a54P4WMQke2SfbGsOQynY",
+ "type": "text",
+ "x": 608.362053393408,
+ "y": 4540.091592308322,
+ "width": 87.17990112304688,
+ "height": 81,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b0q",
+ "roundness": null,
+ "seed": 957337124,
+ "version": 1168,
+ "versionNonce": 789701836,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756384370075,
+ "link": null,
+ "locked": false,
+ "text": "controller\ntags\nattached",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "YWnqpbubCSQtYu3EBKdCG",
+ "originalText": "controller tags attached",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "KQYdj2qVp-P7-w7bmSS01",
+ "type": "arrow",
+ "x": 1157.379105954283,
+ "y": 4281.648412945489,
+ "width": 503.66886655867916,
+ "height": 156.1638623132344,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b1G",
+ "roundness": null,
+ "seed": 1372847004,
+ "version": 3759,
+ "versionNonce": 558720399,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599708603,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 3.0256609658169964,
+ 156.1638623132344
+ ],
+ [
+ -500.64320559286216,
+ 151.38636409893934
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "eYk5Jal5QnhVduMGA5Q06",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.45102245608498165,
+ 0.5489775439150253
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "FE8sj5--D8auFuA1HAZki",
+ "type": "arrow",
+ "x": 664.0621119056582,
+ "y": 4057.6346340962473,
+ "width": 1.55859375,
+ "height": 96.25390625,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b1I",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 709494044,
+ "version": 581,
+ "versionNonce": 1355275183,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "nlnLBmwb0a_d68rjWqSQg"
+ }
+ ],
+ "updated": 1748599708603,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -1.55859375,
+ 96.25390625
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "8at5BoUBefw4T46v74AjP",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5064646637689444,
+ -0.47608229779891514
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "nlnLBmwb0a_d68rjWqSQg",
+ "type": "text",
+ "x": 630.9392242431641,
+ "y": 3403.634765625,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b1IV",
+ "roundness": null,
+ "seed": 598915522,
+ "version": 4,
+ "versionNonce": 919521474,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747152151585,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "FE8sj5--D8auFuA1HAZki",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "s246hlOX-y5imRXCkb8cU",
+ "type": "arrow",
+ "x": 772.3508504703155,
+ "y": 4572.96148977722,
+ "width": 380.948007029059,
+ "height": 291.5245797146699,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b1J",
+ "roundness": null,
+ "seed": 156185244,
+ "version": 3508,
+ "versionNonce": 2110957071,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "WdSMedBqySe0HqhFBX77W"
+ }
+ ],
+ "updated": 1748599708604,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 376.54960308556656,
+ -2.867526127308338
+ ],
+ [
+ 380.948007029059,
+ 288.6570535873616
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "YWnqpbubCSQtYu3EBKdCG",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5001,
+ 0.46340103008895556
+ ]
+ },
+ "endBinding": {
+ "elementId": "m8syNMl0bZYtMoSNuOeb3",
+ "mode": "inside",
+ "fixedPoint": [
+ 0.47531022856880073,
+ 0.0474517676066992
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "WdSMedBqySe0HqhFBX77W",
+ "type": "text",
+ "x": 1091.699759042563,
+ "y": 3883.865540954326,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b1JV",
+ "roundness": null,
+ "seed": 561309954,
+ "version": 6,
+ "versionNonce": 1657531842,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748584812059,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "s246hlOX-y5imRXCkb8cU",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "bPecrO0kAzIHqfBjDtax_",
+ "type": "arrow",
+ "x": 649.1844650042692,
+ "y": 4693.024338154751,
+ "width": 3.443614650529753,
+ "height": 105.97641845138605,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b1L",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1415943076,
+ "version": 1213,
+ "versionNonce": 1540426799,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "lJTv5djHV4MphqtIgHfVa"
+ }
+ ],
+ "updated": 1748599708604,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -3.443614650529753,
+ 105.97641845138605
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "2UBYpq6ZZg2pbtEa8eKuV",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.49983726319246646,
+ -0.5067167846426585
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "lJTv5djHV4MphqtIgHfVa",
+ "type": "text",
+ "x": 618.6883272651143,
+ "y": 4043.9605730812864,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b1LV",
+ "roundness": null,
+ "seed": 1092241154,
+ "version": 4,
+ "versionNonce": 644199938,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747230902278,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "bPecrO0kAzIHqfBjDtax_",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "CQzlNPX0jdANvFKtmlYR4",
+ "type": "arrow",
+ "x": 657.5823007433779,
+ "y": 4348.791864910099,
+ "width": 2.4855994106834487,
+ "height": 115.382926459401,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b3t",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 898187074,
+ "version": 1350,
+ "versionNonce": 1431374959,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "UsFf_NLkvR9EjHL40NVEg"
+ }
+ ],
+ "updated": 1748599708604,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.5613524382232526,
+ 41.46969151409212
+ ],
+ [
+ -0.924246972460196,
+ 115.382926459401
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "4hhFdsXwGM8bq_NrTqg5a",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.4644975026582266,
+ 0.5355024973417559
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "UsFf_NLkvR9EjHL40NVEg",
+ "type": "text",
+ "x": 626.4555066877283,
+ "y": 3706.33965123269,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b3tV",
+ "roundness": null,
+ "seed": 1841723102,
+ "version": 4,
+ "versionNonce": 1220351966,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747230870007,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "CQzlNPX0jdANvFKtmlYR4",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "8at5BoUBefw4T46v74AjP",
+ "type": "diamond",
+ "x": 519.8913579069576,
+ "y": 4152.375216878958,
+ "width": 283.05143158244437,
+ "height": 199.0132943242099,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "yx-gMijfIsf9FIo8r4wj-"
+ ],
+ "frameId": null,
+ "index": "b3wV",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 840643202,
+ "version": 2522,
+ "versionNonce": 835620303,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "CQzlNPX0jdANvFKtmlYR4",
+ "type": "arrow"
+ },
+ {
+ "id": "7jdWESJ1if4Z5FQjs2PI3",
+ "type": "arrow"
+ },
+ {
+ "id": "FE8sj5--D8auFuA1HAZki",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599708603,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "4hhFdsXwGM8bq_NrTqg5a",
+ "type": "text",
+ "x": 576.4470997903239,
+ "y": 4227.957373260125,
+ "width": 168.63986206054688,
+ "height": 43.2,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "yx-gMijfIsf9FIo8r4wj-"
+ ],
+ "frameId": null,
+ "index": "b3x",
+ "roundness": null,
+ "seed": 1837722270,
+ "version": 872,
+ "versionNonce": 823562959,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "CQzlNPX0jdANvFKtmlYR4",
+ "type": "arrow"
+ },
+ {
+ "id": "7jdWESJ1if4Z5FQjs2PI3",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599708608,
+ "link": null,
+ "locked": false,
+ "text": "status.TransitGateway.\nControllerCreated=true",
+ "fontSize": 16,
+ "fontFamily": 6,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "status.TransitGateway.\nControllerCreated=true",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "m8syNMl0bZYtMoSNuOeb3",
+ "type": "rectangle",
+ "x": 1010.5903620205097,
+ "y": 4860.016298772519,
+ "width": 298.2265625,
+ "height": 56.9296875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b3z",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 673556738,
+ "version": 1187,
+ "versionNonce": 826070927,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "dIIe_xp6zn-76r51TMpZS"
+ },
+ {
+ "id": "s246hlOX-y5imRXCkb8cU",
+ "type": "arrow"
+ },
+ {
+ "id": "os4uZDofkWth5IiUcwd3J",
+ "type": "arrow"
+ },
+ {
+ "id": "BlekYWZtMW1SMx9MZes01",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707869,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "dIIe_xp6zn-76r51TMpZS",
+ "type": "text",
+ "x": 1066.723739095705,
+ "y": 4874.981142522519,
+ "width": 185.95980834960938,
+ "height": 27,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b40",
+ "roundness": null,
+ "seed": 1565341890,
+ "version": 766,
+ "versionNonce": 1232672783,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707869,
+ "link": null,
+ "locked": false,
+ "text": "Delete DHCP Server",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "m8syNMl0bZYtMoSNuOeb3",
+ "originalText": "Delete DHCP Server",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "2UBYpq6ZZg2pbtEa8eKuV",
+ "type": "diamond",
+ "x": 506.8859157626903,
+ "y": 4793.873955227219,
+ "width": 283.05143158244437,
+ "height": 199.0132943242099,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "OO9TanhI0KLpt0K8HzKEL"
+ ],
+ "frameId": null,
+ "index": "b41",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1009005726,
+ "version": 2628,
+ "versionNonce": 1432202831,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "0XdD5tPuQbskTNFkiK0JH",
+ "type": "arrow"
+ },
+ {
+ "id": "BlekYWZtMW1SMx9MZes01",
+ "type": "arrow"
+ },
+ {
+ "id": "bPecrO0kAzIHqfBjDtax_",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599708604,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "9XUeF705AHecEoDWhowB8",
+ "type": "text",
+ "x": 563.4416576460571,
+ "y": 4869.456111608385,
+ "width": 168.63986206054688,
+ "height": 43.2,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "OO9TanhI0KLpt0K8HzKEL"
+ ],
+ "frameId": null,
+ "index": "b42",
+ "roundness": null,
+ "seed": 1227878622,
+ "version": 1009,
+ "versionNonce": 840470223,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "BlekYWZtMW1SMx9MZes01",
+ "type": "arrow"
+ },
+ {
+ "id": "0XdD5tPuQbskTNFkiK0JH",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599708604,
+ "link": null,
+ "locked": false,
+ "text": "status.DHCPServer.\nControllerCreated=true",
+ "fontSize": 16,
+ "fontFamily": 6,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "status.DHCPServer.\nControllerCreated=true",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "0XdD5tPuQbskTNFkiK0JH",
+ "type": "arrow",
+ "x": 649.5733140873857,
+ "y": 4993.500899355345,
+ "width": 0.9830402700135892,
+ "height": 141.0468826056067,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b49",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 414846622,
+ "version": 741,
+ "versionNonce": 1249770671,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "HIFco4b8uzlqewfi6h4ng"
+ }
+ ],
+ "updated": 1748599708604,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.6295453554424739,
+ 50.45841815446329
+ ],
+ [
+ -0.35349491457111526,
+ 141.0468826056067
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "9XUeF705AHecEoDWhowB8",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5088937138294066,
+ 0.508893713829408
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "HIFco4b8uzlqewfi6h4ng",
+ "type": "text",
+ "x": 624.5336701121817,
+ "y": 4341.582723267082,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b49V",
+ "roundness": null,
+ "seed": 1015003970,
+ "version": 5,
+ "versionNonce": 1670312898,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231345255,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "0XdD5tPuQbskTNFkiK0JH",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "6s9UFuW2GrbpHFexY3uR7",
+ "type": "diamond",
+ "x": 525.2533249268806,
+ "y": 5127.960069312503,
+ "width": 251.26171875000003,
+ "height": 236.921875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4B",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 354758174,
+ "version": 1420,
+ "versionNonce": 1589739727,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "mEd-Nz_PDHIqMgddlYY-k"
+ },
+ {
+ "id": "l-xyhetwNi2ah4SqP6U91",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707869,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "mEd-Nz_PDHIqMgddlYY-k",
+ "type": "text",
+ "x": 607.4788040528572,
+ "y": 5205.690538062503,
+ "width": 87.17990112304688,
+ "height": 81,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4C",
+ "roundness": null,
+ "seed": 450214494,
+ "version": 1290,
+ "versionNonce": 1456301388,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756384380404,
+ "link": null,
+ "locked": false,
+ "text": "controller\ntags\nattached",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "6s9UFuW2GrbpHFexY3uR7",
+ "originalText": "controller tags attached",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "EcpAL2UDfGqj4VczXLRjB",
+ "type": "diamond",
+ "x": 512.7260131161479,
+ "y": 5445.261939840588,
+ "width": 283.05143158244437,
+ "height": 199.0132943242099,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "cim-1l-n_I_EFWiDcIvrk"
+ ],
+ "frameId": null,
+ "index": "b4D",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 2111716574,
+ "version": 2791,
+ "versionNonce": 774168367,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "arYzOH_St3Sk8K2p9k9Yq",
+ "type": "arrow"
+ },
+ {
+ "id": "C5NOmXpUI3dXZmCp78NOP",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "kBB6XtDU1AQZybJnXtGPB",
+ "type": "text",
+ "x": 569.2817549995134,
+ "y": 5520.844096221747,
+ "width": 168.63986206054688,
+ "height": 43.2,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "cim-1l-n_I_EFWiDcIvrk"
+ ],
+ "frameId": null,
+ "index": "b4E",
+ "roundness": null,
+ "seed": 251588894,
+ "version": 1167,
+ "versionNonce": 1649436431,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "arYzOH_St3Sk8K2p9k9Yq",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599708605,
+ "link": null,
+ "locked": false,
+ "text": "status.Network.\nControllerCreated=true",
+ "fontSize": 16,
+ "fontFamily": 6,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "status.Network.\nControllerCreated=true",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "arYzOH_St3Sk8K2p9k9Yq",
+ "type": "arrow",
+ "x": 651.8624792649662,
+ "y": 5360.465689666141,
+ "width": 0.8965092284778393,
+ "height": 86.37408334588781,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4F",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 2036140418,
+ "version": 1572,
+ "versionNonce": 148626671,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "y51xn9gIA5kBfv7HOSlFN"
+ }
+ ],
+ "updated": 1748599708605,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.8965092284778393,
+ 86.37408334588781
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "kBB6XtDU1AQZybJnXtGPB",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.4963030067194623,
+ 0.49630300671948485
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "y51xn9gIA5kBfv7HOSlFN",
+ "type": "text",
+ "x": 627.1987718932987,
+ "y": 4701.5643167745275,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4FV",
+ "roundness": null,
+ "seed": 1596376350,
+ "version": 4,
+ "versionNonce": 2103723550,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747230933790,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "arYzOH_St3Sk8K2p9k9Yq",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "f-jAVBIMIOS0qVgGqBU1P",
+ "type": "diamond",
+ "x": 532.3892277970563,
+ "y": 5731.209974524705,
+ "width": 251.26171875000003,
+ "height": 236.921875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4G",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 198947486,
+ "version": 1519,
+ "versionNonce": 54730159,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "nB182Z8E9z987imf8mgQr"
+ },
+ {
+ "id": "a6hjFWQlE_mNpnXB-j2tI",
+ "type": "arrow"
+ },
+ {
+ "id": "7TMn7_VVtIUOyZiGu9DXL",
+ "type": "arrow"
+ },
+ {
+ "id": "C5NOmXpUI3dXZmCp78NOP",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599708605,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "nB182Z8E9z987imf8mgQr",
+ "type": "text",
+ "x": 614.6147069230328,
+ "y": 5808.940443274705,
+ "width": 87.17990112304688,
+ "height": 81,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4H",
+ "roundness": null,
+ "seed": 1900523230,
+ "version": 1387,
+ "versionNonce": 113808844,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756384393066,
+ "link": null,
+ "locked": false,
+ "text": "controller\ntags\nattached",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "f-jAVBIMIOS0qVgGqBU1P",
+ "originalText": "controller tags attached",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "lXmEWqgpx152cBOmpD-Zi",
+ "type": "diamond",
+ "x": 516.7285386845284,
+ "y": 6049.59386993186,
+ "width": 283.05143158244437,
+ "height": 199.0132943242099,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "oQ35XNg4t20HzXmrogcU8"
+ ],
+ "frameId": null,
+ "index": "b4I",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 260832706,
+ "version": 3022,
+ "versionNonce": 1402839631,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "a6hjFWQlE_mNpnXB-j2tI",
+ "type": "arrow"
+ },
+ {
+ "id": "KvXN4Wn39uDv_AmueOUAF",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "_h5VEERWa8-_p67GaYegf",
+ "type": "text",
+ "x": 573.2842805678945,
+ "y": 6125.176026313023,
+ "width": 168.63986206054688,
+ "height": 43.2,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "oQ35XNg4t20HzXmrogcU8"
+ ],
+ "frameId": null,
+ "index": "b4J",
+ "roundness": null,
+ "seed": 1451947394,
+ "version": 1410,
+ "versionNonce": 1664717007,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "a6hjFWQlE_mNpnXB-j2tI",
+ "type": "arrow"
+ },
+ {
+ "id": "KvXN4Wn39uDv_AmueOUAF",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599708606,
+ "link": null,
+ "locked": false,
+ "text": "status.ServiceInstance.\nControllerCreated=true",
+ "fontSize": 16,
+ "fontFamily": 6,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "status.ServiceInstance.\nControllerCreated=true",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "DIxGc-8dJlMNtTkysQfb5",
+ "type": "diamond",
+ "x": 530.0518522216274,
+ "y": 6370.305684380718,
+ "width": 251.26171875000003,
+ "height": 236.921875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4K",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 459514398,
+ "version": 1723,
+ "versionNonce": 650019535,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "rT2GKHa4sUI7AzzrcTE38"
+ },
+ {
+ "id": "EqBGnXsOnGatZcoKraf2I",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "rT2GKHa4sUI7AzzrcTE38",
+ "type": "text",
+ "x": 612.277331347604,
+ "y": 6448.036153130718,
+ "width": 87.17990112304688,
+ "height": 81,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4L",
+ "roundness": null,
+ "seed": 958770782,
+ "version": 1593,
+ "versionNonce": 1069343860,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756384400173,
+ "link": null,
+ "locked": false,
+ "text": "controller\ntags\nattached",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "DIxGc-8dJlMNtTkysQfb5",
+ "originalText": "controller tags attached",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "4DV0GG0CLMmydIZ9ZQXg5",
+ "type": "diamond",
+ "x": 516.2716441369263,
+ "y": 6686.302855251271,
+ "width": 283.05143158244437,
+ "height": 199.0132943242099,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "X_FPyq8oRtD4kvMItOtBP"
+ ],
+ "frameId": null,
+ "index": "b4M",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1783232862,
+ "version": 3069,
+ "versionNonce": 1553525007,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "EqBGnXsOnGatZcoKraf2I",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599708606,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "Qyi3Hq2KvqcLxLMPpmX2c",
+ "type": "text",
+ "x": 572.8273860202926,
+ "y": 6761.885011632436,
+ "width": 168.63986206054688,
+ "height": 43.2,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "X_FPyq8oRtD4kvMItOtBP"
+ ],
+ "frameId": null,
+ "index": "b4N",
+ "roundness": null,
+ "seed": 1606360478,
+ "version": 1456,
+ "versionNonce": 2083201871,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "text": "status.Loadbalancers[].\nControllerCreated=true",
+ "fontSize": 16,
+ "fontFamily": 6,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "status.Loadbalancers[].\nControllerCreated=true",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "46ZXRbGjvHErLad6SlHte",
+ "type": "diamond",
+ "x": 529.3992062225465,
+ "y": 6995.975247463634,
+ "width": 251.26171875000003,
+ "height": 236.921875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4O",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 655575554,
+ "version": 1705,
+ "versionNonce": 212328815,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "qzVY_ppQG08jiTXZIO537"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "qzVY_ppQG08jiTXZIO537",
+ "type": "text",
+ "x": 611.624685348523,
+ "y": 7073.705716213634,
+ "width": 87.17990112304688,
+ "height": 81,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4P",
+ "roundness": null,
+ "seed": 1339996610,
+ "version": 1576,
+ "versionNonce": 1465621492,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756384406485,
+ "link": null,
+ "locked": false,
+ "text": "controller\ntags\nattached",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "46ZXRbGjvHErLad6SlHte",
+ "originalText": "controller tags attached",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "ms_zqYQM5mNTYS-r7DqYb",
+ "type": "diamond",
+ "x": 515.3445328243708,
+ "y": 7312.963382708366,
+ "width": 283.05143158244437,
+ "height": 199.0132943242099,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "zVB4uIirXBlO40lGq4JG1"
+ ],
+ "frameId": null,
+ "index": "b4Q",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1374183554,
+ "version": 3241,
+ "versionNonce": 1071878575,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "PKfRax80GeHrYxOwhoLy3",
+ "type": "text",
+ "x": 571.9002747077367,
+ "y": 7388.545539089528,
+ "width": 168.63986206054688,
+ "height": 43.2,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "zVB4uIirXBlO40lGq4JG1"
+ ],
+ "frameId": null,
+ "index": "b4R",
+ "roundness": null,
+ "seed": 1020067906,
+ "version": 1623,
+ "versionNonce": 1879278543,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "text": "status.vpcSubnet[].\nControllerCreated=true",
+ "fontSize": 16,
+ "fontFamily": 6,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "status.vpcSubnet[].\nControllerCreated=true",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "4QAehKkozkndGmOGuCKtl",
+ "type": "diamond",
+ "x": 525.2035308355114,
+ "y": 7625.516769371459,
+ "width": 251.26171875000003,
+ "height": 236.921875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4S",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1603252802,
+ "version": 1853,
+ "versionNonce": 396374511,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "Ok2D3qlC3RM5WYJ9SU_5M"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "Ok2D3qlC3RM5WYJ9SU_5M",
+ "type": "text",
+ "x": 607.429009961488,
+ "y": 7703.247238121459,
+ "width": 87.17990112304688,
+ "height": 81,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4T",
+ "roundness": null,
+ "seed": 1159993858,
+ "version": 1724,
+ "versionNonce": 1868014452,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756384414200,
+ "link": null,
+ "locked": false,
+ "text": "controller\ntags\nattached",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "4QAehKkozkndGmOGuCKtl",
+ "originalText": "controller tags attached",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "6oZy1f7KuQpPSi-oARtMP",
+ "type": "diamond",
+ "x": 511.4758127227793,
+ "y": 7941.298373697187,
+ "width": 283.05143158244437,
+ "height": 199.0132943242099,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "d_dcqZ6cmN4p1RKRhjrL1"
+ ],
+ "frameId": null,
+ "index": "b4U",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 776547038,
+ "version": 3247,
+ "versionNonce": 1013039663,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "P139LxTxaFeqyicCgtpds",
+ "type": "text",
+ "x": 568.0314725940719,
+ "y": 8016.909980919378,
+ "width": 179.21585083007812,
+ "height": 43.2,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "d_dcqZ6cmN4p1RKRhjrL1"
+ ],
+ "frameId": null,
+ "index": "b4V",
+ "roundness": null,
+ "seed": 266084126,
+ "version": 1634,
+ "versionNonce": 241673295,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "text": "status.vpcSecurityGroup.\nControllerCreated=true",
+ "fontSize": 16,
+ "fontFamily": 6,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "status.vpcSecurityGroup.\nControllerCreated=true",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "os4uZDofkWth5IiUcwd3J",
+ "type": "arrow",
+ "x": 1158.089922454788,
+ "y": 4919.319145438085,
+ "width": 508.19056919642844,
+ "height": 164.37243344183298,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4W",
+ "roundness": null,
+ "seed": 209049602,
+ "version": 1804,
+ "versionNonce": 1290710319,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599708605,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.69937792079304,
+ 164.37243344183298
+ ],
+ [
+ -505.4911912756354,
+ 162.1660997364761
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "m8syNMl0bZYtMoSNuOeb3",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.49495367133179025,
+ 0.5050463286682253
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "VfZLsdsCnfCIsgIdGQYv1",
+ "type": "rectangle",
+ "x": 1008.7745877238958,
+ "y": 5513.398896586622,
+ "width": 298.2265625,
+ "height": 56.9296875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4c",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 746480094,
+ "version": 1541,
+ "versionNonce": 49814671,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "Brr8JZBjAdahAV7lqU6Wk"
+ },
+ {
+ "id": "V2Z0gOmILgpAxhxsIKws5",
+ "type": "arrow"
+ },
+ {
+ "id": "l-xyhetwNi2ah4SqP6U91",
+ "type": "arrow"
+ },
+ {
+ "id": "D0XUSc88F7fkJtOiA64Wi",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "Brr8JZBjAdahAV7lqU6Wk",
+ "type": "text",
+ "x": 1086.2279492351263,
+ "y": 5528.363740336622,
+ "width": 143.31983947753906,
+ "height": 27,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4d",
+ "roundness": null,
+ "seed": 542275102,
+ "version": 1133,
+ "versionNonce": 619306255,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "text": "Delete Network",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "VfZLsdsCnfCIsgIdGQYv1",
+ "originalText": "Delete Network",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "l-xyhetwNi2ah4SqP6U91",
+ "type": "arrow",
+ "x": 770.1487522548219,
+ "y": 5240.696961627934,
+ "width": 395.6106212014614,
+ "height": 275.6592229738608,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4e",
+ "roundness": null,
+ "seed": 1769788610,
+ "version": 3291,
+ "versionNonce": 37383535,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "Jpk3gOHZamnvhGRuU_W0i"
+ }
+ ],
+ "updated": 1748599708605,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 395.6106212014614,
+ -3.2811670525743466
+ ],
+ [
+ 395.12573585253006,
+ 272.37805592128643
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "6s9UFuW2GrbpHFexY3uR7",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5001,
+ 0.4725712824020937
+ ]
+ },
+ "endBinding": {
+ "elementId": "VfZLsdsCnfCIsgIdGQYv1",
+ "mode": "inside",
+ "fixedPoint": [
+ 0.5216624400655928,
+ 0.01290906551287958
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "Jpk3gOHZamnvhGRuU_W0i",
+ "type": "text",
+ "x": 1046.4763495273032,
+ "y": 4553.155898198071,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4eV",
+ "roundness": null,
+ "seed": 1003635486,
+ "version": 5,
+ "versionNonce": 657363038,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747230931257,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "l-xyhetwNi2ah4SqP6U91",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "C5NOmXpUI3dXZmCp78NOP",
+ "type": "arrow",
+ "x": 654.4889061695765,
+ "y": 5638.192621406317,
+ "width": 2.3476603039578094,
+ "height": 107.1113357306067,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4g",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 9947870,
+ "version": 1025,
+ "versionNonce": 1116268431,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "y1B3xzc1j8m4IVb-QgpYh"
+ }
+ ],
+ "updated": 1748599708605,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.3476603039578094,
+ 36.98955784737518
+ ],
+ [
+ 1.8535363354288847,
+ 107.1113357306067
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "f-jAVBIMIOS0qVgGqBU1P",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.48244662398552385,
+ -0.39255925608976106
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "y1B3xzc1j8m4IVb-QgpYh",
+ "type": "text",
+ "x": 633.3276154246817,
+ "y": 4973.067098267082,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4gV",
+ "roundness": null,
+ "seed": 1725607938,
+ "version": 5,
+ "versionNonce": 1462029342,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231330129,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "C5NOmXpUI3dXZmCp78NOP",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "V2Z0gOmILgpAxhxsIKws5",
+ "type": "arrow",
+ "x": 1165.1395563618348,
+ "y": 5573.938249819868,
+ "width": 511.8415178571429,
+ "height": 140.6009680607467,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4h",
+ "roundness": null,
+ "seed": 759989406,
+ "version": 2037,
+ "versionNonce": 932286415,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599708605,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.0949719178868236,
+ 140.6009680607467
+ ],
+ [
+ -510.74654593925607,
+ 136.02647029288983
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "VfZLsdsCnfCIsgIdGQYv1",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5254049916943297,
+ 0.5254049916943456
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "a6hjFWQlE_mNpnXB-j2tI",
+ "type": "arrow",
+ "x": 654.0173166708088,
+ "y": 5959.138297794308,
+ "width": 4.705102978477839,
+ "height": 96.01275522088781,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4i",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1442920222,
+ "version": 1985,
+ "versionNonce": 205334543,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "exqDbpCrT5HYH6NYLK7ly"
+ }
+ ],
+ "updated": 1748599708606,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 4.705102978477839,
+ 96.01275522088781
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "lXmEWqgpx152cBOmpD-Zi",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.4822393677803692,
+ -0.4544588276282566
+ ]
+ },
+ "endBinding": {
+ "elementId": "_h5VEERWa8-_p67GaYegf",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5282891642659395,
+ 0.4717108357340925
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "exqDbpCrT5HYH6NYLK7ly",
+ "type": "text",
+ "x": 634.6176260699222,
+ "y": 5305.024391965473,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4iV",
+ "roundness": null,
+ "seed": 1396291522,
+ "version": 4,
+ "versionNonce": 1139197634,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231085662,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "a6hjFWQlE_mNpnXB-j2tI",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "O0GZKKuvqj_4s47M1Nnu8",
+ "type": "rectangle",
+ "x": 1009.9513007096375,
+ "y": 6114.342504620333,
+ "width": 298.2265625,
+ "height": 56.9296875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4j",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 1792058910,
+ "version": 1912,
+ "versionNonce": 1764938671,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "CPhiMXdVpoGhneL-CcyPG"
+ },
+ {
+ "id": "Ib1QV3DlY4uzlfn5Nkvgv",
+ "type": "arrow"
+ },
+ {
+ "id": "7TMn7_VVtIUOyZiGu9DXL",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "CPhiMXdVpoGhneL-CcyPG",
+ "type": "text",
+ "x": 1053.324713795575,
+ "y": 6129.307348370333,
+ "width": 211.479736328125,
+ "height": 27,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4k",
+ "roundness": null,
+ "seed": 475148894,
+ "version": 1526,
+ "versionNonce": 629186063,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "text": "Delete Service Instance",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "O0GZKKuvqj_4s47M1Nnu8",
+ "originalText": "Delete Service Instance",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "7TMn7_VVtIUOyZiGu9DXL",
+ "type": "arrow",
+ "x": 778.9324905665572,
+ "y": 5849.186947118027,
+ "width": 388.94116773973724,
+ "height": 266.3163599490972,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4l",
+ "roundness": null,
+ "seed": 247507138,
+ "version": 4267,
+ "versionNonce": 385011311,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "Ra8iEITT4Lddq94go6322"
+ }
+ ],
+ "updated": 1748599708606,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 383.96015450020764,
+ -2.389957138772843
+ ],
+ [
+ 388.94116773973724,
+ 263.92640281032436
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "f-jAVBIMIOS0qVgGqBU1P",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5001,
+ 0.4937305512166637
+ ]
+ },
+ "endBinding": {
+ "elementId": "O0GZKKuvqj_4s47M1Nnu8",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5282018720069563,
+ 0.47179812799303783
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "Ra8iEITT4Lddq94go6322",
+ "type": "text",
+ "x": 1054.0543528046583,
+ "y": 5150.077102770951,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4lV",
+ "roundness": null,
+ "seed": 1823836866,
+ "version": 9,
+ "versionNonce": 2012135554,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231081641,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "7TMn7_VVtIUOyZiGu9DXL",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "Ib1QV3DlY4uzlfn5Nkvgv",
+ "type": "arrow",
+ "x": 1164.8200160578506,
+ "y": 6175.292051466687,
+ "width": 510.61383928571445,
+ "height": 157.56613247886344,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4n",
+ "roundness": null,
+ "seed": 1173036034,
+ "version": 2584,
+ "versionNonce": 1133324431,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599708606,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.918040671183462,
+ 157.56613247886344
+ ],
+ [
+ -508.695798614531,
+ 153.0139561395781
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "O0GZKKuvqj_4s47M1Nnu8",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5200578458405651,
+ 0.5200578458405583
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "KvXN4Wn39uDv_AmueOUAF",
+ "type": "arrow",
+ "x": 653.9653663023043,
+ "y": 6251.719391907709,
+ "width": 1.4599609375,
+ "height": 122.7392578125,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4o",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1929659294,
+ "version": 692,
+ "versionNonce": 1008156335,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "1dC6HOnPHzU9-Pg8RuliR"
+ }
+ ],
+ "updated": 1748599708606,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.4599609375,
+ 35.927734375
+ ],
+ [
+ 0.37109375,
+ 122.7392578125
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "_h5VEERWa8-_p67GaYegf",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.4590604380243649,
+ 0.5409395619756406
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "1dC6HOnPHzU9-Pg8RuliR",
+ "type": "text",
+ "x": 634.1039826121817,
+ "y": 5612.678914673332,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4oV",
+ "roundness": null,
+ "seed": 248276482,
+ "version": 4,
+ "versionNonce": 1720734978,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231088780,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "KvXN4Wn39uDv_AmueOUAF",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "EqBGnXsOnGatZcoKraf2I",
+ "type": "arrow",
+ "x": 655.8178541630692,
+ "y": 6604.391020389814,
+ "width": 1.4501953125,
+ "height": 86.7578125,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4r",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 201098306,
+ "version": 763,
+ "versionNonce": 848076527,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "5nFDpSNlWRrL33bXyfTKJ"
+ }
+ ],
+ "updated": 1748599708606,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.4501953125,
+ 86.7578125
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "4DV0GG0CLMmydIZ9ZQXg5",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.4903004384360634,
+ -0.41154362292153585
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "5nFDpSNlWRrL33bXyfTKJ",
+ "type": "text",
+ "x": 638.3610555526193,
+ "y": 5945.639272020229,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4rV",
+ "roundness": null,
+ "seed": 1382791746,
+ "version": 4,
+ "versionNonce": 1254328642,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231095964,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "EqBGnXsOnGatZcoKraf2I",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "19EopraoRs6X-rl877M2e",
+ "type": "rectangle",
+ "x": 1000.3815020940642,
+ "y": 6758.365880287441,
+ "width": 298.2265625,
+ "height": 56.9296875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4t",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 1633796318,
+ "version": 2751,
+ "versionNonce": 242283695,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "cMmAvIM7BUTvktPj0KLfF"
+ },
+ {
+ "id": "QMUM5XEn41xJhlwsJfJzZ",
+ "type": "arrow"
+ },
+ {
+ "id": "2e8RH6JuX6PNm0a8EMecv",
+ "type": "arrow"
+ },
+ {
+ "id": "MKmpEKoFm5jQWYq5UGGiU",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "cMmAvIM7BUTvktPj0KLfF",
+ "type": "text",
+ "x": 1052.3548983953337,
+ "y": 6773.330724037441,
+ "width": 194.27976989746094,
+ "height": 27,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4u",
+ "roundness": null,
+ "seed": 1064432926,
+ "version": 2391,
+ "versionNonce": 425127244,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1757314935637,
+ "link": null,
+ "locked": false,
+ "text": "Delete Load Balancer",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "19EopraoRs6X-rl877M2e",
+ "originalText": "Delete Load Balancer",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "QMUM5XEn41xJhlwsJfJzZ",
+ "type": "arrow",
+ "x": 776.6063619800902,
+ "y": 6488.9128092465735,
+ "width": 397.2547997117862,
+ "height": 267.32545797176317,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4v",
+ "roundness": null,
+ "seed": 845028738,
+ "version": 5453,
+ "versionNonce": 785837871,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "jKE8ACqXHCYijccYY5W2W"
+ }
+ ],
+ "updated": 1748599708606,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 395.17953861217586,
+ -0.9436949543587616
+ ],
+ [
+ 397.2547997117862,
+ 266.3817630174044
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "19EopraoRs6X-rl877M2e",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5793062800564859,
+ 0.42069371994351235
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "jKE8ACqXHCYijccYY5W2W",
+ "type": "text",
+ "x": 1058.6030166449523,
+ "y": 5786.720149816509,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4vV",
+ "roundness": null,
+ "seed": 1784757954,
+ "version": 5,
+ "versionNonce": 288867714,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231105392,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "QMUM5XEn41xJhlwsJfJzZ",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "Bz7OYWlma3iTk8BfhnDox",
+ "type": "arrow",
+ "x": 654.80716477775,
+ "y": 6881.195852396223,
+ "width": 0.677009090812362,
+ "height": 119.3310546875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4x",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 977044994,
+ "version": 572,
+ "versionNonce": 563307887,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "QphwCt9x9gQyzQk_nsSHA"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.677009090812362,
+ 37.85751374685242
+ ],
+ [
+ 0.37109375,
+ 119.3310546875
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "QphwCt9x9gQyzQk_nsSHA",
+ "type": "text",
+ "x": 638.4416219588693,
+ "y": 6238.732533738979,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4xV",
+ "roundness": null,
+ "seed": 223492226,
+ "version": 4,
+ "versionNonce": 2086201218,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231098682,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "Bz7OYWlma3iTk8BfhnDox",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "2e8RH6JuX6PNm0a8EMecv",
+ "type": "arrow",
+ "x": 1176.7122546965604,
+ "y": 6823.048679538517,
+ "width": 520.2085658482142,
+ "height": 133.67815290178532,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4y",
+ "roundness": null,
+ "seed": 175459330,
+ "version": 2573,
+ "versionNonce": 867119439,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599708607,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.8510044642853245,
+ 130.63197544642753
+ ],
+ [
+ -519.3575613839289,
+ 133.67815290178532
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "19EopraoRs6X-rl877M2e",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5924967473930152,
+ 0.5924967473930179
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "3iIPBCICyWPpBahkmhPqo",
+ "type": "arrow",
+ "x": 653.3288945489601,
+ "y": 7229.550384073616,
+ "width": 1.4501953125,
+ "height": 86.7578125,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4z",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1967558302,
+ "version": 603,
+ "versionNonce": 1790842287,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "dS6FYFkKwHT5Gig-bONx4"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.4501953125,
+ 86.7578125
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "dS6FYFkKwHT5Gig-bONx4",
+ "type": "text",
+ "x": 639.3497369140741,
+ "y": 6570.8005834560645,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b4zV",
+ "roundness": null,
+ "seed": 559028418,
+ "version": 6,
+ "versionNonce": 1307385666,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231118940,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "3iIPBCICyWPpBahkmhPqo",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "7Fe7XLnCuzMwcN85onO8L",
+ "type": "arrow",
+ "x": 652.7055524860104,
+ "y": 7507.676335396889,
+ "width": 0.8104547445243497,
+ "height": 119.3310546875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b50",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 557384642,
+ "version": 585,
+ "versionNonce": 1693288399,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "6r5cxv-ElDu-du4PGopDB"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.8104547445243497,
+ 31.171039595454204
+ ],
+ [
+ 0.37109375,
+ 119.3310546875
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "6r5cxv-ElDu-du4PGopDB",
+ "type": "text",
+ "x": 639.8316138051573,
+ "y": 6865.2188125778775,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b50V",
+ "roundness": null,
+ "seed": 1134268034,
+ "version": 4,
+ "versionNonce": 1346846082,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231122195,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "7Fe7XLnCuzMwcN85onO8L",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "FdbQCEJEM75zsjxB6rWra",
+ "type": "arrow",
+ "x": 648.9161944520914,
+ "y": 7857.51345294245,
+ "width": 1.4501953125,
+ "height": 86.7578125,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b52",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 2130452574,
+ "version": 664,
+ "versionNonce": 1755952623,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "DvZzYHnCEgC_21RTSwCJf"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.4501953125,
+ 86.7578125
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "DvZzYHnCEgC_21RTSwCJf",
+ "type": "text",
+ "x": 638.4366249812379,
+ "y": 7198.780332475076,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b52V",
+ "roundness": null,
+ "seed": 275179074,
+ "version": 4,
+ "versionNonce": 197702978,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231138747,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "FdbQCEJEM75zsjxB6rWra",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "_lTwmWTutizP99KUYAURD",
+ "type": "arrow",
+ "x": 648.5755446053549,
+ "y": 8135.459229124517,
+ "width": 0.7560008480936631,
+ "height": 119.3310546875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b53",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 396958210,
+ "version": 659,
+ "versionNonce": 486219791,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "Hz6crZa-e6sSW9dspHUhD"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.3849070980936631,
+ 37.12608903129512
+ ],
+ [
+ 0.37109375,
+ 119.3310546875
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "Hz6crZa-e6sSW9dspHUhD",
+ "type": "text",
+ "x": 639.2008037727753,
+ "y": 7493.013763142037,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b53V",
+ "roundness": null,
+ "seed": 433513602,
+ "version": 4,
+ "versionNonce": 992449410,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231141740,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "_lTwmWTutizP99KUYAURD",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "L78wOgpy8pDWjXSwV3BYk",
+ "type": "rectangle",
+ "x": 993.9457285783803,
+ "y": 7388.628595324559,
+ "width": 298.2265625,
+ "height": 56.9296875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b54",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 1852018718,
+ "version": 2892,
+ "versionNonce": 869942831,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "nTf0zSrkZCV2a4VmvozsM"
+ },
+ {
+ "id": "IVaK8j_txuT9yrEdoBgQK",
+ "type": "arrow"
+ },
+ {
+ "id": "LEUKXgUuncVLfiBmRZQ2A",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "nTf0zSrkZCV2a4VmvozsM",
+ "type": "text",
+ "x": 1055.5491068742788,
+ "y": 7403.593439074559,
+ "width": 175.01980590820312,
+ "height": 27,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b55",
+ "roundness": null,
+ "seed": 1106762846,
+ "version": 2532,
+ "versionNonce": 1770987663,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "text": "Delete VPC Subnet",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "L78wOgpy8pDWjXSwV3BYk",
+ "originalText": "Delete VPC Subnet",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "IVaK8j_txuT9yrEdoBgQK",
+ "type": "arrow",
+ "x": 776.4694885604413,
+ "y": 7116.671621568685,
+ "width": 404.3013501439383,
+ "height": 255.91910221085163,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b56",
+ "roundness": null,
+ "seed": 698436354,
+ "version": 5387,
+ "versionNonce": 343551855,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "mKiPghdZ4Uk5lX-w4Y1tH"
+ }
+ ],
+ "updated": 1748599708607,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 400.5199403978903,
+ 1.1545193313568234
+ ],
+ [
+ 404.3013501439383,
+ 255.91910221085163
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "L78wOgpy8pDWjXSwV3BYk",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.625053794283396,
+ 0.3749462057166267
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "mKiPghdZ4Uk5lX-w4Y1tH",
+ "type": "text",
+ "x": 1061.935060831036,
+ "y": 6414.450441907708,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b56V",
+ "roundness": null,
+ "seed": 430602946,
+ "version": 5,
+ "versionNonce": 1597735298,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231111640,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "IVaK8j_txuT9yrEdoBgQK",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "LEUKXgUuncVLfiBmRZQ2A",
+ "type": "arrow",
+ "x": 1178.51079109983,
+ "y": 7453.6926432655055,
+ "width": 525.2008928571433,
+ "height": 131.4404296875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b58",
+ "roundness": null,
+ "seed": 1416214366,
+ "version": 2673,
+ "versionNonce": 998271375,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599708607,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.7059151785717859,
+ 131.4404296875
+ ],
+ [
+ -524.4949776785716,
+ 130.44084821428714
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "L78wOgpy8pDWjXSwV3BYk",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.6202394135483601,
+ 0.6202394135483709
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "JP2bWKUf7Fb63uqbsd-F8",
+ "type": "rectangle",
+ "x": 996.7196219890664,
+ "y": 8007.522225263337,
+ "width": 298.2265625,
+ "height": 56.9296875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b59",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 1692742402,
+ "version": 3185,
+ "versionNonce": 456234735,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "BCcEl3VgEw5D-SgZhdEhV"
+ },
+ {
+ "id": "bBqoGtM-q3qP_xCkpAMXx",
+ "type": "arrow"
+ },
+ {
+ "id": "JoDAbXFbZ4iXkcZiE0dn3",
+ "type": "arrow"
+ },
+ {
+ "id": "dASsTb-OFkdkZKJBx2InQ",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "BCcEl3VgEw5D-SgZhdEhV",
+ "type": "text",
+ "x": 1023.3930381267617,
+ "y": 8022.487069013337,
+ "width": 244.87973022460938,
+ "height": 27,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5A",
+ "roundness": null,
+ "seed": 764117698,
+ "version": 2844,
+ "versionNonce": 1726162799,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "text": "Delete VPC Security Group",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "JP2bWKUf7Fb63uqbsd-F8",
+ "originalText": "Delete VPC Security Group",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "JoDAbXFbZ4iXkcZiE0dn3",
+ "type": "arrow",
+ "x": 770.427432277713,
+ "y": 7744.586031404115,
+ "width": 405.40275289788997,
+ "height": 262.5498590917068,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5B",
+ "roundness": null,
+ "seed": 1666933662,
+ "version": 4855,
+ "versionNonce": 905600943,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "CyuIbNfIOjCFAGgLV-YVC"
+ }
+ ],
+ "updated": 1748599708607,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 405.40275289788997,
+ -1.4626681686431766
+ ],
+ [
+ 402.3888497799783,
+ 261.08719092306364
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "JP2bWKUf7Fb63uqbsd-F8",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5865306700942421,
+ 0.41346932990575286
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "CyuIbNfIOjCFAGgLV-YVC",
+ "type": "text",
+ "x": 1059.4012498315951,
+ "y": 7042.38566596471,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5BV",
+ "roundness": null,
+ "seed": 436521026,
+ "version": 5,
+ "versionNonce": 1240817410,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231136307,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "JoDAbXFbZ4iXkcZiE0dn3",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "bBqoGtM-q3qP_xCkpAMXx",
+ "type": "arrow",
+ "x": 1169.4739996960502,
+ "y": 8066.92288965213,
+ "width": 526.9445532284112,
+ "height": 157.07823727034702,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5D",
+ "roundness": null,
+ "seed": 1333138590,
+ "version": 3376,
+ "versionNonce": 349929455,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599708607,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 3.462637426086303,
+ 157.07823727034702
+ ],
+ [
+ -523.4819158023249,
+ 155.9794074464162
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "JP2bWKUf7Fb63uqbsd-F8",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5792808097402532,
+ 0.5792808097402218
+ ]
+ },
+ "endBinding": {
+ "elementId": "ZoHpPLiY4FPOkcTMW_57I",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.48276391323598405,
+ -0.1088909370679542
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "ZoHpPLiY4FPOkcTMW_57I",
+ "type": "diamond",
+ "x": 523.4618934101937,
+ "y": 8247.25424833198,
+ "width": 251.26171875000003,
+ "height": 236.921875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5F",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1566999938,
+ "version": 1920,
+ "versionNonce": 1350339023,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "mYZPKBfksw9EQCqCeUmBL"
+ },
+ {
+ "id": "bBqoGtM-q3qP_xCkpAMXx",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "mYZPKBfksw9EQCqCeUmBL",
+ "type": "text",
+ "x": 605.6873725361703,
+ "y": 8324.98471708198,
+ "width": 87.17990112304688,
+ "height": 81,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5G",
+ "roundness": null,
+ "seed": 1597932866,
+ "version": 1790,
+ "versionNonce": 1616525260,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756384533253,
+ "link": null,
+ "locked": false,
+ "text": "controller\ntags\nattached",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "ZoHpPLiY4FPOkcTMW_57I",
+ "originalText": "controller tags attached",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "lE7_DbMu4ZsB8OVPiLMDz",
+ "type": "diamond",
+ "x": 510.6038820761182,
+ "y": 8570.487983611485,
+ "width": 283.05143158244437,
+ "height": 199.0132943242099,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "MMSF9372btR21voQRo66D"
+ ],
+ "frameId": null,
+ "index": "b5H",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 749384770,
+ "version": 3365,
+ "versionNonce": 2129692719,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "s3--vgjnzIOiG9MQ4xjhJ",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "ts2UJrBP-gzhVnTmrt485",
+ "type": "text",
+ "x": 567.1596239594844,
+ "y": 8646.070139992657,
+ "width": 168.63986206054688,
+ "height": 43.2,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [
+ "MMSF9372btR21voQRo66D"
+ ],
+ "frameId": null,
+ "index": "b5I",
+ "roundness": null,
+ "seed": 2072960002,
+ "version": 1765,
+ "versionNonce": 564236335,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "s3--vgjnzIOiG9MQ4xjhJ",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599708607,
+ "link": null,
+ "locked": false,
+ "text": "status.vpc.\nControllerCreated=true",
+ "fontSize": 16,
+ "fontFamily": 6,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "status.vpc.\nControllerCreated=true",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "s3--vgjnzIOiG9MQ4xjhJ",
+ "type": "arrow",
+ "x": 647.1306280896056,
+ "y": 8478.38841655078,
+ "width": 1.7431640625,
+ "height": 94.12109375,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5J",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1065255774,
+ "version": 945,
+ "versionNonce": 878946831,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "LbKzsVxUQQg9QgcxJP8KW"
+ }
+ ],
+ "updated": 1748599708607,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.7431640625,
+ 94.12109375
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "ts2UJrBP-gzhVnTmrt485",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.49023877333729743,
+ 0.49023877333727084
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "LbKzsVxUQQg9QgcxJP8KW",
+ "type": "text",
+ "x": 640.2725772595716,
+ "y": 7823.335572421885,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5JV",
+ "roundness": null,
+ "seed": 1456933058,
+ "version": 4,
+ "versionNonce": 970168258,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231147841,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "s3--vgjnzIOiG9MQ4xjhJ",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "KR4iLcbEXQ7xlY_remFRk",
+ "type": "rectangle",
+ "x": 1008.2879571760591,
+ "y": 8639.752569517363,
+ "width": 298.2265625,
+ "height": 56.9296875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5K",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 1273347842,
+ "version": 3405,
+ "versionNonce": 1409251503,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "og1YAgJxF5MybErdCaZeN"
+ },
+ {
+ "id": "dSqFy90Y3bCys0t9bRDED",
+ "type": "arrow"
+ },
+ {
+ "id": "8dV3z622U8Rxf3mz_oWcZ",
+ "type": "arrow"
+ },
+ {
+ "id": "STW0GY2-Tw0roLxUmrOE2",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "og1YAgJxF5MybErdCaZeN",
+ "type": "text",
+ "x": 1104.8312921369966,
+ "y": 8654.717413267363,
+ "width": 105.139892578125,
+ "height": 27,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5L",
+ "roundness": null,
+ "seed": 2090503874,
+ "version": 3077,
+ "versionNonce": 2077370671,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "text": "Delete VPC",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "KR4iLcbEXQ7xlY_remFRk",
+ "originalText": "Delete VPC",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "8dV3z622U8Rxf3mz_oWcZ",
+ "type": "arrow",
+ "x": 768.4742473455116,
+ "y": 8364.592009353075,
+ "width": 406.3270197867954,
+ "height": 265.5619593537085,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5M",
+ "roundness": null,
+ "seed": 582413470,
+ "version": 5018,
+ "versionNonce": 377336399,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "1nkepePGosI-FBUXXbVHh"
+ }
+ ],
+ "updated": 1748599708607,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 405.7264136121763,
+ 3.6991621884981214
+ ],
+ [
+ 406.3270197867954,
+ 265.5619593537085
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "KR4iLcbEXQ7xlY_remFRk",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5554246294428957,
+ 0.4445753705570751
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "1nkepePGosI-FBUXXbVHh",
+ "type": "text",
+ "x": 1060.917659625762,
+ "y": 7662.386646678541,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5MV",
+ "roundness": null,
+ "seed": 952030978,
+ "version": 5,
+ "versionNonce": 1624126914,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231150498,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "8dV3z622U8Rxf3mz_oWcZ",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "dSqFy90Y3bCys0t9bRDED",
+ "type": "arrow",
+ "x": 1173.206830577457,
+ "y": 8703.35921482654,
+ "width": 527.2927870866029,
+ "height": 170.36214919285158,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5P",
+ "roundness": null,
+ "seed": 398145438,
+ "version": 3683,
+ "versionNonce": 1849804001,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748600322907,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -1.8947599315861225,
+ 170.36214919285158
+ ],
+ [
+ -527.2927870866029,
+ 165.98668373948385
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "KR4iLcbEXQ7xlY_remFRk",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5565004794098329,
+ 0.5565004794098206
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "VtQG7GlOsyd7isFQ7IMWP",
+ "type": "arrow",
+ "x": 646.1798903715522,
+ "y": 8766.601409500818,
+ "width": 0.849609375,
+ "height": 144.0478515625,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5Q",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 904582366,
+ "version": 954,
+ "versionNonce": 191015567,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "_IpECXYesPaIDGDrjweNM"
+ }
+ ],
+ "updated": 1748599708608,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.7961247294305167,
+ 56.87764409283773
+ ],
+ [
+ 0.849609375,
+ 144.0478515625
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "j_0H2qDfPMFq_eau43zeZ",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.44526478805499814,
+ 0.44526478805502323
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "_IpECXYesPaIDGDrjweNM",
+ "type": "text",
+ "x": 640.3781703827511,
+ "y": 8124.155762767994,
+ "width": 26.019989013671875,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5QV",
+ "roundness": null,
+ "seed": 487994626,
+ "version": 4,
+ "versionNonce": 1174053890,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1747231153918,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "VtQG7GlOsyd7isFQ7IMWP",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "egD8_tgr-mbrJQDHCtihg",
+ "type": "rectangle",
+ "x": 479.49533842074595,
+ "y": 8912.31757631625,
+ "width": 362.51953125,
+ "height": 82.6367187499998,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5R",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 280489182,
+ "version": 670,
+ "versionNonce": 378050991,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "j_0H2qDfPMFq_eau43zeZ",
+ "type": "text",
+ "x": 520.7232635510195,
+ "y": 8917.661495109382,
+ "width": 282.46380615234375,
+ "height": 37.800000000000004,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5V",
+ "roundness": null,
+ "seed": 1942521630,
+ "version": 373,
+ "versionNonce": 1019710415,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "VtQG7GlOsyd7isFQ7IMWP",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "text": "Cluster delete success",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "Cluster delete success",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "7jdWESJ1if4Z5FQjs2PI3",
+ "type": "arrow",
+ "x": 801.9210255715884,
+ "y": 4248.43695429108,
+ "width": 221.3225446428571,
+ "height": 3.091517857143117,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5q",
+ "roundness": null,
+ "seed": 895794846,
+ "version": 765,
+ "versionNonce": 24731887,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "JRe6kPeisXhgsWch_UGmW"
+ }
+ ],
+ "updated": 1748599708608,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 221.3225446428571,
+ 3.091517857143117
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "4hhFdsXwGM8bq_NrTqg5a",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5986607325792463,
+ 0.40133926742075543
+ ]
+ },
+ "endBinding": {
+ "elementId": "eYk5Jal5QnhVduMGA5Q06",
+ "mode": "inside",
+ "fixedPoint": [
+ 0.0011674003173228835,
+ 0.5529451723149902
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "JRe6kPeisXhgsWch_UGmW",
+ "type": "text",
+ "x": 878.6694489934333,
+ "y": 3546.463210618357,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5r",
+ "roundness": null,
+ "seed": 597967390,
+ "version": 5,
+ "versionNonce": 1356935006,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748586107669,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "7jdWESJ1if4Z5FQjs2PI3",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "BlekYWZtMW1SMx9MZes01",
+ "type": "arrow",
+ "x": 785.3317786632043,
+ "y": 4894.839974510268,
+ "width": 221.6852678571429,
+ "height": 3.1863839285715585,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5s",
+ "roundness": null,
+ "seed": 722062402,
+ "version": 911,
+ "versionNonce": 385560879,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "Uo4BLh00IKrkIaIS5CZFb"
+ }
+ ],
+ "updated": 1748599708608,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 221.6852678571429,
+ 3.1863839285715585
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "9XUeF705AHecEoDWhowB8",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5103622945928514,
+ 0.5103622945928784
+ ]
+ },
+ "endBinding": {
+ "elementId": "m8syNMl0bZYtMoSNuOeb3",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.284261164710815,
+ 0.7157388352892028
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "Uo4BLh00IKrkIaIS5CZFb",
+ "type": "text",
+ "x": 843.2927748862902,
+ "y": 4181.519014189776,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5t",
+ "roundness": null,
+ "seed": 239793154,
+ "version": 9,
+ "versionNonce": 916166046,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748586116895,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "BlekYWZtMW1SMx9MZes01",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "D0XUSc88F7fkJtOiA64Wi",
+ "type": "arrow",
+ "x": 790.6566402761923,
+ "y": 5545.812619519326,
+ "width": 212.02566964285688,
+ "height": 0.1897321428577925,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5u",
+ "roundness": null,
+ "seed": 384382594,
+ "version": 771,
+ "versionNonce": 1375417167,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "f0fGfaLwm1s7IkizP225Q"
+ }
+ ],
+ "updated": 1748599708608,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 212.02566964285688,
+ 0.1897321428577925
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "VfZLsdsCnfCIsgIdGQYv1",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.3997799409054596,
+ 0.6002200590945355
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "f0fGfaLwm1s7IkizP225Q",
+ "type": "text",
+ "x": 858.0583998862895,
+ "y": 4840.871692761193,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5v",
+ "roundness": null,
+ "seed": 390272578,
+ "version": 9,
+ "versionNonce": 1108363102,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748586128320,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "D0XUSc88F7fkJtOiA64Wi",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "NVArCg1yDudLuzww1KQGu",
+ "type": "arrow",
+ "x": 796.893798990271,
+ "y": 6149.891330206425,
+ "width": 212.02566964285688,
+ "height": 0.1897321428577925,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5w",
+ "roundness": null,
+ "seed": 2058888478,
+ "version": 629,
+ "versionNonce": 787171951,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "PqwpqseQ4of6c7h_xGqsw"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 212.02566964285688,
+ 0.1897321428577925
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "PqwpqseQ4of6c7h_xGqsw",
+ "type": "text",
+ "x": 841.9534891720018,
+ "y": 5440.464326689793,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5x",
+ "roundness": null,
+ "seed": 1626460510,
+ "version": 13,
+ "versionNonce": 273253122,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748586180053,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "NVArCg1yDudLuzww1KQGu",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "MKmpEKoFm5jQWYq5UGGiU",
+ "type": "arrow",
+ "x": 794.3816540551659,
+ "y": 6787.194812541856,
+ "width": 201.043526785714,
+ "height": 0.597098214286234,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5y",
+ "roundness": null,
+ "seed": 1850607518,
+ "version": 938,
+ "versionNonce": 1307963759,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "L-460DyKaW0zbp_YymRlv"
+ }
+ ],
+ "updated": 1748599708608,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 201.043526785714,
+ 0.597098214286234
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "19EopraoRs6X-rl877M2e",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.4509360002678727,
+ 0.5490639997321329
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "L-460DyKaW0zbp_YymRlv",
+ "type": "text",
+ "x": 880.6142034577158,
+ "y": 6083.829282046961,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b5z",
+ "roundness": null,
+ "seed": 1554473950,
+ "version": 14,
+ "versionNonce": 450329858,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748586198890,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "MKmpEKoFm5jQWYq5UGGiU",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "e_oHDoBsE4L0HIDDyeyva",
+ "type": "arrow",
+ "x": 790.5019127601753,
+ "y": 7413.865398485603,
+ "width": 201.043526785714,
+ "height": 0.597098214286234,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b62",
+ "roundness": null,
+ "seed": 1706660546,
+ "version": 758,
+ "versionNonce": 1428208303,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "4LgSf9i8ABVcXjhc1sPOG"
+ }
+ ],
+ "updated": 1748599707870,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 201.043526785714,
+ 0.597098214286234
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "4LgSf9i8ABVcXjhc1sPOG",
+ "type": "text",
+ "x": 873.5829534577159,
+ "y": 6716.061424904117,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b63",
+ "roundness": null,
+ "seed": 473819778,
+ "version": 18,
+ "versionNonce": 616228638,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748586222099,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "e_oHDoBsE4L0HIDDyeyva",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "dASsTb-OFkdkZKJBx2InQ",
+ "type": "arrow",
+ "x": 790.2953493015522,
+ "y": 8039.089804239729,
+ "width": 204.41406249999977,
+ "height": 0.0837053571422075,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b66",
+ "roundness": null,
+ "seed": 1084899742,
+ "version": 1091,
+ "versionNonce": 338946959,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "WAvsL-AiE0GcW7CsQUNVd"
+ }
+ ],
+ "updated": 1748599708608,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 204.41406249999977,
+ -0.0837053571422075
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "JP2bWKUf7Fb63uqbsd-F8",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.423108852445656,
+ 0.5768911475543504
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "WAvsL-AiE0GcW7CsQUNVd",
+ "type": "text",
+ "x": 873.6220159577152,
+ "y": 7341.43530883264,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b67",
+ "roundness": null,
+ "seed": 1265393118,
+ "version": 22,
+ "versionNonce": 1898126978,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748586280877,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "dASsTb-OFkdkZKJBx2InQ",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "STW0GY2-Tw0roLxUmrOE2",
+ "type": "arrow",
+ "x": 791.1689566655334,
+ "y": 8670.760783565487,
+ "width": 214.04575892857133,
+ "height": 4.1238839285715585,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b68",
+ "roundness": null,
+ "seed": 1297645022,
+ "version": 1108,
+ "versionNonce": 1894621615,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "JVTqnRY3mgCiAlrim_Pb1"
+ }
+ ],
+ "updated": 1748599708609,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 214.04575892857133,
+ 4.1238839285715585
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "KR4iLcbEXQ7xlY_remFRk",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.32381745998447814,
+ 0.6761825400155347
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "JVTqnRY3mgCiAlrim_Pb1",
+ "type": "text",
+ "x": 828.9233552434299,
+ "y": 7963.717674904075,
+ "width": 30.759963989257812,
+ "height": 27,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b69",
+ "roundness": null,
+ "seed": 1468600862,
+ "version": 22,
+ "versionNonce": 1538383426,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1748586310043,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "STW0GY2-Tw0roLxUmrOE2",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "yZZxBUh58_4qReaWbybgo",
+ "type": "arrow",
+ "x": 682.5982608804829,
+ "y": 10654.22161515563,
+ "width": 5.178156685985186,
+ "height": 204.60371339961966,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b6d",
+ "roundness": null,
+ "seed": 1429552225,
+ "version": 1198,
+ "versionNonce": 387510162,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "LxpTMM6Irz8TjHiwTQr6F"
+ }
+ ],
+ "updated": 1755059846035,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.178156685985186,
+ 204.60371339961966
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "9KjotsmVHbhavb9DKBLIX",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.48931108173725835,
+ 0.5001
+ ]
+ },
+ "endBinding": {
+ "elementId": "7puWwk8nvX7JQ0xvaOL8v",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5001,
+ 0.4526415187003624
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "LxpTMM6Irz8TjHiwTQr6F",
+ "type": "text",
+ "x": 646.2003367788501,
+ "y": 10726.340256749445,
+ "width": 26.019989013671875,
+ "height": 25,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b6dV",
+ "roundness": null,
+ "seed": 1000117217,
+ "version": 4,
+ "versionNonce": 978787169,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1750742345965,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "yZZxBUh58_4qReaWbybgo",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "5vTSKEbf2P3wnjLHCy8cU",
+ "type": "rectangle",
+ "x": 1316.4809736754505,
+ "y": 10988.784639098747,
+ "width": 322.8499742624368,
+ "height": 71.05566406249999,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b6g",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 599842337,
+ "version": 1291,
+ "versionNonce": 1673179598,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "Zv_NCla5dn9_ArE8m1nyH",
+ "type": "arrow"
+ },
+ {
+ "type": "text",
+ "id": "t2Hlu6Izg0XpZWJLPbezW"
+ },
+ {
+ "id": "TDn49-DxN3XtncyEYYf0c",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1755059691434,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "t2Hlu6Izg0XpZWJLPbezW",
+ "type": "text",
+ "x": 1374.3860786045204,
+ "y": 10999.312471129997,
+ "width": 207.03976440429688,
+ "height": 50,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b6gV",
+ "roundness": null,
+ "seed": 753520769,
+ "version": 212,
+ "versionNonce": 492783630,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1755059691434,
+ "link": null,
+ "locked": false,
+ "text": "Delete TransitGateway\nConnections",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "5vTSKEbf2P3wnjLHCy8cU",
+ "originalText": "Delete TransitGateway Connections",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "7puWwk8nvX7JQ0xvaOL8v",
+ "type": "diamond",
+ "x": 365.1555004126102,
+ "y": 10847.31271532566,
+ "width": 653.5677909782859,
+ "height": 398,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b6i",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 2107321903,
+ "version": 1718,
+ "versionNonce": 1244695502,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "G_y_3c695tDHzBD-E3NrJ"
+ },
+ {
+ "id": "2Z6VvaWnvv7VSvHb7c3sq",
+ "type": "arrow"
+ },
+ {
+ "id": "yZZxBUh58_4qReaWbybgo",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1755059744011,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "G_y_3c695tDHzBD-E3NrJ",
+ "type": "text",
+ "x": 534.6776056278848,
+ "y": 10992.31271532566,
+ "width": 314.73968505859375,
+ "height": 108,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b6j",
+ "roundness": null,
+ "seed": 1033080911,
+ "version": 1870,
+ "versionNonce": 1397880180,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756732950388,
+ "link": null,
+ "locked": false,
+ "text": " Tag is present\n powervs.cluster.x-k8s.io/owner/\n/TG:\nvpcconnection, powervsconnection",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "7puWwk8nvX7JQ0xvaOL8v",
+ "originalText": " Tag is present\n powervs.cluster.x-k8s.io/owner//TG: vpcconnection, powervsconnection ",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "2Z6VvaWnvv7VSvHb7c3sq",
+ "type": "arrow",
+ "x": 693.8390313271161,
+ "y": 11234.585860161287,
+ "width": 0.9753004709841662,
+ "height": 223.93381423949904,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b6p",
+ "roundness": null,
+ "seed": 235884161,
+ "version": 1703,
+ "versionNonce": 2145865170,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "lgS-eO0dvl_EoSEJEZGSy"
+ }
+ ],
+ "updated": 1755059897127,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.9753004709841662,
+ 223.93381423949904
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "7puWwk8nvX7JQ0xvaOL8v",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5041611581657156,
+ 0.5001
+ ]
+ },
+ "endBinding": {
+ "elementId": "BGMiPpUrvEfXvBmVPRkhq",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.45248085028437524,
+ 0.45248085028439305
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "lgS-eO0dvl_EoSEJEZGSy",
+ "type": "text",
+ "x": 654.5793345818772,
+ "y": 11181.176510649133,
+ "width": 26.019989013671875,
+ "height": 25,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b6pV",
+ "roundness": null,
+ "seed": 1523741761,
+ "version": 4,
+ "versionNonce": 1726598081,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1750690104782,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "2Z6VvaWnvv7VSvHb7c3sq",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "Zv_NCla5dn9_ArE8m1nyH",
+ "type": "arrow",
+ "x": 1009.419447689415,
+ "y": 11040.548662536818,
+ "width": 305.6244378715097,
+ "height": 2.338912273038659,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b6z",
+ "roundness": null,
+ "seed": 1152751119,
+ "version": 645,
+ "versionNonce": 1069644306,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "sEuHHWSXyEtsWJYNGe_YF"
+ }
+ ],
+ "updated": 1755059695471,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 305.6244378715097,
+ -2.338912273038659
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "5vTSKEbf2P3wnjLHCy8cU",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.3105661947214487,
+ 0.6894338052785163
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "sEuHHWSXyEtsWJYNGe_YF",
+ "type": "text",
+ "x": 939.4325628327218,
+ "y": 10950.220465082786,
+ "width": 30.759963989257812,
+ "height": 25,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b6zG",
+ "roundness": null,
+ "seed": 584407279,
+ "version": 5,
+ "versionNonce": 85255055,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1750690099688,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "Zv_NCla5dn9_ArE8m1nyH",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "BGMiPpUrvEfXvBmVPRkhq",
+ "type": "rectangle",
+ "x": 557.7598104523506,
+ "y": 11459.300705968217,
+ "width": 298.2265625,
+ "height": 71.05566406249999,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b71",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 636656847,
+ "version": 1544,
+ "versionNonce": 1469160590,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "YH7gFRYcubQVsk1vJDLwx"
+ },
+ {
+ "id": "oJ28g1-hj9vRI-GykuApN",
+ "type": "arrow"
+ },
+ {
+ "id": "2Z6VvaWnvv7VSvHb7c3sq",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1755059771033,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "YH7gFRYcubQVsk1vJDLwx",
+ "type": "text",
+ "x": 608.5032033966866,
+ "y": 11482.328537999467,
+ "width": 196.73977661132812,
+ "height": 25,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b71G",
+ "roundness": null,
+ "seed": 352666799,
+ "version": 231,
+ "versionNonce": 881515214,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1755059771033,
+ "link": null,
+ "locked": false,
+ "text": "Delete TransitGatway",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "BGMiPpUrvEfXvBmVPRkhq",
+ "originalText": "Delete TransitGatway",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "TDn49-DxN3XtncyEYYf0c",
+ "type": "arrow",
+ "x": 1428.4825722757132,
+ "y": 11066.516332198433,
+ "width": 738.6809895833329,
+ "height": 347.6442370510358,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b73",
+ "roundness": null,
+ "seed": 201846017,
+ "version": 1181,
+ "versionNonce": 2146522574,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1755059800001,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.9126548433041535,
+ 347.6442370510358
+ ],
+ [
+ -731.7683347400288,
+ 343.13772663436794
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "5vTSKEbf2P3wnjLHCy8cU",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.3451638233561237,
+ 0.654836176643871
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "_pobHaeleNG0CHV_TAxGF",
+ "type": "rectangle",
+ "x": 524.4108521190171,
+ "y": 10189.959560134796,
+ "width": 298.2265625,
+ "height": 71.05566406249999,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b77",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 126601985,
+ "version": 957,
+ "versionNonce": 1434849102,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "id": "PZmHQWzrHOy3IgVJBjGNR",
+ "type": "arrow"
+ },
+ {
+ "type": "text",
+ "id": "KWIZYKv6e10VdGJtObDdX"
+ }
+ ],
+ "updated": 1755059716567,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "KWIZYKv6e10VdGJtObDdX",
+ "type": "text",
+ "x": 570.0042511668687,
+ "y": 10212.987392166046,
+ "width": 207.03976440429688,
+ "height": 25,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b77V",
+ "roundness": null,
+ "seed": 999570255,
+ "version": 201,
+ "versionNonce": 1222833550,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1755059716567,
+ "link": null,
+ "locked": false,
+ "text": "Delete TransitGateway",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "_pobHaeleNG0CHV_TAxGF",
+ "originalText": "Delete TransitGateway",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "PZmHQWzrHOy3IgVJBjGNR",
+ "type": "arrow",
+ "x": 679.9204519698926,
+ "y": 10264.89751535146,
+ "width": 4.1812588161768645,
+ "height": 157.81337813786377,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b7A",
+ "roundness": null,
+ "seed": 1504018337,
+ "version": 1170,
+ "versionNonce": 892100242,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1755059838441,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 4.1812588161768645,
+ 157.81337813786377
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "_pobHaeleNG0CHV_TAxGF",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5180877193216302,
+ 0.5180877193216338
+ ]
+ },
+ "endBinding": {
+ "elementId": "9KjotsmVHbhavb9DKBLIX",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5001,
+ 0.38709615221081883
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "9KjotsmVHbhavb9DKBLIX",
+ "type": "diamond",
+ "x": 375.56965594211135,
+ "y": 10419.49247274859,
+ "width": 621.4554199871731,
+ "height": 236.921875,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b7B",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 386434255,
+ "version": 1658,
+ "versionNonce": 1389884626,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "RX28cgDZdAKwXbHOMborT"
+ },
+ {
+ "id": "yZZxBUh58_4qReaWbybgo",
+ "type": "arrow"
+ },
+ {
+ "id": "O7nnfwm_Qw_uR0nXDbsJn",
+ "type": "arrow"
+ },
+ {
+ "id": "PZmHQWzrHOy3IgVJBjGNR",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1755059833097,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "RX28cgDZdAKwXbHOMborT",
+ "type": "text",
+ "x": 550.8136531508187,
+ "y": 10524.22294149859,
+ "width": 271.2397155761719,
+ "height": 27,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b7C",
+ "roundness": null,
+ "seed": 2019365615,
+ "version": 1601,
+ "versionNonce": 157649554,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1755059833097,
+ "link": null,
+ "locked": false,
+ "text": "Check TransitGateway tagged",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "9KjotsmVHbhavb9DKBLIX",
+ "originalText": "Check TransitGateway tagged",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "O7nnfwm_Qw_uR0nXDbsJn",
+ "type": "arrow",
+ "x": 391.38174793635187,
+ "y": 10531.736044657966,
+ "width": 232.33337740077735,
+ "height": 500.76979063521685,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b7D",
+ "roundness": null,
+ "seed": 606127983,
+ "version": 1830,
+ "versionNonce": 103648786,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "b7d2qcXm6-C-tJYK8rhA6"
+ }
+ ],
+ "updated": 1755059833097,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -228.98782290066913,
+ -5.113235825245283
+ ],
+ [
+ -232.33337740077735,
+ 495.65655480997157
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "9KjotsmVHbhavb9DKBLIX",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.46466644748458324,
+ 0.5001
+ ]
+ },
+ "endBinding": {
+ "elementId": "IBf9CvTxg7XXfJsx2h2rm",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.461641081386107,
+ 0.46164108138610355
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "b7d2qcXm6-C-tJYK8rhA6",
+ "type": "text",
+ "x": 134.29258887438732,
+ "y": 10513.06812133272,
+ "width": 30.759963989257812,
+ "height": 25,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b7DV",
+ "roundness": null,
+ "seed": 667515937,
+ "version": 6,
+ "versionNonce": 1206610479,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1750744219846,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "O7nnfwm_Qw_uR0nXDbsJn",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "IBf9CvTxg7XXfJsx2h2rm",
+ "type": "rectangle",
+ "x": 21.134810452349598,
+ "y": 11028.268153884803,
+ "width": 298.2265625,
+ "height": 71.05566406249999,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b7E",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 399944751,
+ "version": 1481,
+ "versionNonce": 242362642,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "W298N8ohv14HnrHn6D1k6"
+ },
+ {
+ "id": "O7nnfwm_Qw_uR0nXDbsJn",
+ "type": "arrow"
+ },
+ {
+ "id": "oJ28g1-hj9vRI-GykuApN",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1755059623202,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "W298N8ohv14HnrHn6D1k6",
+ "type": "text",
+ "x": 66.72820950020116,
+ "y": 11038.795985916053,
+ "width": 207.03976440429688,
+ "height": 50,
+ "angle": 0.005569407063674703,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b7F",
+ "roundness": null,
+ "seed": 1068453455,
+ "version": 737,
+ "versionNonce": 1949251282,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1755059623202,
+ "link": null,
+ "locked": false,
+ "text": "Delete TransitGateway\nConnections",
+ "fontSize": 20,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "IBf9CvTxg7XXfJsx2h2rm",
+ "originalText": "Delete TransitGateway Connections",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "oJ28g1-hj9vRI-GykuApN",
+ "type": "arrow",
+ "x": 164.43003113578573,
+ "y": 11108.163172441366,
+ "width": 394.30047194113854,
+ "height": 377.6001447440831,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b7H",
+ "roundness": null,
+ "seed": 599997025,
+ "version": 2013,
+ "versionNonce": 307734158,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1755059783637,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -1.89417901676984,
+ 376.81770930799394
+ ],
+ [
+ 392.4062929243687,
+ 377.6001447440831
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "IBf9CvTxg7XXfJsx2h2rm",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.4812416327606775,
+ 0.518758367239328
+ ]
+ },
+ "endBinding": {
+ "elementId": "BGMiPpUrvEfXvBmVPRkhq",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.3784394629509141,
+ 0.37843946295086356
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "nfeQ1NCZqpm9aXRVt18Fi",
+ "type": "rectangle",
+ "x": 576.760310858604,
+ "y": -512.1554385824284,
+ "width": 399.6516927083334,
+ "height": 101.21744791666607,
+ "angle": 0.00529850823430511,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAa",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 950000460,
+ "version": 1475,
+ "versionNonce": 1091796940,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "HcWFEUXSQLA19MsjF_3VP"
+ },
+ {
+ "id": "EjkkJcxAwdjQLTaPBw0Pf",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "HcWFEUXSQLA19MsjF_3VP",
+ "type": "text",
+ "x": 685.3202117782004,
+ "y": -479.04671462409533,
+ "width": 182.53189086914062,
+ "height": 35,
+ "angle": 0.00529850823430511,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAaV",
+ "roundness": null,
+ "seed": 260485364,
+ "version": 1065,
+ "versionNonce": 480880204,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false,
+ "text": "Create Cluster",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "nfeQ1NCZqpm9aXRVt18Fi",
+ "originalText": "Create Cluster",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "fH3MqEp4cYUP6vbNQII0A",
+ "type": "rectangle",
+ "x": 575.0143338778043,
+ "y": -185.2531544164267,
+ "width": 398.8420188331062,
+ "height": 91.53975412963081,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAc",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 1786558156,
+ "version": 3400,
+ "versionNonce": 869630796,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "97yc5QNUabvVGy0CJReIN"
+ }
+ ],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "97yc5QNUabvVGy0CJReIN",
+ "type": "text",
+ "x": 628.9894204427949,
+ "y": -156.98327735161092,
+ "width": 290.891845703125,
+ "height": 35,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAd",
+ "roundness": null,
+ "seed": 1372847436,
+ "version": 2051,
+ "versionNonce": 2136947148,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false,
+ "text": "Reconciling a Resource",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "fH3MqEp4cYUP6vbNQII0A",
+ "originalText": "Reconciling a Resource",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "EjkkJcxAwdjQLTaPBw0Pf",
+ "type": "arrow",
+ "x": 762.466358266722,
+ "y": -403.8802185150689,
+ "width": 2.839007063555073,
+ "height": 205.43394300106866,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAg",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 446069836,
+ "version": 5320,
+ "versionNonce": 2063584756,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163176,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.839007063555073,
+ 205.43394300106866
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "nfeQ1NCZqpm9aXRVt18Fi",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.4670129360250078,
+ 1.0705037963143331
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "pXxpFBtm3Qzx4ewsQBcwk",
+ "type": "diamond",
+ "x": 470.3642708995071,
+ "y": 104.51254278034776,
+ "width": 574.5927048765312,
+ "height": 288.7165012844644,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAi",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1816903796,
+ "version": 4281,
+ "versionNonce": 37850802,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "VaJQc4DUoVZScIiXBlhyi"
+ },
+ {
+ "id": "sBD-vhayg3Cmb16iEaEdW",
+ "type": "arrow"
+ },
+ {
+ "id": "3ZCMGbkDQBaoVjwBwrhMb",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1764905794479,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "VaJQc4DUoVZScIiXBlhyi",
+ "type": "text",
+ "x": 627.630885839343,
+ "y": 221.8363415608701,
+ "width": 259.76312255859375,
+ "height": 53.71065308118645,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAj",
+ "roundness": null,
+ "seed": 1533252084,
+ "version": 4477,
+ "versionNonce": 1162050892,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false,
+ "text": "Check resource exist in cloud\nwith given name/ID",
+ "fontSize": 19.8928344745135,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "pXxpFBtm3Qzx4ewsQBcwk",
+ "originalText": "Check resource exist in cloud with given name/ID",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "sBD-vhayg3Cmb16iEaEdW",
+ "type": "arrow",
+ "x": 761.8997378939193,
+ "y": -98.6452994587562,
+ "width": 1.1213752233753667,
+ "height": 211.05655900542024,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAk",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1873319116,
+ "version": 4935,
+ "versionNonce": 1664741236,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163176,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.1213752233753667,
+ 211.05655900542024
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "pXxpFBtm3Qzx4ewsQBcwk",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5079850472295931,
+ 0.5001
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "T7t2CX1NjE6Y7gYe4d-m2",
+ "type": "arrow",
+ "x": 752.27049109213,
+ "y": 395.61864281719227,
+ "width": 3.601666212005739,
+ "height": 241.8368398890825,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAl",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 911955188,
+ "version": 4977,
+ "versionNonce": 1387520244,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "7tCFZjbpSAa04lQxHMeKD"
+ }
+ ],
+ "updated": 1756804163176,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 3.601666212005739,
+ 241.8368398890825
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": {
+ "elementId": "82q7kyJaM3QsQYoEbW9ef",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.44998247855125145,
+ -0.21676086949033213
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "7tCFZjbpSAa04lQxHMeKD",
+ "type": "text",
+ "x": 574.9214125378154,
+ "y": -4102.201624676858,
+ "width": 36.427978515625,
+ "height": 35,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAlV",
+ "roundness": null,
+ "seed": 1028927948,
+ "version": 4,
+ "versionNonce": 1689709516,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756731256212,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "T7t2CX1NjE6Y7gYe4d-m2",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "82q7kyJaM3QsQYoEbW9ef",
+ "type": "rectangle",
+ "x": 575.2466816356978,
+ "y": 657.4259210376767,
+ "width": 398.8420188331062,
+ "height": 91.53975412963081,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAo",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 512687180,
+ "version": 3563,
+ "versionNonce": 1817187404,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "T04EDGmv_Q8CLoCgstLiv"
+ },
+ {
+ "id": "Ifz7YoCjZB8btvf6s0rsb",
+ "type": "arrow"
+ },
+ {
+ "id": "3iAg_6hBWmxCbjPuqp1cX",
+ "type": "arrow"
+ },
+ {
+ "id": "T7t2CX1NjE6Y7gYe4d-m2",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "T04EDGmv_Q8CLoCgstLiv",
+ "type": "text",
+ "x": 671.0957458618212,
+ "y": 685.6957981024921,
+ "width": 207.14389038085938,
+ "height": 35,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAp",
+ "roundness": null,
+ "seed": 646025932,
+ "version": 2218,
+ "versionNonce": 1281338060,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false,
+ "text": "Create Resource",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "82q7kyJaM3QsQYoEbW9ef",
+ "originalText": "Create Resource",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "l7tUOzVDJBndDLUHtsGdR",
+ "type": "rectangle",
+ "x": 548.6756693988951,
+ "y": 916.9958098178909,
+ "width": 398.8420188331062,
+ "height": 91.53975412963081,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAs",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 658233676,
+ "version": 3680,
+ "versionNonce": 1237181644,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "RNjdUAQnkpk2MFs75Rstm"
+ }
+ ],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "RNjdUAQnkpk2MFs75Rstm",
+ "type": "text",
+ "x": 610.4207754951358,
+ "y": 945.2656868827062,
+ "width": 275.351806640625,
+ "height": 35,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAt",
+ "roundness": null,
+ "seed": 529190860,
+ "version": 2346,
+ "versionNonce": 1287613260,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false,
+ "text": "Attach controller tags",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "l7tUOzVDJBndDLUHtsGdR",
+ "originalText": "Attach controller tags",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "Ifz7YoCjZB8btvf6s0rsb",
+ "type": "arrow",
+ "x": 752.9977311963812,
+ "y": 766.2273760271378,
+ "width": 4.271763298165183,
+ "height": 141.12726739867367,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAv",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1457427148,
+ "version": 5264,
+ "versionNonce": 79639540,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163177,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 4.271763298165183,
+ 141.12726739867367
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "82q7kyJaM3QsQYoEbW9ef",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.44773198736286035,
+ 1.1898537559922004
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "jZ98SVwIoDbXCMrZrFhN7",
+ "type": "diamond",
+ "x": 1228.244250564448,
+ "y": 576.6159473135594,
+ "width": 372.9989490723193,
+ "height": 213.1060663791305,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAw",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 643680588,
+ "version": 4050,
+ "versionNonce": 1392379980,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "x8yhpheN5VU1YcSvsXLI7"
+ },
+ {
+ "id": "0x3yQxYx0edxQ0uzGrgv1",
+ "type": "arrow"
+ },
+ {
+ "id": "3iAg_6hBWmxCbjPuqp1cX",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "x8yhpheN5VU1YcSvsXLI7",
+ "type": "text",
+ "x": 1328.559333596688,
+ "y": 656.537137367749,
+ "width": 171.8693084716797,
+ "height": 53.71065308118645,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAx",
+ "roundness": null,
+ "seed": 1156497356,
+ "version": 4164,
+ "versionNonce": 288300748,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false,
+ "text": "ibmpowervscluster\n.spec.Tags > 0",
+ "fontSize": 19.8928344745135,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "jZ98SVwIoDbXCMrZrFhN7",
+ "originalText": "ibmpowervscluster.spec.Tags > 0",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "o0qkqriMeVdrvBzUTOE4A",
+ "type": "arrow",
+ "x": 1586.7724597097276,
+ "y": 680.9525892816,
+ "width": 250.6645998217674,
+ "height": 330.27918573779584,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bAz",
+ "roundness": null,
+ "seed": 625522892,
+ "version": 6777,
+ "versionNonce": 763462220,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "MjdePv6GwrqsYXmit_W1Q"
+ }
+ ],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 248.62480151389195,
+ -1.4378931735250262
+ ],
+ [
+ 250.6645998217674,
+ 328.8412925642708
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "MjdePv6GwrqsYXmit_W1Q",
+ "type": "text",
+ "x": 1833.9809451881536,
+ "y": -4088.367533913472,
+ "width": 30.590789794921875,
+ "height": 26.855326540593225,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bB0",
+ "roundness": null,
+ "seed": 399490892,
+ "version": 248,
+ "versionNonce": 1208114804,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756731427248,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 19.8928344745135,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "o0qkqriMeVdrvBzUTOE4A",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "eOjYfm5JCMcaO125Ll29F",
+ "type": "rectangle",
+ "x": 1624.0529678071632,
+ "y": 1023.7303331169942,
+ "width": 398.8420188331062,
+ "height": 91.53975412963081,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bB1",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 296569804,
+ "version": 3581,
+ "versionNonce": 20142284,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "XCF3MMynUmTGYUJoTOrJd"
+ },
+ {
+ "id": "eyDgfRvIKvlfr67ExeHLl",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "XCF3MMynUmTGYUJoTOrJd",
+ "type": "text",
+ "x": 1660.4720851338725,
+ "y": 1052.0002101818095,
+ "width": 326.0037841796875,
+ "height": 35,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bB2",
+ "roundness": null,
+ "seed": 1344926284,
+ "version": 2250,
+ "versionNonce": 1566990156,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false,
+ "text": "Attach user provided tags",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "eOjYfm5JCMcaO125Ll29F",
+ "originalText": "Attach user provided tags",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "3ZCMGbkDQBaoVjwBwrhMb",
+ "type": "arrow",
+ "x": 476.73639926240844,
+ "y": 243.58889938203552,
+ "width": 578.4027675024629,
+ "height": 292.66521629918327,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBB",
+ "roundness": null,
+ "seed": 1247521100,
+ "version": 5696,
+ "versionNonce": 1878216242,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "so_fExPKC3249OtRX_5ox"
+ }
+ ],
+ "updated": 1764905808163,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -575.7870355412118,
+ -15.030456066974779
+ ],
+ [
+ -578.4027675024629,
+ 277.63476023220846
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "pXxpFBtm3Qzx4ewsQBcwk",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5001,
+ 0.39966459580747915
+ ]
+ },
+ "endBinding": {
+ "elementId": "j2ToZjEliXTQUMxwwloYD",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.4960494381253402,
+ -0.023044966856400007
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "so_fExPKC3249OtRX_5ox",
+ "type": "text",
+ "x": -177.1619249993995,
+ "y": 285.4203810604397,
+ "width": 43.06396484375,
+ "height": 35,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBC",
+ "roundness": null,
+ "seed": 1848680396,
+ "version": 20,
+ "versionNonce": 637541678,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1764905790717,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "3ZCMGbkDQBaoVjwBwrhMb",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "j2ToZjEliXTQUMxwwloYD",
+ "type": "diamond",
+ "x": -389.68992249834935,
+ "y": 521.3485638296265,
+ "width": 574.5927048765312,
+ "height": 288.7165012844644,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBD",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 1877575924,
+ "version": 4699,
+ "versionNonce": 637723950,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "0eW9gZIzZBTQLNfJaxSES"
+ },
+ {
+ "id": "X4uJC0nNRdz3GEijpjMCV",
+ "type": "arrow"
+ },
+ {
+ "id": "3ZCMGbkDQBaoVjwBwrhMb",
+ "type": "arrow"
+ },
+ {
+ "id": "cJqKuYIUjmamB_Bsm3lbC",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1764905833833,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "0eW9gZIzZBTQLNfJaxSES",
+ "type": "text",
+ "x": -214.2339230980641,
+ "y": 625.244699339853,
+ "width": 223.3843536376953,
+ "height": 80.56597962177968,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBE",
+ "roundness": null,
+ "seed": 691292788,
+ "version": 4945,
+ "versionNonce": 400086958,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1764905768280,
+ "link": null,
+ "locked": false,
+ "text": "Check Tag exists\npowervs.cluster.x-\nk8s.io/cluster-uuid: UUID",
+ "fontSize": 19.8928344745135,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "j2ToZjEliXTQUMxwwloYD",
+ "originalText": "Check Tag exists powervs.cluster.x-k8s.io/cluster-uuid: UUID",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "0x3yQxYx0edxQ0uzGrgv1",
+ "type": "arrow",
+ "x": 1413.0505549108211,
+ "y": 784.8934909066143,
+ "width": 656.4251814246463,
+ "height": 355.89294795377555,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBO",
+ "roundness": null,
+ "seed": 2042814028,
+ "version": 6643,
+ "versionNonce": 1414645492,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "jO2zegamM9RmpPouflAWZ"
+ }
+ ],
+ "updated": 1756804163177,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.025573558754786,
+ 351.71602410620017
+ ],
+ [
+ -654.3996078658915,
+ 355.89294795377555
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "jZ98SVwIoDbXCMrZrFhN7",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5001,
+ 0.9515916138055671
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "jO2zegamM9RmpPouflAWZ",
+ "type": "text",
+ "x": 1247.9044077033577,
+ "y": -3275.515963885149,
+ "width": 25.876876831054688,
+ "height": 26.855326540593225,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBP",
+ "roundness": null,
+ "seed": 1961440460,
+ "version": 244,
+ "versionNonce": 459234804,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756732519487,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 19.8928344745135,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "0x3yQxYx0edxQ0uzGrgv1",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.35
+ },
+ {
+ "id": "X4uJC0nNRdz3GEijpjMCV",
+ "type": "arrow",
+ "x": -108.20518216289459,
+ "y": 813.5614785081144,
+ "width": 650.3103437747791,
+ "height": 542.3400892818564,
+ "angle": 0.00529850823430511,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBR",
+ "roundness": null,
+ "seed": 856140620,
+ "version": 3367,
+ "versionNonce": 1470369714,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "F7DobqNja55xoM-bd9SBc"
+ }
+ ],
+ "updated": 1764905893105,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 3.37970995274479,
+ 542.3400892818564
+ ],
+ [
+ 650.3103437747791,
+ 540.4971422974954
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "j2ToZjEliXTQUMxwwloYD",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.492157448904391,
+ 0.5001
+ ]
+ },
+ "endBinding": {
+ "elementId": "JItiKAJdHVh4-6-RhsPke",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.4358085223502459,
+ 0.4358085223502474
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false,
+ "moveMidPointsWithElement": false
+ },
+ {
+ "id": "F7DobqNja55xoM-bd9SBc",
+ "type": "text",
+ "x": -127.78947403703992,
+ "y": 1336.6944616544556,
+ "width": 43.06396484375,
+ "height": 35,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBS",
+ "roundness": null,
+ "seed": 1451622476,
+ "version": 12,
+ "versionNonce": 943679790,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1764905883720,
+ "link": null,
+ "locked": false,
+ "text": "Yes",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "X4uJC0nNRdz3GEijpjMCV",
+ "originalText": "Yes",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "0hyMfmVweGO-G03ynDbpu",
+ "type": "arrow",
+ "x": 748.7471636643821,
+ "y": 1015.7049121776577,
+ "width": 1.4784870047302547,
+ "height": 278.93582627090063,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBT",
+ "roundness": {
+ "type": 2
+ },
+ "seed": 107534836,
+ "version": 4634,
+ "versionNonce": 900859596,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163162,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -1.4784870047302547,
+ 278.93582627090063
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": null,
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "eyDgfRvIKvlfr67ExeHLl",
+ "type": "arrow",
+ "x": 1756.830350217199,
+ "y": 1120.069186010825,
+ "width": 997.8088329967609,
+ "height": 112.91602998581038,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBU",
+ "roundness": null,
+ "seed": 1537325388,
+ "version": 5745,
+ "versionNonce": 1400650612,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163177,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.0066537490261,
+ 110.0677200935952
+ ],
+ [
+ -995.8021792477348,
+ 112.91602998581038
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "eOjYfm5JCMcaO125Ll29F",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.33459431382553484,
+ 1.0904812128286914
+ ]
+ },
+ "endBinding": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "JItiKAJdHVh4-6-RhsPke",
+ "type": "rectangle",
+ "x": 551.6299241780572,
+ "y": 1300.328551457649,
+ "width": 401.017466076887,
+ "height": 128.59340816713527,
+ "angle": 0.00529850823430511,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBV",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 641915892,
+ "version": 1648,
+ "versionNonce": 565963634,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "a81QibPMWzsnPNYlwYRYO"
+ },
+ {
+ "id": "DXCxhDiJClICci4-Va71d",
+ "type": "arrow"
+ },
+ {
+ "id": "X4uJC0nNRdz3GEijpjMCV",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1764905883714,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "a81QibPMWzsnPNYlwYRYO",
+ "type": "text",
+ "x": 601.9047399801725,
+ "y": 1347.1252555412166,
+ "width": 300.46783447265625,
+ "height": 35,
+ "angle": 0.00529850823430511,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBW",
+ "roundness": null,
+ "seed": 250297716,
+ "version": 1241,
+ "versionNonce": 1589201484,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1757315003640,
+ "link": null,
+ "locked": false,
+ "text": "End Resource Reconcile",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "JItiKAJdHVh4-6-RhsPke",
+ "originalText": "End Resource Reconcile",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "3iAg_6hBWmxCbjPuqp1cX",
+ "type": "arrow",
+ "x": 983.538120281086,
+ "y": 688.1115960599573,
+ "width": 256.25166170672594,
+ "height": 1.7768332285650104,
+ "angle": 0.00529850823430511,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBY",
+ "roundness": null,
+ "seed": 1508779468,
+ "version": 2301,
+ "versionNonce": 370339444,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756804163177,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 256.25166170672594,
+ -1.7768332285650104
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "82q7kyJaM3QsQYoEbW9ef",
+ "mode": "orbit",
+ "fixedPoint": [
+ 1.0234278500998586,
+ 0.31368846806678086
+ ]
+ },
+ "endBinding": {
+ "elementId": "jZ98SVwIoDbXCMrZrFhN7",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.5001,
+ 0.5166990377894866
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false
+ },
+ {
+ "id": "mOAA6uHElNEkA2oOA_o33",
+ "type": "text",
+ "x": -1439.0836466312014,
+ "y": -3737.809213796841,
+ "width": 36.427978515625,
+ "height": 35,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBb",
+ "roundness": null,
+ "seed": 1516125260,
+ "version": 13,
+ "versionNonce": 2061585524,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1756737961621,
+ "link": null,
+ "locked": false,
+ "text": "No",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "cJqKuYIUjmamB_Bsm3lbC",
+ "originalText": "No",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "sQeIk_ZOTTVi9TS5VMyzx",
+ "type": "rectangle",
+ "x": -1012.2238696107573,
+ "y": 875.8325253877181,
+ "width": 399.6516927083334,
+ "height": 101.21744791666607,
+ "angle": 0.00529850823430511,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBc",
+ "roundness": {
+ "type": 3
+ },
+ "seed": 1991321076,
+ "version": 2104,
+ "versionNonce": 651057070,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "VIkM_e5U3TLDTQkQlABGh"
+ },
+ {
+ "id": "DXCxhDiJClICci4-Va71d",
+ "type": "arrow"
+ },
+ {
+ "id": "cJqKuYIUjmamB_Bsm3lbC",
+ "type": "arrow"
+ }
+ ],
+ "updated": 1764905836197,
+ "link": null,
+ "locked": false
+ },
+ {
+ "id": "cJqKuYIUjmamB_Bsm3lbC",
+ "type": "arrow",
+ "x": -371.5276629498194,
+ "y": 665.328692438714,
+ "width": 376.76991361672304,
+ "height": 201.00667173873808,
+ "angle": 0.006186400290492777,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBcV",
+ "roundness": null,
+ "seed": 253941196,
+ "version": 5911,
+ "versionNonce": 1477769582,
+ "isDeleted": false,
+ "boundElements": [
+ {
+ "type": "text",
+ "id": "mOAA6uHElNEkA2oOA_o33"
+ }
+ ],
+ "updated": 1764905857224,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -373.5384550222311,
+ 0.5579674688038949
+ ],
+ [
+ -376.76991361672304,
+ 201.00667173873808
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "j2ToZjEliXTQUMxwwloYD",
+ "mode": "inside",
+ "fixedPoint": [
+ 0.03270093405276979,
+ 0.5084870179005754
+ ]
+ },
+ "endBinding": {
+ "elementId": "sQeIk_ZOTTVi9TS5VMyzx",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.6578453985960068,
+ -0.06635223686085139
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false,
+ "moveMidPointsWithElement": false
+ },
+ {
+ "id": "VIkM_e5U3TLDTQkQlABGh",
+ "type": "text",
+ "x": -987.8458992331531,
+ "y": 908.9412493460511,
+ "width": 350.895751953125,
+ "height": 35,
+ "angle": 0.00529850823430511,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBd",
+ "roundness": null,
+ "seed": 251676532,
+ "version": 1747,
+ "versionNonce": 1280118706,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1764905819711,
+ "link": null,
+ "locked": false,
+ "text": "Error to user, Stale resource",
+ "fontSize": 28,
+ "fontFamily": 6,
+ "textAlign": "center",
+ "verticalAlign": "middle",
+ "containerId": "sQeIk_ZOTTVi9TS5VMyzx",
+ "originalText": "Error to user, Stale resource",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "DXCxhDiJClICci4-Va71d",
+ "type": "arrow",
+ "x": -753.4360371474313,
+ "y": 988.3632516144972,
+ "width": 1294.5708330024945,
+ "height": 417.2600887138275,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "transparent",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "bBh",
+ "roundness": null,
+ "seed": 871199436,
+ "version": 883,
+ "versionNonce": 824179634,
+ "isDeleted": false,
+ "boundElements": [],
+ "updated": 1764905888604,
+ "link": null,
+ "locked": false,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 4.573910434116897,
+ 405.96670506865837
+ ],
+ [
+ 1294.5708330024945,
+ 417.2600887138275
+ ]
+ ],
+ "lastCommittedPoint": null,
+ "startBinding": {
+ "elementId": "sQeIk_ZOTTVi9TS5VMyzx",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.648135951616616,
+ 1.0427737868544718
+ ]
+ },
+ "endBinding": {
+ "elementId": "JItiKAJdHVh4-6-RhsPke",
+ "mode": "orbit",
+ "fixedPoint": [
+ 0.1735580333731566,
+ 0.8264419666268441
+ ]
+ },
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "elbowed": false,
+ "moveMidPointsWithElement": false
+ }
+ ],
+ "appState": {
+ "gridSize": 20,
+ "gridStep": 5,
+ "gridModeEnabled": false,
+ "viewBackgroundColor": "#ffffff",
+ "lockedMultiSelections": {}
+ },
+ "files": {}
+}
\ No newline at end of file
diff --git a/docs/images/add-tag-workflow.png b/docs/images/add-tag-workflow.png
new file mode 100644
index 0000000000..eeeed2580f
Binary files /dev/null and b/docs/images/add-tag-workflow.png differ
diff --git a/docs/images/delete-tag-workflow.png b/docs/images/delete-tag-workflow.png
new file mode 100644
index 0000000000..b10abfa6dd
Binary files /dev/null and b/docs/images/delete-tag-workflow.png differ
diff --git a/docs/images/transitgateway-delete-tag-flow.png b/docs/images/transitgateway-delete-tag-flow.png
new file mode 100644
index 0000000000..d9969c36b9
Binary files /dev/null and b/docs/images/transitgateway-delete-tag-flow.png differ
diff --git a/docs/proposal/controller-and-user-tags.md b/docs/proposal/controller-and-user-tags.md
new file mode 100644
index 0000000000..309356c16d
--- /dev/null
+++ b/docs/proposal/controller-and-user-tags.md
@@ -0,0 +1,98 @@
+# Tagging PowerVS cluster resources for lifecycle management
+
+
+## Motivation
+PowerVS cluster creation supports both creating infrastructure and using existing resources required for cluster creation.
+PowerVS cluster reconciler sets [controllerCreated](https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud/blob/48aebb99c3cd8ce65b95dcfceee8f52daf3d5a31/api/v1beta2/ibmpowervscluster_types.go#L181) field whenever resource is created by controller, which was initially introduced to allow proper cleanup of newly created resources. ControllerCreated field will be set for respective resources under `IBMPowerVSCluster.Status`.
+
+Though its working as expected and fulfills the purpose, we see some drawbacks.
+1. The field is initially set to true during the first reconciliation cycle when the resource is being created. In subsequent reconciliation loops, the field is not updated because the resource already exists in the cloud(created during first reconciliation). This behavior introduces non-idempotency in the controller logic. As a result, if the initial reconciliation event is missed, the controller exhibits inconsistent behavior. Its against Kubernetes principle of reconciliation of having level trigger rather than edge triggered.
+2. The Status field in resource object gets created from spec. Considering the scenario of backup and recover, if we move the spec to fresh management cluster which is setting the status, the ControllerCreated will be set as false as the resource already exists in cloud but it was created during its previous reconciliation.
+
+## Goal
+1. Tag newly created PowerVS Cluster's cloud resources and delete the resources based on tag.
+2. Provide ability to set custom tags to cloud resources.
+
+## Non-Goals
+1. Deprecate and remove controllerCreated flag.
+2. Tag user provided resources.
+
+## Proposal
+This proposal presents adding two kinds of tags to the resources created by controller
+1. Controller tags
+2. User tags
+
+
+### Controller tags
+ When cluster creation is triggered, resources gets created in the cloud. So to distinguish whether resources are newly created or user has given pre-existing resources,
+ tag of format `powervs.cluster.x-k8s.io/cluster-uuid: UUID` will be added by the controller to newly created cloud resources marking the resource as created by controller.
+ During cluster creation with infrastructure creation if the resources are already present with the same name in the cloud. It will lead to security issues because there is a possibilty the existing resources in the cloud belong to different user. So to handle this scenario tag of this `powervs.cluster.x-k8s.io/cluster-uuid: UUID` is added. UUID in tag `powervs.cluster.x-k8s.io/cluster-uuid: UUID` represents cluster object ID.
+
+ During deletion phase the system will look for the presence of the tag and match inorder to proceed with deletion or to keep as it is.
+
+ Below are the cluster creation scenarios.
+ #### Creating a new cluster
+ - When resources will be created for new cluster in the cloud the tag will be attached. During deletion flow, will check for tag `powervs.cluster.x-k8s.io/cluster-uuid: UUID` and delete the resources.
+ #### Creating a new cluster with reusing pre-created resources
+ - When cluster is created using existing resources, no tag will be attached. We won't delete these resources, as these were not created by controller.
+ #### Creating a new cluster with reusing pre-created resources from old cluster.
+ - When cluster creation is triggered with clustername "test-cluster", resources like "test-cluster-serviceInstance, test-cluster-VPC, test-cluster-loadbalancer, test-cluster-TransitGateway, test-cluster-COSInstance" are created. When trying to create the resources in the cloud, since the resources already exists with same name but tag `powervs.cluster.x-k8s.io/cluster-uuid: UUID` won't match because UUIDs of cluster objects will be different. So in this case will error out to user that resources with similar name already exist, user has to provide different name to cluster.
+
+
+#### Following resources will be getting tagged
+1. [PowerVS workspace](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-creating-power-virtual-server)
+2. [PowerVS Network](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-configuring-subnet) [DHCP server]
+3. [VPC](https://cloud.ibm.com/docs/vpc?topic=vpc-about-vpc)
+4. [VPC Subnet](https://cloud.ibm.com/docs/vpc?topic=vpc-about-networking-for-vpc)
+5. [VPC Security Groups](https://cloud.ibm.com/docs/vpc?topic=vpc-security-in-your-vpc)
+6. [Transit Gateway](https://www.ibm.com/products/transit-gateway)
+7. [VPC Loadbalancer](https://www.ibm.com/products/load-balancer)
+8. [COS Instance](https://www.ibm.com/products/cloud-object-storage)
+
+#### Note
+- When TransitGateway is tagged we can delete connections. But there is case when TransitGateway is not newly created but connections are newly created. But we cannot delete connections since it doesn't support tagging. So to delete TransitGateway connections have to add tag `powervs.cluster.x-k8s.io/owner//TG: vpcconnection, powervsconnection` to TransitGateway. So will check if this tag is added to TransitGateway, will move with the deletion of connections.
+
+- To handle deletion DHCP server, have to tag DHCP Network. DHCP server doesn't support tagging.
+
+### User tags
+User can add tags to resources when creating PowerVS cluster. Incase of already existing resources, will just attach the user tags and during deletion user tags will be deleted as well.
+
+#### Proposed API changes
+UserTags field will contain list of tags that will be attached to resources.
+
+```shell
+
+// IBMPowerVSClusterSpec defines the desired state of IBMPowerVSCluster.
+type IBMPowerVSClusterSpec struct {
+
+ // Tags contains list of tags needs to be attached to resources
+ Tags []Tag `json:"tags,omitempty"`
+ .
+ .
+ .
+
+}
+
+// Tag defines single tag in pair
+type Tag struct {
+ Key string `json:"key,omitempty"`
+ Value string `json:"value,omitempty"`
+}
+
+```
+
+
+### Cluster creation workflow
+ 1. The controller will attach the `powervs.cluster.x-k8s.io/cluster-uuid: UUID` tag to the created resources.
+ 2. If user tags are set in the spec, they will be attached to the resources.
+ In diagram resources represents all the cloud resources that will be created during cluster creation.For all the resources similar follow will be followed.
+
+
+
+### Cluster Deletion workflow
+The controller will only delete the resources which are having tag `powervs.cluster.x-k8s.io/cluster-uuid: UUID` attached to it.
+
+
+#### TransitGatway Deletion workflow
+This provides detailed flow how TransitGateway and TransitGateway Connections will be deleted.
+
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 23ea333b87..9d7c101680 100644
--- a/go.mod
+++ b/go.mod
@@ -4,61 +4,64 @@ go 1.24.0
// Keep these modules sync with sigs.k8s.io/cluster-api repository
replace (
- github.com/onsi/ginkgo/v2 => github.com/onsi/ginkgo/v2 v2.23.4
- github.com/onsi/gomega => github.com/onsi/gomega v1.37.0
- sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.11.1
+ github.com/onsi/ginkgo/v2 => github.com/onsi/ginkgo/v2 v2.27.2
+ github.com/onsi/gomega => github.com/onsi/gomega v1.38.2
+ sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.12.0
)
require (
- github.com/IBM-Cloud/power-go-client v1.12.0
- github.com/IBM/go-sdk-core/v5 v5.21.0
- github.com/IBM/ibm-cos-sdk-go v1.12.3
- github.com/IBM/networking-go-sdk v0.51.11
- github.com/IBM/platform-services-go-sdk v0.86.1
- github.com/IBM/vpc-go-sdk v0.71.1
+ github.com/IBM-Cloud/power-go-client v1.14.4
+ github.com/IBM/go-sdk-core/v5 v5.21.2
+ github.com/IBM/ibm-cos-sdk-go v1.12.4
+ github.com/IBM/networking-go-sdk v0.51.15
+ github.com/IBM/platform-services-go-sdk v0.91.0
+ github.com/IBM/vpc-go-sdk v0.76.2
github.com/blang/semver/v4 v4.0.0
- github.com/coreos/ignition/v2 v2.22.0
+ github.com/coreos/ignition/v2 v2.25.0
github.com/go-logr/logr v1.4.3
- github.com/go-openapi/strfmt v0.23.0
+ github.com/go-openapi/strfmt v0.25.0
github.com/golang-jwt/jwt/v4 v4.5.2
github.com/google/go-cmp v0.7.0
- github.com/onsi/ginkgo/v2 v2.25.1
- github.com/onsi/gomega v1.38.0
+ github.com/onsi/ginkgo/v2 v2.27.2
+ github.com/onsi/gomega v1.38.2
github.com/ppc64le-cloud/powervs-utils v0.0.0-20250403153021-219b161805db
- github.com/spf13/cobra v1.10.1
- github.com/spf13/pflag v1.0.9
+ github.com/spf13/cobra v1.10.2
+ github.com/spf13/pflag v1.0.10
github.com/stretchr/testify v1.11.1
go.uber.org/mock v0.6.0
- golang.org/x/crypto v0.41.0
- golang.org/x/net v0.43.0
- golang.org/x/text v0.28.0
- k8s.io/api v0.33.3
- k8s.io/apiextensions-apiserver v0.33.3
- k8s.io/apimachinery v0.33.3
+ golang.org/x/crypto v0.46.0
+ golang.org/x/net v0.48.0
+ golang.org/x/text v0.32.0
+ k8s.io/api v0.34.2
+ k8s.io/apiextensions-apiserver v0.34.2
+ k8s.io/apimachinery v0.34.2
k8s.io/cli-runtime v0.30.3
- k8s.io/client-go v0.33.3
- k8s.io/component-base v0.33.3
+ k8s.io/client-go v0.34.2
+ k8s.io/component-base v0.34.2
k8s.io/klog/v2 v2.130.1
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738
- sigs.k8s.io/cluster-api v1.11.1
- sigs.k8s.io/cluster-api/test v1.11.1
- sigs.k8s.io/controller-runtime v0.21.0
+ k8s.io/utils v0.0.0-20250604170112-4c0f3b243397
+ sigs.k8s.io/cluster-api v1.12.0-beta.1
+ sigs.k8s.io/cluster-api/test v1.12.0
+ sigs.k8s.io/controller-runtime v0.22.4
sigs.k8s.io/yaml v1.6.0
)
require (
al.essio.dev/pkg/shellescape v1.5.1 // indirect
- cel.dev/expr v0.20.0 // indirect
+ cel.dev/expr v0.24.0 // indirect
+ dario.cat/mergo v1.0.1 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect
github.com/MakeNowJust/heredoc v1.0.0 // indirect
+ github.com/Masterminds/goutils v1.1.1 // indirect
+ github.com/Masterminds/semver/v3 v3.4.0 // indirect
+ github.com/Masterminds/sprig/v3 v3.3.0 // indirect
github.com/Microsoft/go-winio v0.5.0 // indirect
github.com/NYTimes/gziphandler v1.1.1 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect
github.com/adrg/xdg v0.5.3 // indirect
github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
- github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
- github.com/aws/aws-sdk-go v1.55.7 // indirect
+ github.com/aws/aws-sdk-go-v2 v1.40.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
@@ -66,25 +69,25 @@ require (
github.com/containerd/errdefs v1.0.0 // indirect
github.com/containerd/errdefs/pkg v0.3.0 // indirect
github.com/coreos/go-semver v0.3.1 // indirect
- github.com/coreos/go-systemd/v22 v22.5.0 // indirect
+ github.com/coreos/go-systemd/v22 v22.6.0 // indirect
github.com/coreos/vcontext v0.0.0-20230201181013-d72178a18687 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/distribution/reference v0.6.0 // indirect
- github.com/docker/docker v28.3.3+incompatible // indirect
- github.com/docker/go-connections v0.5.0 // indirect
+ github.com/docker/docker v28.5.2+incompatible // indirect
+ github.com/docker/go-connections v0.6.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 // indirect
- github.com/emicklei/go-restful/v3 v3.12.2 // indirect
+ github.com/emicklei/go-restful/v3 v3.13.0 // indirect
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
- github.com/fsnotify/fsnotify v1.8.0 // indirect
- github.com/fxamacker/cbor/v2 v2.7.0 // indirect
- github.com/gabriel-vasile/mimetype v1.4.9 // indirect
+ github.com/fsnotify/fsnotify v1.9.0 // indirect
+ github.com/fxamacker/cbor/v2 v2.9.0 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.11 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-logr/zapr v1.3.0 // indirect
github.com/go-openapi/analysis v0.23.0 // indirect
- github.com/go-openapi/errors v0.22.1 // indirect
+ github.com/go-openapi/errors v0.22.4 // indirect
github.com/go-openapi/jsonpointer v0.21.1 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/loads v0.22.0 // indirect
@@ -94,21 +97,22 @@ require (
github.com/go-openapi/validate v0.24.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
- github.com/go-playground/validator/v10 v10.26.0 // indirect
+ github.com/go-playground/validator/v10 v10.28.0 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/gobuffalo/flect v1.0.3 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/btree v1.1.3 // indirect
- github.com/google/cel-go v0.23.2 // indirect
- github.com/google/gnostic-models v0.6.9 // indirect
+ github.com/google/cel-go v0.26.0 // indirect
+ github.com/google/gnostic-models v0.7.0 // indirect
github.com/google/go-github/v53 v53.2.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
- github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
+ github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect
github.com/google/uuid v1.6.0 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
- github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
+ github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
+ github.com/huandu/xstrings v1.5.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
@@ -120,73 +124,78 @@ require (
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
- github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/mitchellh/copystructure v1.2.0 // indirect
+ github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/moby/docker-image-spec v1.3.1 // indirect
github.com/moby/sys/sequential v0.6.0 // indirect
github.com/moby/term 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/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/oklog/ulid v1.3.1 // indirect
- github.com/olekukonko/tablewriter v0.0.5 // indirect
+ github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect
+ github.com/olekukonko/errors v1.1.0 // indirect
+ github.com/olekukonko/ll v0.1.1 // indirect
+ github.com/olekukonko/tablewriter v1.0.9 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.2 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
- github.com/pelletier/go-toml/v2 v2.2.3 // indirect
+ github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
- github.com/prometheus/client_model v0.6.1 // indirect
+ github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
- github.com/rogpeppe/go-internal v1.14.1 // indirect
- github.com/sagikazarmark/locafero v0.7.0 // indirect
- github.com/sourcegraph/conc v0.3.0 // indirect
- github.com/spf13/afero v1.12.0 // indirect
- github.com/spf13/cast v1.7.1 // indirect
- github.com/spf13/viper v1.20.1 // indirect
+ github.com/sagikazarmark/locafero v0.11.0 // indirect
+ github.com/shopspring/decimal v1.4.0 // indirect
+ github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect
+ github.com/spf13/afero v1.15.0 // indirect
+ github.com/spf13/cast v1.10.0 // indirect
+ github.com/spf13/viper v1.21.0 // indirect
github.com/stoewer/go-strcase v1.3.0 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
+ github.com/valyala/fastjson v1.6.4 // indirect
github.com/vincent-petithory/dataurl v1.0.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
- go.mongodb.org/mongo-driver v1.17.3 // indirect
- go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 // indirect
- go.opentelemetry.io/otel/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
- go.opentelemetry.io/proto/otlp v1.4.0 // indirect
- go.uber.org/automaxprocs v1.6.0 // indirect
+ go.mongodb.org/mongo-driver v1.17.6 // indirect
+ go.opentelemetry.io/auto/sdk v1.2.1 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
+ go.opentelemetry.io/otel v1.38.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
+ go.opentelemetry.io/otel/metric v1.38.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.38.0 // indirect
+ go.opentelemetry.io/otel/trace v1.38.0 // indirect
+ go.opentelemetry.io/proto/otlp v1.5.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
- go.uber.org/zap v1.27.0 // indirect
- go.yaml.in/yaml/v2 v2.4.2 // indirect
+ go.uber.org/zap v1.27.1 // indirect
+ go.yaml.in/yaml/v2 v2.4.3 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
- golang.org/x/oauth2 v0.30.0 // indirect
- golang.org/x/sync v0.16.0 // indirect
- golang.org/x/sys v0.35.0 // indirect
- golang.org/x/term v0.34.0 // indirect
- golang.org/x/time v0.11.0 // indirect
- golang.org/x/tools v0.36.0 // indirect
+ golang.org/x/mod v0.30.0 // indirect
+ golang.org/x/oauth2 v0.34.0 // indirect
+ golang.org/x/sync v0.19.0 // indirect
+ golang.org/x/sys v0.39.0 // indirect
+ golang.org/x/term v0.38.0 // indirect
+ golang.org/x/time v0.14.0 // indirect
+ golang.org/x/tools v0.39.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20250512202823-5a2f75b736a9 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect
- google.golang.org/grpc v1.72.2 // indirect
- google.golang.org/protobuf v1.36.6 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 // indirect
+ google.golang.org/grpc v1.77.0 // indirect
+ google.golang.org/protobuf v1.36.10 // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/apiserver v0.33.3 // indirect
- k8s.io/cluster-bootstrap v0.33.3 // indirect
- k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
+ k8s.io/apiserver v0.34.2 // indirect
+ k8s.io/cluster-bootstrap v0.34.2 // indirect
+ k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/kind v0.30.0 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
- sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
+ sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
)
diff --git a/go.sum b/go.sum
index b340e2bfc0..269b4c45f4 100644
--- a/go.sum
+++ b/go.sum
@@ -1,31 +1,31 @@
al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho=
al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
-cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI=
-cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=
+cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
+cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs=
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
-github.com/IBM-Cloud/power-go-client v1.12.0 h1:tF9Mq5GLYHebpzQT6IYB89lIxEST1E9teuchjxSAaw0=
-github.com/IBM-Cloud/power-go-client v1.12.0/go.mod h1:SpTK1ttW8bfMNUVQS8qOEuWn2KOkzaCLyzfze8MG1JE=
-github.com/IBM/go-sdk-core/v5 v5.21.0 h1:DUnYhvC4SoC8T84rx5omnhY3+xcQg/Whyoa3mDPIMkk=
-github.com/IBM/go-sdk-core/v5 v5.21.0/go.mod h1:Q3BYO6iDA2zweQPDGbNTtqft5tDcEpm6RTuqMlPcvbw=
-github.com/IBM/ibm-cos-sdk-go v1.12.3 h1:kMIs1nfPY0UXAMcW6bq8O9WOd6KgqiDBnIMd0e/fMqA=
-github.com/IBM/ibm-cos-sdk-go v1.12.3/go.mod h1:dt13UIqJRgfGIlSNlnf17JmAXlBXhfTgXLKV3as8ABk=
-github.com/IBM/networking-go-sdk v0.51.11 h1:l+yMXcO9GDcb7JU9jl8riUOXjnHTvIKSLnXYFlYlKXo=
-github.com/IBM/networking-go-sdk v0.51.11/go.mod h1:TAXWyBUk3C3R7aS1m84EfKdnDcBMZMAClwLfDj/SYZc=
-github.com/IBM/platform-services-go-sdk v0.86.1 h1:ngBpaXvUF3gmLvbU1Z4lX1wowOSYgGoKBEBaR/urt30=
-github.com/IBM/platform-services-go-sdk v0.86.1/go.mod h1:aGD045m6I8pfcB77wft8w2cHqWOJjcM3YSSV55BX0Js=
-github.com/IBM/vpc-go-sdk v0.71.1 h1:SP5/uQs5JDb1QRvSJ1QC2BzE+BHEMq4jd2+JEcRuieE=
-github.com/IBM/vpc-go-sdk v0.71.1/go.mod h1:K3vVlje72PYE3ZRt1iouE+jSIq+vCyYzT1HiFC06hUA=
+github.com/IBM-Cloud/power-go-client v1.14.4 h1:XXQp4atVwvCfDps1nF5zyi2FzNbsuHtszz5nBJ9yCYg=
+github.com/IBM-Cloud/power-go-client v1.14.4/go.mod h1:TT0jJbptQuDRwB9PPYDcGe0ZwFSl5GiSrNuQeJzJYco=
+github.com/IBM/go-sdk-core/v5 v5.21.2 h1:mJ5QbLPOm4g5qhZiVB6wbSllfpeUExftGoyPek2hk4M=
+github.com/IBM/go-sdk-core/v5 v5.21.2/go.mod h1:ngpMgwkjur1VNUjqn11LPk3o5eCyOCRbcfg/0YAY7Hc=
+github.com/IBM/ibm-cos-sdk-go v1.12.4 h1:XUxGUQoqNH6Cpa/eSItbRhVRdmDIsd9jCTMeTVh1siE=
+github.com/IBM/ibm-cos-sdk-go v1.12.4/go.mod h1:s4abN0Kllr83a/aI5KEjNY6fZCQK4apt2w4QjVD0PU0=
+github.com/IBM/networking-go-sdk v0.51.15 h1:JEljJvjUYeSL5F091sI3kZzD9wZYDWsnnKJIoR47XNk=
+github.com/IBM/networking-go-sdk v0.51.15/go.mod h1:TAXWyBUk3C3R7aS1m84EfKdnDcBMZMAClwLfDj/SYZc=
+github.com/IBM/platform-services-go-sdk v0.91.0 h1:5o4XotMmP9UfCg9BKG0cx/pTAMhBh0KzjyFQQyHZTgE=
+github.com/IBM/platform-services-go-sdk v0.91.0/go.mod h1:KAnBhxKaYsu9It2aVXV6oCPEj78imvTs2qSG0ScZKpM=
+github.com/IBM/vpc-go-sdk v0.76.2 h1:bZ6aHA1X69Ekn9rxd5XyjxuV9dwEneamEPYojDPHZdA=
+github.com/IBM/vpc-go-sdk v0.76.2/go.mod h1:hhgE1EQZRq1Cngdh4A6+LLUaA0kKWW/rgfHpISM+AKg=
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
-github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
-github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
+github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
+github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs=
github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0=
github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU=
@@ -40,10 +40,8 @@ github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU=
github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
-github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
-github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
-github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE=
-github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
+github.com/aws/aws-sdk-go-v2 v1.40.1 h1:difXb4maDZkRH0x//Qkwcfpdg1XQVXEAEs2DdXldFFc=
+github.com/aws/aws-sdk-go-v2 v1.40.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
@@ -64,16 +62,16 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0=
github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4=
-github.com/coredns/corefile-migration v1.0.27 h1:WIIw5sU0LfGgoGnhdrYdVcto/aWmJoGA/C62iwkU0JM=
-github.com/coredns/corefile-migration v1.0.27/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY=
+github.com/coredns/corefile-migration v1.0.29 h1:g4cPYMXXDDs9uLE2gFYrJaPBuUAR07eEMGyh9JBE13w=
+github.com/coredns/corefile-migration v1.0.29/go.mod h1:56DPqONc3njpVPsdilEnfijCwNGC3/kTJLl7i7SPavY=
github.com/coreos/go-json v0.0.0-20230131223807-18775e0fb4fb h1:rmqyI19j3Z/74bIRhuC59RB442rXUazKNueVpfJPxg4=
github.com/coreos/go-json v0.0.0-20230131223807-18775e0fb4fb/go.mod h1:rcFZM3uxVvdyNmsAV2jopgPD1cs5SPWJWU5dOz2LUnw=
github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
-github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
-github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/coreos/ignition/v2 v2.22.0 h1:DcVOKStjs0Qaz8F2bTX0jD0YDRLlzkIwON42502Fkuo=
-github.com/coreos/ignition/v2 v2.22.0/go.mod h1:renvkPY1eRngVQvDFjQai+/EHPXEVb4VO3v5tcERfZ8=
+github.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo=
+github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU=
+github.com/coreos/ignition/v2 v2.25.0 h1:4TboIy9z2ofMZmIv5ypyXCFTeKjPNwE5mQNpgkJLdMM=
+github.com/coreos/ignition/v2 v2.25.0/go.mod h1:L8tzd8rDzGMKtEvJ22Rk41jW5chE50sDK5Rn/8C1JsE=
github.com/coreos/vcontext v0.0.0-20230201181013-d72178a18687 h1:uSmlDgJGbUB0bwQBcZomBTottKwEDF5fF8UjSwKSzWM=
github.com/coreos/vcontext v0.0.0-20230201181013-d72178a18687/go.mod h1:Salmysdw7DAVuobBW/LwsKKgpyCPHUhjyJoMJD+ZJiI=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
@@ -85,16 +83,16 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
-github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI=
-github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
-github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
+github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM=
+github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94=
+github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5sizHf27aoY2RTvw62mO6x7mxkScNk0=
github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU=
-github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU=
-github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes=
+github.com/emicklei/go-restful/v3 v3.13.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/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU=
@@ -105,12 +103,18 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
-github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
-github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
-github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
-github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
-github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
-github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
+github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
+github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
+github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
+github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
+github.com/gabriel-vasile/mimetype v1.4.11 h1:AQvxbp830wPhHTqc1u7nzoLT+ZFxGY7emj5DR5DYFik=
+github.com/gabriel-vasile/mimetype v1.4.11/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
+github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs=
+github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo=
+github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M=
+github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk=
+github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE=
+github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -120,8 +124,8 @@ github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
-github.com/go-openapi/errors v0.22.1 h1:kslMRRnK7NCb/CvR1q1VWuEQCEIsBGn5GgKD9e+HYhU=
-github.com/go-openapi/errors v0.22.1/go.mod h1:+n/5UdIqdVnLIJ6Q9Se8HNGUXYaY6CN8ImWzfi/Gzp0=
+github.com/go-openapi/errors v0.22.4 h1:oi2K9mHTOb5DPW2Zjdzs/NIvwi2N3fARKaTJLdNabaM=
+github.com/go-openapi/errors v0.22.4/go.mod h1:z9S8ASTUqx7+CP1Q8dD8ewGH/1JWFFLX/2PmAYNQLgk=
github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic=
github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
@@ -132,10 +136,12 @@ github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsF
github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc=
github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
-github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
-github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
+github.com/go-openapi/strfmt v0.25.0 h1:7R0RX7mbKLa9EYCTHRcCuIPcaqlyQiWNPTXwClK0saQ=
+github.com/go-openapi/strfmt v0.25.0/go.mod h1:nNXct7OzbwrMY9+5tLX4I21pzcmE6ccMGXl3jFdPfn8=
github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU=
github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0=
+github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls=
+github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
@@ -144,15 +150,16 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k=
-github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
+github.com/go-playground/validator/v10 v10.28.0 h1:Q7ibns33JjyW48gHkuFT91qX48KG0ktULL6FgHdG688=
+github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3fFYbyDOpwMn5KXd+m2hUU=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4=
github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs=
-github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
+github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
@@ -161,13 +168,12 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
-github.com/google/cel-go v0.23.2 h1:UdEe3CvQh3Nv+E/j9r1Y//WO0K0cSyD7/y0bzyLIMI4=
-github.com/google/cel-go v0.23.2/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=
-github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
-github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
+github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI=
+github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM=
+github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
+github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.5.2/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.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-github/v53 v53.2.0 h1:wvz3FyF53v4BK+AsnvCmeNhf8AkTaeh2SoYu/XUvTtI=
@@ -177,20 +183,22 @@ github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17
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-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
-github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
+github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY=
+github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
-github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU=
-github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
+github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48=
+github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw=
github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
@@ -203,6 +211,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
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/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE=
+github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung=
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=
@@ -221,17 +231,18 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhn
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
+github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo=
+github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
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/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE=
+github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
-github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
-github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
@@ -245,8 +256,9 @@ github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3
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/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8=
+github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
@@ -255,14 +267,20 @@ github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
-github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 h1:zrbMGy9YXpIeTnGj4EljqMiZsIcE09mmF8XsD5AYOJc=
+github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6/go.mod h1:rEKTHC9roVVicUIfZK7DYrdIoM0EOr8mK1Hj5s3JjH0=
+github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM=
+github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y=
+github.com/olekukonko/ll v0.1.1 h1:9Dfeed5/Mgaxb9lHRAftLK9pVfYETvHn+If6lywVhJc=
+github.com/olekukonko/ll v0.1.1/go.mod h1:2dJo+hYZcJMLMbKwHEWvxCUbAOLc/CXWS9noET22Mdo=
+github.com/olekukonko/tablewriter v1.0.9 h1:XGwRsYLC2bY7bNd93Dk51bcPZksWZmLYuaTHR0FqfL8=
+github.com/olekukonko/tablewriter v1.0.9/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
-github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
-github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
-github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y=
-github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
+github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns=
+github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo=
+github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A=
+github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=
@@ -271,8 +289,8 @@ github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
-github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
+github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
+github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -280,12 +298,10 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/ppc64le-cloud/powervs-utils v0.0.0-20250403153021-219b161805db h1:Fy2pmDLfLq2H0N77KD2LpNoCWbDGP0BknZU/odPx2+c=
github.com/ppc64le-cloud/powervs-utils v0.0.0-20250403153021-219b161805db/go.mod h1:yfr6HHPYyJzVgnivMsobLMbHQqUHrzcIqWM4Nav4kc8=
-github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
-github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
-github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
-github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
+github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
@@ -296,25 +312,26 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
-github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
+github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc=
+github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
-github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
-github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
-github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
-github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
-github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
-github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
-github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
-github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
+github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=
+github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=
+github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
+github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
+github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
+github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
+github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
+github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4=
-github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4=
+github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
+github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
+github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=
github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -331,74 +348,92 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
+github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
+github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
+github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
+github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
+github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
+github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
+github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI=
github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-go.mongodb.org/mongo-driver v1.17.3 h1:TQyXhnsWfWtgAhMtOgtYHMTkZIfBTpMTsMnd9ZBeHxQ=
-go.mongodb.org/mongo-driver v1.17.3/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
-go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
-go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
-go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0/go.mod h1:57gTHJSE5S1tqg+EKsLPlTWhpHMsWlVmer+LA926XiA=
+go.etcd.io/etcd/api/v3 v3.6.6 h1:mcaMp3+7JawWv69p6QShYWS8cIWUOl32bFLb6qf8pOQ=
+go.etcd.io/etcd/api/v3 v3.6.6/go.mod h1:f/om26iXl2wSkcTA1zGQv8reJRSLVdoEBsi4JdfMrx4=
+go.etcd.io/etcd/client/pkg/v3 v3.6.6 h1:uoqgzSOv2H9KlIF5O1Lsd8sW+eMLuV6wzE3q5GJGQNs=
+go.etcd.io/etcd/client/pkg/v3 v3.6.6/go.mod h1:YngfUVmvsvOJ2rRgStIyHsKtOt9SZI2aBJrZiWJhCbI=
+go.etcd.io/etcd/client/v3 v3.6.6 h1:G5z1wMf5B9SNexoxOHUGBaULurOZPIgGPsW6CN492ec=
+go.etcd.io/etcd/client/v3 v3.6.6/go.mod h1:36Qv6baQ07znPR3+n7t+Rk5VHEzVYPvFfGmfF4wBHV8=
+go.mongodb.org/mongo-driver v1.17.6 h1:87JUG1wZfWsr6rIz3ZmpH90rL5tea7O3IHuSwHUpsss=
+go.mongodb.org/mongo-driver v1.17.6/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
+go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
+go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
+go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
+go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 h1:FyjCyI9jVEfqhUh2MoSkmolPjfh5fp2hnV0b0irxH4Q=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0/go.mod h1:hYwym2nDEeZfG/motx0p7L7J1N1vyzIThemQsb4g2qY=
-go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
-go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
-go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
-go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
-go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
-go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
-go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
-go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg=
-go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY=
-go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
-go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
+go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
+go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
+go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=
+go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=
+go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
+go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
+go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
+go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
+go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
+go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
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/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
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.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
-go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
-go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
-go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
+go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
+go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
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.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
-golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
+golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
+golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk=
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
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.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=
+golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
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-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.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
-golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
-golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
-golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
+golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
+golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
+golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
+golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
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.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
-golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
+golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
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-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -409,37 +444,39 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
-golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
+golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
-golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
+golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q=
+golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg=
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.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
-golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
-golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
-golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
+golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
+golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
+golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
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-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
-golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
+golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
+golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
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=
gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0=
gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
-google.golang.org/genproto/googleapis/api v0.0.0-20250512202823-5a2f75b736a9 h1:WvBuA5rjZx9SNIzgcU53OohgZy6lKSus++uY4xLaWKc=
-google.golang.org/genproto/googleapis/api v0.0.0-20250512202823-5a2f75b736a9/go.mod h1:W3S/3np0/dPWsWLi1h/UymYctGXaGBM2StwzD0y140U=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
-google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8=
-google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
-google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
-google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
+google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba h1:B14OtaXuMaCQsl2deSvNkyPKIzq3BjfxQp8d00QyWx4=
+google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:G5IanEx8/PgI9w6CFcYQf7jMtHQhZruvfM1i3qOqk5U=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 h1:Wgl1rcDNThT+Zn47YyCXOXyX/COgMTIdhJ717F0l4xk=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
+google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM=
+google.golang.org/grpc v1.77.0/go.mod h1:z0BY1iVj0q8E1uSQCjL9cppRj+gnZjzDnzV0dHhrNig=
+google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
+google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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=
@@ -457,45 +494,43 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g=
-k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
-k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
-k8s.io/apiextensions-apiserver v0.33.3 h1:qmOcAHN6DjfD0v9kxL5udB27SRP6SG/MTopmge3MwEs=
-k8s.io/apiextensions-apiserver v0.33.3/go.mod h1:oROuctgo27mUsyp9+Obahos6CWcMISSAPzQ77CAQGz8=
-k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
-k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/apiserver v0.33.3 h1:Wv0hGc+QFdMJB4ZSiHrCgN3zL3QRatu56+rpccKC3J4=
-k8s.io/apiserver v0.33.3/go.mod h1:05632ifFEe6TxwjdAIrwINHWE2hLwyADFk5mBsQa15E=
+k8s.io/api v0.34.2 h1:fsSUNZhV+bnL6Aqrp6O7lMTy6o5x2C4XLjnh//8SLYY=
+k8s.io/api v0.34.2/go.mod h1:MMBPaWlED2a8w4RSeanD76f7opUoypY8TFYkSM+3XHw=
+k8s.io/apiextensions-apiserver v0.34.2 h1:WStKftnGeoKP4AZRz/BaAAEJvYp4mlZGN0UCv+uvsqo=
+k8s.io/apiextensions-apiserver v0.34.2/go.mod h1:398CJrsgXF1wytdaanynDpJ67zG4Xq7yj91GrmYN2SE=
+k8s.io/apimachinery v0.34.2 h1:zQ12Uk3eMHPxrsbUJgNF8bTauTVR2WgqJsTmwTE/NW4=
+k8s.io/apimachinery v0.34.2/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
+k8s.io/apiserver v0.34.2 h1:2/yu8suwkmES7IzwlehAovo8dDE07cFRC7KMDb1+MAE=
+k8s.io/apiserver v0.34.2/go.mod h1:gqJQy2yDOB50R3JUReHSFr+cwJnL8G1dzTA0YLEqAPI=
k8s.io/cli-runtime v0.30.3 h1:aG69oRzJuP2Q4o8dm+f5WJIX4ZBEwrvdID0+MXyUY6k=
k8s.io/cli-runtime v0.30.3/go.mod h1:hwrrRdd9P84CXSKzhHxrOivAR9BRnkMt0OeP5mj7X30=
-k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
-k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
-k8s.io/cluster-bootstrap v0.33.3 h1:u2NTxJ5CFSBFXaDxLQoOWMly8eni31psVso+caq6uwI=
-k8s.io/cluster-bootstrap v0.33.3/go.mod h1:p970f8u8jf273zyQ5raD8WUu2XyAl0SAWOY82o7i/ds=
-k8s.io/component-base v0.33.3 h1:mlAuyJqyPlKZM7FyaoM/LcunZaaY353RXiOd2+B5tGA=
-k8s.io/component-base v0.33.3/go.mod h1:ktBVsBzkI3imDuxYXmVxZ2zxJnYTZ4HAsVj9iF09qp4=
+k8s.io/client-go v0.34.2 h1:Co6XiknN+uUZqiddlfAjT68184/37PS4QAzYvQvDR8M=
+k8s.io/client-go v0.34.2/go.mod h1:2VYDl1XXJsdcAxw7BenFslRQX28Dxz91U9MWKjX97fE=
+k8s.io/cluster-bootstrap v0.34.2 h1:oKckPeunVCns37BntcsxaOesDul32yzGd3DFLjW2fc8=
+k8s.io/cluster-bootstrap v0.34.2/go.mod h1:f21byPR7X5nt12ivZi+J3pb4sG4SH6VySX8KAAJA8BY=
+k8s.io/component-base v0.34.2 h1:HQRqK9x2sSAsd8+R4xxRirlTjowsg6fWCPwWYeSvogQ=
+k8s.io/component-base v0.34.2/go.mod h1:9xw2FHJavUHBFpiGkZoKuYZ5pdtLKe97DEByaA+hHbM=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
-k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
-k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA=
+k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
+k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y=
+k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
-sigs.k8s.io/cluster-api v1.11.1 h1:7CyGCTxv1p3Y2kRe1ljTj/w4TcdIdWNj0CTBc4i1aBo=
-sigs.k8s.io/cluster-api v1.11.1/go.mod h1:zyrjgJ5RbXhwKcAdUlGPNK5YOHpcmxXvur+5I8lkMUQ=
-sigs.k8s.io/cluster-api/test v1.11.1 h1:p9tT2HupKHW1URQDsZ3QNdEC/YPc8nrkiV6RCtNgi5k=
-sigs.k8s.io/cluster-api/test v1.11.1/go.mod h1:COviHWIKTcip0VADeIh8Rm5bjqzyZ1LuzKBW1EqjJRc=
-sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8=
-sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+sigs.k8s.io/cluster-api v1.12.0 h1:iFOz8b0LdrMJS5Df1Eb7wyvTkWqlTUM2LHFEHCeI6vA=
+sigs.k8s.io/cluster-api v1.12.0/go.mod h1:+S6WJdi8UPdqv5q9nka5al3ed/Qa0zAcSBgzTaa9VKA=
+sigs.k8s.io/cluster-api/test v1.12.0 h1:OpxFwNSu9j9jY2v4dl90rSi5W9is8/vBXxGCTci5gyE=
+sigs.k8s.io/cluster-api/test v1.12.0/go.mod h1:eS05aBCEZeKzcW7MGnT9U+zap4NCpkxHBWb10DshWp0=
+sigs.k8s.io/controller-runtime v0.22.4 h1:GEjV7KV3TY8e+tJ2LCTxUTanW4z/FmNB7l327UfMq9A=
+sigs.k8s.io/controller-runtime v0.22.4/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/kind v0.30.0 h1:2Xi1KFEfSMm0XDcvKnUt15ZfgRPCT0OnCBbpgh8DztY=
sigs.k8s.io/kind v0.30.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8=
-sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
-sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
-sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
-sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco=
+sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
diff --git a/hack/ccm/Makefile b/hack/ccm/Makefile
index 8e5784ce49..6e90013a8a 100644
--- a/hack/ccm/Makefile
+++ b/hack/ccm/Makefile
@@ -13,7 +13,7 @@
# limitations under the License.
# Go
-GO_VERSION ?=1.24.6
+GO_VERSION ?=1.24.11
GO_CONTAINER_IMAGE ?= golang:$(GO_VERSION)
REGISTRY=gcr.io/k8s-staging-capi-ibmcloud
diff --git a/hack/tools/go.mod b/hack/tools/go.mod
index 9c692cf190..d5e8c89276 100644
--- a/hack/tools/go.mod
+++ b/hack/tools/go.mod
@@ -2,36 +2,36 @@ module sigs.k8s.io/cluster-api-provider-ibmcloud/hack/tools
go 1.24.0
-replace sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.11.1
+replace sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.12.0
require (
github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46
- github.com/golangci/golangci-lint/v2 v2.4.0
- github.com/itchyny/gojq v0.12.17
+ github.com/golangci/golangci-lint/v2 v2.7.2
+ github.com/itchyny/gojq v0.12.18
github.com/joelanford/go-apidiff v0.8.3
- github.com/onsi/ginkgo/v2 v2.23.4
+ github.com/onsi/ginkgo/v2 v2.27.2
go.uber.org/mock v0.6.0
golang.org/x/vuln v1.1.4
- gotest.tools/gotestsum v1.12.3
- k8s.io/code-generator v0.33.3
+ gotest.tools/gotestsum v1.13.0
+ k8s.io/code-generator v0.34.2
k8s.io/release v0.16.9
- sigs.k8s.io/cluster-api/hack/tools v0.0.0-20250902052713-dc0fb8760107
+ sigs.k8s.io/cluster-api/hack/tools v0.0.0-20251209103530-b52de697d29f
sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20241202165100-3e6681045387
- sigs.k8s.io/controller-tools v0.18.0
- sigs.k8s.io/kustomize/kustomize/v5 v5.7.1
+ sigs.k8s.io/controller-tools v0.19.0
+ sigs.k8s.io/kustomize/kustomize/v5 v5.8.0
)
require (
4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
4d63.com/gochecknoglobals v0.2.2 // indirect
cel.dev/expr v0.24.0 // indirect
- cloud.google.com/go v0.121.4 // indirect
- cloud.google.com/go/auth v0.16.3 // indirect
+ cloud.google.com/go v0.121.6 // indirect
+ cloud.google.com/go/auth v0.17.0 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
- cloud.google.com/go/compute/metadata v0.7.0 // indirect
+ cloud.google.com/go/compute/metadata v0.9.0 // indirect
cloud.google.com/go/iam v1.5.2 // indirect
cloud.google.com/go/monitoring v1.24.2 // indirect
- cloud.google.com/go/storage v1.56.0 // indirect
+ cloud.google.com/go/storage v1.57.2 // indirect
codeberg.org/chavacava/garif v0.2.0 // indirect
cuelabs.dev/go/oci/ociregistry v0.0.0-20240314152124-224736b49f2e // indirect
cuelang.org/go v0.8.1 // indirect
@@ -40,12 +40,13 @@ require (
dev.gaijin.team/go/golib v0.6.0 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
github.com/4meepo/tagalign v1.4.3 // indirect
- github.com/Abirdcfly/dupword v0.1.6 // indirect
+ github.com/Abirdcfly/dupword v0.1.7 // indirect
+ github.com/AdminBenni/iota-mixing v1.0.0 // indirect
github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 // indirect
github.com/AlwxSin/noinlineerr v1.0.5 // indirect
- github.com/Antonboom/errname v1.1.0 // indirect
- github.com/Antonboom/nilnil v1.1.0 // indirect
- github.com/Antonboom/testifylint v1.6.1 // indirect
+ github.com/Antonboom/errname v1.1.1 // indirect
+ github.com/Antonboom/nilnil v1.1.1 // indirect
+ github.com/Antonboom/testifylint v1.6.4 // indirect
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 // indirect
@@ -58,13 +59,14 @@ require (
github.com/Azure/go-autorest/logger v0.2.1 // indirect
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
github.com/BurntSushi/toml v1.5.0 // indirect
- github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect
- github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect
+ github.com/Djarvur/go-err113 v0.1.1 // indirect
+ github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect
github.com/MakeNowJust/heredoc/v2 v2.0.1 // indirect
- github.com/Masterminds/semver/v3 v3.3.1 // indirect
+ github.com/Masterminds/semver/v3 v3.4.0 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
+ github.com/MirrexOne/unqueryvet v1.3.0 // indirect
github.com/OneOfOne/xxhash v1.2.8 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
github.com/ProtonMail/go-crypto v1.2.0 // indirect
@@ -90,8 +92,8 @@ require (
github.com/alingse/nilnesserr v0.2.0 // indirect
github.com/aliyun/credentials-go v1.3.1 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
- github.com/ashanbrown/forbidigo/v2 v2.1.0 // indirect
- github.com/ashanbrown/makezero/v2 v2.0.1 // indirect
+ github.com/ashanbrown/forbidigo/v2 v2.3.0 // indirect
+ github.com/ashanbrown/makezero/v2 v2.1.0 // indirect
github.com/aws/aws-sdk-go v1.55.5 // indirect
github.com/aws/aws-sdk-go-v2 v1.32.5 // indirect
github.com/aws/aws-sdk-go-v2/config v1.28.5 // indirect
@@ -117,7 +119,7 @@ require (
github.com/blang/semver/v4 v4.0.0 // indirect
github.com/blizzy78/varnamelen v0.8.0 // indirect
github.com/bombsimon/wsl/v4 v4.7.0 // indirect
- github.com/bombsimon/wsl/v5 v5.1.1 // indirect
+ github.com/bombsimon/wsl/v5 v5.3.0 // indirect
github.com/breml/bidichk v0.3.3 // indirect
github.com/breml/errchkjson v0.4.1 // indirect
github.com/buildkite/agent/v3 v3.62.0 // indirect
@@ -125,10 +127,10 @@ require (
github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 // indirect
github.com/butuzov/ireturn v0.4.0 // indirect
github.com/butuzov/mirror v1.3.0 // indirect
- github.com/catenacyber/perfsprint v0.9.1 // indirect
+ github.com/catenacyber/perfsprint v0.10.1 // indirect
github.com/ccojocar/zxcvbn-go v1.0.4 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
- github.com/charithe/durationcheck v0.0.10 // indirect
+ github.com/charithe/durationcheck v0.0.11 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/lipgloss v1.1.0 // indirect
github.com/charmbracelet/x/ansi v0.8.0 // indirect
@@ -138,6 +140,8 @@ require (
github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect
github.com/ckaznocha/intrange v0.3.1 // indirect
github.com/clbanning/mxj/v2 v2.7.0 // indirect
+ github.com/clipperhouse/stringish v0.1.1 // indirect
+ github.com/clipperhouse/uax29/v2 v2.3.0 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect
github.com/cockroachdb/apd/v3 v3.2.1 // indirect
@@ -160,7 +164,7 @@ require (
github.com/docker/distribution v2.8.3+incompatible // indirect
github.com/docker/docker-credential-helpers v0.8.2 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
- github.com/emicklei/go-restful/v3 v3.12.2 // indirect
+ github.com/emicklei/go-restful/v3 v3.13.0 // indirect
github.com/emicklei/proto v1.12.1 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect
@@ -170,20 +174,20 @@ require (
github.com/fatih/structtag v1.2.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/firefart/nonamedreturns v1.0.6 // indirect
- github.com/fsnotify/fsnotify v1.8.0 // indirect
- github.com/fxamacker/cbor/v2 v2.7.0 // indirect
+ github.com/fsnotify/fsnotify v1.9.0 // indirect
+ github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
- github.com/ghostiam/protogetter v0.3.15 // indirect
+ github.com/ghostiam/protogetter v0.3.17 // indirect
github.com/glebarez/go-sqlite v1.22.0 // indirect
github.com/go-chi/chi v4.1.2+incompatible // indirect
- github.com/go-critic/go-critic v0.13.0 // indirect
+ github.com/go-critic/go-critic v0.14.2 // indirect
github.com/go-errors/errors v1.4.2 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.6.2 // indirect
github.com/go-git/go-git/v5 v5.16.0 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/go-jose/go-jose/v3 v3.0.4 // indirect
- github.com/go-jose/go-jose/v4 v4.0.5 // indirect
+ github.com/go-jose/go-jose/v4 v4.1.2 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-logr/zapr v1.3.0 // indirect
@@ -213,14 +217,15 @@ require (
github.com/goark/go-cvss v1.6.6 // indirect
github.com/gobuffalo/flect v1.0.3 // indirect
github.com/gobwas/glob v0.2.3 // indirect
- github.com/gofrs/flock v0.12.1 // indirect
+ github.com/godoc-lint/godoc-lint v0.10.2 // indirect
+ github.com/gofrs/flock v0.13.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
- github.com/golang-jwt/jwt/v5 v5.2.2 // indirect
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
github.com/golang/snappy v0.0.4 // indirect
+ github.com/golangci/asciicheck v0.5.0 // indirect
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect
- github.com/golangci/go-printf-func-name v0.1.0 // indirect
+ github.com/golangci/go-printf-func-name v0.1.1 // indirect
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect
github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // indirect
github.com/golangci/misspell v0.7.0 // indirect
@@ -230,34 +235,35 @@ require (
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect
github.com/gomarkdown/markdown v0.0.0-20240328165702-4d01890c35c0 // indirect
github.com/google/certificate-transparency-go v1.1.8 // indirect
- github.com/google/gnostic-models v0.6.9 // indirect
+ github.com/google/gnostic-models v0.7.0 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/go-containerregistry v0.20.2 // indirect
github.com/google/go-github/v55 v55.0.0 // indirect
github.com/google/go-github/v58 v58.0.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/licenseclassifier/v2 v2.0.0 // indirect
- github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a // indirect
+ github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect
github.com/google/s2a-go v0.1.9 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.6.0 // indirect
- github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
+ github.com/googleapis/enterprise-certificate-proxy v0.3.7 // indirect
github.com/googleapis/gax-go/v2 v2.15.0 // indirect
- github.com/gordonklaus/ineffassign v0.1.0 // indirect
+ github.com/gordonklaus/ineffassign v0.2.0 // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
github.com/gostaticanalysis/comment v1.5.0 // indirect
github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
- github.com/gostaticanalysis/nilerr v0.1.1 // indirect
+ github.com/gostaticanalysis/nilerr v0.1.2 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
- github.com/hashicorp/go-version v1.7.0 // indirect
+ github.com/hashicorp/go-version v1.8.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/in-toto/in-toto-golang v0.9.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
- github.com/itchyny/timefmt-go v0.1.6 // indirect
+ github.com/itchyny/go-yaml v0.0.0-20251001235044-fca9a0999f15 // indirect
+ github.com/itchyny/timefmt-go v0.1.7 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 // indirect
github.com/jellydator/ttlcache/v3 v3.2.0 // indirect
@@ -268,41 +274,41 @@ require (
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/julz/importas v0.2.0 // indirect
- github.com/karamaru-alpha/copyloopvar v1.2.1 // indirect
+ github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/kisielk/errcheck v1.9.0 // indirect
github.com/kkHAIKE/contextcheck v1.1.6 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/knqyf263/go-rpmdb v0.1.1 // indirect
- github.com/kulti/thelper v0.6.3 // indirect
- github.com/kunwardeep/paralleltest v1.0.14 // indirect
+ github.com/kulti/thelper v0.7.1 // indirect
+ github.com/kunwardeep/paralleltest v1.0.15 // indirect
github.com/lasiar/canonicalheader v1.1.2 // indirect
- github.com/ldez/exptostd v0.4.4 // indirect
- github.com/ldez/gomoddirectives v0.7.0 // indirect
- github.com/ldez/grignotin v0.10.0 // indirect
- github.com/ldez/tagliatelle v0.7.1 // indirect
+ github.com/ldez/exptostd v0.4.5 // indirect
+ github.com/ldez/gomoddirectives v0.7.1 // indirect
+ github.com/ldez/grignotin v0.10.1 // indirect
+ github.com/ldez/tagliatelle v0.7.2 // indirect
github.com/ldez/usetesting v0.5.0 // indirect
github.com/leonklingele/grouper v1.1.2 // indirect
github.com/letsencrypt/boulder v0.0.0-20231026200631-000cd05d5491 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/macabu/inamedparam v0.2.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
- github.com/manuelarte/embeddedstructfieldcheck v0.3.0 // indirect
+ github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect
github.com/manuelarte/funcorder v0.5.0 // indirect
- github.com/maratori/testableexamples v1.0.0 // indirect
- github.com/maratori/testpackage v1.1.1 // indirect
+ github.com/maratori/testableexamples v1.0.1 // indirect
+ github.com/maratori/testpackage v1.1.2 // indirect
github.com/matoous/godox v1.1.0 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
- github.com/mattn/go-runewidth v0.0.16 // indirect
- github.com/mgechev/revive v1.11.0 // indirect
+ github.com/mattn/go-runewidth v0.0.19 // indirect
+ github.com/mgechev/revive v1.13.0 // indirect
github.com/miekg/pkcs11 v1.1.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mmarkdown/mmark v2.0.40+incompatible // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
- github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/moricho/tparallel v0.3.2 // indirect
github.com/mozillazg/docker-credential-acr-helper v0.3.0 // indirect
@@ -313,7 +319,7 @@ require (
github.com/nishanths/exhaustive v0.12.0 // indirect
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 // indirect
- github.com/nunnatsa/ginkgolinter v0.20.0 // indirect
+ github.com/nunnatsa/ginkgolinter v0.21.2 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/oleiade/reflections v1.0.1 // indirect
github.com/open-policy-agent/opa v0.70.0 // indirect
@@ -330,12 +336,12 @@ require (
github.com/polyfloyd/go-errorlint v1.8.0 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
- github.com/prometheus/client_model v0.6.1 // indirect
+ github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.62.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf // indirect
- github.com/quasilyte/go-ruleguard v0.4.4 // indirect
- github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect
+ github.com/quasilyte/go-ruleguard v0.4.5 // indirect
+ github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect
github.com/quasilyte/gogrep v0.5.0 // indirect
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
@@ -346,7 +352,7 @@ require (
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/ryancurrah/gomodguard v1.4.1 // indirect
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
- github.com/sagikazarmark/locafero v0.7.0 // indirect
+ github.com/sagikazarmark/locafero v0.11.0 // indirect
github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect
github.com/saschagrunert/go-modiff v1.3.5 // indirect
@@ -354,9 +360,9 @@ require (
github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect
github.com/sassoftware/relic v7.2.1+incompatible // indirect
github.com/secure-systems-lab/go-securesystemslib v0.8.0 // indirect
- github.com/securego/gosec/v2 v2.22.7 // indirect
+ github.com/securego/gosec/v2 v2.22.11-0.20251204091113-daccba6b93d7 // indirect
github.com/segmentio/ksuid v1.0.4 // indirect
- github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
+ github.com/sergi/go-diff v1.4.0 // indirect
github.com/shibumi/go-pathspec v1.3.0 // indirect
github.com/shirou/gopsutil/v3 v3.24.3 // indirect
github.com/sigstore/cosign/v2 v2.2.4 // indirect
@@ -369,30 +375,29 @@ require (
github.com/skeema/knownhosts v1.3.1 // indirect
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect
github.com/sonatard/noctx v0.4.0 // indirect
- github.com/sourcegraph/conc v0.3.0 // indirect
+ github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect
github.com/sourcegraph/go-diff v0.7.0 // indirect
- github.com/spf13/afero v1.14.0 // indirect
- github.com/spf13/cast v1.7.1 // indirect
- github.com/spf13/cobra v1.9.1 // indirect
- github.com/spf13/pflag v1.0.7 // indirect
- github.com/spf13/viper v1.20.1 // indirect
+ github.com/spf13/afero v1.15.0 // indirect
+ github.com/spf13/cast v1.10.0 // indirect
+ github.com/spf13/cobra v1.10.2 // indirect
+ github.com/spf13/pflag v1.0.10 // indirect
+ github.com/spf13/viper v1.21.0 // indirect
github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
- github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect
+ github.com/stbenjam/no-sprintf-host-port v0.3.1 // indirect
github.com/stretchr/objx v0.5.2 // indirect
- github.com/stretchr/testify v1.10.0 // indirect
+ github.com/stretchr/testify v1.11.1 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
github.com/tchap/go-patricia/v2 v2.3.1 // indirect
- github.com/tdakkota/asciicheck v0.4.1 // indirect
- github.com/tetafro/godot v1.5.1 // indirect
+ github.com/tetafro/godot v1.5.4 // indirect
github.com/thales-e-security/pool v0.0.2 // indirect
github.com/theupdateframework/go-tuf v0.7.0 // indirect
github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect
github.com/timonwong/loggercheck v0.11.0 // indirect
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect
github.com/tjfoc/gmsm v1.4.1 // indirect
- github.com/tomarrell/wrapcheck/v2 v2.11.0 // indirect
+ github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
github.com/transparency-dev/merkle v0.0.2 // indirect
github.com/ultraware/funlen v0.2.0 // indirect
@@ -416,47 +421,47 @@ require (
github.com/zeebo/errs v1.4.0 // indirect
gitlab.alpinelinux.org/alpine/go v0.8.0 // indirect
gitlab.com/bosi/decorder v0.4.2 // indirect
- go-simpler.org/musttag v0.13.1 // indirect
+ go-simpler.org/musttag v0.14.0 // indirect
go-simpler.org/sloglint v0.11.1 // indirect
- go.augendre.info/arangolint v0.2.0 // indirect
- go.augendre.info/fatcontext v0.8.0 // indirect
+ go.augendre.info/arangolint v0.3.1 // indirect
+ go.augendre.info/fatcontext v0.9.0 // indirect
go.mongodb.org/mongo-driver v1.14.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.37.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
go.step.sm/crypto v0.44.2 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
- go.uber.org/zap v1.27.0 // indirect
+ go.uber.org/zap v1.27.1 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
- golang.org/x/crypto v0.41.0 // indirect
+ golang.org/x/crypto v0.45.0 // indirect
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
- golang.org/x/exp/typeparams v0.0.0-20250620022241-b7579e27df2b // indirect
- golang.org/x/mod v0.27.0 // indirect
- golang.org/x/net v0.43.0 // indirect
- golang.org/x/oauth2 v0.30.0 // indirect
- golang.org/x/sync v0.16.0 // indirect
- golang.org/x/sys v0.35.0 // indirect
- golang.org/x/telemetry v0.0.0-20250807160809-1a19826ec488 // indirect
- golang.org/x/term v0.34.0 // indirect
- golang.org/x/text v0.28.0 // indirect
- golang.org/x/time v0.12.0 // indirect
- golang.org/x/tools v0.36.0 // indirect
+ golang.org/x/exp/typeparams v0.0.0-20251023183803-a4bb9ffd2546 // indirect
+ golang.org/x/mod v0.30.0 // indirect
+ golang.org/x/net v0.47.0 // indirect
+ golang.org/x/oauth2 v0.33.0 // indirect
+ golang.org/x/sync v0.18.0 // indirect
+ golang.org/x/sys v0.38.0 // indirect
+ golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 // indirect
+ golang.org/x/term v0.37.0 // indirect
+ golang.org/x/text v0.31.0 // indirect
+ golang.org/x/time v0.14.0 // indirect
+ golang.org/x/tools v0.39.0 // indirect
golang.org/x/tools/go/vcs v0.1.0-deprecated // indirect
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
- google.golang.org/api v0.244.0 // indirect
+ google.golang.org/api v0.256.0 // indirect
google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 // indirect
- google.golang.org/grpc v1.74.2 // indirect
- google.golang.org/protobuf v1.36.6 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 // indirect
+ google.golang.org/grpc v1.76.0 // indirect
+ google.golang.org/protobuf v1.36.10 // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
@@ -465,32 +470,32 @@ require (
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
honnef.co/go/tools v0.6.1 // indirect
- k8s.io/api v0.33.3 // indirect
- k8s.io/apiextensions-apiserver v0.33.3 // indirect
- k8s.io/apimachinery v0.33.3 // indirect
- k8s.io/client-go v0.33.3 // indirect
- k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 // indirect
+ k8s.io/api v0.34.2 // indirect
+ k8s.io/apiextensions-apiserver v0.34.2 // indirect
+ k8s.io/apimachinery v0.34.2 // indirect
+ k8s.io/client-go v0.34.2 // indirect
+ k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f // indirect
k8s.io/klog/v2 v2.130.1 // indirect
- k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
+ k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect
+ k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect
modernc.org/libc v1.55.3 // indirect
modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.8.0 // indirect
modernc.org/sqlite v1.34.1 // indirect
- mvdan.cc/gofumpt v0.8.0 // indirect
- mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect
+ mvdan.cc/gofumpt v0.9.2 // indirect
+ mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect
sigs.k8s.io/bom v0.6.0 // indirect
sigs.k8s.io/cluster-api v0.0.0-00010101000000-000000000000 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d // indirect
- sigs.k8s.io/kustomize/api v0.20.1 // indirect
- sigs.k8s.io/kustomize/cmd/config v0.20.1 // indirect
- sigs.k8s.io/kustomize/kyaml v0.20.1 // indirect
+ sigs.k8s.io/kustomize/api v0.21.0 // indirect
+ sigs.k8s.io/kustomize/cmd/config v0.21.0 // indirect
+ sigs.k8s.io/kustomize/kyaml v0.21.0 // indirect
sigs.k8s.io/mdtoc v1.3.0 // indirect
sigs.k8s.io/promo-tools/v3 v3.6.0 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/release-sdk v0.11.0 // indirect
sigs.k8s.io/release-utils v0.8.1 // indirect
- sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
+ sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
sigs.k8s.io/yaml v1.6.0 // indirect
)
diff --git a/hack/tools/go.sum b/hack/tools/go.sum
index 25039e10bf..bff9059a67 100644
--- a/hack/tools/go.sum
+++ b/hack/tools/go.sum
@@ -5,26 +5,26 @@
cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs=
-cloud.google.com/go v0.121.4/go.mod h1:XEBchUiHFJbz4lKBZwYBDHV/rSyfFktk737TLDU089s=
-cloud.google.com/go/auth v0.16.3 h1:kabzoQ9/bobUmnseYnBO6qQG7q4a/CffFRlJSxv2wCc=
-cloud.google.com/go/auth v0.16.3/go.mod h1:NucRGjaXfzP1ltpcQ7On/VTZ0H4kWB5Jy+Y9Dnm76fA=
+cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c=
+cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI=
+cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4=
+cloud.google.com/go/auth v0.17.0/go.mod h1:6wv/t5/6rOPAX4fJiRjKkJCvswLwdet7G8+UGXt7nCQ=
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
-cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU=
-cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo=
+cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
+cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8=
cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE=
cloud.google.com/go/kms v1.22.0 h1:dBRIj7+GDeeEvatJeTB19oYZNV0aj6wEqSIT/7gLqtk=
cloud.google.com/go/kms v1.22.0/go.mod h1:U7mf8Sva5jpOb4bxYZdtw/9zsbIjrklYwPcvMk34AL8=
cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc=
cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA=
-cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE=
-cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY=
+cloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qoboQT1E=
+cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY=
cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM=
cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U=
-cloud.google.com/go/storage v1.56.0 h1:iixmq2Fse2tqxMbWhLWC9HfBj1qdxqAmiK8/eqtsLxI=
-cloud.google.com/go/storage v1.56.0/go.mod h1:Tpuj6t4NweCLzlNbw9Z9iwxEkrSem20AetIeH/shgVU=
+cloud.google.com/go/storage v1.57.2 h1:sVlym3cHGYhrp6XZKkKb+92I1V42ks2qKKpB0CF5Mb4=
+cloud.google.com/go/storage v1.57.2/go.mod h1:n5ijg4yiRXXpCu0sJTD6k+eMf7GRrJmPyr9YxLXGHOk=
cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4=
cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI=
codeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY=
@@ -43,20 +43,22 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/4meepo/tagalign v1.4.3 h1:Bnu7jGWwbfpAie2vyl63Zup5KuRv21olsPIha53BJr8=
github.com/4meepo/tagalign v1.4.3/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c=
-github.com/Abirdcfly/dupword v0.1.6 h1:qeL6u0442RPRe3mcaLcbaCi2/Y/hOcdtw6DE9odjz9c=
-github.com/Abirdcfly/dupword v0.1.6/go.mod h1:s+BFMuL/I4YSiFv29snqyjwzDp4b65W2Kvy+PKzZ6cw=
+github.com/Abirdcfly/dupword v0.1.7 h1:2j8sInznrje4I0CMisSL6ipEBkeJUJAmK1/lfoNGWrQ=
+github.com/Abirdcfly/dupword v0.1.7/go.mod h1:K0DkBeOebJ4VyOICFdppB23Q0YMOgVafM0zYW0n9lF4=
github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d h1:zjqpY4C7H15HjRPEenkS4SAn3Jy2eRRjkjZbGR30TOg=
github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d/go.mod h1:XNqJ7hv2kY++g8XEHREpi+JqZo3+0l+CH2egBVN4yqM=
+github.com/AdminBenni/iota-mixing v1.0.0 h1:Os6lpjG2dp/AE5fYBPAA1zfa2qMdCAWwPMCgpwKq7wo=
+github.com/AdminBenni/iota-mixing v1.0.0/go.mod h1:i4+tpAaB+qMVIV9OK3m4/DAynOd5bQFaOu+2AhtBCNY=
github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 h1:8+4G8JaejP8Xa6W46PzJEwisNgBXMvFcz78N6zG/ARw=
github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0/go.mod h1:GgeIE+1be8Ivm7Sh4RgwI42aTtC9qrcj+Y9Y6CjJhJs=
github.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY=
github.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc=
-github.com/Antonboom/errname v1.1.0 h1:A+ucvdpMwlo/myWrkHEUEBWc/xuXdud23S8tmTb/oAE=
-github.com/Antonboom/errname v1.1.0/go.mod h1:O1NMrzgUcVBGIfi3xlVuvX8Q/VP/73sseCaAppfjqZw=
-github.com/Antonboom/nilnil v1.1.0 h1:jGxJxjgYS3VUUtOTNk8Z1icwT5ESpLH/426fjmQG+ng=
-github.com/Antonboom/nilnil v1.1.0/go.mod h1:b7sAlogQjFa1wV8jUW3o4PMzDVFLbTux+xnQdvzdcIE=
-github.com/Antonboom/testifylint v1.6.1 h1:6ZSytkFWatT8mwZlmRCHkWz1gPi+q6UBSbieji2Gj/o=
-github.com/Antonboom/testifylint v1.6.1/go.mod h1:k+nEkathI2NFjKO6HvwmSrbzUcQ6FAnbZV+ZRrnXPLI=
+github.com/Antonboom/errname v1.1.1 h1:bllB7mlIbTVzO9jmSWVWLjxTEbGBVQ1Ff/ClQgtPw9Q=
+github.com/Antonboom/errname v1.1.1/go.mod h1:gjhe24xoxXp0ScLtHzjiXp0Exi1RFLKJb0bVBtWKCWQ=
+github.com/Antonboom/nilnil v1.1.1 h1:9Mdr6BYd8WHCDngQnNVV0b554xyisFioEKi30sksufQ=
+github.com/Antonboom/nilnil v1.1.1/go.mod h1:yCyAmSw3doopbOWhJlVci+HuyNRuHJKIv6V2oYQa8II=
+github.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS87UiqmQ=
+github.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4=
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0 h1:JZg6HRh6W6U4OLl6lk7BZ7BLisIzM9dG1R50zUk9C/M=
@@ -97,10 +99,10 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
-github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM=
-github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc=
-github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY=
+github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao4g=
+github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0 h1:4LP6hvB4I5ouTbGgWtixJhgED6xdf67twf9PoY96Tbg=
@@ -109,11 +111,13 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0/go.mod h1:cSgYe11MCNYunTnRXrKiR/tHc0eoKjICUuWpNZoVCOo=
github.com/MakeNowJust/heredoc/v2 v2.0.1 h1:rlCHh70XXXv7toz95ajQWOWQnN4WNLt0TdpZYIR/J6A=
github.com/MakeNowJust/heredoc/v2 v2.0.1/go.mod h1:6/2Abh5s+hc3g9nbWLe9ObDIOhaRrqsyY9MWy+4JdRM=
-github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4=
-github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
+github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
+github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
+github.com/MirrexOne/unqueryvet v1.3.0 h1:5slWSomgqpYU4zFuZ3NNOfOUxVPlXFDBPAVasZOGlAY=
+github.com/MirrexOne/unqueryvet v1.3.0/go.mod h1:IWwCwMQlSWjAIteW0t+28Q5vouyktfujzYznSIWiuOg=
github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8=
github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4=
@@ -190,16 +194,18 @@ github.com/aliyun/credentials-go v1.3.1 h1:uq/0v7kWrxmoLGpqjx7vtQ/s03f0zR//0br/x
github.com/aliyun/credentials-go v1.3.1/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTsBEN04dgcAcYz0=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
+github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
+github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
-github.com/ashanbrown/forbidigo/v2 v2.1.0 h1:NAxZrWqNUQiDz19FKScQ/xvwzmij6BiOw3S0+QUQ+Hs=
-github.com/ashanbrown/forbidigo/v2 v2.1.0/go.mod h1:0zZfdNAuZIL7rSComLGthgc/9/n2FqspBOH90xlCHdA=
-github.com/ashanbrown/makezero/v2 v2.0.1 h1:r8GtKetWOgoJ4sLyUx97UTwyt2dO7WkGFHizn/Lo8TY=
-github.com/ashanbrown/makezero/v2 v2.0.1/go.mod h1:kKU4IMxmYW1M4fiEHMb2vc5SFoPzXvgbMR9gIp5pjSw=
+github.com/ashanbrown/forbidigo/v2 v2.3.0 h1:OZZDOchCgsX5gvToVtEBoV2UWbFfI6RKQTir2UZzSxo=
+github.com/ashanbrown/forbidigo/v2 v2.3.0/go.mod h1:5p6VmsG5/1xx3E785W9fouMxIOkvY2rRV9nMdWadd6c=
+github.com/ashanbrown/makezero/v2 v2.1.0 h1:snuKYMbqosNokUKm+R6/+vOPs8yVAi46La7Ck6QYSaE=
+github.com/ashanbrown/makezero/v2 v2.1.0/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY=
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM=
@@ -256,8 +262,8 @@ github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ
github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=
github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ=
github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg=
-github.com/bombsimon/wsl/v5 v5.1.1 h1:cQg5KJf9FlctAH4cpL9vLKnziYknoCMCdqXl0wjl72Q=
-github.com/bombsimon/wsl/v5 v5.1.1/go.mod h1:Gp8lD04z27wm3FANIUPZycXp+8huVsn0oxc+n4qfV9I=
+github.com/bombsimon/wsl/v5 v5.3.0 h1:nZWREJFL6U3vgW/B1lfDOigl+tEF6qgs6dGGbFeR0UM=
+github.com/bombsimon/wsl/v5 v5.3.0/go.mod h1:Gp8lD04z27wm3FANIUPZycXp+8huVsn0oxc+n4qfV9I=
github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE=
github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE=
github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg=
@@ -274,8 +280,8 @@ github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc=
github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI=
github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA=
github.com/bytecodealliance/wasmtime-go/v3 v3.0.2/go.mod h1:RnUjnIXxEJcL6BgCvNyzCCRzZcxCgsZCi+RNlvYor5Q=
-github.com/catenacyber/perfsprint v0.9.1 h1:5LlTp4RwTooQjJCvGEFV6XksZvWE7wCOUvjD2z0vls0=
-github.com/catenacyber/perfsprint v0.9.1/go.mod h1:q//VWC2fWbcdSLEY1R3l8n0zQCDPdE4IjZwyY1HMunM=
+github.com/catenacyber/perfsprint v0.10.1 h1:u7Riei30bk46XsG8nknMhKLXG9BcXz3+3tl/WpKm0PQ=
+github.com/catenacyber/perfsprint v0.10.1/go.mod h1:DJTGsi/Zufpuus6XPGJyKOTMELe347o6akPvWG9Zcsc=
github.com/ccojocar/zxcvbn-go v1.0.4 h1:FWnCIRMXPj43ukfX000kvBZvV6raSxakYr1nzyNrUcc=
github.com/ccojocar/zxcvbn-go v1.0.4/go.mod h1:3GxGX+rHmueTUMvm5ium7irpyjmm7ikxYFOSJB21Das=
github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M=
@@ -287,8 +293,8 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4=
-github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ=
+github.com/charithe/durationcheck v0.0.11 h1:g1/EX1eIiKS57NTWsYtHDZ/APfeXKhye1DidBcABctk=
+github.com/charithe/durationcheck v0.0.11/go.mod h1:x5iZaixRNl8ctbM+3B2RrPG5t856TxRyVQEnbIEM2X4=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
@@ -312,6 +318,10 @@ github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs=
+github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA=
+github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4=
+github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
@@ -379,8 +389,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
-github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU=
-github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes=
+github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/proto v1.12.1 h1:6n/Z2pZAnBwuhU66Gs8160B8rrrYKo7h2F2sCOnNceE=
github.com/emicklei/proto v1.12.1/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
@@ -415,22 +425,28 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z
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/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
-github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
-github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
-github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
-github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
+github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
+github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
+github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
+github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
-github.com/ghostiam/protogetter v0.3.15 h1:1KF5sXel0HE48zh1/vn0Loiw25A9ApyseLzQuif1mLY=
-github.com/ghostiam/protogetter v0.3.15/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA=
+github.com/ghostiam/protogetter v0.3.17 h1:sjGPErP9o7i2Ym+z3LsQzBdLCNaqbYy2iJQPxGXg04Q=
+github.com/ghostiam/protogetter v0.3.17/go.mod h1:AivIX1eKA/TcUmzZdzbl+Tb8tjIe8FcyG6JFyemQAH4=
+github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs=
+github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo=
+github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M=
+github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk=
+github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE=
+github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc=
github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ=
github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc=
github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec=
github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
-github.com/go-critic/go-critic v0.13.0 h1:kJzM7wzltQasSUXtYyTl6UaPVySO6GkaR1thFnJ6afY=
-github.com/go-critic/go-critic v0.13.0/go.mod h1:M/YeuJ3vOCQDnP2SU+ZhjgRzwzcBW87JqLpMJLrZDLI=
+github.com/go-critic/go-critic v0.14.2 h1:PMvP5f+LdR8p6B29npvChUXbD1vrNlKDf60NJtgMBOo=
+github.com/go-critic/go-critic v0.14.2/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
@@ -445,8 +461,8 @@ github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-jose/go-jose/v3 v3.0.4 h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY=
github.com/go-jose/go-jose/v3 v3.0.4/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
-github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
-github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
+github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI=
+github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -519,12 +535,17 @@ github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4
github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
+github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
+github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
-github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
+github.com/godoc-lint/godoc-lint v0.10.2 h1:dksNgK+zebnVlj4Fx83CRnCmPO0qRat/9xfFsir1nfg=
+github.com/godoc-lint/godoc-lint v0.10.2/go.mod h1:KleLcHu/CGSvkjUH2RvZyoK1MBC7pDQg4NxMYLcBBsw=
+github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw=
+github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
@@ -553,14 +574,16 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golangci/asciicheck v0.5.0 h1:jczN/BorERZwK8oiFBOGvlGPknhvq0bjnysTj4nUfo0=
+github.com/golangci/asciicheck v0.5.0/go.mod h1:5RMNAInbNFw2krqN6ibBxN/zfRFa9S6tA1nPdM0l8qQ=
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw=
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E=
-github.com/golangci/go-printf-func-name v0.1.0 h1:dVokQP+NMTO7jwO4bwsRwLWeudOVUPPyAKJuzv8pEJU=
-github.com/golangci/go-printf-func-name v0.1.0/go.mod h1:wqhWFH5mUdJQhweRnldEywnR5021wTdZSNgwYceV14s=
+github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarogrvjO9AfiW3B4U=
+github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss=
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE=
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY=
-github.com/golangci/golangci-lint/v2 v2.4.0 h1:qz6O6vr7kVzXJqyvHjHSz5fA3D+PM8v96QU5gxZCNWM=
-github.com/golangci/golangci-lint/v2 v2.4.0/go.mod h1:Oq7vuAf6L1iNL34uHDcsIF6Mnc0amOPdsT3/GlpHD+I=
+github.com/golangci/golangci-lint/v2 v2.7.2 h1:AhBC+YeEueec4AGlIbvPym5C70Thx0JykIqXbdIXWx0=
+github.com/golangci/golangci-lint/v2 v2.7.2/go.mod h1:pDijleoBu7e8sejMqyZ3L5n6geqe+cVvOAz2QImqqVc=
github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 h1:AkK+w9FZBXlU/xUmBtSJN1+tAI4FIvy5WtnUnY8e4p8=
github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95/go.mod h1:k9mmcyWKSTMcPPvQUCfRWWQ9VHJ1U9Dc0R7kaXAgtnQ=
github.com/golangci/misspell v0.7.0 h1:4GOHr/T1lTW0hhR4tgaaV1WS/lJ+ncvYCoFKmqJsj0c=
@@ -575,19 +598,20 @@ github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e h1:gD6P7NEo7Eqt
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e/go.mod h1:h+wZwLjUTJnm/P2rwlbJdRPZXOzaT36/FwnPnY2inzc=
github.com/gomarkdown/markdown v0.0.0-20240328165702-4d01890c35c0 h1:4gjrh/PN2MuWCCElk8/I4OCKRKWCCo2zEct3VKCbibU=
github.com/gomarkdown/markdown v0.0.0-20240328165702-4d01890c35c0/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
+github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI=
+github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM=
github.com/google/certificate-transparency-go v1.1.8 h1:LGYKkgZF7satzgTak9R4yzfJXEeYVAjV6/EAEJOf1to=
github.com/google/certificate-transparency-go v1.1.8/go.mod h1:bV/o8r0TBKRf1X//iiiSgWrvII4d7/8OiA+3vG26gI8=
github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM=
github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
-github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
-github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
+github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
+github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
github.com/google/go-cmdtest v0.4.1-0.20220921163831-55ab3332a786 h1:rcv+Ippz6RAtvaGgKxc+8FQIpxHgsF+HBzPyYL2cyVU=
github.com/google/go-cmdtest v0.4.1-0.20220921163831-55ab3332a786/go.mod h1:apVn/GCasLZUVpAJ6oWAuyP7Ne7CEsQbTnc0plM3m+o=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -613,8 +637,8 @@ github.com/google/licenseclassifier/v2 v2.0.0/go.mod h1:cOjbdH0kyC9R22sdQbYsFkto
github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=
github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18=
-github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
+github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY=
+github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U=
github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
@@ -628,32 +652,31 @@ github.com/google/trillian v1.6.0/go.mod h1:Yu3nIMITzNhhMJEHjAtp6xKiu+H/iHu2Oq5F
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=
-github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
+github.com/googleapis/enterprise-certificate-proxy v0.3.7 h1:zrn2Ee/nWmHulBx5sAVrGgAa0f2/R35S4DJwfFaUPFQ=
+github.com/googleapis/enterprise-certificate-proxy v0.3.7/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo=
github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s=
-github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0=
+github.com/gordonklaus/ineffassign v0.2.0 h1:Uths4KnmwxNJNzq87fwQQDDnbNb7De00VOk9Nu0TySs=
+github.com/gordonklaus/ineffassign v0.2.0/go.mod h1:TIpymnagPSexySzs7F9FnO1XFTy8IT3a59vmZp5Y9Lw=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk=
github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc=
-github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado=
github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM=
github.com/gostaticanalysis/comment v1.5.0 h1:X82FLl+TswsUMpMh17srGRuKaaXprTaytmEpgnKIDu8=
github.com/gostaticanalysis/comment v1.5.0/go.mod h1:V6eb3gpCv9GNVqb6amXzEUX3jXLVK/AdA+IrAMSqvEc=
github.com/gostaticanalysis/forcetypeassert v0.2.0 h1:uSnWrrUEYDr86OCxWa4/Tp2jeYDlogZiZHzGkWFefTk=
github.com/gostaticanalysis/forcetypeassert v0.2.0/go.mod h1:M5iPavzE9pPqWyeiVXSFghQjljW1+l/Uke3PXHS6ILY=
-github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk=
-github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A=
+github.com/gostaticanalysis/nilerr v0.1.2 h1:S6nk8a9N8g062nsx63kUkF6AzbHGw7zzyHMcpu52xQU=
+github.com/gostaticanalysis/nilerr v0.1.2/go.mod h1:A19UHhoY3y8ahoL7YKz6sdjDtduwTSI4CsymaC2htPA=
github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M=
github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+3Zh0sUGqw8=
github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs=
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
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-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
@@ -677,8 +700,8 @@ github.com/hashicorp/go-sockaddr v1.0.5/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3ly
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
-github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4=
+github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM=
@@ -695,10 +718,12 @@ github.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ
github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3lUTQd+eF9HdeMo=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
-github.com/itchyny/gojq v0.12.17 h1:8av8eGduDb5+rvEdaOO+zQUjA04MS0m3Ps8HiD+fceg=
-github.com/itchyny/gojq v0.12.17/go.mod h1:WBrEMkgAfAGO1LUcGOckBl5O726KPp+OlkKug0I/FEY=
-github.com/itchyny/timefmt-go v0.1.6 h1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q=
-github.com/itchyny/timefmt-go v0.1.6/go.mod h1:RRDZYC5s9ErkjQvTvvU7keJjxUYzIISJGxm9/mAERQg=
+github.com/itchyny/go-yaml v0.0.0-20251001235044-fca9a0999f15 h1:m4jKsIK0QS9ihQzOxUN2zJcPdrACwqIWCwvdzv9skMQ=
+github.com/itchyny/go-yaml v0.0.0-20251001235044-fca9a0999f15/go.mod h1:Tmbz8uw5I/I6NvVpEGuhzlElCGS5hPoXJkt7l+ul6LE=
+github.com/itchyny/gojq v0.12.18 h1:gFGHyt/MLbG9n6dqnvlliiya2TaMMh6FFaR2b1H6Drc=
+github.com/itchyny/gojq v0.12.18/go.mod h1:4hPoZ/3lN9fDL1D+aK7DY1f39XZpY9+1Xpjz8atrEkg=
+github.com/itchyny/timefmt-go v0.1.7 h1:xyftit9Tbw+Dc/huSSPJaEmX1TVL8lw5vxjJLK4GMMA=
+github.com/itchyny/timefmt-go v0.1.7/go.mod h1:5E46Q+zj7vbTgWY8o5YkMeYb4I6GeWLFnetPy5oBrAI=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY=
@@ -721,14 +746,16 @@ github.com/joelanford/go-apidiff v0.8.3 h1:pj3KnTX0VqH6AYk2AzUBB+hsANk10VMz5oCRR
github.com/joelanford/go-apidiff v0.8.3/go.mod h1:V5YAvsIzCNB8POAR2y4NFjn3sKIRNSWktBCVO8hO/9s=
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/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE=
+github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ=
github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY=
-github.com/karamaru-alpha/copyloopvar v1.2.1 h1:wmZaZYIjnJ0b5UoKDjUHrikcV0zuPyyxI4SVplLd2CI=
-github.com/karamaru-alpha/copyloopvar v1.2.1/go.mod h1:nFmMlFNlClC2BPvNaHMdkirmTJxVCY0lhxBtlfOypMM=
+github.com/karamaru-alpha/copyloopvar v1.2.2 h1:yfNQvP9YaGQR7VaWLYcfZUlRP2eo2vhExWKxD/fP6q0=
+github.com/karamaru-alpha/copyloopvar v1.2.2/go.mod h1:oY4rGZqZ879JkJMtX3RRkcXRkmUvH0x35ykgaKgsgJY=
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
@@ -748,22 +775,22 @@ 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/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs=
-github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I=
-github.com/kunwardeep/paralleltest v1.0.14 h1:wAkMoMeGX/kGfhQBPODT/BL8XhK23ol/nuQ3SwFaUw8=
-github.com/kunwardeep/paralleltest v1.0.14/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk=
+github.com/kulti/thelper v0.7.1 h1:fI8QITAoFVLx+y+vSyuLBP+rcVIB8jKooNSCT2EiI98=
+github.com/kulti/thelper v0.7.1/go.mod h1:NsMjfQEy6sd+9Kfw8kCP61W1I0nerGSYSFnGaxQkcbs=
+github.com/kunwardeep/paralleltest v1.0.15 h1:ZMk4Qt306tHIgKISHWFJAO1IDQJLc6uDyJMLyncOb6w=
+github.com/kunwardeep/paralleltest v1.0.15/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4=
github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI=
-github.com/ldez/exptostd v0.4.4 h1:58AtQjnLcT/tI5W/1KU7xE/O7zW9RAWB6c/ScQAnfus=
-github.com/ldez/exptostd v0.4.4/go.mod h1:QfdzPw6oHjFVdNV7ILoPu5sw3OZ3OG1JS0I5JN3J4Js=
-github.com/ldez/gomoddirectives v0.7.0 h1:EOx8Dd56BZYSez11LVgdj025lKwlP0/E5OLSl9HDwsY=
-github.com/ldez/gomoddirectives v0.7.0/go.mod h1:wR4v8MN9J8kcwvrkzrx6sC9xe9Cp68gWYCsda5xvyGc=
-github.com/ldez/grignotin v0.10.0 h1:NQPeh1E/Eza4F0exCeC1WkpnLvgUcQDT8MQ1vOLML0E=
-github.com/ldez/grignotin v0.10.0/go.mod h1:oR4iCKUP9fwoeO6vCQeD7M5SMxCT6xdVas4vg0h1LaI=
-github.com/ldez/tagliatelle v0.7.1 h1:bTgKjjc2sQcsgPiT902+aadvMjCeMHrY7ly2XKFORIk=
-github.com/ldez/tagliatelle v0.7.1/go.mod h1:3zjxUpsNB2aEZScWiZTHrAXOl1x25t3cRmzfK1mlo2I=
+github.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ=
+github.com/ldez/exptostd v0.4.5/go.mod h1:QRjHRMXJrCTIm9WxVNH6VW7oN7KrGSht69bIRwvdFsM=
+github.com/ldez/gomoddirectives v0.7.1 h1:FaULkvUIG36hj6chpwa+FdCNGZBsD7/fO+p7CCsM6pE=
+github.com/ldez/gomoddirectives v0.7.1/go.mod h1:auDNtakWJR1rC+YX7ar+HmveqXATBAyEK1KYpsIRW/8=
+github.com/ldez/grignotin v0.10.1 h1:keYi9rYsgbvqAZGI1liek5c+jv9UUjbvdj3Tbn5fn4o=
+github.com/ldez/grignotin v0.10.1/go.mod h1:UlDbXFCARrXbWGNGP3S5vsysNXAPhnSuBufpTEbwOas=
+github.com/ldez/tagliatelle v0.7.2 h1:KuOlL70/fu9paxuxbeqlicJnCspCRjH0x8FW+NfgYUk=
+github.com/ldez/tagliatelle v0.7.2/go.mod h1:PtGgm163ZplJfZMZ2sf5nhUT170rSuPgBimoyYtdaSI=
github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc=
github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ=
github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY=
@@ -779,14 +806,16 @@ github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddB
github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
-github.com/manuelarte/embeddedstructfieldcheck v0.3.0 h1:VhGqK8gANDvFYDxQkjPbv7/gDJtsGU9k6qj/hC2hgso=
-github.com/manuelarte/embeddedstructfieldcheck v0.3.0/go.mod h1:LSo/IQpPfx1dXMcX4ibZCYA7Yy6ayZHIaOGM70+1Wy8=
+github.com/manuelarte/embeddedstructfieldcheck v0.4.0 h1:3mAIyaGRtjK6EO9E73JlXLtiy7ha80b2ZVGyacxgfww=
+github.com/manuelarte/embeddedstructfieldcheck v0.4.0/go.mod h1:z8dFSyXqp+fC6NLDSljRJeNQJJDWnY7RoWFzV3PC6UM=
github.com/manuelarte/funcorder v0.5.0 h1:llMuHXXbg7tD0i/LNw8vGnkDTHFpTnWqKPI85Rknc+8=
github.com/manuelarte/funcorder v0.5.0/go.mod h1:Yt3CiUQthSBMBxjShjdXMexmzpP8YGvGLjrxJNkO2hA=
-github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI=
-github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE=
-github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04=
-github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc=
+github.com/maratori/testableexamples v1.0.1 h1:HfOQXs+XgfeRBJ+Wz0XfH+FHnoY9TVqL6Fcevpzy4q8=
+github.com/maratori/testableexamples v1.0.1/go.mod h1:XE2F/nQs7B9N08JgyRmdGjYVGqxWwClLPCGSQhXQSrQ=
+github.com/maratori/testpackage v1.1.2 h1:ffDSh+AgqluCLMXhM19f/cpvQAKygKAJXFl9aUjmbqs=
+github.com/maratori/testpackage v1.1.2/go.mod h1:8F24GdVDFW5Ew43Et02jamrVMNXLUNaOynhDssITGfc=
+github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo=
+github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg=
github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4=
github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs=
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
@@ -795,10 +824,12 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
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/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
-github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
-github.com/mgechev/revive v1.11.0 h1:b/gLLpBE427o+Xmd8G58gSA+KtBwxWinH/A565Awh0w=
-github.com/mgechev/revive v1.11.0/go.mod h1:tI0oLF/2uj+InHCBLrrqfTKfjtFTBCFFfG05auyzgdw=
+github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw=
+github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
+github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE=
+github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A=
+github.com/mgechev/revive v1.13.0 h1:yFbEVliCVKRXY8UgwEO7EOYNopvjb1BFbmYqm9hZjBM=
+github.com/mgechev/revive v1.13.0/go.mod h1:efJfeBVCX2JUumNQ7dtOLDja+QKj9mYGgEZA7rt5u+0=
github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM=
github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk=
github.com/miekg/pkcs11 v1.0.3-0.20190429190417-a667d056470f/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
@@ -817,8 +848,9 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-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/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8=
+github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI=
@@ -840,8 +872,8 @@ github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm
github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c=
github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 h1:Up6+btDp321ZG5/zdSLo48H9Iaq0UQGthrhWC6pCxzE=
github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481/go.mod h1:yKZQO8QE2bHlgozqWDiRVqTFlLQSj30K/6SAK8EeYFw=
-github.com/nunnatsa/ginkgolinter v0.20.0 h1:OmWLkAFO2HUTYcU6mprnKud1Ey5pVdiVNYGO5HVicx8=
-github.com/nunnatsa/ginkgolinter v0.20.0/go.mod h1:dCIuFlTPfQerXgGUju3VygfAFPdC5aE1mdacCDKDJcQ=
+github.com/nunnatsa/ginkgolinter v0.21.2 h1:khzWfm2/Br8ZemX8QM1pl72LwM+rMeW6VUbQ4rzh0Po=
+github.com/nunnatsa/ginkgolinter v0.21.2/go.mod h1:GItSI5fw7mCGLPmkvGYrr1kEetZe7B593jcyOpyabsY=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
@@ -855,14 +887,14 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
-github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
+github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns=
+github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo=
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.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
-github.com/onsi/gomega v1.38.0 h1:c/WX+w8SLAinvuKKQFh77WEucCnPk4j2OTUr7lt7BeY=
-github.com/onsi/gomega v1.38.0/go.mod h1:OcXcwId0b9QsE7Y49u+BTrL4IdKOBOKnD6VQNTJEB6o=
+github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A=
+github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k=
github.com/open-policy-agent/opa v0.70.0 h1:B3cqCN2iQAyKxK6+GI+N40uqkin+wzIrM7YA60t9x1U=
github.com/open-policy-agent/opa v0.70.0/go.mod h1:Y/nm5NY0BX0BqjBriKUiV81sCl8XOjjvqQG7dXrggtI=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
@@ -906,18 +938,18 @@ github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
-github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
+github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf h1:014O62zIzQwvoD7Ekj3ePDF5bv9Xxy0w6AZk0qYbjUk=
github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c=
-github.com/quasilyte/go-ruleguard v0.4.4 h1:53DncefIeLX3qEpjzlS1lyUmQoUEeOWPFWqaTJq9eAQ=
-github.com/quasilyte/go-ruleguard v0.4.4/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE=
-github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE=
-github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
+github.com/quasilyte/go-ruleguard v0.4.5 h1:AGY0tiOT5hJX9BTdx/xBdoCubQUAE2grkqY2lSwvZcA=
+github.com/quasilyte/go-ruleguard v0.4.5/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE=
+github.com/quasilyte/go-ruleguard/dsl v0.3.23 h1:lxjt5B6ZCiBeeNO8/oQsegE6fLeCzuMRoVWSkXC4uvY=
+github.com/quasilyte/go-ruleguard/dsl v0.3.23/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo=
github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng=
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU=
@@ -930,7 +962,6 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
-github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
@@ -942,8 +973,8 @@ github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9f
github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ=
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/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
-github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
+github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc=
+github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=
github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0=
github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4=
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=
@@ -960,13 +991,13 @@ github.com/sassoftware/relic/v7 v7.6.2 h1:rS44Lbv9G9eXsukknS4mSjIAuuX+lMq/FnStgm
github.com/sassoftware/relic/v7 v7.6.2/go.mod h1:kjmP0IBVkJZ6gXeAu35/KCEfca//+PKM6vTAsyDPY+k=
github.com/secure-systems-lab/go-securesystemslib v0.8.0 h1:mr5An6X45Kb2nddcFlbmfHkLguCE9laoZCUzEEpIZXA=
github.com/secure-systems-lab/go-securesystemslib v0.8.0/go.mod h1:UH2VZVuJfCYR8WgMlCU1uFsOUU+KeyrTWcSS73NBOzU=
-github.com/securego/gosec/v2 v2.22.7 h1:8/9P+oTYI4yIpAzccQKVsg1/90Po+JzGtAhqoHImDeM=
-github.com/securego/gosec/v2 v2.22.7/go.mod h1:510TFNDMrIPytokyHQAVLvPeDr41Yihn2ak8P+XQfNE=
+github.com/securego/gosec/v2 v2.22.11-0.20251204091113-daccba6b93d7 h1:rZg6IGn0ySYZwCX8LHwZoYm03JhG/cVAJJ3O+u3Vclo=
+github.com/securego/gosec/v2 v2.22.11-0.20251204091113-daccba6b93d7/go.mod h1:9sr22NZO5Kfh7unW/xZxkGYTmj2484/fCiE54gw7UTY=
github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c=
github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
-github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
+github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
+github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI=
github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE=
github.com/shirou/gopsutil/v3 v3.24.3 h1:eoUGJSmdfLzJ3mxIhmOAhgKEKgQkeOwKpz1NbhVnuPE=
@@ -1009,28 +1040,30 @@ github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYl
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/sonatard/noctx v0.4.0 h1:7MC/5Gg4SQ4lhLYR6mvOP6mQVSxCrdyiExo7atBs27o=
github.com/sonatard/noctx v0.4.0/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas=
-github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
-github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
+github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=
+github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=
github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0=
github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=
-github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA=
-github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo=
-github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
-github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
-github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
-github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
+github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
+github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
+github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
+github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
+github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
+github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
-github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4=
-github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4=
+github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
+github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
+github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=
github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=
github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0=
github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I=
-github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4=
-github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk=
+github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g=
+github.com/stbenjam/no-sprintf-host-port v0.3.1/go.mod h1:ODbZesTCHMVKthBHskvUUexdcNHAQRXk9NpSsL8p/HQ=
+github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=
+github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
@@ -1050,26 +1083,32 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
-github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
-github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
+github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs=
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes=
github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k=
-github.com/tdakkota/asciicheck v0.4.1 h1:bm0tbcmi0jezRA2b5kg4ozmMuGAFotKI3RZfrhfovg8=
-github.com/tdakkota/asciicheck v0.4.1/go.mod h1:0k7M3rCfRXb0Z6bwgvkEIMleKH3kXNz9UqJ9Xuqopr8=
github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA=
github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0=
github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag=
github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY=
-github.com/tetafro/godot v1.5.1 h1:PZnjCol4+FqaEzvZg5+O8IY2P3hfY9JzRBNPv1pEDS4=
-github.com/tetafro/godot v1.5.1/go.mod h1:cCdPtEndkmqqrhiCfkmxDodMQJ/f3L1BCNskCUZdTwk=
+github.com/tetafro/godot v1.5.4 h1:u1ww+gqpRLiIA16yF2PV1CV1n/X3zhyezbNXC3E14Sg=
+github.com/tetafro/godot v1.5.4/go.mod h1:eOkMrVQurDui411nBY2FA05EYH01r14LuWY/NrVDVcU=
github.com/thales-e-security/pool v0.0.2 h1:RAPs4q2EbWsTit6tpzuvTFlgFRJ3S8Evf5gtvVDbmPg=
github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU=
github.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qvs5LdxRWqRI=
github.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug=
+github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
+github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
+github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
+github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
+github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
+github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 h1:9LPGD+jzxMlnk5r6+hJnar67cgpDIz/iyD+rfl5r2Vk=
github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460=
github.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M=
@@ -1081,8 +1120,8 @@ github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
-github.com/tomarrell/wrapcheck/v2 v2.11.0 h1:BJSt36snX9+4WTIXeJ7nvHBQBcm1h2SjQMSlmQ6aFSU=
-github.com/tomarrell/wrapcheck/v2 v2.11.0/go.mod h1:wFL9pDWDAbXhhPZZt+nG8Fu+h29TtnZ2MW6Lx4BRXIU=
+github.com/tomarrell/wrapcheck/v2 v2.12.0 h1:H/qQ1aNWz/eeIhxKAFvkfIA+N7YDvq6TWVFL27Of9is=
+github.com/tomarrell/wrapcheck/v2 v2.12.0/go.mod h1:AQhQuZd0p7b6rfW+vUwHm5OMCGgp63moQ9Qr/0BpIWo=
github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw=
github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
github.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG81+twTK4=
@@ -1151,14 +1190,14 @@ gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo=
gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8=
go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ=
go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28=
-go-simpler.org/musttag v0.13.1 h1:lw2sJyu7S1X8lc8zWUAdH42y+afdcCnHhWpnkWvd6vU=
-go-simpler.org/musttag v0.13.1/go.mod h1:8r450ehpMLQgvpb6sg+hV5Ur47eH6olp/3yEanfG97k=
+go-simpler.org/musttag v0.14.0 h1:XGySZATqQYSEV3/YTy+iX+aofbZZllJaqwFWs+RTtSo=
+go-simpler.org/musttag v0.14.0/go.mod h1:uP8EymctQjJ4Z1kUnjX0u2l60WfUdQxCwSNKzE1JEOE=
go-simpler.org/sloglint v0.11.1 h1:xRbPepLT/MHPTCA6TS/wNfZrDzkGvCCqUv4Bdwc3H7s=
go-simpler.org/sloglint v0.11.1/go.mod h1:2PowwiCOK8mjiF+0KGifVOT8ZsCNiFzvfyJeJOIt8MQ=
-go.augendre.info/arangolint v0.2.0 h1:2NP/XudpPmfBhQKX4rMk+zDYIj//qbt4hfZmSSTcpj8=
-go.augendre.info/arangolint v0.2.0/go.mod h1:Vx4KSJwu48tkE+8uxuf0cbBnAPgnt8O1KWiT7bljq7w=
-go.augendre.info/fatcontext v0.8.0 h1:2dfk6CQbDGeu1YocF59Za5Pia7ULeAM6friJ3LP7lmk=
-go.augendre.info/fatcontext v0.8.0/go.mod h1:oVJfMgwngMsHO+KB2MdgzcO+RvtNdiCEOlWvSFtax/s=
+go.augendre.info/arangolint v0.3.1 h1:n2E6p8f+zfXSFLa2e2WqFPp4bfvcuRdd50y6cT65pSo=
+go.augendre.info/arangolint v0.3.1/go.mod h1:6ZKzEzIZuBQwoSvlKT+qpUfIbBfFCE5gbAoTg0/117g=
+go.augendre.info/fatcontext v0.9.0 h1:Gt5jGD4Zcj8CDMVzjOJITlSb9cEch54hjRRlN3qDojE=
+go.augendre.info/fatcontext v0.9.0/go.mod h1:L94brOAT1OOUNue6ph/2HnwxoNlds9aXDF2FcUntbNw=
go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
@@ -1171,24 +1210,24 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
-go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0/go.mod h1:57gTHJSE5S1tqg+EKsLPlTWhpHMsWlVmer+LA926XiA=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY=
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw=
-go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
-go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
-go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
-go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
-go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
-go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
-go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
-go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg=
-go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
+go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
+go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
go.step.sm/crypto v0.44.2 h1:t3p3uQ7raP2jp2ha9P6xkQF85TJZh+87xmjSLaib+jk=
go.step.sm/crypto v0.44.2/go.mod h1:x1439EnFhadzhkuaGX7sz03LEMQ+jV4gRamf5LCZJQQ=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
@@ -1199,8 +1238,8 @@ go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
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.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
-go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
+go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
@@ -1220,15 +1259,15 @@ golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
-golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
-golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
+golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
+golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
-golang.org/x/exp/typeparams v0.0.0-20250620022241-b7579e27df2b h1:KdrhdYPDUvJTvrDK9gdjfFd6JTk8vA1WJoldYSi0kHo=
-golang.org/x/exp/typeparams v0.0.0-20250620022241-b7579e27df2b/go.mod h1:LKZHyeOpPuZcMgxeHjJp4p5yvxrCX1xDvH10zYHhjjQ=
+golang.org/x/exp/typeparams v0.0.0-20251023183803-a4bb9ffd2546 h1:HDjDiATsGqvuqvkDvgJjD1IgPrVekcSXVVE21JwvzGE=
+golang.org/x/exp/typeparams v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:4Mzdyp/6jzw9auFDJ3OMF5qksa7UvPnzKqTVGcb04ms=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -1241,8 +1280,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
-golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
+golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=
+golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1270,11 +1309,11 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
-golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
-golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
+golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
+golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
-golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
+golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo=
+golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1287,8 +1326,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
-golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
-golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
+golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
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=
@@ -1327,10 +1366,10 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
-golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
-golang.org/x/telemetry v0.0.0-20250807160809-1a19826ec488 h1:3doPGa+Gg4snce233aCWnbZVFsyFMo/dR40KK/6skyE=
-golang.org/x/telemetry v0.0.0-20250807160809-1a19826ec488/go.mod h1:fGb/2+tgXXjhjHsTNdVEEMZNWA0quBnfrO+AfoDSAKw=
+golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
+golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 h1:E2/AqCUMZGgd73TQkxUMcMla25GB9i/5HOdLr+uH7Vo=
+golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ=
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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -1339,8 +1378,8 @@ golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
-golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
-golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
+golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
+golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -1351,10 +1390,10 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
-golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
-golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
-golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
+golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
+golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
+golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -1362,26 +1401,22 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
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.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
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.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
-golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
-golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
+golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
+golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=
golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=
golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM=
@@ -1397,24 +1432,26 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
-google.golang.org/api v0.244.0 h1:lpkP8wVibSKr++NCD36XzTk/IzeKJ3klj7vbj+XU5pE=
-google.golang.org/api v0.244.0/go.mod h1:dMVhVcylamkirHdzEBAIQWUCgqY885ivNeZYd7VAVr8=
+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
+google.golang.org/api v0.256.0 h1:u6Khm8+F9sxbCTYNoBHg6/Hwv0N/i+V94MvkOSor6oI=
+google.golang.org/api v0.256.0/go.mod h1:KIgPhksXADEKJlnEoRa9qAII4rXcy40vfI8HRqcU964=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4=
google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s=
-google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074 h1:mVXdvnmR3S3BQOqHECm9NGMjYiRtEvDYcqAqedTXY6s=
-google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074/go.mod h1:vYFwMYFbmA8vl6Z/krj/h7+U/AqpHknwJX4Uqgfyc7I=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 h1:MAKi5q709QWfnkkpNQ0M12hYJ1+e8qYVDyowc4U1XZM=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
+google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c h1:AtEkQdl5b6zsybXcbz00j1LwNodDuH6hVifIaNqk7NQ=
+google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c/go.mod h1:ea2MjsO70ssTfCjiwHgI0ZFqcw45Ksuk2ckf9G468GA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 h1:tRPGkdGHuewF4UisLzzHHr1spKw92qLM98nIzxbC0wY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
-google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
+google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=
+google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=
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=
@@ -1423,8 +1460,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
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.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
-google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
+google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
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-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1453,34 +1490,38 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gotest.tools/gotestsum v1.12.3 h1:jFwenGJ0RnPkuKh2VzAYl1mDOJgbhobBDeL2W1iEycs=
-gotest.tools/gotestsum v1.12.3/go.mod h1:Y1+e0Iig4xIRtdmYbEV7K7H6spnjc1fX4BOuUhWw2Wk=
+gotest.tools/gotestsum v1.13.0 h1:+Lh454O9mu9AMG1APV4o0y7oDYKyik/3kBOiCqiEpRo=
+gotest.tools/gotestsum v1.13.0/go.mod h1:7f0NS5hFb0dWr4NtcsAsF0y1kzjEFfAil0HiBQJE03Q=
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI=
honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4=
-k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
-k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
-k8s.io/apiextensions-apiserver v0.33.3 h1:qmOcAHN6DjfD0v9kxL5udB27SRP6SG/MTopmge3MwEs=
-k8s.io/apiextensions-apiserver v0.33.3/go.mod h1:oROuctgo27mUsyp9+Obahos6CWcMISSAPzQ77CAQGz8=
-k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
-k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
-k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
-k8s.io/code-generator v0.33.3 h1:6+34LhYkIuQ/yn/E3qlpVqjQaP8smzCu4NE1A8b0LWs=
-k8s.io/code-generator v0.33.3/go.mod h1:6Y02+HQJYgNphv9z3wJB5w+sjYDIEBQW7sh62PkufvA=
-k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog=
-k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
+k8s.io/api v0.34.2 h1:fsSUNZhV+bnL6Aqrp6O7lMTy6o5x2C4XLjnh//8SLYY=
+k8s.io/api v0.34.2/go.mod h1:MMBPaWlED2a8w4RSeanD76f7opUoypY8TFYkSM+3XHw=
+k8s.io/apiextensions-apiserver v0.34.2 h1:WStKftnGeoKP4AZRz/BaAAEJvYp4mlZGN0UCv+uvsqo=
+k8s.io/apiextensions-apiserver v0.34.2/go.mod h1:398CJrsgXF1wytdaanynDpJ67zG4Xq7yj91GrmYN2SE=
+k8s.io/apimachinery v0.34.2 h1:zQ12Uk3eMHPxrsbUJgNF8bTauTVR2WgqJsTmwTE/NW4=
+k8s.io/apimachinery v0.34.2/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
+k8s.io/apiserver v0.34.2 h1:2/yu8suwkmES7IzwlehAovo8dDE07cFRC7KMDb1+MAE=
+k8s.io/apiserver v0.34.2/go.mod h1:gqJQy2yDOB50R3JUReHSFr+cwJnL8G1dzTA0YLEqAPI=
+k8s.io/client-go v0.34.2 h1:Co6XiknN+uUZqiddlfAjT68184/37PS4QAzYvQvDR8M=
+k8s.io/client-go v0.34.2/go.mod h1:2VYDl1XXJsdcAxw7BenFslRQX28Dxz91U9MWKjX97fE=
+k8s.io/code-generator v0.34.2 h1:9bG6jTxmsU3HXE5BNYJTC8AZ1D6hVVfkm8yYSkdkGY0=
+k8s.io/code-generator v0.34.2/go.mod h1:dnDDEd6S/z4uZ+PG1aE58ySCi/lR4+qT3a4DddE4/2I=
+k8s.io/component-base v0.34.2 h1:HQRqK9x2sSAsd8+R4xxRirlTjowsg6fWCPwWYeSvogQ=
+k8s.io/component-base v0.34.2/go.mod h1:9xw2FHJavUHBFpiGkZoKuYZ5pdtLKe97DEByaA+hHbM=
+k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f h1:SLb+kxmzfA87x4E4brQzB33VBbT2+x7Zq9ROIHmGn9Q=
+k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
-k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
-k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
+k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA=
+k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
k8s.io/release v0.16.9 h1:CDqFlNmckqtXEn+YPVbDoUbnmqf1Y2R9BkHBC2vgMGo=
k8s.io/release v0.16.9/go.mod h1:iRTTQYssZDVke2X7bqhdbi3cPjdmRqZXpIJsp2IRDyM=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y=
+k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y=
@@ -1505,46 +1546,46 @@ modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
-mvdan.cc/gofumpt v0.8.0 h1:nZUCeC2ViFaerTcYKstMmfysj6uhQrA2vJe+2vwGU6k=
-mvdan.cc/gofumpt v0.8.0/go.mod h1:vEYnSzyGPmjvFkqJWtXkh79UwPWP9/HMxQdGEXZHjpg=
-mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 h1:WjUu4yQoT5BHT1w8Zu56SP8367OuBV5jvo+4Ulppyf8=
-mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4/go.mod h1:rthT7OuvRbaGcd5ginj6dA2oLE7YNlta9qhBNNdCaLE=
+mvdan.cc/gofumpt v0.9.2 h1:zsEMWL8SVKGHNztrx6uZrXdp7AX8r421Vvp23sz7ik4=
+mvdan.cc/gofumpt v0.9.2/go.mod h1:iB7Hn+ai8lPvofHd9ZFGVg2GOr8sBUw1QUWjNbmIL/s=
+mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 h1:ssMzja7PDPJV8FStj7hq9IKiuiKhgz9ErWw+m68e7DI=
+mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15/go.mod h1:4M5MMXl2kW6fivUT6yRGpLLPNfuGtU2Z0cPvFquGDYU=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
sigs.k8s.io/bom v0.6.0 h1:IPMPHx6XdmMeW2oEeF66DgNyP5d4RxfuXwiC1qn+n9o=
sigs.k8s.io/bom v0.6.0/go.mod h1:MV0D3vdGlkaPgi5EwpwMBeQ8n8QS8Q2u1lJ5LyE7RLM=
-sigs.k8s.io/cluster-api v1.11.1 h1:7CyGCTxv1p3Y2kRe1ljTj/w4TcdIdWNj0CTBc4i1aBo=
-sigs.k8s.io/cluster-api v1.11.1/go.mod h1:zyrjgJ5RbXhwKcAdUlGPNK5YOHpcmxXvur+5I8lkMUQ=
-sigs.k8s.io/cluster-api/hack/tools v0.0.0-20250902052713-dc0fb8760107 h1:nrHxoKCdYG9s4kS1v0j5EJ8K3JTz6rlQdnfu5tIWRVQ=
-sigs.k8s.io/cluster-api/hack/tools v0.0.0-20250902052713-dc0fb8760107/go.mod h1:NI3ikApK2FzecHWNuglo2chzggfSCKN0JSLBn8eSMR8=
+sigs.k8s.io/cluster-api v1.12.0 h1:iFOz8b0LdrMJS5Df1Eb7wyvTkWqlTUM2LHFEHCeI6vA=
+sigs.k8s.io/cluster-api v1.12.0/go.mod h1:+S6WJdi8UPdqv5q9nka5al3ed/Qa0zAcSBgzTaa9VKA=
+sigs.k8s.io/cluster-api/hack/tools v0.0.0-20251209103530-b52de697d29f h1:d7K7HCUvf3gSNzZ0FsUs6NQlY0OwJ+vdwODDA779l94=
+sigs.k8s.io/cluster-api/hack/tools v0.0.0-20251209103530-b52de697d29f/go.mod h1:cqj/Yc987UnRDhw1YIAFDROFAVep9ftUd6il0hPFSYc=
sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20241202165100-3e6681045387 h1:WVCytp5VYi3EbLI/tKmjQ3zgEWdQrMAARVUtmqAmf48=
sigs.k8s.io/controller-runtime/tools/setup-envtest v0.0.0-20241202165100-3e6681045387/go.mod h1:IaDsO8xSPRxRG1/rm9CP7+jPmj0nMNAuNi/yiHnLX8k=
-sigs.k8s.io/controller-tools v0.18.0 h1:rGxGZCZTV2wJreeRgqVoWab/mfcumTMmSwKzoM9xrsE=
-sigs.k8s.io/controller-tools v0.18.0/go.mod h1:gLKoiGBriyNh+x1rWtUQnakUYEujErjXs9pf+x/8n1U=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+sigs.k8s.io/controller-tools v0.19.0 h1:OU7jrPPiZusryu6YK0jYSjPqg8Vhf8cAzluP9XGI5uk=
+sigs.k8s.io/controller-tools v0.19.0/go.mod h1:y5HY/iNDFkmFla2CfQoVb2AQXMsBk4ad84iR1PLANB0=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d h1:KLiQzLW3RZJR19+j4pw2h5iioyAyqCkDBEAFdnGa3N8=
sigs.k8s.io/kubebuilder/docs/book/utils v0.0.0-20211028165026-57688c578b5d/go.mod h1:NRdZafr4zSCseLQggdvIMXa7umxf+Q+PJzrj3wFwiGE=
-sigs.k8s.io/kustomize/api v0.20.1 h1:iWP1Ydh3/lmldBnH/S5RXgT98vWYMaTUL1ADcr+Sv7I=
-sigs.k8s.io/kustomize/api v0.20.1/go.mod h1:t6hUFxO+Ph0VxIk1sKp1WS0dOjbPCtLJ4p8aADLwqjM=
-sigs.k8s.io/kustomize/cmd/config v0.20.1 h1:4APUORmZe2BYrsqgGfEKdd/r7gM6i43egLrUzilpiFo=
-sigs.k8s.io/kustomize/cmd/config v0.20.1/go.mod h1:R7rQ8kxknVlXWVUIbxWtMgu8DCCNVtl8V0KrmeVd/KE=
-sigs.k8s.io/kustomize/kustomize/v5 v5.7.1 h1:sYJsarwy/SDJfjjLMUqwFDGPwzUtMOQ1i1Ed49+XSbw=
-sigs.k8s.io/kustomize/kustomize/v5 v5.7.1/go.mod h1:+5/SrBcJ4agx1SJknGuR/c9thwRSKLxnKoI5BzXFaLU=
-sigs.k8s.io/kustomize/kyaml v0.20.1 h1:PCMnA2mrVbRP3NIB6v9kYCAc38uvFLVs8j/CD567A78=
-sigs.k8s.io/kustomize/kyaml v0.20.1/go.mod h1:0EmkQHRUsJxY8Ug9Niig1pUMSCGHxQ5RklbpV/Ri6po=
+sigs.k8s.io/kustomize/api v0.21.0 h1:I7nry5p8iDJbuRdYS7ez8MUvw7XVNPcIP5GkzzuXIIQ=
+sigs.k8s.io/kustomize/api v0.21.0/go.mod h1:XGVQuR5n2pXKWbzXHweZU683pALGw/AMVO4zU4iS8SE=
+sigs.k8s.io/kustomize/cmd/config v0.21.0 h1:ikLtzcNK9isBqSaXXhAg7LRCTNKdp70z5v/c4Y55DOw=
+sigs.k8s.io/kustomize/cmd/config v0.21.0/go.mod h1:oxa6eRzeLWUcE7M3Rmio29Sfc4KpqGspHur3GjOYqNA=
+sigs.k8s.io/kustomize/kustomize/v5 v5.8.0 h1:CCIJK7z/xJOlkXOaDOcL2jprV53a/eloiL02wg7oJJs=
+sigs.k8s.io/kustomize/kustomize/v5 v5.8.0/go.mod h1:qewGAExYZK9LbPPbnJMPK5HQ8nsdxRzpclIg0qslzDo=
+sigs.k8s.io/kustomize/kyaml v0.21.0 h1:7mQAf3dUwf0wBerWJd8rXhVcnkk5Tvn/q91cGkaP6HQ=
+sigs.k8s.io/kustomize/kyaml v0.21.0/go.mod h1:hmxADesM3yUN2vbA5z1/YTBnzLJ1dajdqpQonwBL1FQ=
sigs.k8s.io/mdtoc v1.3.0 h1:iMJLfMax45vMl3rnwLjEhZ38TS6JqLXSpm0uDNo/zyo=
sigs.k8s.io/mdtoc v1.3.0/go.mod h1:8zLWymqzP8oKMm+1m1e5GKnGZq8gbC1MreKfmRelMQA=
sigs.k8s.io/promo-tools/v3 v3.6.0 h1:C2L08ezrWm1aZI8Emd3iZPZQserLPRgzuqQVxvI0PUI=
sigs.k8s.io/promo-tools/v3 v3.6.0/go.mod h1:XJ3jy0hJYs+hWKt8XsLHFzGQV8PUtvllvbxjN/E5RXI=
-sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/release-sdk v0.11.0 h1:a+zjOO3tHm1NiVZgNcUWq5QrKmv7b63UZXw+XGdPGfk=
sigs.k8s.io/release-sdk v0.11.0/go.mod h1:sjbFpskyVjCXcFBnI3Bj1iGQHGjDYPoHVyld/pT+TvU=
sigs.k8s.io/release-utils v0.8.1 h1:qSA9p3vZzO6RAq7zvzupCZjR29+n3NK9DSJPe9bSf7w=
sigs.k8s.io/release-utils v0.8.1/go.mod h1:vrQ3eR1VmudgX4OUwr4pUZEkYLRms9bdbv06mr3kchQ=
-sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
-sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
-sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco=
+sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k=
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/CHANGES.md b/hack/tools/vendor/cloud.google.com/go/auth/CHANGES.md
index cbee128167..4deca44353 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/CHANGES.md
+++ b/hack/tools/vendor/cloud.google.com/go/auth/CHANGES.md
@@ -1,5 +1,27 @@
+## [0.17.0](https://github.com/googleapis/google-cloud-go/releases/tag/auth%2Fv0.17.0) (2025-10-02)
+
+### Features
+
+* Add trust boundary support for service accounts and impersonation (HTTP/gRPC) (#11870) ([5c2b665](https://github.com/googleapis/google-cloud-go/commit/5c2b665f392e6dd90192f107188720aa1357e7da))
+* add trust boundary support for external accounts (#12864) ([a67a146](https://github.com/googleapis/google-cloud-go/commit/a67a146a6a88a6f1ba10c409dfce8015ecd60a64))
+
# Changelog
+## [0.16.5](https://github.com/googleapis/google-cloud-go/compare/auth/v0.16.4...auth/v0.16.5) (2025-08-14)
+
+
+### Bug Fixes
+
+* **auth:** Improve error message for unknown credentials type ([#12673](https://github.com/googleapis/google-cloud-go/issues/12673)) ([558b164](https://github.com/googleapis/google-cloud-go/commit/558b16429f621276694405fa5f2091199f2d4c4d))
+* **auth:** Set Content-Type in userTokenProvider.exchangeToken ([#12634](https://github.com/googleapis/google-cloud-go/issues/12634)) ([1197ebc](https://github.com/googleapis/google-cloud-go/commit/1197ebcbca491f8c610da732c7361c90bc6f46d0))
+
+## [0.16.4](https://github.com/googleapis/google-cloud-go/compare/auth/v0.16.3...auth/v0.16.4) (2025-08-06)
+
+
+### Bug Fixes
+
+* **auth:** Add UseDefaultClient: true to metadata.Options ([#12666](https://github.com/googleapis/google-cloud-go/issues/12666)) ([1482191](https://github.com/googleapis/google-cloud-go/commit/1482191e88236693efef68769752638281566766)), refs [#11078](https://github.com/googleapis/google-cloud-go/issues/11078) [#12657](https://github.com/googleapis/google-cloud-go/issues/12657)
+
## [0.16.3](https://github.com/googleapis/google-cloud-go/compare/auth/v0.16.2...auth/v0.16.3) (2025-07-17)
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/auth.go b/hack/tools/vendor/cloud.google.com/go/auth/auth.go
index fb24c43eb5..c6d8015833 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/auth.go
+++ b/hack/tools/vendor/cloud.google.com/go/auth/auth.go
@@ -483,6 +483,8 @@ type Options2LO struct {
Audience string
// PrivateClaims allows specifying any custom claims for the JWT. Optional.
PrivateClaims map[string]interface{}
+ // UniverseDomain is the default service domain for a given Cloud universe.
+ UniverseDomain string
// Client is the client to be used to make the underlying token requests.
// Optional.
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/credentials/compute.go b/hack/tools/vendor/cloud.google.com/go/auth/credentials/compute.go
index e4a8078f8b..a2d5c310a4 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/credentials/compute.go
+++ b/hack/tools/vendor/cloud.google.com/go/auth/credentials/compute.go
@@ -92,11 +92,11 @@ func (cs *computeProvider) Token(ctx context.Context) (*auth.Token, error) {
if res.ExpiresInSec == 0 || res.AccessToken == "" {
return nil, errors.New("credentials: incomplete token received from metadata")
}
- return &auth.Token{
+ token := &auth.Token{
Value: res.AccessToken,
Type: res.TokenType,
Expiry: time.Now().Add(time.Duration(res.ExpiresInSec) * time.Second),
Metadata: computeTokenMetadata,
- }, nil
-
+ }
+ return token, nil
}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/credentials/detect.go b/hack/tools/vendor/cloud.google.com/go/auth/credentials/detect.go
index d8f7d96146..6700e33e14 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/credentials/detect.go
+++ b/hack/tools/vendor/cloud.google.com/go/auth/credentials/detect.go
@@ -27,6 +27,7 @@ import (
"cloud.google.com/go/auth"
"cloud.google.com/go/auth/internal"
"cloud.google.com/go/auth/internal/credsfile"
+ "cloud.google.com/go/auth/internal/trustboundary"
"cloud.google.com/go/compute/metadata"
"github.com/googleapis/gax-go/v2/internallog"
)
@@ -95,6 +96,10 @@ func DetectDefault(opts *DetectOptions) (*auth.Credentials, error) {
if err := opts.validate(); err != nil {
return nil, err
}
+ trustBoundaryEnabled, err := trustboundary.IsEnabled()
+ if err != nil {
+ return nil, err
+ }
if len(opts.CredentialsJSON) > 0 {
return readCredentialsFileJSON(opts.CredentialsJSON, opts)
}
@@ -116,16 +121,29 @@ func DetectDefault(opts *DetectOptions) (*auth.Credentials, error) {
if OnGCE() {
metadataClient := metadata.NewWithOptions(&metadata.Options{
- Logger: opts.logger(),
+ Logger: opts.logger(),
+ UseDefaultClient: true,
})
+ gceUniverseDomainProvider := &internal.ComputeUniverseDomainProvider{
+ MetadataClient: metadataClient,
+ }
+
+ tp := computeTokenProvider(opts, metadataClient)
+ if trustBoundaryEnabled {
+ gceConfigProvider := trustboundary.NewGCEConfigProvider(gceUniverseDomainProvider)
+ var err error
+ tp, err = trustboundary.NewProvider(opts.client(), gceConfigProvider, opts.logger(), tp)
+ if err != nil {
+ return nil, fmt.Errorf("credentials: failed to initialize GCE trust boundary provider: %w", err)
+ }
+
+ }
return auth.NewCredentials(&auth.CredentialsOptions{
- TokenProvider: computeTokenProvider(opts, metadataClient),
+ TokenProvider: tp,
ProjectIDProvider: auth.CredentialsPropertyFunc(func(ctx context.Context) (string, error) {
return metadataClient.ProjectIDWithContext(ctx)
}),
- UniverseDomainProvider: &internal.ComputeUniverseDomainProvider{
- MetadataClient: metadataClient,
- },
+ UniverseDomainProvider: gceUniverseDomainProvider,
}), nil
}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/credentials/filetypes.go b/hack/tools/vendor/cloud.google.com/go/auth/credentials/filetypes.go
index e5243e6cfb..d2a0424702 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/credentials/filetypes.go
+++ b/hack/tools/vendor/cloud.google.com/go/auth/credentials/filetypes.go
@@ -25,6 +25,7 @@ import (
"cloud.google.com/go/auth/credentials/internal/impersonate"
internalauth "cloud.google.com/go/auth/internal"
"cloud.google.com/go/auth/internal/credsfile"
+ "cloud.google.com/go/auth/internal/trustboundary"
)
func fileCredentials(b []byte, opts *DetectOptions) (*auth.Credentials, error) {
@@ -36,6 +37,8 @@ func fileCredentials(b []byte, opts *DetectOptions) (*auth.Credentials, error) {
var projectID, universeDomain string
var tp auth.TokenProvider
switch fileType {
+ case credsfile.UnknownCredType:
+ return nil, errors.New("credentials: unsupported unidentified file type")
case credsfile.ServiceAccountKey:
f, err := credsfile.ParseServiceAccount(b)
if err != nil {
@@ -134,19 +137,34 @@ func handleServiceAccount(f *credsfile.ServiceAccountFile, opts *DetectOptions)
return configureSelfSignedJWT(f, opts)
}
opts2LO := &auth.Options2LO{
- Email: f.ClientEmail,
- PrivateKey: []byte(f.PrivateKey),
- PrivateKeyID: f.PrivateKeyID,
- Scopes: opts.scopes(),
- TokenURL: f.TokenURL,
- Subject: opts.Subject,
- Client: opts.client(),
- Logger: opts.logger(),
+ Email: f.ClientEmail,
+ PrivateKey: []byte(f.PrivateKey),
+ PrivateKeyID: f.PrivateKeyID,
+ Scopes: opts.scopes(),
+ TokenURL: f.TokenURL,
+ Subject: opts.Subject,
+ Client: opts.client(),
+ Logger: opts.logger(),
+ UniverseDomain: ud,
}
if opts2LO.TokenURL == "" {
opts2LO.TokenURL = jwtTokenURL
}
- return auth.New2LOTokenProvider(opts2LO)
+
+ tp, err := auth.New2LOTokenProvider(opts2LO)
+ if err != nil {
+ return nil, err
+ }
+
+ trustBoundaryEnabled, err := trustboundary.IsEnabled()
+ if err != nil {
+ return nil, err
+ }
+ if !trustBoundaryEnabled {
+ return tp, nil
+ }
+ saConfig := trustboundary.NewServiceAccountConfigProvider(opts2LO.Email, opts2LO.UniverseDomain)
+ return trustboundary.NewProvider(opts.client(), saConfig, opts.logger(), tp)
}
func handleUserCredential(f *credsfile.UserCredentialsFile, opts *DetectOptions) (auth.TokenProvider, error) {
@@ -185,7 +203,39 @@ func handleExternalAccount(f *credsfile.ExternalAccountFile, opts *DetectOptions
if f.ServiceAccountImpersonation != nil {
externalOpts.ServiceAccountImpersonationLifetimeSeconds = f.ServiceAccountImpersonation.TokenLifetimeSeconds
}
- return externalaccount.NewTokenProvider(externalOpts)
+ tp, err := externalaccount.NewTokenProvider(externalOpts)
+ if err != nil {
+ return nil, err
+ }
+ trustBoundaryEnabled, err := trustboundary.IsEnabled()
+ if err != nil {
+ return nil, err
+ }
+ if !trustBoundaryEnabled {
+ return tp, nil
+ }
+
+ ud := resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain)
+ var configProvider trustboundary.ConfigProvider
+
+ if f.ServiceAccountImpersonationURL == "" {
+ // No impersonation, this is a direct external account credential.
+ // The trust boundary is based on the workload/workforce pool.
+ var err error
+ configProvider, err = trustboundary.NewExternalAccountConfigProvider(f.Audience, ud)
+ if err != nil {
+ return nil, err
+ }
+ } else {
+ // Impersonation is used. The trust boundary is based on the target service account.
+ targetSAEmail, err := impersonate.ExtractServiceAccountEmail(f.ServiceAccountImpersonationURL)
+ if err != nil {
+ return nil, fmt.Errorf("credentials: could not extract target service account email for trust boundary: %w", err)
+ }
+ configProvider = trustboundary.NewServiceAccountConfigProvider(targetSAEmail, ud)
+ }
+
+ return trustboundary.NewProvider(opts.client(), configProvider, opts.logger(), tp)
}
func handleExternalAccountAuthorizedUser(f *credsfile.ExternalAccountAuthorizedUserFile, opts *DetectOptions) (auth.TokenProvider, error) {
@@ -200,7 +250,24 @@ func handleExternalAccountAuthorizedUser(f *credsfile.ExternalAccountAuthorizedU
Client: opts.client(),
Logger: opts.logger(),
}
- return externalaccountuser.NewTokenProvider(externalOpts)
+ tp, err := externalaccountuser.NewTokenProvider(externalOpts)
+ if err != nil {
+ return nil, err
+ }
+ trustBoundaryEnabled, err := trustboundary.IsEnabled()
+ if err != nil {
+ return nil, err
+ }
+ if !trustBoundaryEnabled {
+ return tp, nil
+ }
+
+ ud := resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain)
+ configProvider, err := trustboundary.NewExternalAccountConfigProvider(f.Audience, ud)
+ if err != nil {
+ return nil, err
+ }
+ return trustboundary.NewProvider(opts.client(), configProvider, opts.logger(), tp)
}
func handleImpersonatedServiceAccount(f *credsfile.ImpersonatedServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) {
@@ -208,20 +275,38 @@ func handleImpersonatedServiceAccount(f *credsfile.ImpersonatedServiceAccountFil
return nil, errors.New("missing 'source_credentials' field or 'service_account_impersonation_url' in credentials")
}
- tp, err := fileCredentials(f.CredSource, opts)
+ sourceTP, err := fileCredentials(f.CredSource, opts)
if err != nil {
return nil, err
}
- return impersonate.NewTokenProvider(&impersonate.Options{
- URL: f.ServiceAccountImpersonationURL,
- Scopes: opts.scopes(),
- Tp: tp,
- Delegates: f.Delegates,
- Client: opts.client(),
- Logger: opts.logger(),
- })
+ ud := resolveUniverseDomain(opts.UniverseDomain, f.UniverseDomain)
+ impOpts := &impersonate.Options{
+ URL: f.ServiceAccountImpersonationURL,
+ Scopes: opts.scopes(),
+ Tp: sourceTP,
+ Delegates: f.Delegates,
+ Client: opts.client(),
+ Logger: opts.logger(),
+ UniverseDomain: ud,
+ }
+ tp, err := impersonate.NewTokenProvider(impOpts)
+ if err != nil {
+ return nil, err
+ }
+ trustBoundaryEnabled, err := trustboundary.IsEnabled()
+ if err != nil {
+ return nil, err
+ }
+ if !trustBoundaryEnabled {
+ return tp, nil
+ }
+ targetSAEmail, err := impersonate.ExtractServiceAccountEmail(f.ServiceAccountImpersonationURL)
+ if err != nil {
+ return nil, fmt.Errorf("credentials: could not extract target service account email for trust boundary: %w", err)
+ }
+ targetSAConfig := trustboundary.NewServiceAccountConfigProvider(targetSAEmail, ud)
+ return trustboundary.NewProvider(opts.client(), targetSAConfig, opts.logger(), tp)
}
-
func handleGDCHServiceAccount(f *credsfile.GDCHServiceAccountFile, opts *DetectOptions) (auth.TokenProvider, error) {
return gdch.NewTokenProvider(f, &gdch.Options{
STSAudience: opts.STSAudience,
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/credentials/impersonate/user.go b/hack/tools/vendor/cloud.google.com/go/auth/credentials/impersonate/user.go
index e5e1d65028..432427fa88 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/credentials/impersonate/user.go
+++ b/hack/tools/vendor/cloud.google.com/go/auth/credentials/impersonate/user.go
@@ -179,6 +179,7 @@ func (u userTokenProvider) exchangeToken(ctx context.Context, signedJWT string)
if err != nil {
return nil, err
}
+ req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
u.logger.DebugContext(ctx, "impersonated user token exchange request", "request", internallog.HTTPRequest(req, []byte(v.Encode())))
resp, body, err := internal.DoRequest(u.client, req)
if err != nil {
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/credentials/internal/impersonate/impersonate.go b/hack/tools/vendor/cloud.google.com/go/auth/credentials/internal/impersonate/impersonate.go
index b3a99261fa..8253376ef8 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/credentials/internal/impersonate/impersonate.go
+++ b/hack/tools/vendor/cloud.google.com/go/auth/credentials/internal/impersonate/impersonate.go
@@ -22,10 +22,12 @@ import (
"fmt"
"log/slog"
"net/http"
+ "regexp"
"time"
"cloud.google.com/go/auth"
"cloud.google.com/go/auth/internal"
+ "cloud.google.com/go/auth/internal/transport/headers"
"github.com/googleapis/gax-go/v2/internallog"
)
@@ -34,6 +36,8 @@ const (
authHeaderKey = "Authorization"
)
+var serviceAccountEmailRegex = regexp.MustCompile(`serviceAccounts/(.+?):generateAccessToken`)
+
// generateAccesstokenReq is used for service account impersonation
type generateAccessTokenReq struct {
Delegates []string `json:"delegates,omitempty"`
@@ -81,6 +85,8 @@ type Options struct {
// enabled by setting GOOGLE_SDK_GO_LOGGING_LEVEL in which case a default
// logger will be used. Optional.
Logger *slog.Logger
+ // UniverseDomain is the default service domain for a given Cloud universe.
+ UniverseDomain string
}
func (o *Options) validate() error {
@@ -114,9 +120,11 @@ func (o *Options) Token(ctx context.Context) (*auth.Token, error) {
return nil, fmt.Errorf("credentials: unable to create impersonation request: %w", err)
}
req.Header.Set("Content-Type", "application/json")
- if err := setAuthHeader(ctx, o.Tp, req); err != nil {
+ sourceToken, err := o.Tp.Token(ctx)
+ if err != nil {
return nil, err
}
+ headers.SetAuthHeader(sourceToken, req)
logger.DebugContext(ctx, "impersonated token request", "request", internallog.HTTPRequest(req, b))
resp, body, err := internal.DoRequest(o.Client, req)
if err != nil {
@@ -135,22 +143,26 @@ func (o *Options) Token(ctx context.Context) (*auth.Token, error) {
if err != nil {
return nil, fmt.Errorf("credentials: unable to parse expiry: %w", err)
}
- return &auth.Token{
+ token := &auth.Token{
Value: accessTokenResp.AccessToken,
Expiry: expiry,
Type: internal.TokenTypeBearer,
- }, nil
+ }
+ return token, nil
}
-func setAuthHeader(ctx context.Context, tp auth.TokenProvider, r *http.Request) error {
- t, err := tp.Token(ctx)
- if err != nil {
- return err
- }
- typ := t.Type
- if typ == "" {
- typ = internal.TokenTypeBearer
+// ExtractServiceAccountEmail extracts the service account email from the impersonation URL.
+// The impersonation URL is expected to be in the format:
+// https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}:generateAccessToken
+// or
+// https://iamcredentials.googleapis.com/v1/projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}:generateAccessToken
+// Returns an error if the email cannot be extracted.
+func ExtractServiceAccountEmail(impersonationURL string) (string, error) {
+ matches := serviceAccountEmailRegex.FindStringSubmatch(impersonationURL)
+
+ if len(matches) < 2 {
+ return "", fmt.Errorf("credentials: invalid impersonation URL format: %s", impersonationURL)
}
- r.Header.Set(authHeaderKey, typ+" "+t.Value)
- return nil
+
+ return matches[1], nil
}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/grpctransport/grpctransport.go b/hack/tools/vendor/cloud.google.com/go/auth/grpctransport/grpctransport.go
index 834aef41c8..6bcd3ef545 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/grpctransport/grpctransport.go
+++ b/hack/tools/vendor/cloud.google.com/go/auth/grpctransport/grpctransport.go
@@ -30,6 +30,7 @@ import (
"cloud.google.com/go/auth/credentials"
"cloud.google.com/go/auth/internal"
"cloud.google.com/go/auth/internal/transport"
+ "cloud.google.com/go/auth/internal/transport/headers"
"github.com/googleapis/gax-go/v2/internallog"
"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
"google.golang.org/grpc"
@@ -428,23 +429,13 @@ func (c *grpcCredentialsProvider) GetRequestMetadata(ctx context.Context, uri ..
}
}
metadata := make(map[string]string, len(c.metadata)+1)
- setAuthMetadata(token, metadata)
+ headers.SetAuthMetadata(token, metadata)
for k, v := range c.metadata {
metadata[k] = v
}
return metadata, nil
}
-// setAuthMetadata uses the provided token to set the Authorization metadata.
-// If the token.Type is empty, the type is assumed to be Bearer.
-func setAuthMetadata(token *auth.Token, m map[string]string) {
- typ := token.Type
- if typ == "" {
- typ = internal.TokenTypeBearer
- }
- m["authorization"] = typ + " " + token.Value
-}
-
func (c *grpcCredentialsProvider) RequireTransportSecurity() bool {
return c.secure
}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/httptransport/httptransport.go b/hack/tools/vendor/cloud.google.com/go/auth/httptransport/httptransport.go
index 5758e85b5d..c9126535d7 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/httptransport/httptransport.go
+++ b/hack/tools/vendor/cloud.google.com/go/auth/httptransport/httptransport.go
@@ -25,8 +25,8 @@ import (
"cloud.google.com/go/auth"
detect "cloud.google.com/go/auth/credentials"
- "cloud.google.com/go/auth/internal"
"cloud.google.com/go/auth/internal/transport"
+ "cloud.google.com/go/auth/internal/transport/headers"
"github.com/googleapis/gax-go/v2/internallog"
)
@@ -236,12 +236,10 @@ func NewClient(opts *Options) (*http.Client, error) {
}, nil
}
-// SetAuthHeader uses the provided token to set the Authorization header on a
-// request. If the token.Type is empty, the type is assumed to be Bearer.
+// SetAuthHeader uses the provided token to set the Authorization and trust
+// boundary headers on an http.Request. If the token.Type is empty, the type is
+// assumed to be Bearer. This is the recommended way to set authorization
+// headers on a custom http.Request.
func SetAuthHeader(token *auth.Token, req *http.Request) {
- typ := token.Type
- if typ == "" {
- typ = internal.TokenTypeBearer
- }
- req.Header.Set("Authorization", typ+" "+token.Value)
+ headers.SetAuthHeader(token, req)
}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/httptransport/transport.go b/hack/tools/vendor/cloud.google.com/go/auth/httptransport/transport.go
index ee215b6dc6..3feb997c76 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/httptransport/transport.go
+++ b/hack/tools/vendor/cloud.google.com/go/auth/httptransport/transport.go
@@ -27,6 +27,7 @@ import (
"cloud.google.com/go/auth/internal"
"cloud.google.com/go/auth/internal/transport"
"cloud.google.com/go/auth/internal/transport/cert"
+ "cloud.google.com/go/auth/internal/transport/headers"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"golang.org/x/net/http2"
)
@@ -228,7 +229,7 @@ func (t *authTransport) RoundTrip(req *http.Request) (*http.Response, error) {
}
}
req2 := req.Clone(req.Context())
- SetAuthHeader(token, req2)
+ headers.SetAuthHeader(token, req2)
reqBodyClosed = true
return t.base.RoundTrip(req2)
}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/internal/internal.go b/hack/tools/vendor/cloud.google.com/go/auth/internal/internal.go
index 6a8eab6eb9..72a8a6b7a5 100644
--- a/hack/tools/vendor/cloud.google.com/go/auth/internal/internal.go
+++ b/hack/tools/vendor/cloud.google.com/go/auth/internal/internal.go
@@ -47,6 +47,12 @@ const (
// DefaultUniverseDomain is the default value for universe domain.
// Universe domain is the default service domain for a given Cloud universe.
DefaultUniverseDomain = "googleapis.com"
+
+ // TrustBoundaryNoOp is a constant indicating no trust boundary is enforced.
+ TrustBoundaryNoOp = "0x0"
+
+ // TrustBoundaryDataKey is the key used to store trust boundary data in a token's metadata.
+ TrustBoundaryDataKey = "google.auth.trust_boundary_data"
)
type clonableTransport interface {
@@ -223,3 +229,56 @@ func getMetadataUniverseDomain(ctx context.Context, client *metadata.Client) (st
func FormatIAMServiceAccountResource(name string) string {
return fmt.Sprintf("projects/-/serviceAccounts/%s", name)
}
+
+// TrustBoundaryData represents the trust boundary data associated with a token.
+// It contains information about the regions or environments where the token is valid.
+type TrustBoundaryData struct {
+ // Locations is the list of locations that the token is allowed to be used in.
+ Locations []string
+ // EncodedLocations represents the locations in an encoded format.
+ EncodedLocations string
+}
+
+// NewTrustBoundaryData returns a new TrustBoundaryData with the specified locations and encoded locations.
+func NewTrustBoundaryData(locations []string, encodedLocations string) *TrustBoundaryData {
+ // Ensure consistency by treating a nil slice as an empty slice.
+ if locations == nil {
+ locations = []string{}
+ }
+ locationsCopy := make([]string, len(locations))
+ copy(locationsCopy, locations)
+ return &TrustBoundaryData{
+ Locations: locationsCopy,
+ EncodedLocations: encodedLocations,
+ }
+}
+
+// NewNoOpTrustBoundaryData returns a new TrustBoundaryData with no restrictions.
+func NewNoOpTrustBoundaryData() *TrustBoundaryData {
+ return &TrustBoundaryData{
+ Locations: []string{},
+ EncodedLocations: TrustBoundaryNoOp,
+ }
+}
+
+// TrustBoundaryHeader returns the value for the x-allowed-locations header and a bool
+// indicating if the header should be set. The return values are structured to
+// handle three distinct states required by the backend:
+// 1. Header not set: (value="", present=false) -> data is empty.
+// 2. Header set to an empty string: (value="", present=true) -> data is a no-op.
+// 3. Header set to a value: (value="...", present=true) -> data has locations.
+func (t TrustBoundaryData) TrustBoundaryHeader() (value string, present bool) {
+ if t.EncodedLocations == "" {
+ // If the data is empty, the header should not be present.
+ return "", false
+ }
+
+ // If data is not empty, the header should always be present.
+ present = true
+ value = ""
+ if t.EncodedLocations != TrustBoundaryNoOp {
+ value = t.EncodedLocations
+ }
+ // For a no-op, the backend requires an empty string.
+ return value, present
+}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/internal/retry/retry.go b/hack/tools/vendor/cloud.google.com/go/auth/internal/retry/retry.go
new file mode 100644
index 0000000000..276cc4a3e2
--- /dev/null
+++ b/hack/tools/vendor/cloud.google.com/go/auth/internal/retry/retry.go
@@ -0,0 +1,117 @@
+// Copyright 2025 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.
+
+package retry
+
+import (
+ "context"
+ "io"
+ "math/rand"
+ "net/http"
+ "time"
+)
+
+const (
+ maxRetryAttempts = 5
+)
+
+var (
+ syscallRetryable = func(error) bool { return false }
+)
+
+// defaultBackoff is basically equivalent to gax.Backoff without the need for
+// the dependency.
+type defaultBackoff struct {
+ max time.Duration
+ mul float64
+ cur time.Duration
+}
+
+func (b *defaultBackoff) Pause() time.Duration {
+ d := time.Duration(1 + rand.Int63n(int64(b.cur)))
+ b.cur = time.Duration(float64(b.cur) * b.mul)
+ if b.cur > b.max {
+ b.cur = b.max
+ }
+ return d
+}
+
+// Sleep is the equivalent of gax.Sleep without the need for the dependency.
+func Sleep(ctx context.Context, d time.Duration) error {
+ t := time.NewTimer(d)
+ select {
+ case <-ctx.Done():
+ t.Stop()
+ return ctx.Err()
+ case <-t.C:
+ return nil
+ }
+}
+
+// New returns a new Retryer with the default backoff strategy.
+func New() *Retryer {
+ return &Retryer{bo: &defaultBackoff{
+ cur: 100 * time.Millisecond,
+ max: 30 * time.Second,
+ mul: 2,
+ }}
+}
+
+type backoff interface {
+ Pause() time.Duration
+}
+
+// Retryer is a retryer for HTTP requests.
+type Retryer struct {
+ bo backoff
+ attempts int
+}
+
+// Retry determines if a request should be retried.
+func (r *Retryer) Retry(status int, err error) (time.Duration, bool) {
+ if status == http.StatusOK {
+ return 0, false
+ }
+ retryOk := shouldRetry(status, err)
+ if !retryOk {
+ return 0, false
+ }
+ if r.attempts == maxRetryAttempts {
+ return 0, false
+ }
+ r.attempts++
+ return r.bo.Pause(), true
+}
+
+func shouldRetry(status int, err error) bool {
+ if 500 <= status && status <= 599 {
+ return true
+ }
+ if err == io.ErrUnexpectedEOF {
+ return true
+ }
+ // Transient network errors should be retried.
+ if syscallRetryable(err) {
+ return true
+ }
+ if err, ok := err.(interface{ Temporary() bool }); ok {
+ if err.Temporary() {
+ return true
+ }
+ }
+ if err, ok := err.(interface{ Unwrap() error }); ok {
+ return shouldRetry(status, err.Unwrap())
+ }
+ return false
+}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/internal/transport/headers/headers.go b/hack/tools/vendor/cloud.google.com/go/auth/internal/transport/headers/headers.go
new file mode 100644
index 0000000000..5483a763c4
--- /dev/null
+++ b/hack/tools/vendor/cloud.google.com/go/auth/internal/transport/headers/headers.go
@@ -0,0 +1,61 @@
+// Copyright 2025 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.
+
+package headers
+
+import (
+ "net/http"
+
+ "cloud.google.com/go/auth"
+ "cloud.google.com/go/auth/internal"
+)
+
+// SetAuthHeader uses the provided token to set the Authorization and trust
+// boundary headers on a request. If the token.Type is empty, the type is
+// assumed to be Bearer.
+func SetAuthHeader(token *auth.Token, req *http.Request) {
+ typ := token.Type
+ if typ == "" {
+ typ = internal.TokenTypeBearer
+ }
+ req.Header.Set("Authorization", typ+" "+token.Value)
+
+ if headerVal, setHeader := getTrustBoundaryHeader(token); setHeader {
+ req.Header.Set("x-allowed-locations", headerVal)
+ }
+}
+
+// SetAuthMetadata uses the provided token to set the Authorization and trust
+// boundary metadata. If the token.Type is empty, the type is assumed to be
+// Bearer.
+func SetAuthMetadata(token *auth.Token, m map[string]string) {
+ typ := token.Type
+ if typ == "" {
+ typ = internal.TokenTypeBearer
+ }
+ m["authorization"] = typ + " " + token.Value
+
+ if headerVal, setHeader := getTrustBoundaryHeader(token); setHeader {
+ m["x-allowed-locations"] = headerVal
+ }
+}
+
+func getTrustBoundaryHeader(token *auth.Token) (val string, present bool) {
+ if data, ok := token.Metadata[internal.TrustBoundaryDataKey]; ok {
+ if tbd, ok := data.(internal.TrustBoundaryData); ok {
+ return tbd.TrustBoundaryHeader()
+ }
+ }
+ return "", false
+}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/internal/trustboundary/external_accounts_config_providers.go b/hack/tools/vendor/cloud.google.com/go/auth/internal/trustboundary/external_accounts_config_providers.go
new file mode 100644
index 0000000000..8fa5600bdc
--- /dev/null
+++ b/hack/tools/vendor/cloud.google.com/go/auth/internal/trustboundary/external_accounts_config_providers.go
@@ -0,0 +1,100 @@
+// Copyright 2025 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.
+
+package trustboundary
+
+import (
+ "context"
+ "fmt"
+ "regexp"
+)
+
+const (
+ workloadAllowedLocationsEndpoint = "https://iamcredentials.%s/v1/projects/%s/locations/global/workloadIdentityPools/%s/allowedLocations"
+ workforceAllowedLocationsEndpoint = "https://iamcredentials.%s/v1/locations/global/workforcePools/%s/allowedLocations"
+)
+
+var (
+ workforceAudiencePattern = regexp.MustCompile(`//iam\.([^/]+)/locations/global/workforcePools/([^/]+)`)
+ workloadAudiencePattern = regexp.MustCompile(`//iam\.([^/]+)/projects/([^/]+)/locations/global/workloadIdentityPools/([^/]+)`)
+)
+
+// NewExternalAccountConfigProvider creates a new ConfigProvider for external accounts.
+func NewExternalAccountConfigProvider(audience, inputUniverseDomain string) (ConfigProvider, error) {
+ var audienceDomain, projectNumber, poolID string
+ var isWorkload bool
+
+ matches := workloadAudiencePattern.FindStringSubmatch(audience)
+ if len(matches) == 4 { // Expecting full match, domain, projectNumber, poolID
+ audienceDomain = matches[1]
+ projectNumber = matches[2]
+ poolID = matches[3]
+ isWorkload = true
+ } else {
+ matches = workforceAudiencePattern.FindStringSubmatch(audience)
+ if len(matches) == 3 { // Expecting full match, domain, poolID
+ audienceDomain = matches[1]
+ poolID = matches[2]
+ isWorkload = false
+ } else {
+ return nil, fmt.Errorf("trustboundary: unknown audience format: %q", audience)
+ }
+ }
+
+ effectiveUniverseDomain := inputUniverseDomain
+ if effectiveUniverseDomain == "" {
+ effectiveUniverseDomain = audienceDomain
+ } else if audienceDomain != "" && effectiveUniverseDomain != audienceDomain {
+ return nil, fmt.Errorf("trustboundary: provided universe domain (%q) does not match domain in audience (%q)", inputUniverseDomain, audienceDomain)
+ }
+
+ if isWorkload {
+ return &workloadIdentityPoolConfigProvider{
+ projectNumber: projectNumber,
+ poolID: poolID,
+ universeDomain: effectiveUniverseDomain,
+ }, nil
+ }
+ return &workforcePoolConfigProvider{
+ poolID: poolID,
+ universeDomain: effectiveUniverseDomain,
+ }, nil
+}
+
+type workforcePoolConfigProvider struct {
+ poolID string
+ universeDomain string
+}
+
+func (p *workforcePoolConfigProvider) GetTrustBoundaryEndpoint(ctx context.Context) (string, error) {
+ return fmt.Sprintf(workforceAllowedLocationsEndpoint, p.universeDomain, p.poolID), nil
+}
+
+func (p *workforcePoolConfigProvider) GetUniverseDomain(ctx context.Context) (string, error) {
+ return p.universeDomain, nil
+}
+
+type workloadIdentityPoolConfigProvider struct {
+ projectNumber string
+ poolID string
+ universeDomain string
+}
+
+func (p *workloadIdentityPoolConfigProvider) GetTrustBoundaryEndpoint(ctx context.Context) (string, error) {
+ return fmt.Sprintf(workloadAllowedLocationsEndpoint, p.universeDomain, p.projectNumber, p.poolID), nil
+}
+
+func (p *workloadIdentityPoolConfigProvider) GetUniverseDomain(ctx context.Context) (string, error) {
+ return p.universeDomain, nil
+}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/internal/trustboundary/trust_boundary.go b/hack/tools/vendor/cloud.google.com/go/auth/internal/trustboundary/trust_boundary.go
new file mode 100644
index 0000000000..bf898fffd6
--- /dev/null
+++ b/hack/tools/vendor/cloud.google.com/go/auth/internal/trustboundary/trust_boundary.go
@@ -0,0 +1,392 @@
+// Copyright 2025 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.
+
+package trustboundary
+
+import (
+ "context"
+ "encoding/json"
+ "errors"
+ "fmt"
+ "io"
+ "log/slog"
+ "net/http"
+ "os"
+ "strings"
+ "sync"
+
+ "cloud.google.com/go/auth"
+ "cloud.google.com/go/auth/internal"
+ "cloud.google.com/go/auth/internal/retry"
+ "cloud.google.com/go/auth/internal/transport/headers"
+ "github.com/googleapis/gax-go/v2/internallog"
+)
+
+const (
+ // serviceAccountAllowedLocationsEndpoint is the URL for fetching allowed locations for a given service account email.
+ serviceAccountAllowedLocationsEndpoint = "https://iamcredentials.%s/v1/projects/-/serviceAccounts/%s/allowedLocations"
+)
+
+// isEnabled wraps isTrustBoundaryEnabled with sync.OnceValues to ensure it's
+// called only once.
+var isEnabled = sync.OnceValues(isTrustBoundaryEnabled)
+
+// IsEnabled returns if the trust boundary feature is enabled and an error if
+// the configuration is invalid. The underlying check is performed only once.
+func IsEnabled() (bool, error) {
+ return isEnabled()
+}
+
+// isTrustBoundaryEnabled checks if the trust boundary feature is enabled via
+// GOOGLE_AUTH_TRUST_BOUNDARY_ENABLED environment variable.
+//
+// If the environment variable is not set, it is considered false.
+//
+// The environment variable is interpreted as a boolean with the following
+// (case-insensitive) rules:
+// - "true", "1" are considered true.
+// - "false", "0" are considered false.
+//
+// Any other values will return an error.
+func isTrustBoundaryEnabled() (bool, error) {
+ const envVar = "GOOGLE_AUTH_TRUST_BOUNDARY_ENABLED"
+ val, ok := os.LookupEnv(envVar)
+ if !ok {
+ return false, nil
+ }
+ val = strings.ToLower(val)
+ switch val {
+ case "true", "1":
+ return true, nil
+ case "false", "0":
+ return false, nil
+ default:
+ return false, fmt.Errorf(`invalid value for %s: %q. Must be one of "true", "false", "1", or "0"`, envVar, val)
+ }
+}
+
+// ConfigProvider provides specific configuration for trust boundary lookups.
+type ConfigProvider interface {
+ // GetTrustBoundaryEndpoint returns the endpoint URL for the trust boundary lookup.
+ GetTrustBoundaryEndpoint(ctx context.Context) (url string, err error)
+ // GetUniverseDomain returns the universe domain associated with the credential.
+ // It may return an error if the universe domain cannot be determined.
+ GetUniverseDomain(ctx context.Context) (string, error)
+}
+
+// AllowedLocationsResponse is the structure of the response from the Trust Boundary API.
+type AllowedLocationsResponse struct {
+ // Locations is the list of allowed locations.
+ Locations []string `json:"locations"`
+ // EncodedLocations is the encoded representation of the allowed locations.
+ EncodedLocations string `json:"encodedLocations"`
+}
+
+// fetchTrustBoundaryData fetches the trust boundary data from the API.
+func fetchTrustBoundaryData(ctx context.Context, client *http.Client, url string, token *auth.Token, logger *slog.Logger) (*internal.TrustBoundaryData, error) {
+ if logger == nil {
+ logger = slog.New(slog.NewTextHandler(io.Discard, nil))
+ }
+ if client == nil {
+ return nil, errors.New("trustboundary: HTTP client is required")
+ }
+
+ if url == "" {
+ return nil, errors.New("trustboundary: URL cannot be empty")
+ }
+
+ req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
+ if err != nil {
+ return nil, fmt.Errorf("trustboundary: failed to create trust boundary request: %w", err)
+ }
+
+ if token == nil || token.Value == "" {
+ return nil, errors.New("trustboundary: access token required for lookup API authentication")
+ }
+ headers.SetAuthHeader(token, req)
+ logger.DebugContext(ctx, "trust boundary request", "request", internallog.HTTPRequest(req, nil))
+
+ retryer := retry.New()
+ var response *http.Response
+ for {
+ response, err = client.Do(req)
+
+ var statusCode int
+ if response != nil {
+ statusCode = response.StatusCode
+ }
+ pause, shouldRetry := retryer.Retry(statusCode, err)
+
+ if !shouldRetry {
+ break
+ }
+
+ if response != nil {
+ // Drain and close the body to reuse the connection
+ io.Copy(io.Discard, response.Body)
+ response.Body.Close()
+ }
+
+ if err := retry.Sleep(ctx, pause); err != nil {
+ return nil, err
+ }
+ }
+
+ if err != nil {
+ return nil, fmt.Errorf("trustboundary: failed to fetch trust boundary: %w", err)
+ }
+ defer response.Body.Close()
+
+ body, err := io.ReadAll(response.Body)
+ if err != nil {
+ return nil, fmt.Errorf("trustboundary: failed to read trust boundary response: %w", err)
+ }
+
+ logger.DebugContext(ctx, "trust boundary response", "response", internallog.HTTPResponse(response, body))
+
+ if response.StatusCode != http.StatusOK {
+ return nil, fmt.Errorf("trustboundary: trust boundary request failed with status: %s, body: %s", response.Status, string(body))
+ }
+
+ apiResponse := AllowedLocationsResponse{}
+ if err := json.Unmarshal(body, &apiResponse); err != nil {
+ return nil, fmt.Errorf("trustboundary: failed to unmarshal trust boundary response: %w", err)
+ }
+
+ if apiResponse.EncodedLocations == "" {
+ return nil, errors.New("trustboundary: invalid API response: encodedLocations is empty")
+ }
+
+ return internal.NewTrustBoundaryData(apiResponse.Locations, apiResponse.EncodedLocations), nil
+}
+
+// serviceAccountConfig holds configuration for SA trust boundary lookups.
+// It implements the ConfigProvider interface.
+type serviceAccountConfig struct {
+ ServiceAccountEmail string
+ UniverseDomain string
+}
+
+// NewServiceAccountConfigProvider creates a new config for service accounts.
+func NewServiceAccountConfigProvider(saEmail, universeDomain string) ConfigProvider {
+ return &serviceAccountConfig{
+ ServiceAccountEmail: saEmail,
+ UniverseDomain: universeDomain,
+ }
+}
+
+// GetTrustBoundaryEndpoint returns the formatted URL for fetching allowed locations
+// for the configured service account and universe domain.
+func (sac *serviceAccountConfig) GetTrustBoundaryEndpoint(ctx context.Context) (url string, err error) {
+ if sac.ServiceAccountEmail == "" {
+ return "", errors.New("trustboundary: service account email cannot be empty for config")
+ }
+ ud := sac.UniverseDomain
+ if ud == "" {
+ ud = internal.DefaultUniverseDomain
+ }
+ return fmt.Sprintf(serviceAccountAllowedLocationsEndpoint, ud, sac.ServiceAccountEmail), nil
+}
+
+// GetUniverseDomain returns the configured universe domain, defaulting to
+// [internal.DefaultUniverseDomain] if not explicitly set.
+func (sac *serviceAccountConfig) GetUniverseDomain(ctx context.Context) (string, error) {
+ if sac.UniverseDomain == "" {
+ return internal.DefaultUniverseDomain, nil
+ }
+ return sac.UniverseDomain, nil
+}
+
+// DataProvider fetches and caches trust boundary Data.
+// It implements the DataProvider interface and uses a ConfigProvider
+// to get type-specific details for the lookup.
+type DataProvider struct {
+ client *http.Client
+ configProvider ConfigProvider
+ data *internal.TrustBoundaryData
+ logger *slog.Logger
+ base auth.TokenProvider
+}
+
+// NewProvider wraps the provided base [auth.TokenProvider] to create a new
+// provider that injects tokens with trust boundary data. It uses the provided
+// HTTP client and configProvider to fetch the data and attach it to the token's
+// metadata.
+func NewProvider(client *http.Client, configProvider ConfigProvider, logger *slog.Logger, base auth.TokenProvider) (*DataProvider, error) {
+ if client == nil {
+ return nil, errors.New("trustboundary: HTTP client cannot be nil for DataProvider")
+ }
+ if configProvider == nil {
+ return nil, errors.New("trustboundary: ConfigProvider cannot be nil for DataProvider")
+ }
+ p := &DataProvider{
+ client: client,
+ configProvider: configProvider,
+ logger: internallog.New(logger),
+ base: base,
+ }
+ return p, nil
+}
+
+// Token retrieves a token from the base provider and injects it with trust
+// boundary data.
+func (p *DataProvider) Token(ctx context.Context) (*auth.Token, error) {
+ // Get the original token.
+ token, err := p.base.Token(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ tbData, err := p.GetTrustBoundaryData(ctx, token)
+ if err != nil {
+ return nil, fmt.Errorf("trustboundary: error fetching the trust boundary data: %w", err)
+ }
+ if tbData != nil {
+ if token.Metadata == nil {
+ token.Metadata = make(map[string]interface{})
+ }
+ token.Metadata[internal.TrustBoundaryDataKey] = *tbData
+ }
+ return token, nil
+}
+
+// GetTrustBoundaryData retrieves the trust boundary data.
+// It first checks the universe domain: if it's non-default, a NoOp is returned.
+// Otherwise, it checks a local cache. If the data is not cached as NoOp,
+// it fetches new data from the endpoint provided by its ConfigProvider,
+// using the given accessToken for authentication. Results are cached.
+// If fetching fails, it returns previously cached data if available, otherwise the fetch error.
+func (p *DataProvider) GetTrustBoundaryData(ctx context.Context, token *auth.Token) (*internal.TrustBoundaryData, error) {
+ // Check the universe domain.
+ uniDomain, err := p.configProvider.GetUniverseDomain(ctx)
+ if err != nil {
+ return nil, fmt.Errorf("trustboundary: error getting universe domain: %w", err)
+ }
+ if uniDomain != "" && uniDomain != internal.DefaultUniverseDomain {
+ if p.data == nil || p.data.EncodedLocations != internal.TrustBoundaryNoOp {
+ p.data = internal.NewNoOpTrustBoundaryData()
+ }
+ return p.data, nil
+ }
+
+ // Check cache for a no-op result from a previous API call.
+ cachedData := p.data
+ if cachedData != nil && cachedData.EncodedLocations == internal.TrustBoundaryNoOp {
+ return cachedData, nil
+ }
+
+ // Get the endpoint
+ url, err := p.configProvider.GetTrustBoundaryEndpoint(ctx)
+ if err != nil {
+ return nil, fmt.Errorf("trustboundary: error getting the lookup endpoint: %w", err)
+ }
+
+ // Proceed to fetch new data.
+ newData, fetchErr := fetchTrustBoundaryData(ctx, p.client, url, token, p.logger)
+
+ if fetchErr != nil {
+ // Fetch failed. Fallback to cachedData if available.
+ if cachedData != nil {
+ return cachedData, nil // Successful fallback
+ }
+ // No cache to fallback to.
+ return nil, fmt.Errorf("trustboundary: failed to fetch trust boundary data for endpoint %s and no cache available: %w", url, fetchErr)
+ }
+
+ // Fetch successful. Update cache.
+ p.data = newData
+ return newData, nil
+}
+
+// GCEConfigProvider implements ConfigProvider for GCE environments.
+// It lazily fetches and caches the necessary metadata (service account email, universe domain)
+// from the GCE metadata server.
+type GCEConfigProvider struct {
+ // universeDomainProvider provides the universe domain and underlying metadata client.
+ universeDomainProvider *internal.ComputeUniverseDomainProvider
+
+ // Caching for service account email
+ saOnce sync.Once
+ saEmail string
+ saEmailErr error
+
+ // Caching for universe domain
+ udOnce sync.Once
+ ud string
+ udErr error
+}
+
+// NewGCEConfigProvider creates a new GCEConfigProvider
+// which uses the provided gceUDP to interact with the GCE metadata server.
+func NewGCEConfigProvider(gceUDP *internal.ComputeUniverseDomainProvider) *GCEConfigProvider {
+ // The validity of gceUDP and its internal MetadataClient will be checked
+ // within the GetTrustBoundaryEndpoint and GetUniverseDomain methods.
+ return &GCEConfigProvider{
+ universeDomainProvider: gceUDP,
+ }
+}
+
+func (g *GCEConfigProvider) fetchSA(ctx context.Context) {
+ if g.universeDomainProvider == nil || g.universeDomainProvider.MetadataClient == nil {
+ g.saEmailErr = errors.New("trustboundary: GCEConfigProvider not properly initialized (missing ComputeUniverseDomainProvider or MetadataClient)")
+ return
+ }
+ mdClient := g.universeDomainProvider.MetadataClient
+ saEmail, err := mdClient.EmailWithContext(ctx, "default")
+ if err != nil {
+ g.saEmailErr = fmt.Errorf("trustboundary: GCE config: failed to get service account email: %w", err)
+ return
+ }
+ g.saEmail = saEmail
+}
+
+func (g *GCEConfigProvider) fetchUD(ctx context.Context) {
+ if g.universeDomainProvider == nil || g.universeDomainProvider.MetadataClient == nil {
+ g.udErr = errors.New("trustboundary: GCEConfigProvider not properly initialized (missing ComputeUniverseDomainProvider or MetadataClient)")
+ return
+ }
+ ud, err := g.universeDomainProvider.GetProperty(ctx)
+ if err != nil {
+ g.udErr = fmt.Errorf("trustboundary: GCE config: failed to get universe domain: %w", err)
+ return
+ }
+ if ud == "" {
+ ud = internal.DefaultUniverseDomain
+ }
+ g.ud = ud
+}
+
+// GetTrustBoundaryEndpoint constructs the trust boundary lookup URL for a GCE environment.
+// It uses cached metadata (service account email, universe domain) after the first call.
+func (g *GCEConfigProvider) GetTrustBoundaryEndpoint(ctx context.Context) (string, error) {
+ g.saOnce.Do(func() { g.fetchSA(ctx) })
+ if g.saEmailErr != nil {
+ return "", g.saEmailErr
+ }
+ g.udOnce.Do(func() { g.fetchUD(ctx) })
+ if g.udErr != nil {
+ return "", g.udErr
+ }
+ return fmt.Sprintf(serviceAccountAllowedLocationsEndpoint, g.ud, g.saEmail), nil
+}
+
+// GetUniverseDomain retrieves the universe domain from the GCE metadata server.
+// It uses a cached value after the first call.
+func (g *GCEConfigProvider) GetUniverseDomain(ctx context.Context) (string, error) {
+ g.udOnce.Do(func() { g.fetchUD(ctx) })
+ if g.udErr != nil {
+ return "", g.udErr
+ }
+ return g.ud, nil
+}
diff --git a/hack/tools/vendor/cloud.google.com/go/auth/internal/version.go b/hack/tools/vendor/cloud.google.com/go/auth/internal/version.go
new file mode 100644
index 0000000000..e2f56cf4d8
--- /dev/null
+++ b/hack/tools/vendor/cloud.google.com/go/auth/internal/version.go
@@ -0,0 +1,20 @@
+// Copyright 2025 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.
+
+// Code generated by gapicgen. DO NOT EDIT.
+
+package internal
+
+// Version is the current tagged release of the library.
+const Version = "0.17.0"
diff --git a/hack/tools/vendor/cloud.google.com/go/compute/metadata/CHANGES.md b/hack/tools/vendor/cloud.google.com/go/compute/metadata/CHANGES.md
index 1f848ce0b3..e384683c50 100644
--- a/hack/tools/vendor/cloud.google.com/go/compute/metadata/CHANGES.md
+++ b/hack/tools/vendor/cloud.google.com/go/compute/metadata/CHANGES.md
@@ -1,5 +1,47 @@
# Changes
+## [0.9.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.8.4...compute/metadata/v0.9.0) (2025-09-24)
+
+
+### Features
+
+* **compute/metadata:** Retry on HTTP 429 ([#12932](https://github.com/googleapis/google-cloud-go/issues/12932)) ([1e91f5c](https://github.com/googleapis/google-cloud-go/commit/1e91f5c07acacd38ecdd4ff3e83e092b745e0bc2))
+
+## [0.8.4](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.8.3...compute/metadata/v0.8.4) (2025-09-18)
+
+
+### Bug Fixes
+
+* **compute/metadata:** Set subClient for UseDefaultClient case ([#12911](https://github.com/googleapis/google-cloud-go/issues/12911)) ([9e2646b](https://github.com/googleapis/google-cloud-go/commit/9e2646b1821231183fd775bb107c062865eeaccd))
+
+## [0.8.3](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.8.2...compute/metadata/v0.8.3) (2025-09-17)
+
+
+### Bug Fixes
+
+* **compute/metadata:** Disable Client timeouts for subscription client ([#12910](https://github.com/googleapis/google-cloud-go/issues/12910)) ([187a58a](https://github.com/googleapis/google-cloud-go/commit/187a58a540494e1e8562b046325b8cad8cf7af4a))
+
+## [0.8.2](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.8.1...compute/metadata/v0.8.2) (2025-09-17)
+
+
+### Bug Fixes
+
+* **compute/metadata:** Racy test and uninitialized subClient ([#12892](https://github.com/googleapis/google-cloud-go/issues/12892)) ([4943ca2](https://github.com/googleapis/google-cloud-go/commit/4943ca2bf83908a23806247bc4252dfb440d09cc)), refs [#12888](https://github.com/googleapis/google-cloud-go/issues/12888)
+
+## [0.8.1](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.8.0...compute/metadata/v0.8.1) (2025-09-16)
+
+
+### Bug Fixes
+
+* **compute/metadata:** Use separate client for subscribe methods ([#12885](https://github.com/googleapis/google-cloud-go/issues/12885)) ([76b80f8](https://github.com/googleapis/google-cloud-go/commit/76b80f8df9bf9339d175407e8c15936fe1ac1c9c))
+
+## [0.8.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.7.0...compute/metadata/v0.8.0) (2025-08-06)
+
+
+### Features
+
+* **compute/metadata:** Add Options.UseDefaultClient ([#12657](https://github.com/googleapis/google-cloud-go/issues/12657)) ([1a88209](https://github.com/googleapis/google-cloud-go/commit/1a8820900f20e038291c4bb2c5284a449196e81f)), refs [#11078](https://github.com/googleapis/google-cloud-go/issues/11078)
+
## [0.7.0](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.6.0...compute/metadata/v0.7.0) (2025-05-13)
diff --git a/hack/tools/vendor/cloud.google.com/go/compute/metadata/metadata.go b/hack/tools/vendor/cloud.google.com/go/compute/metadata/metadata.go
index 322be8032d..6bd1891660 100644
--- a/hack/tools/vendor/cloud.google.com/go/compute/metadata/metadata.go
+++ b/hack/tools/vendor/cloud.google.com/go/compute/metadata/metadata.go
@@ -22,6 +22,7 @@ package metadata // import "cloud.google.com/go/compute/metadata"
import (
"context"
"encoding/json"
+ "errors"
"fmt"
"io"
"log/slog"
@@ -62,21 +63,26 @@ var (
)
var defaultClient = &Client{
- hc: newDefaultHTTPClient(),
- logger: slog.New(noOpHandler{}),
+ hc: newDefaultHTTPClient(true),
+ subClient: newDefaultHTTPClient(false),
+ logger: slog.New(noOpHandler{}),
}
-func newDefaultHTTPClient() *http.Client {
- return &http.Client{
- Transport: &http.Transport{
- Dial: (&net.Dialer{
- Timeout: 2 * time.Second,
- KeepAlive: 30 * time.Second,
- }).Dial,
- IdleConnTimeout: 60 * time.Second,
- },
- Timeout: 5 * time.Second,
+func newDefaultHTTPClient(enableTimeouts bool) *http.Client {
+ transport := &http.Transport{
+ Dial: (&net.Dialer{
+ Timeout: 2 * time.Second,
+ KeepAlive: 30 * time.Second,
+ }).Dial,
}
+ c := &http.Client{
+ Transport: transport,
+ }
+ if enableTimeouts {
+ transport.IdleConnTimeout = 60 * time.Second
+ c.Timeout = 5 * time.Second
+ }
+ return c
}
// NotDefinedError is returned when requested metadata is not defined.
@@ -350,42 +356,74 @@ func strsContains(ss []string, s string) bool {
// A Client provides metadata.
type Client struct {
- hc *http.Client
- logger *slog.Logger
+ hc *http.Client
+ // subClient by default is a HTTP Client that is only used for subscribe
+ // methods that should not specify a timeout. If the user specifies a client
+ // this with be the same as 'hc'.
+ subClient *http.Client
+ logger *slog.Logger
}
// Options for configuring a [Client].
type Options struct {
// Client is the HTTP client used to make requests. Optional.
+ // If UseDefaultClient is true, this field is ignored.
+ // If this field is nil, a new default http.Client will be created.
Client *http.Client
// Logger is used to log information about HTTP request and responses.
// If not provided, nothing will be logged. Optional.
Logger *slog.Logger
+ // UseDefaultClient specifies that the client should use the same default
+ // internal http.Client that is used in functions such as GetWithContext.
+ // This is useful for sharing a single TCP connection pool across requests.
+ // The difference vs GetWithContext is the ability to use this struct
+ // to provide a custom logger. If this field is true, the Client
+ // field is ignored.
+ UseDefaultClient bool
}
// NewClient returns a Client that can be used to fetch metadata.
// Returns the client that uses the specified http.Client for HTTP requests.
-// If nil is specified, returns the default client.
+// If nil is specified, returns the default internal Client that is
+// also used in functions such as GetWithContext. This is useful for sharing
+// a single TCP connection pool across requests.
func NewClient(c *http.Client) *Client {
- return NewWithOptions(&Options{
- Client: c,
- })
+ if c == nil {
+ // Preserve original behavior for nil argument.
+ return defaultClient
+ }
+ // Return a new client with a no-op logger for backward compatibility.
+ return &Client{hc: c, subClient: c, logger: slog.New(noOpHandler{})}
}
// NewWithOptions returns a Client that is configured with the provided Options.
func NewWithOptions(opts *Options) *Client {
+ // Preserve original behavior for nil opts.
if opts == nil {
return defaultClient
}
+
+ // Handle explicit request for the internal default http.Client.
+ if opts.UseDefaultClient {
+ logger := opts.Logger
+ if logger == nil {
+ logger = slog.New(noOpHandler{})
+ }
+ return &Client{hc: defaultClient.hc, subClient: defaultClient.subClient, logger: logger}
+ }
+
+ // Handle isolated client creation.
client := opts.Client
+ subClient := opts.Client
if client == nil {
- client = newDefaultHTTPClient()
+ client = newDefaultHTTPClient(true)
+ subClient = newDefaultHTTPClient(false)
}
logger := opts.Logger
if logger == nil {
logger = slog.New(noOpHandler{})
}
- return &Client{hc: client, logger: logger}
+ return &Client{hc: client, subClient: subClient, logger: logger}
}
// NOTE: metadataRequestStrategy is assigned to a variable for test stubbing purposes.
@@ -469,6 +507,10 @@ func (c *Client) OnGCEWithContext(ctx context.Context) bool {
// getETag returns a value from the metadata service as well as the associated ETag.
// This func is otherwise equivalent to Get.
func (c *Client) getETag(ctx context.Context, suffix string) (value, etag string, err error) {
+ return c.getETagWithSubClient(ctx, suffix, false)
+}
+
+func (c *Client) getETagWithSubClient(ctx context.Context, suffix string, enableSubClient bool) (value, etag string, err error) {
// Using a fixed IP makes it very difficult to spoof the metadata service in
// a container, which is an important use-case for local testing of cloud
// deployments. To enable spoofing of the metadata service, the environment
@@ -495,9 +537,13 @@ func (c *Client) getETag(ctx context.Context, suffix string) (value, etag string
var reqErr error
var body []byte
retryer := newRetryer()
+ hc := c.hc
+ if enableSubClient {
+ hc = c.subClient
+ }
for {
c.logger.DebugContext(ctx, "metadata request", "request", httpRequest(req, nil))
- res, reqErr = c.hc.Do(req)
+ res, reqErr = hc.Do(req)
var code int
if res != nil {
code = res.StatusCode
@@ -843,7 +889,7 @@ func (c *Client) SubscribeWithContext(ctx context.Context, suffix string, fn fun
const failedSubscribeSleep = time.Second * 5
// First check to see if the metadata value exists at all.
- val, lastETag, err := c.getETag(ctx, suffix)
+ val, lastETag, err := c.getETagWithSubClient(ctx, suffix, true)
if err != nil {
return err
}
@@ -859,8 +905,11 @@ func (c *Client) SubscribeWithContext(ctx context.Context, suffix string, fn fun
suffix += "?wait_for_change=true&last_etag="
}
for {
- val, etag, err := c.getETag(ctx, suffix+url.QueryEscape(lastETag))
+ val, etag, err := c.getETagWithSubClient(ctx, suffix+url.QueryEscape(lastETag), true)
if err != nil {
+ if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {
+ return err
+ }
if _, deleted := err.(NotDefinedError); !deleted {
time.Sleep(failedSubscribeSleep)
continue // Retry on other errors.
diff --git a/hack/tools/vendor/cloud.google.com/go/compute/metadata/retry.go b/hack/tools/vendor/cloud.google.com/go/compute/metadata/retry.go
index 3d4bc75ddf..d516f30f80 100644
--- a/hack/tools/vendor/cloud.google.com/go/compute/metadata/retry.go
+++ b/hack/tools/vendor/cloud.google.com/go/compute/metadata/retry.go
@@ -95,6 +95,9 @@ func shouldRetry(status int, err error) bool {
if 500 <= status && status <= 599 {
return true
}
+ if status == http.StatusTooManyRequests {
+ return true
+ }
if err == io.ErrUnexpectedEOF {
return true
}
diff --git a/hack/tools/vendor/cloud.google.com/go/internal/.repo-metadata-full.json b/hack/tools/vendor/cloud.google.com/go/internal/.repo-metadata-full.json
index 655773bf1e..eaa1dab093 100644
--- a/hack/tools/vendor/cloud.google.com/go/internal/.repo-metadata-full.json
+++ b/hack/tools/vendor/cloud.google.com/go/internal/.repo-metadata-full.json
@@ -539,6 +539,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/bigquery/datapolicies/apiv2beta1": {
+ "api_shortname": "bigquerydatapolicy",
+ "distribution_name": "cloud.google.com/go/bigquery/datapolicies/apiv2beta1",
+ "description": "BigQuery Data Policy API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/datapolicies/apiv2beta1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/bigquery/datatransfer/apiv1": {
"api_shortname": "bigquerydatatransfer",
"distribution_name": "cloud.google.com/go/bigquery/datatransfer/apiv1",
@@ -939,6 +949,26 @@
"release_level": "stable",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/configdelivery/apiv1": {
+ "api_shortname": "configdelivery",
+ "distribution_name": "cloud.google.com/go/configdelivery/apiv1",
+ "description": "Config Delivery API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/configdelivery/latest/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
+ "cloud.google.com/go/configdelivery/apiv1beta": {
+ "api_shortname": "configdelivery",
+ "distribution_name": "cloud.google.com/go/configdelivery/apiv1beta",
+ "description": "Config Delivery API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/configdelivery/latest/apiv1beta",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/contactcenterinsights/apiv1": {
"api_shortname": "contactcenterinsights",
"distribution_name": "cloud.google.com/go/contactcenterinsights/apiv1",
@@ -1639,6 +1669,16 @@
"release_level": "stable",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/licensemanager/apiv1": {
+ "api_shortname": "licensemanager",
+ "distribution_name": "cloud.google.com/go/licensemanager/apiv1",
+ "description": "License Manager API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/licensemanager/latest/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/lifesciences/apiv2beta": {
"api_shortname": "lifesciences",
"distribution_name": "cloud.google.com/go/lifesciences/apiv2beta",
@@ -1719,6 +1759,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/managedkafka/schemaregistry/apiv1": {
+ "api_shortname": "managedkafka",
+ "distribution_name": "cloud.google.com/go/managedkafka/schemaregistry/apiv1",
+ "description": "Managed Service for Apache Kafka API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/managedkafka/latest/schemaregistry/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/maps/addressvalidation/apiv1": {
"api_shortname": "addressvalidation",
"distribution_name": "cloud.google.com/go/maps/addressvalidation/apiv1",
@@ -2249,23 +2299,13 @@
"release_level": "stable",
"library_type": "GAPIC_MANUAL"
},
- "cloud.google.com/go/pubsub/v2": {
- "api_shortname": "pubsub",
- "distribution_name": "cloud.google.com/go/pubsub/v2",
- "description": "Cloud Pub/Sub API",
- "language": "go",
- "client_library_type": "manual",
- "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsub/latest/v2",
- "release_level": "stable",
- "library_type": "GAPIC_MANUAL"
- },
"cloud.google.com/go/pubsub/v2/apiv1": {
"api_shortname": "pubsub",
"distribution_name": "cloud.google.com/go/pubsub/v2/apiv1",
"description": "Cloud Pub/Sub API",
"language": "go",
"client_library_type": "generated",
- "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsub/latest/v2/apiv1",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/pubsub/v2/latest/apiv1",
"release_level": "stable",
"library_type": "GAPIC_AUTO"
},
@@ -2679,6 +2719,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/accounts/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/accounts/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/accounts/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/accounts/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/accounts/apiv1beta",
@@ -2689,6 +2739,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/conversions/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/conversions/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/conversions/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/conversions/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/conversions/apiv1beta",
@@ -2699,6 +2759,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/datasources/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/datasources/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/datasources/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/datasources/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/datasources/apiv1beta",
@@ -2709,6 +2779,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/inventories/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/inventories/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/inventories/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/inventories/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/inventories/apiv1beta",
@@ -2719,6 +2799,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/issueresolution/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/issueresolution/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/issueresolution/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/issueresolution/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/issueresolution/apiv1beta",
@@ -2729,6 +2819,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/lfp/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/lfp/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/lfp/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/lfp/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/lfp/apiv1beta",
@@ -2739,6 +2839,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/notifications/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/notifications/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/notifications/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/notifications/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/notifications/apiv1beta",
@@ -2749,6 +2859,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/ordertracking/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/ordertracking/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/ordertracking/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/ordertracking/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/ordertracking/apiv1beta",
@@ -2759,6 +2879,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/products/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/products/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/products/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/products/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/products/apiv1beta",
@@ -2769,6 +2899,26 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/productstudio/apiv1alpha": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/productstudio/apiv1alpha",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/productstudio/apiv1alpha",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
+ "cloud.google.com/go/shopping/merchant/promotions/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/promotions/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/promotions/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/promotions/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/promotions/apiv1beta",
@@ -2779,6 +2929,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/quota/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/quota/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/quota/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/quota/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/quota/apiv1beta",
@@ -2789,6 +2949,16 @@
"release_level": "preview",
"library_type": "GAPIC_AUTO"
},
+ "cloud.google.com/go/shopping/merchant/reports/apiv1": {
+ "api_shortname": "merchantapi",
+ "distribution_name": "cloud.google.com/go/shopping/merchant/reports/apiv1",
+ "description": "Merchant API",
+ "language": "go",
+ "client_library_type": "generated",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/reports/apiv1",
+ "release_level": "preview",
+ "library_type": "GAPIC_AUTO"
+ },
"cloud.google.com/go/shopping/merchant/reports/apiv1beta": {
"api_shortname": "merchantapi",
"distribution_name": "cloud.google.com/go/shopping/merchant/reports/apiv1beta",
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/.repo-metadata.json b/hack/tools/vendor/cloud.google.com/go/storage/.repo-metadata.json
new file mode 100644
index 0000000000..3eed725e33
--- /dev/null
+++ b/hack/tools/vendor/cloud.google.com/go/storage/.repo-metadata.json
@@ -0,0 +1,10 @@
+{
+ "api_shortname": "storage",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest",
+ "client_library_type": "manual",
+ "description": "Cloud Storage (GCS)",
+ "distribution_name": "cloud.google.com/go/storage",
+ "language": "go",
+ "library_type": "GAPIC_MANUAL",
+ "release_level": "stable"
+}
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/CHANGES.md b/hack/tools/vendor/cloud.google.com/go/storage/CHANGES.md
index cbe212871f..8333598e22 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/CHANGES.md
+++ b/hack/tools/vendor/cloud.google.com/go/storage/CHANGES.md
@@ -1,6 +1,58 @@
# Changes
+## [1.57.2](https://github.com/googleapis/google-cloud-go/releases/tag/storage%2Fv1.57.2) (2025-11-14)
+
+### Bug Fixes
+
+* Handle redirect on takeover. (#13354) ([b0f1362](https://github.com/googleapis/google-cloud-go/commit/b0f136268be1e4c629e288353bc277549ac5c663))
+* add env var to allow disabling bound token (#13236) ([cdaf6a6](https://github.com/googleapis/google-cloud-go/commit/cdaf6a6da006a19db932a74885ea3722b4e42311))
+
+### Documentation
+
+* updates to docs and docs formatting ([93ca68d](https://github.com/googleapis/google-cloud-go/commit/93ca68d54b6d213f22e0d67ae01d135cf26d37c6))
+
+## [1.57.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.57.0...storage/v1.57.1) (2025-10-28)
+
+
+### Bug Fixes
+* **storage:** Takeover idempotence ([#13230](https://github.com/googleapis/google-cloud-go/issues/13230)) ([cc5d2a1](https://github.com/googleapis/google-cloud-go/commit/cc5d2a12293a509a14da9bea8a86c8655eaf4a71))
+* **storage:** Copy metadata when using Copier with grpc ([#12919](https://github.com/googleapis/google-cloud-go/issues/12919)) ([57a2e80](https://github.com/googleapis/google-cloud-go/commit/57a2e804f690ec8d4c55fd1c73b0dafd5cff46e5))
+* **storage:** Fix takeover response handling ([#13239](https://github.com/googleapis/google-cloud-go/issues/13239)) ([26d75bc](https://github.com/googleapis/google-cloud-go/commit/26d75bc08e242348d26691877aba7fa68cf30f7f))
+* **storage:** Remove default timeout for gRPC operations ([#13022](https://github.com/googleapis/google-cloud-go/issues/13022)) ([b94c3ba](https://github.com/googleapis/google-cloud-go/commit/b94c3ba69994d9c56ae8f302449dd8df6f287296))
+* **storage:** Skip download of file outside of target dir ([#12945](https://github.com/googleapis/google-cloud-go/issues/12945)) ([6259aee](https://github.com/googleapis/google-cloud-go/commit/6259aeec393d0d996961cac38396daa57ad1a290))
+* **storage:** Upgrade gRPC service registration func ([8fffca2](https://github.com/googleapis/google-cloud-go/commit/8fffca2819fa3dc858c213aa0c503e0df331b084))
+
+## [1.57.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.56.1...storage/v1.57.0) (2025-09-23)
+
+
+### Features
+
+* **storage/control:** Add new GetIamPolicy, SetIamPolicy, and TestIamPermissions RPCs ([d73f912](https://github.com/googleapis/google-cloud-go/commit/d73f9123be77bb3278f48d510cd0fb22feb605bc))
+* **storage:** Post support dynamic key name ([#12677](https://github.com/googleapis/google-cloud-go/issues/12677)) ([9e761f9](https://github.com/googleapis/google-cloud-go/commit/9e761f961a2c4351b3e0793ed655314ac5853903))
+* **storage:** WithMeterProvider allows custom meter provider configuration ([#12668](https://github.com/googleapis/google-cloud-go/issues/12668)) ([7f574b0](https://github.com/googleapis/google-cloud-go/commit/7f574b01e0b454c1ef5c13e6a58075e394ee990d))
+
+
+### Bug Fixes
+
+* **storage:** Free buffers in Bidi Reader ([#12839](https://github.com/googleapis/google-cloud-go/issues/12839)) ([bc247fd](https://github.com/googleapis/google-cloud-go/commit/bc247fdc3f5234a8bd6934e58d5b0b578f1335cb))
+* **storage:** Make Writer thread-safe. ([#12753](https://github.com/googleapis/google-cloud-go/issues/12753)) ([9ea380b](https://github.com/googleapis/google-cloud-go/commit/9ea380bea5b980a9054d201be4f315a195da2182))
+* **storage:** No progress report for oneshot write ([#12746](https://github.com/googleapis/google-cloud-go/issues/12746)) ([b97c286](https://github.com/googleapis/google-cloud-go/commit/b97c286ec369a10a81b1a8a3a1aae18b46d2dfbc))
+
+
+### Performance Improvements
+
+* **storage:** Pipeline gRPC writes ([#12422](https://github.com/googleapis/google-cloud-go/issues/12422)) ([1f2c5fe](https://github.com/googleapis/google-cloud-go/commit/1f2c5fe2843724302086fe04cb8dab8b515969c5))
+
+## [1.56.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.56.0...storage/v1.56.1) (2025-08-19)
+
+
+### Bug Fixes
+
+* **storage:** Fix redirect logic in MRD ([#12733](https://github.com/googleapis/google-cloud-go/issues/12733)) ([9f369f9](https://github.com/googleapis/google-cloud-go/commit/9f369f931853220550cabb3d67a5a5d3d9e137ba))
+* **storage:** Pass all user options to NewService ([#12615](https://github.com/googleapis/google-cloud-go/issues/12615)) ([77cdb83](https://github.com/googleapis/google-cloud-go/commit/77cdb832a374eba29e4de7699324a87f1d20eea3))
+* **storage:** ZB Reader redirect support ([#12703](https://github.com/googleapis/google-cloud-go/issues/12703)) ([3c7ea5c](https://github.com/googleapis/google-cloud-go/commit/3c7ea5ceb199d5787d36bf8f415f028bea66e3b5))
+
## [1.56.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.55.0...storage/v1.56.0) (2025-07-24)
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/bucket.go b/hack/tools/vendor/cloud.google.com/go/storage/bucket.go
index 60a5ffb5b3..a8e56ed173 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/bucket.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/bucket.go
@@ -225,6 +225,11 @@ func (b *BucketHandle) SignedURL(object string, opts *SignedURLOptions) (string,
// to be non-nil. You may need to set the GoogleAccessID and PrivateKey fields
// in some cases. Read more on the [automatic detection of credentials] for this method.
//
+// To allow the unauthenticated client to upload to any object name in the
+// bucket with a given prefix rather than a specific object name, you can pass
+// an empty string for object and set [PostPolicyV4Options].Conditions to
+// include [ConditionStartsWith]("$key", "prefix").
+//
// [automatic detection of credentials]: https://pkg.go.dev/cloud.google.com/go/storage#hdr-Credential_requirements_for_signing
func (b *BucketHandle) GenerateSignedPostPolicyV4(object string, opts *PostPolicyV4Options) (*PostPolicyV4, error) {
// Make a copy of opts so we don't modify the pointer parameter.
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/copy.go b/hack/tools/vendor/cloud.google.com/go/storage/copy.go
index a0b9a2683c..d10e377ffe 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/copy.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/copy.go
@@ -18,8 +18,6 @@ import (
"context"
"errors"
"fmt"
-
- "cloud.google.com/go/internal/trace"
)
// CopierFrom creates a Copier that can copy src to dst.
@@ -82,8 +80,8 @@ type Copier struct {
// Run performs the copy.
func (c *Copier) Run(ctx context.Context) (attrs *ObjectAttrs, err error) {
- ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Copier.Run")
- defer func() { trace.EndSpan(ctx, err) }()
+ ctx, _ = startSpan(ctx, "Copier.Run")
+ defer func() { endSpan(ctx, err) }()
if err := c.src.validate(); err != nil {
return nil, err
@@ -180,8 +178,8 @@ type Composer struct {
// Run performs the compose operation.
func (c *Composer) Run(ctx context.Context) (attrs *ObjectAttrs, err error) {
- ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Composer.Run")
- defer func() { trace.EndSpan(ctx, err) }()
+ ctx, _ = startSpan(ctx, "Composer.Run")
+ defer func() { endSpan(ctx, err) }()
if err := c.dst.validate(); err != nil {
return nil, err
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/doc.go b/hack/tools/vendor/cloud.google.com/go/storage/doc.go
index 6a64c6c03b..3726432c86 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/doc.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/doc.go
@@ -364,7 +364,7 @@ to add a [custom audit logging] header:
This package includes support for the [Cloud Storage gRPC API]. This
implementation uses gRPC rather than the default JSON & XML APIs
to make requests to Cloud Storage. All methods on the [Client] support
-the gRPC API, with the exception of [GetServiceAccount], [Notification],
+the gRPC API, with the exception of the [Client.ServiceAccount], [Notification],
and [HMACKey] methods.
The Cloud Storage gRPC API is generally available.
@@ -390,7 +390,10 @@ Requirements to use Direct Connectivity include:
- Your client must use service account authentication.
Additional requirements for Direct Connectivity are documented in the
-[Cloud Storage gRPC docs].
+[Cloud Storage gRPC docs]. If all requirements are met, the client will
+use Direct Connectivity by default without requiring any client options
+or environment variables. To disable Direct Connectivity, you can set
+the environment variable GOOGLE_CLOUD_DISABLE_DIRECT_PATH=true.
Dependencies for the gRPC API may slightly increase the size of binaries for
applications depending on this package. If you are not using gRPC, you can use
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/experimental/experimental.go b/hack/tools/vendor/cloud.google.com/go/storage/experimental/experimental.go
index a178f9ebb3..819e105d70 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/experimental/experimental.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/experimental/experimental.go
@@ -33,17 +33,25 @@ import (
// It sets how often to emit metrics [metric.WithInterval] when using
// [metric.NewPeriodicReader]
// When using Cloud Monitoring interval must be at minimum 1 [time.Minute].
+// This option is ignored if WithMeterProvider is also set.
func WithMetricInterval(metricInterval time.Duration) option.ClientOption {
return internal.WithMetricInterval.(func(time.Duration) option.ClientOption)(metricInterval)
}
// WithMetricExporter provides a [option.ClientOption] that may be passed to [storage.NewGRPCClient].
// Set an alternate client-side metric Exporter to emit metrics through.
-// Must implement [metric.Exporter]
+// Must implement [metric.Exporter]. This option is ignored if WithMeterProvider is also set.
func WithMetricExporter(ex *metric.Exporter) option.ClientOption {
return internal.WithMetricExporter.(func(*metric.Exporter) option.ClientOption)(ex)
}
+// WithMeterProvider provides a [option.ClientOption] that may be passed to [storage.NewGRPCClient].
+// Set an alternate client-side meter provider to emit metrics through.
+// This option takes precedence over WithMetricExporter and WithMetricInterval.
+func WithMeterProvider(mp *metric.MeterProvider) option.ClientOption {
+ return internal.WithMeterProvider.(func(*metric.MeterProvider) option.ClientOption)(mp)
+}
+
// WithReadStallTimeout provides a [option.ClientOption] that may be passed to [storage.NewClient].
// It enables the client to retry stalled requests when starting a download from
// Cloud Storage. If the timeout elapses with no response from the server, the request
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/grpc_client.go b/hack/tools/vendor/cloud.google.com/go/storage/grpc_client.go
index 19c969f739..70d623b655 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/grpc_client.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/grpc_client.go
@@ -23,10 +23,10 @@ import (
"io"
"log"
"os"
+ "strconv"
"sync"
"cloud.google.com/go/iam/apiv1/iampb"
- "cloud.google.com/go/internal/trace"
gapic "cloud.google.com/go/storage/internal/apiv2"
"cloud.google.com/go/storage/internal/apiv2/storagepb"
"github.com/googleapis/gax-go/v2"
@@ -100,9 +100,12 @@ func defaultGRPCOptions() []option.ClientOption {
} else {
// Only enable DirectPath when the emulator is not being targeted.
defaults = append(defaults,
- internaloption.EnableDirectPath(true),
internaloption.AllowNonDefaultServiceAccount(true),
+ internaloption.EnableDirectPath(true),
internaloption.EnableDirectPathXds())
+ if disableBoundToken, _ := strconv.ParseBool(os.Getenv("STORAGE_DISABLE_DIRECTPATH_BOUND_TOKEN")); !disableBoundToken {
+ defaults = append(defaults, internaloption.AllowHardBoundTokens("ALTS"))
+ }
}
return defaults
@@ -124,9 +127,11 @@ func enableClientMetrics(ctx context.Context, s *settings, config storageConfig)
project = c.ProjectID
}
metricsContext, err := newGRPCMetricContext(ctx, metricsConfig{
- project: project,
- interval: config.metricInterval,
- manualReader: config.manualReader},
+ project: project,
+ interval: config.metricInterval,
+ manualReader: config.manualReader,
+ meterProvider: config.meterProvider,
+ },
)
if err != nil {
return nil, fmt.Errorf("gRPC Metrics: %w", err)
@@ -140,7 +145,7 @@ func newGRPCStorageClient(ctx context.Context, opts ...storageOption) (*grpcStor
s := initSettings(opts...)
s.clientOption = append(defaultGRPCOptions(), s.clientOption...)
// Disable all gax-level retries in favor of retry logic in the veneer client.
- s.gax = append(s.gax, gax.WithRetry(nil))
+ s.gax = append(s.gax, gax.WithRetry(nil), gax.WithTimeout(0))
config := newStorageConfig(s.clientOption...)
if config.readAPIWasSet {
@@ -950,14 +955,24 @@ func (c *grpcStorageClient) ComposeObject(ctx context.Context, req *composeObjec
}
func (c *grpcStorageClient) RewriteObject(ctx context.Context, req *rewriteObjectRequest, opts ...storageOption) (*rewriteObjectResponse, error) {
s := callSettings(c.settings, opts...)
- obj := req.dstObject.attrs.toProtoObject("")
+
+ var dst *storagepb.Object
+ // If the destination object attributes are not set, do not include them
+ // in the request. This indicates that the object attributes should be
+ // copied from the source object.
+ if req.dstObject.attrs.isZero() {
+ dst = nil
+ } else {
+ dst = req.dstObject.attrs.toProtoObject("")
+ }
+
call := &storagepb.RewriteObjectRequest{
SourceBucket: bucketResourceName(globalProjectAlias, req.srcObject.bucket),
SourceObject: req.srcObject.name,
RewriteToken: req.token,
DestinationBucket: bucketResourceName(globalProjectAlias, req.dstObject.bucket),
DestinationName: req.dstObject.name,
- Destination: obj,
+ Destination: dst,
DestinationKmsKey: req.dstObject.keyName,
DestinationPredefinedAcl: req.predefinedACL,
CommonObjectRequestParams: toProtoCommonObjectRequestParams(req.dstObject.encryptionKey),
@@ -1066,8 +1081,8 @@ func (c *grpcStorageClient) NewMultiRangeDownloader(ctx context.Context, params
return nil, errors.New("storage: MultiRangeDownloader requires the experimental.WithGRPCBidiReads option")
}
- ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.NewMultiRangeDownloader")
- defer func() { trace.EndSpan(ctx, err) }()
+ ctx, _ = startSpan(ctx, "grpcStorageClient.NewMultiRangeDownloader")
+ defer func() { endSpan(ctx, err) }()
s := callSettings(c.settings, opts...)
// Force the use of the custom codec to enable zero-copy reads.
s.gax = append(s.gax, gax.WithGRPCOptions(
@@ -1100,8 +1115,6 @@ func (c *grpcStorageClient) NewMultiRangeDownloader(ctx context.Context, params
ReadObjectSpec: bidiObject,
}
- ctx = gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...)
-
openStream := func(readHandle ReadHandle) (*bidiReadStreamResponse, context.CancelFunc, error) {
if err := applyCondsProto("grpcStorageClient.BidiReadObject", params.gen, params.conds, bidiObject); err != nil {
return nil, nil, err
@@ -1111,36 +1124,53 @@ func (c *grpcStorageClient) NewMultiRangeDownloader(ctx context.Context, params
Handle: readHandle,
}
}
+ databufs := mem.BufferSlice{}
+
var stream storagepb.Storage_BidiReadObjectClient
var decoder *readResponseDecoder
cc, cancel := context.WithCancel(ctx)
err = run(cc, func(ctx context.Context) error {
- stream, err = c.raw.BidiReadObject(ctx, s.gax...)
- if err != nil {
+ openAndSendReq := func() error {
+ mdCtx := gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...)
+
+ stream, err = c.raw.BidiReadObject(mdCtx, s.gax...)
+ if err != nil {
+ return err
+ }
+ // If stream opened succesfully, send first message on the stream.
+ // First message to stream should contain read_object_spec
+ err = stream.Send(req)
+ if err != nil {
+ return err
+ }
+ // Use RecvMsg to get the raw buffer slice instead of Recv().
+ err = stream.RecvMsg(&databufs)
+ if err != nil {
+ return err
+ }
+ return nil
+ }
+
+ err := openAndSendReq()
+
+ // We might get a redirect error here for an out-of-region request.
+ // Add the routing token and read handle to the request and do one
+ // retry.
+ if st, ok := status.FromError(err); ok && st.Code() == codes.Aborted {
// BidiReadObjectRedirectedError error is only returned on initial open in case of a redirect.
// The routing token that should be used when reopening the read stream. Needs to be exported.
- rpcStatus := status.Convert(err)
- details := rpcStatus.Details()
- for _, detail := range details {
+ for _, detail := range st.Details() {
if bidiError, ok := detail.(*storagepb.BidiReadObjectRedirectedError); ok {
bidiObject.ReadHandle = bidiError.ReadHandle
bidiObject.RoutingToken = bidiError.RoutingToken
- req.ReadObjectSpec = bidiObject
- ctx = gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...)
+ databufs = mem.BufferSlice{}
+ err = openAndSendReq()
+ break
}
}
- return err
- }
- // Incase stream opened succesfully, send first message on the stream.
- // First message to stream should contain read_object_spec
- err = stream.Send(req)
- if err != nil {
- return err
}
- // Use RecvMsg to get the raw buffer slice instead of Recv().
- databufs := mem.BufferSlice{}
- err = stream.RecvMsg(&databufs)
if err != nil {
+ databufs.Free()
return err
}
@@ -1596,8 +1626,8 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
return c.NewRangeReaderReadObject(ctx, params, opts...)
}
- ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.NewRangeReader")
- defer func() { trace.EndSpan(ctx, err) }()
+ ctx, _ = startSpan(ctx, "grpcStorageClient.NewRangeReader")
+ defer func() { endSpan(ctx, err) }()
s := callSettings(c.settings, opts...)
@@ -1628,7 +1658,6 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
req := &storagepb.BidiReadObjectRequest{
ReadObjectSpec: spec,
}
- ctx = gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...)
// Define a function that initiates a Read with offset and length, assuming
// we have already read seen bytes.
@@ -1660,28 +1689,53 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
var decoder *readResponseDecoder
err = run(cc, func(ctx context.Context) error {
- stream, err = c.raw.BidiReadObject(ctx, s.gax...)
- if err != nil {
- return err
- }
- if err := stream.Send(req); err != nil {
- return err
+ var databufs mem.BufferSlice
+ openAndSendReq := func() error {
+ databufs = mem.BufferSlice{}
+
+ // Insert context metadata, including routing token if this is a retry
+ // for a redirect.
+ mdCtx := gax.InsertMetadataIntoOutgoingContext(ctx, contextMetadataFromBidiReadObject(req)...)
+ stream, err = c.raw.BidiReadObject(mdCtx, s.gax...)
+ if err != nil {
+ return err
+ }
+ if err := stream.Send(req); err != nil {
+ return err
+ }
+ // Oneshot reads can close the client->server side immediately.
+ if err := stream.CloseSend(); err != nil {
+ return err
+ }
+
+ // Receive the message into databuf as a wire-encoded message so we can
+ // use a custom decoder to avoid an extra copy at the protobuf layer.
+ return stream.RecvMsg(&databufs)
}
- // Oneshot reads can close the client->server side immediately.
- if err := stream.CloseSend(); err != nil {
- return err
+
+ err := openAndSendReq()
+
+ // We might get a redirect error here for an out-of-region request.
+ // Add the routing token and read handle to the request and do one
+ // retry.
+ if st, ok := status.FromError(err); ok && st.Code() == codes.Aborted {
+ for _, d := range st.Details() {
+ if e, ok := d.(*storagepb.BidiReadObjectRedirectedError); ok {
+ req.ReadObjectSpec.ReadHandle = e.GetReadHandle()
+ req.ReadObjectSpec.RoutingToken = e.RoutingToken
+ err = openAndSendReq()
+ break
+ }
+ }
}
- // Receive the message into databuf as a wire-encoded message so we can
- // use a custom decoder to avoid an extra copy at the protobuf layer.
- databufs := mem.BufferSlice{}
- err := stream.RecvMsg(&databufs)
// These types of errors show up on the RecvMsg call, rather than the
// initialization of the stream via BidiReadObject above.
if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {
- return formatObjectErr(err)
+ err = formatObjectErr(err)
}
if err != nil {
+ databufs.Free()
return err
}
// Use a custom decoder that uses protobuf unmarshalling for all
@@ -1989,6 +2043,10 @@ func (r *gRPCReader) Read(p []byte) (int, error) {
n, found := r.currMsg.readAndUpdateCRC(p, 1, func(b []byte) {
r.updateCRC(b)
})
+ // If we are done reading the current msg, free buffers.
+ if r.currMsg.done {
+ r.currMsg.databufs.Free()
+ }
// If data for our readID was found, we can update `seen` and return.
if found {
@@ -2041,6 +2099,8 @@ func (r *gRPCReader) WriteTo(w io.Writer) (int64, error) {
r.updateCRC(b)
})
r.seen += written
+ // We have processed the message, so free the buffer
+ r.currMsg.databufs.Free()
if err != nil {
return r.seen - alreadySeen, err
}
@@ -2093,7 +2153,9 @@ func (r *gRPCReader) Close() error {
func (r *gRPCReader) recv() error {
databufs := mem.BufferSlice{}
err := r.stream.RecvMsg(&databufs)
- if err != nil && r.settings.retry.runShouldRetry(err) {
+ // If we get a mid-stream error on a recv call, reopen the stream.
+ // ABORTED could indicate a redirect so should also trigger a reopen.
+ if err != nil && (r.settings.retry.runShouldRetry(err) || status.Code(err) == codes.Aborted) {
// This will "close" the existing stream and immediately attempt to
// reopen the stream, but will backoff if further attempts are necessary.
// Reopening the stream Recvs the first message, so if retrying is
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/grpc_metrics.go b/hack/tools/vendor/cloud.google.com/go/storage/grpc_metrics.go
index f7bebd1def..0442101574 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/grpc_metrics.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/grpc_metrics.go
@@ -126,6 +126,7 @@ type metricsConfig struct {
project string
interval time.Duration
customExporter *metric.Exporter
+ meterProvider *metric.MeterProvider
manualReader *metric.ManualReader // used by tests
disableExporter bool // used by tests disables exports
resourceOpts []resource.Option // used by tests
@@ -172,7 +173,10 @@ func newGRPCMetricContext(ctx context.Context, cfg metricsConfig) (*metricsConte
meterOpts = append(meterOpts, metric.WithReader(
metric.NewPeriodicReader(&exporterLogSuppressor{Exporter: exporter}, metric.WithInterval(interval))))
}
- provider := metric.NewMeterProvider(meterOpts...)
+ provider := cfg.meterProvider
+ if provider == nil {
+ provider = metric.NewMeterProvider(meterOpts...)
+ }
mo := opentelemetry.MetricsOptions{
MeterProvider: provider,
Metrics: stats.NewMetrics(
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/grpc_reader.go b/hack/tools/vendor/cloud.google.com/go/storage/grpc_reader.go
index 14ec5048d8..0fd848cad6 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/grpc_reader.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/grpc_reader.go
@@ -22,7 +22,6 @@ import (
"hash/crc32"
"io"
- "cloud.google.com/go/internal/trace"
"cloud.google.com/go/storage/internal/apiv2/storagepb"
"github.com/googleapis/gax-go/v2"
"google.golang.org/grpc"
@@ -83,8 +82,8 @@ func (bytesCodecReadObject) Name() string {
// NewRangeReaderReadObject is the legacy (non-bidi) implementation of reads.
func (c *grpcStorageClient) NewRangeReaderReadObject(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) {
- ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.NewRangeReaderReadObject")
- defer func() { trace.EndSpan(ctx, err) }()
+ ctx, _ = startSpan(ctx, "grpcStorageClient.NewRangeReaderReadObject")
+ defer func() { endSpan(ctx, err) }()
s := callSettings(c.settings, opts...)
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/grpc_writer.go b/hack/tools/vendor/cloud.google.com/go/storage/grpc_writer.go
index 3d82e59517..46e6742e4c 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/grpc_writer.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/grpc_writer.go
@@ -19,7 +19,9 @@ import (
"errors"
"fmt"
"io"
+ "net/http"
"net/url"
+ "strings"
"time"
gapic "cloud.google.com/go/storage/internal/apiv2"
@@ -42,311 +44,745 @@ const (
maxPerMessageWriteSize int = int(storagepb.ServiceConstants_MAX_WRITE_CHUNK_BYTES)
)
-func withBidiWriteObjectRedirectionErrorRetries(s *settings) (newr *retryConfig) {
- oldr := s.retry
- newr = oldr.clone()
- if newr == nil {
- newr = &retryConfig{}
+func (w *gRPCWriter) Write(p []byte) (n int, err error) {
+ done := make(chan struct{})
+ cmd := &gRPCWriterCommandWrite{p: p, done: done}
+ select {
+ case <-w.donec:
+ return 0, w.streamResult
+ case w.writesChan <- cmd:
+ // write command successfully delivered to sender. We no longer own cmd.
+ break
}
- if (oldr.policy == RetryIdempotent && !s.idempotent) || oldr.policy == RetryNever {
- // We still retry redirection errors even when settings indicate not to
- // retry.
- //
- // The protocol requires us to respect redirection errors, so RetryNever has
- // to ignore them.
- //
- // Idempotency is always protected by redirection errors: they either
- // contain a handle which can be used as idempotency information, or they do
- // not contain a handle and are "affirmative failures" which indicate that
- // no server-side action occurred.
- newr.policy = RetryAlways
- newr.shouldRetry = func(err error) bool {
- return errors.Is(err, bidiWriteObjectRedirectionError{})
- }
- return newr
+
+ select {
+ case <-w.donec:
+ return 0, w.streamResult
+ case <-done:
+ return len(p), nil
}
- // If retry settings allow retries normally, fall back to that behavior.
- newr.shouldRetry = func(err error) bool {
- if errors.Is(err, bidiWriteObjectRedirectionError{}) {
- return true
- }
- v := oldr.runShouldRetry(err)
- return v
+}
+
+func (w *gRPCWriter) Flush() (int64, error) {
+ done := make(chan int64)
+ cmd := &gRPCWriterCommandFlush{done: done}
+ select {
+ case <-w.donec:
+ return 0, w.streamResult
+ case w.writesChan <- cmd:
+ // flush command successfully delivered to sender. We no longer own cmd.
+ break
}
- return newr
+
+ select {
+ case <-w.donec:
+ return 0, w.streamResult
+ case f := <-done:
+ return f, nil
+ }
+}
+
+func (w *gRPCWriter) Close() error {
+ w.CloseWithError(nil)
+ return w.streamResult
}
-type flushResult struct {
- err error
- offset int64
+func (w *gRPCWriter) CloseWithError(err error) error {
+ // N.B. CloseWithError always returns nil!
+ select {
+ case <-w.donec:
+ return nil
+ case w.writesChan <- &gRPCWriterCommandClose{err: err}:
+ break
+ }
+ <-w.donec
+ return nil
}
-type gRPCInternalWriter struct {
- flushSupported bool
- flushInProgress bool
+func (c *grpcStorageClient) OpenWriter(params *openWriterParams, opts ...storageOption) (internalWriter, error) {
+ if params.attrs.Retention != nil {
+ // TO-DO: remove once ObjectRetention is available - see b/308194853
+ return nil, status.Errorf(codes.Unimplemented, "storage: object retention is not supported in gRPC")
+ }
+
+ spec := &storagepb.WriteObjectSpec{
+ Resource: params.attrs.toProtoObject(params.bucket),
+ Appendable: proto.Bool(params.append),
+ }
+ // WriteObject doesn't support the generation condition, so use default.
+ if err := applyCondsProto("WriteObject", defaultGen, params.conds, spec); err != nil {
+ return nil, err
+ }
- pw *io.PipeWriter
+ s := callSettings(c.settings, opts...)
- flushComplete chan flushResult
-}
+ if s.retry == nil {
+ s.retry = defaultRetry.clone()
+ }
+ if params.append {
+ s.retry = withBidiWriteObjectRedirectionErrorRetries(s)
+ }
+
+ chunkRetryDeadline := defaultWriteChunkRetryDeadline
+ if params.chunkRetryDeadline != 0 {
+ chunkRetryDeadline = params.chunkRetryDeadline
+ }
+
+ ctx := params.ctx
+ if s.userProject != "" {
+ ctx = setUserProjectMetadata(ctx, s.userProject)
+ }
+
+ chunkSize := gRPCChunkSize(params.chunkSize)
+ writeQuantum := maxPerMessageWriteSize
+ if writeQuantum > chunkSize {
+ writeQuantum = chunkSize
+ }
+ sendableUnits := chunkSize / writeQuantum
+ // There's no strict requirement that the chunk size be an exact multiple of
+ // the writeQuantum. In that case, there will be a tail segment of less than
+ // writeQuantum.
+ lastSegmentStart := sendableUnits * writeQuantum
+ if lastSegmentStart < chunkSize {
+ sendableUnits++
+ }
+
+ if params.append && params.appendGen >= 0 && params.setTakeoverOffset == nil {
+ return nil, errors.New("storage: no way to report offset for appendable takeover")
+ }
+
+ w := &gRPCWriter{
+ preRunCtx: ctx,
+ c: c,
+ settings: s,
+
+ bucket: params.bucket,
+ attrs: params.attrs,
+ conds: params.conds,
+ spec: spec,
+ encryptionKey: params.encryptionKey,
-func (giw *gRPCInternalWriter) Flush() (int64, error) {
- if !giw.flushSupported {
- return 0, errors.New("Flush is supported only if Writer.Append is set to true")
+ setError: params.setError,
+ progress: params.progress,
+ setObj: params.setObj,
+ setSize: params.setSize,
+ setTakeoverOffset: params.setTakeoverOffset,
+
+ flushSupported: params.append,
+ sendCRC32C: params.sendCRC32C,
+ forceOneShot: params.chunkSize <= 0,
+ forceEmptyContentType: params.forceEmptyContentType,
+ append: params.append,
+ appendGen: params.appendGen,
+ finalizeOnClose: params.finalizeOnClose,
+
+ buf: make([]byte, 0, chunkSize),
+ writeQuantum: writeQuantum,
+ lastSegmentStart: lastSegmentStart,
+ sendableUnits: sendableUnits,
+ bufUnsentIdx: 0,
+ bufFlushedIdx: -1, // Handle flushes to length 0
+ bufBaseOffset: 0,
+
+ chunkRetryDeadline: chunkRetryDeadline,
+ abandonRetriesTime: time.Time{},
+ attempts: 0,
+ lastErr: nil,
+ streamSender: nil,
+
+ writesChan: make(chan gRPCWriterCommand, 1),
+ currentCommand: nil,
+ streamResult: nil,
+ donec: params.donec,
}
- giw.flushInProgress = true
- giw.pw.Close()
+ go func() {
+ if err := w.gatherFirstBuffer(); err != nil {
+ w.streamResult = err
+ w.setError(err)
+ close(w.donec)
+ return
+ }
+
+ if w.attrs.ContentType == "" && !w.forceEmptyContentType {
+ w.spec.Resource.ContentType = w.detectContentType()
+ }
+ w.streamSender = w.pickBufferSender()
+
+ w.streamResult = checkCanceled(run(w.preRunCtx, func(ctx context.Context) error {
+ w.lastErr = w.writeLoop(ctx)
+ return w.lastErr
+ }, w.settings.retry, w.settings.idempotent))
+ w.setError(w.streamResult)
+ close(w.donec)
+ }()
- // Return the offset based on flushComplete.
- r := <-giw.flushComplete
- return r.offset, r.err
+ return w, nil
}
-// Forward other methods to *io.PipeWriter
-func (giw *gRPCInternalWriter) Write(p []byte) (int, error) {
- return giw.pw.Write(p)
+// gRPCWriter is a wrapper around the the gRPC client-stream API that manages
+// sending chunks of data provided by the user over the stream.
+type gRPCWriter struct {
+ preRunCtx context.Context
+ c *grpcStorageClient
+ settings *settings
+
+ bucket string
+ attrs *ObjectAttrs
+ conds *Conditions
+ spec *storagepb.WriteObjectSpec
+ encryptionKey []byte
+
+ setError func(error)
+ progress func(int64)
+ setObj func(*ObjectAttrs)
+ setSize func(int64)
+ setTakeoverOffset func(int64)
+
+ flushSupported bool
+ sendCRC32C bool
+ forceOneShot bool
+ forceEmptyContentType bool
+ append bool
+ appendGen int64
+ finalizeOnClose bool
+
+ buf []byte
+ // A writeQuantum is the largest quantity of data which can be sent to the
+ // service in a single message.
+ writeQuantum int
+ lastSegmentStart int
+ sendableUnits int
+ bufUnsentIdx int
+ bufFlushedIdx int
+ bufBaseOffset int64
+
+ chunkRetryDeadline time.Duration
+ abandonRetriesTime time.Time
+ attempts int
+ lastErr error
+ streamSender gRPCBidiWriteBufferSender
+
+ // Communication from the user goroutine to the stream management goroutines
+ writesChan chan gRPCWriterCommand
+ currentCommand gRPCWriterCommand
+ forcedStreamResult error
+ streamResult error
+ donec chan struct{}
}
-func (giw *gRPCInternalWriter) Close() error {
- return giw.pw.Close()
+func (w *gRPCWriter) pickBufferSender() gRPCBidiWriteBufferSender {
+ if w.append {
+ // Appendable object semantics
+ if w.appendGen >= 0 {
+ return w.newGRPCAppendTakeoverWriteBufferSender()
+ }
+ return w.newGRPCAppendableObjectBufferSender()
+ }
+ if w.forceOneShot {
+ // One shot semantics - no progress reports
+ w.progress = func(int64) {}
+ return w.newGRPCOneshotBidiWriteBufferSender()
+ }
+ // Resumable write semantics
+ return w.newGRPCResumableBidiWriteBufferSender()
}
-func (giw *gRPCInternalWriter) CloseWithError(err error) error {
- return giw.pw.CloseWithError(err)
+// sendBufferToTarget uses cs to send slices of buf, which starts at baseOffset
+// bytes into the object. Slices are sent until flushAt bytes have sent, in
+// which case the final request is a flush, or until len(buf) < w.writeQuantum.
+//
+// handleCompletion is called for any completions that arrive during sends.
+//
+// Returns the last byte offset sent. Returns true if all desired requests were
+// delivered, and false if cs.completions was closed before all requests could
+// be delivered.
+func (w *gRPCWriter) sendBufferToTarget(cs gRPCWriterCommandHandleChans, buf []byte, baseOffset int64, flushAt int, handleCompletion func(gRPCBidiWriteCompletion)) (int64, bool) {
+ sent := 0
+ if len(buf) > flushAt {
+ buf = buf[:flushAt]
+ }
+ for len(buf) > 0 && (len(buf) >= w.writeQuantum || len(buf) >= flushAt-sent) {
+ q := w.writeQuantum
+ if flushAt-sent < w.writeQuantum {
+ q = flushAt - sent
+ }
+ req := gRPCBidiWriteRequest{
+ buf: buf[:q],
+ offset: baseOffset + int64(sent),
+ flush: q == flushAt-sent,
+ }
+ if !cs.deliverRequestUnlessCompleted(req, handleCompletion) {
+ return baseOffset + int64(sent), false
+ }
+ buf = buf[q:]
+ sent += q
+ }
+ return baseOffset + int64(sent), true
}
-func (c *grpcStorageClient) OpenWriter(params *openWriterParams, opts ...storageOption) (internalWriter, error) {
- var offset int64
- errorf := params.setError
- setObj := params.setObj
- pr, pw := io.Pipe()
+func (w *gRPCWriter) handleCompletion(c gRPCBidiWriteCompletion) {
+ if c.resource != nil {
+ w.setObj(newObjectFromProto(c.resource))
+ }
- s := callSettings(c.settings, opts...)
+ // Already handled this completion
+ if c.flushOffset <= w.bufBaseOffset+int64(w.bufFlushedIdx) {
+ return
+ }
- retryDeadline := defaultWriteChunkRetryDeadline
- if params.chunkRetryDeadline != 0 {
- retryDeadline = params.chunkRetryDeadline
+ w.bufFlushedIdx = int(c.flushOffset - w.bufBaseOffset)
+ if w.bufFlushedIdx >= len(w.buf) {
+ // We can clear w.buf
+ w.bufBaseOffset = c.flushOffset
+ w.bufUnsentIdx = 0
+ w.bufFlushedIdx = 0
+ w.buf = w.buf[:0]
}
- if s.retry == nil {
- s.retry = defaultRetry.clone()
+ w.setSize(c.flushOffset)
+ w.progress(c.flushOffset)
+}
+
+func (w *gRPCWriter) withCommandRetryDeadline(f func() error) error {
+ w.abandonRetriesTime = time.Now().Add(w.chunkRetryDeadline)
+ err := f()
+ if err == nil {
+ w.abandonRetriesTime = time.Time{}
}
- if params.append {
- s.retry = withBidiWriteObjectRedirectionErrorRetries(s)
+ return err
+}
+
+// Gather write commands before starting the actual write. Returns nil if the
+// stream should be started, and an error otherwise.
+func (w *gRPCWriter) gatherFirstBuffer() error {
+ if w.append && w.appendGen >= 0 {
+ // For takeovers, kick off the stream immediately since we need to know the
+ // takeover offset to issue writes.
+ return nil
}
- s.retry.maxRetryDuration = retryDeadline
- gw, err := newGRPCWriter(c, s, params, pr, pr, pw)
- if err != nil {
- errorf(err)
- pr.CloseWithError(err)
- close(params.donec)
- return nil, err
+ for cmd := range w.writesChan {
+ switch v := cmd.(type) {
+ case *gRPCWriterCommandWrite:
+ if len(w.buf)+len(v.p) <= cap(w.buf) {
+ // We have not started sending yet, and we can stage all data without
+ // starting a send. Compare against cap(w.buf) instead of
+ // w.writeQuantum: that way we can perform a oneshot upload for objects
+ // which fit in one chunk, even though we will cut the request into
+ // w.writeQuantum units when we do start sending.
+ origLen := len(w.buf)
+ w.buf = w.buf[:origLen+len(v.p)]
+ copy(w.buf[origLen:], v.p)
+ close(v.done)
+ } else {
+ // Too large. Handle it in writeLoop.
+ w.currentCommand = cmd
+ return nil
+ }
+ break
+ case *gRPCWriterCommandClose:
+ // If we get here, data (if any) fits in w.buf, so we can force oneshot.
+ w.forceOneShot = true
+ w.currentCommand = cmd
+ // No need to start sending if v.err is not nil.
+ return v.err
+ default:
+ // Have to start sending!
+ w.currentCommand = cmd
+ return nil
+ }
}
+ // Nothing should ever close w.writesChan, so we should never get here
+ return errors.New("storage.Writer: unexpectedly closed w.writesChan")
+}
- var o *storagepb.Object
+func (w *gRPCWriter) writeLoop(ctx context.Context) error {
+ w.attempts++
+ // Return an error if we've been waiting for a single operation for too long.
+ if !w.abandonRetriesTime.IsZero() && time.Now().After(w.abandonRetriesTime) {
+ return fmt.Errorf("storage: retry deadline of %s reached after %v attempts; last error: %w", w.chunkRetryDeadline, w.attempts, w.lastErr)
+ }
+ // Allow each request in w.buf to be sent and result in a completion without
+ // blocking.
+ requests := make(chan gRPCBidiWriteRequest, w.sendableUnits)
+ completions := make(chan gRPCBidiWriteCompletion, w.sendableUnits)
+ // Only one request ack will be outstanding at a time.
+ requestAcks := make(chan struct{}, 1)
+ chcs := gRPCWriterCommandHandleChans{requests, requestAcks, completions}
+ bscs := gRPCBufSenderChans{requests, requestAcks, completions}
+ ctx, cancel := context.WithCancel(ctx)
+ defer cancel()
+ w.streamSender.connect(ctx, bscs, w.settings.gax...)
+
+ // Send any full quantum in w.buf, possibly including a flush
+ if err := w.withCommandRetryDeadline(func() error {
+ sentOffset, ok := w.sendBufferToTarget(chcs, w.buf, w.bufBaseOffset, cap(w.buf),
+ w.handleCompletion)
+ if !ok {
+ return w.streamSender.err()
+ }
+ w.bufUnsentIdx = int(sentOffset - w.bufBaseOffset)
+ // We may have observed a completion that is after all of w.buf if we also
+ // have a write command in w.currentCommand which sent a flush, but failed
+ // before the completion could be delivered.
+ if w.bufUnsentIdx < 0 {
+ w.bufUnsentIdx = 0
+ }
+ return nil
+ }); err != nil {
+ return err
+ }
- // If we are taking over an appendable object, send the first message here
- // to get the append offset.
- if params.append && params.appendGen >= 0 {
- // Create the buffer sender. This opens a stream and blocks until we
- // get a response that tells us what offset to write from.
- wbs, err := gw.newGRPCAppendTakeoverWriteBufferSender(params.ctx)
- if err != nil {
- return nil, fmt.Errorf("storage: creating buffer sender: %w", err)
+ err := func() error {
+ for {
+ if w.currentCommand != nil {
+ if err := w.withCommandRetryDeadline(func() error {
+ return w.currentCommand.handle(w, chcs)
+ }); err != nil {
+ return err
+ }
+ w.currentCommand = nil
+ }
+ select {
+ case c, ok := <-completions:
+ if !ok {
+ return w.streamSender.err()
+ }
+ w.handleCompletion(c)
+ case cmd, ok := <-w.writesChan:
+ if !ok {
+ // Nothing should ever close w.writesChan, so we should never get here
+ return errors.New("storage.Writer: unexpectedly closed w.writesChan")
+ }
+ w.currentCommand = cmd
+ }
}
- // Propagate append offset to caller and buffer sending logic below.
- params.setTakeoverOffset(wbs.takeoverOffset)
- offset = wbs.takeoverOffset
- gw.streamSender = wbs
- o = wbs.objResource
- setObj(newObjectFromProto(o))
+ }()
+ if err == nil {
+ err = errors.New("storage.Writer: unexpected nil error from write loop")
+ }
+ var closeErr *gRPCWriterCommandClose
+ if !errors.As(err, &closeErr) {
+ // Not a shutdown.
+ return err
}
- // This function reads the data sent to the pipe and sends sets of messages
- // on the gRPC client-stream as the buffer is filled.
- go func() {
- err := func() error {
- // Unless the user told us the content type, we have to determine it from
- // the first read.
- if params.attrs.ContentType == "" && !params.forceEmptyContentType {
- gw.reader, gw.spec.Resource.ContentType = gax.DetermineContentType(gw.reader)
+ if closeErr.err == nil {
+ // Clean shutdown. Send any remaining tail.
+ req := gRPCBidiWriteRequest{
+ buf: w.buf[w.bufUnsentIdx:],
+ offset: w.bufBaseOffset + int64(w.bufUnsentIdx),
+ flush: true,
+ finishWrite: true,
+ }
+ if err := w.withCommandRetryDeadline(func() error {
+ if !chcs.deliverRequestUnlessCompleted(req, w.handleCompletion) {
+ return w.streamSender.err()
}
+ return nil
+ }); err != nil {
+ return err
+ }
+ } else {
+ // Unclean shutdown. Cancel the context so we clean up expeditiously.
+ cancel()
+ }
- // Loop until there is an error or the Object has been finalized.
- for {
- // Note: This blocks until either the buffer is full or EOF is read.
- recvd, doneReading, err := gw.read()
- if err != nil {
- return err
- }
+ close(requests)
+ for c := range completions {
+ w.handleCompletion(c)
+ }
+ if closeErr.err == nil {
+ return w.streamSender.err()
+ }
+ return closeErr.err
+}
- uploadBuff := func(ctx context.Context) error {
- obj, err := gw.uploadBuffer(ctx, recvd, offset, doneReading)
- if obj != nil {
- o = obj
- setObj(newObjectFromProto(o))
- }
- return err
- }
+// gRPCWriterCommandHandleChans contains the channels that a gRPCWriterCommand
+// implementation must use to send requests and get notified of completions.
+// Requests are delivered on a write-only channel, request acks and completions
+// arrive on read-only channels.
+type gRPCWriterCommandHandleChans struct {
+ requests chan<- gRPCBidiWriteRequest
+ requestAcks <-chan struct{}
+ completions <-chan gRPCBidiWriteCompletion
+}
- // Add routing headers to the context metadata for single-shot and resumable
- // writes. Append writes need to set this at a lower level to pass the routing
- // token.
- bctx := gw.ctx
- if !gw.append {
- bctx = bucketContext(bctx, gw.bucket)
- }
- err = run(bctx, uploadBuff, gw.settings.retry, s.idempotent)
- offset += int64(recvd)
- // If this buffer upload was triggered by a flush, reset and
- // communicate back the result.
- if gw.iw.flushInProgress {
- gw.setSize(offset)
- gw.iw.flushInProgress = false
- gw.iw.flushComplete <- flushResult{offset: offset, err: err}
- }
- if err != nil {
- return err
- }
- // When we are done reading data without errors, set the object and
- // finish.
- if doneReading {
- // Build Object from server's response.
- setObj(newObjectFromProto(o))
- return nil
- }
+// gRPCBufSenderChans contains the channels that a gRPCBidiWriteBufferSender
+// must use to get notified of requests and deliver completions. Requests arrive
+// on a read-only channel, request acks and completions are delivered on
+// write-only channels.
+type gRPCBufSenderChans struct {
+ requests <-chan gRPCBidiWriteRequest
+ requestAcks chan<- struct{}
+ completions chan<- gRPCBidiWriteCompletion
+}
+
+// deliverRequestUnlessCompleted submits req to cs.requests, unless
+// cs.completions is closed first. If a completion arrives before the request is
+// enqueued, handleCompletion is called.
+//
+// Returns true if request was successfully enqueued, and false if completions
+// was closed first.
+func (cs gRPCWriterCommandHandleChans) deliverRequestUnlessCompleted(req gRPCBidiWriteRequest, handleCompletion func(gRPCBidiWriteCompletion)) bool {
+ for {
+ select {
+ case cs.requests <- req:
+ return true
+ case c, ok := <-cs.completions:
+ if !ok {
+ return false
}
- }()
+ handleCompletion(c)
+ }
+ }
+}
- // These calls are still valid if err is nil
- err = checkCanceled(err)
- errorf(err)
- gw.pr.CloseWithError(err)
- close(params.donec)
- }()
+// gRPCWriterCommand represents an operation on a gRPCWriter
+type gRPCWriterCommand interface {
+ // handle applies the command to a gRPCWriter.
+ //
+ // Implementations may return an error. In that case, the command may be
+ // retried with a new gRPCWriterCommandHandleChans instance.
+ handle(*gRPCWriter, gRPCWriterCommandHandleChans) error
+}
- return gw.iw, nil
+type gRPCWriterCommandWrite struct {
+ p []byte
+ done chan struct{}
}
-func newGRPCWriter(c *grpcStorageClient, s *settings, params *openWriterParams, r io.Reader, pr *io.PipeReader, pw *io.PipeWriter) (*gRPCWriter, error) {
- if params.attrs.Retention != nil {
- // TO-DO: remove once ObjectRetention is available - see b/308194853
- return nil, status.Errorf(codes.Unimplemented, "storage: object retention is not supported in gRPC")
+func (c *gRPCWriterCommandWrite) handle(w *gRPCWriter, cs gRPCWriterCommandHandleChans) error {
+ if len(c.p) == 0 {
+ // No data to write.
+ close(c.done)
+ return nil
}
- size := googleapi.MinUploadChunkSize
- // A completely bufferless upload (params.chunkSize <= 0) is not possible in
- // gRPC because the buffer must be provided to the message. Use the minimum
- // size possible.
- if params.chunkSize > 0 {
- size = params.chunkSize
+ wblen := len(w.buf)
+ allKnownBytes := wblen + len(c.p)
+ fullBufs := allKnownBytes / cap(w.buf)
+ partialBuf := allKnownBytes % cap(w.buf)
+ if partialBuf == 0 {
+ // If we would exactly fill some number of cap(w.buf) units, we don't need
+ // to block on the flush for the last one. We know that c.p is not empty, so
+ // allKnownBytes is not 0 and therefore if partialBuf is 0, fullBufs is not
+ // 0.
+ fullBufs--
+ partialBuf = cap(w.buf)
}
- // Round up chunksize to nearest 256KiB
- if size%googleapi.MinUploadChunkSize != 0 {
- size += googleapi.MinUploadChunkSize - (size % googleapi.MinUploadChunkSize)
+ if fullBufs == 0 {
+ // Everything fits in w.buf. Copy in and send from there.
+ w.buf = w.buf[:allKnownBytes]
+ copied := copy(w.buf[wblen:], c.p)
+ // Now that it's in w.buf, clear it from the command in case we retry.
+ c.p = c.p[copied:]
+ sending := w.buf[w.bufUnsentIdx:]
+ sentOffset, ok := w.sendBufferToTarget(cs, sending, w.bufBaseOffset+int64(w.bufUnsentIdx), cap(sending),
+ w.handleCompletion)
+ if !ok {
+ return w.streamSender.err()
+ }
+ w.bufUnsentIdx = int(sentOffset - w.bufBaseOffset)
+ close(c.done)
+ return nil
}
- if s.userProject != "" {
- params.ctx = setUserProjectMetadata(params.ctx, s.userProject)
+ // We have at least one full buffer, followed by a partial. The first full
+ // buffer is the interesting one. We don't actually have to copy all of c.p
+ // in: we can send from it in place, except for any partial quantum at the
+ // tail of w.buf. Send that quantum...
+ toNextWriteQuantum := func() int {
+ if wblen > w.lastSegmentStart {
+ return cap(w.buf) - wblen
+ }
+ if wblen%w.writeQuantum == 0 {
+ return 0
+ }
+ return w.writeQuantum - (wblen % w.writeQuantum)
+ }()
+ w.buf = w.buf[:wblen+toNextWriteQuantum]
+ copied := copy(w.buf[wblen:], c.p)
+ c.p = c.p[copied:]
+ firstFullBufFromCmd := cap(w.buf) - len(w.buf)
+
+ sending := w.buf[w.bufUnsentIdx:]
+ sentOffset, ok := w.sendBufferToTarget(cs, sending, w.bufBaseOffset+int64(w.bufUnsentIdx), cap(sending),
+ w.handleCompletion)
+ if !ok {
+ return w.streamSender.err()
}
- spec := &storagepb.WriteObjectSpec{
- Resource: params.attrs.toProtoObject(params.bucket),
- Appendable: proto.Bool(params.append),
+ // ...then send the prefix of c.p which could fill w.buf
+ cmdBaseOffset := w.bufBaseOffset + int64(len(w.buf))
+ cmdBuf := c.p
+ trimCommandBuf := func(cmp gRPCBidiWriteCompletion) {
+ w.handleCompletion(cmp)
+ // After a completion, keep c.p up to date with w.buf's tail.
+ bufTail := w.bufBaseOffset + int64(len(w.buf))
+ if bufTail <= cmdBaseOffset {
+ return
+ }
+ trim := int(bufTail - cmdBaseOffset)
+ if len(c.p) < trim {
+ trim = len(c.p)
+ }
+ c.p = c.p[trim:]
+ cmdBaseOffset = bufTail
+ }
+ offset := cmdBaseOffset
+ sentOffset, ok = w.sendBufferToTarget(cs, cmdBuf, offset, firstFullBufFromCmd,
+ trimCommandBuf)
+ if !ok {
+ return w.streamSender.err()
}
- var appendSpec *storagepb.AppendObjectSpec
- if params.append && params.appendGen >= 0 {
- appendSpec = &storagepb.AppendObjectSpec{
- Bucket: bucketResourceName(globalProjectAlias, params.bucket),
- Object: params.attrs.Name,
- Generation: params.appendGen,
+ cmdBuf = cmdBuf[int(sentOffset-offset):]
+ offset = sentOffset
+
+ // Remaining full buffers can be satisfied entirely from cmdBuf with no copies.
+ for i := 0; i < fullBufs-1; i++ {
+ sentOffset, ok = w.sendBufferToTarget(cs, cmdBuf, offset, cap(w.buf),
+ trimCommandBuf)
+ if !ok {
+ return w.streamSender.err()
}
+ cmdBuf = cmdBuf[int(sentOffset-offset):]
+ offset = sentOffset
}
- // WriteObject doesn't support the generation condition, so use default.
- if err := applyCondsProto("WriteObject", defaultGen, params.conds, spec); err != nil {
- return nil, err
+
+ // Send the last partial buffer. We need to flush to offset before we can copy
+ // the rest of cmdBuf into w.buf and complete this command.
+ sentOffset, ok = w.sendBufferToTarget(cs, cmdBuf, offset, cap(w.buf),
+ trimCommandBuf)
+ if !ok {
+ return w.streamSender.err()
+ }
+ // Finally, we need the sender to ack to let us know c.p can be released.
+ if !cs.deliverRequestUnlessCompleted(gRPCBidiWriteRequest{requestAck: true}, trimCommandBuf) {
+ return w.streamSender.err()
}
+ ackOutstanding := true
+ for ackOutstanding || (w.bufBaseOffset+int64(w.bufFlushedIdx)) < offset {
+ select {
+ case cmp, ok := <-cs.completions:
+ if !ok {
+ return w.streamSender.err()
+ }
+ trimCommandBuf(cmp)
+ case <-cs.requestAcks:
+ ackOutstanding = false
+ }
+ }
+ toCopyIn := cmdBuf[int(w.bufBaseOffset-offset):]
+ w.buf = w.buf[:len(toCopyIn)]
+ copy(w.buf, toCopyIn)
+ w.bufUnsentIdx = int(sentOffset - w.bufBaseOffset)
+ close(c.done)
+ return nil
+}
- return &gRPCWriter{
- buf: make([]byte, size),
- c: c,
- ctx: params.ctx,
- reader: r,
- pr: pr,
- iw: &gRPCInternalWriter{
- flushSupported: params.append,
- flushInProgress: false,
- pw: pw,
- flushComplete: make(chan flushResult),
- },
- bucket: params.bucket,
- attrs: params.attrs,
- conds: params.conds,
- spec: spec,
- appendSpec: appendSpec,
- encryptionKey: params.encryptionKey,
- settings: s,
- progress: params.progress,
- setSize: params.setSize,
- sendCRC32C: params.sendCRC32C,
- forceOneShot: params.chunkSize <= 0,
- forceEmptyContentType: params.forceEmptyContentType,
- append: params.append,
- finalizeOnClose: params.finalizeOnClose,
- }, nil
+type gRPCWriterCommandFlush struct {
+ done chan int64
}
-// gRPCWriter is a wrapper around the the gRPC client-stream API that manages
-// sending chunks of data provided by the user over the stream.
-type gRPCWriter struct {
- c *grpcStorageClient
- buf []byte
- reader io.Reader
- pr *io.PipeReader // Keep track of pr to update post-flush
- iw *gRPCInternalWriter
+func (c *gRPCWriterCommandFlush) handle(w *gRPCWriter, cs gRPCWriterCommandHandleChans) error {
+ flushTarget := w.bufBaseOffset + int64(len(w.buf))
+ // We know that there are at most w.writeQuantum bytes in
+ // w.buf[w.bufUnsentIdx:], because we send anything more inline when handling
+ // a write.
+ req := gRPCBidiWriteRequest{
+ buf: w.buf[w.bufUnsentIdx:],
+ offset: w.bufBaseOffset + int64(w.bufUnsentIdx),
+ flush: true,
+ finishWrite: false,
+ }
+ if !cs.deliverRequestUnlessCompleted(req, w.handleCompletion) {
+ return w.streamSender.err()
+ }
+ // Successful flushes will clear w.buf.
+ for (w.bufBaseOffset + int64(w.bufFlushedIdx)) < flushTarget {
+ c, ok := <-cs.completions
+ if !ok {
+ // Stream failure
+ return w.streamSender.err()
+ }
+ w.handleCompletion(c)
+ }
+ // handleCompletion has cleared w.buf and updated w.bufUnsentIdx by now.
+ c.done <- flushTarget
+ return nil
+}
- ctx context.Context
+type gRPCWriterCommandClose struct {
+ err error
+}
- bucket string
- attrs *ObjectAttrs
- conds *Conditions
- spec *storagepb.WriteObjectSpec
- appendSpec *storagepb.AppendObjectSpec
- encryptionKey []byte
- settings *settings
- progress func(int64)
- setSize func(int64)
+func (e *gRPCWriterCommandClose) Error() string {
+ return e.err.Error()
+}
- sendCRC32C bool
- forceOneShot bool
- forceEmptyContentType bool
- append bool
- finalizeOnClose bool
+func (c *gRPCWriterCommandClose) handle(w *gRPCWriter, cs gRPCWriterCommandHandleChans) error {
+ // N.B. c is not nil, even if c.err is nil!
+ return c
+}
+
+// Detect content type using bytes first from baseBuf, then from pendingBuf if
+// there are not enough bytes in baseBuf.
+func (w *gRPCWriter) detectContentType() string {
+ wblen := len(w.buf)
+ // If the current command is a write, we want to be able to update it in
+ // place. If the
+ cmdbuf := &([]byte{})
+ if c, ok := w.currentCommand.(*gRPCWriterCommandWrite); ok {
+ cmdbuf = &c.p
+ }
+ if wblen == 0 {
+ // Use the command in place
+ return http.DetectContentType(*cmdbuf)
+ }
+ if wblen >= w.writeQuantum {
+ // Use w.buf in place
+ return http.DetectContentType(w.buf)
+ }
- streamSender gRPCBidiWriteBufferSender
+ // We need to put bytes from the command onto w.buf. Try to fill a
+ // writeQuantum since we'll have to do that in order to send, anyway.
+ newSz := w.writeQuantum
+ if wblen+len(*cmdbuf) < newSz {
+ newSz = wblen + len(*cmdbuf)
+ }
+ w.buf = w.buf[:newSz]
+ copied := copy(w.buf[wblen:], *cmdbuf)
+ *cmdbuf = (*cmdbuf)[copied:]
+ return http.DetectContentType(w.buf)
}
-func bucketContext(ctx context.Context, bucket string) context.Context {
- hds := []string{"x-goog-request-params", fmt.Sprintf("bucket=projects/_/buckets/%s", url.QueryEscape(bucket))}
- return gax.InsertMetadataIntoOutgoingContext(ctx, hds...)
+type gRPCBidiWriteRequest struct {
+ buf []byte
+ offset int64
+ flush bool
+ finishWrite bool
+ // If requestAck is true, no other message fields may be set. Buffer senders
+ // must ack on the requestAcks channel if all prior messages on the requests
+ // channel have been delivered to gRPC.
+ requestAck bool
}
-// drainInboundStream calls stream.Recv() repeatedly until an error is returned.
-// It returns the last Resource received on the stream, or nil if no Resource
-// was returned. drainInboundStream always returns a non-nil error. io.EOF
-// indicates all messages were successfully read.
-func drainInboundStream(stream storagepb.Storage_BidiWriteObjectClient) (object *storagepb.Object, err error) {
- for err == nil {
- var resp *storagepb.BidiWriteObjectResponse
- resp, err = stream.Recv()
- // GetResource() returns nil on a nil response
- if resp.GetResource() != nil {
- object = resp.GetResource()
- }
+type gRPCBidiWriteCompletion struct {
+ flushOffset int64
+ resource *storagepb.Object
+}
+
+func completion(r *storagepb.BidiWriteObjectResponse) *gRPCBidiWriteCompletion {
+ switch c := r.WriteStatus.(type) {
+ case *storagepb.BidiWriteObjectResponse_PersistedSize:
+ return &gRPCBidiWriteCompletion{flushOffset: c.PersistedSize}
+ case *storagepb.BidiWriteObjectResponse_Resource:
+ return &gRPCBidiWriteCompletion{flushOffset: c.Resource.GetSize(), resource: c.Resource}
+ default:
+ return nil
}
- return object, err
}
func bidiWriteObjectRequest(buf []byte, offset int64, flush, finishWrite bool) *storagepb.BidiWriteObjectRequest {
@@ -369,464 +805,449 @@ func bidiWriteObjectRequest(buf []byte, offset int64, flush, finishWrite bool) *
}
type gRPCBidiWriteBufferSender interface {
- // sendBuffer implementations should upload buf, respecting flush and
- // finishWrite. Callers must guarantee that buf is not too long to fit in a
- // gRPC message.
+ // connect implementations may attempt to establish a connection for issuing
+ // writes.
+ //
+ // In case of an error, implementations must close the completion channel. The
+ // write loop will inspect err() after that channel is closed and before any
+ // subsequent calls to connect().
//
- // If flush is true, implementations must not return until the data in buf is
- // stable. If finishWrite is true, implementations must return the object on
- // success.
- sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (*storagepb.Object, error)
+ // If a request is delivered with flush true, implementations must request
+ // that the service make the data stable. If a request is delivered with
+ // finishWrite true, no subsequent messages will be delivered on the channel,
+ // and implementations must attempt to tear down the connection cleanly after
+ // sending the request. In both cases, the write loop will stall unless the
+ // completion channel is closed or receives a completion indicating that
+ // offset+len(buf) is persisted.
+ connect(context.Context, gRPCBufSenderChans, ...gax.CallOption)
+
+ // err implementations must return the error on the stream. err() must be safe
+ // to call after the completion channel provided to connect() is closed. The
+ // write loop will not make concurrent calls to connect() and err().
+ err() error
}
type gRPCOneshotBidiWriteBufferSender struct {
- firstMessage *storagepb.BidiWriteObjectRequest
raw *gapic.Client
- stream storagepb.Storage_BidiWriteObjectClient
- settings *settings
+ bucket string
+ firstMessage *storagepb.BidiWriteObjectRequest
+ streamErr error
}
-func (w *gRPCWriter) newGRPCOneshotBidiWriteBufferSender() (*gRPCOneshotBidiWriteBufferSender, error) {
- firstMessage := &storagepb.BidiWriteObjectRequest{
- FirstMessage: &storagepb.BidiWriteObjectRequest_WriteObjectSpec{
- WriteObjectSpec: w.spec,
+func (w *gRPCWriter) newGRPCOneshotBidiWriteBufferSender() *gRPCOneshotBidiWriteBufferSender {
+ return &gRPCOneshotBidiWriteBufferSender{
+ raw: w.c.raw,
+ bucket: w.bucket,
+ firstMessage: &storagepb.BidiWriteObjectRequest{
+ FirstMessage: &storagepb.BidiWriteObjectRequest_WriteObjectSpec{
+ WriteObjectSpec: w.spec,
+ },
+ CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey),
+ // For a non-resumable upload, checksums must be sent in this message.
+ // TODO: Currently the checksums are only sent on the first message
+ // of the stream, but in the future, we must also support sending it
+ // on the *last* message of the stream (instead of the first).
+ ObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs),
},
- CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey),
- // For a non-resumable upload, checksums must be sent in this message.
- // TODO: Currently the checksums are only sent on the first message
- // of the stream, but in the future, we must also support sending it
- // on the *last* message of the stream (instead of the first).
- ObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs),
}
-
- return &gRPCOneshotBidiWriteBufferSender{
- firstMessage: firstMessage,
- raw: w.c.raw,
- settings: w.settings,
- }, nil
}
-func (s *gRPCOneshotBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) {
- var firstMessage *storagepb.BidiWriteObjectRequest
- if s.stream == nil {
- s.stream, err = s.raw.BidiWriteObject(ctx, s.settings.gax...)
- if err != nil {
- return
+func (s *gRPCOneshotBidiWriteBufferSender) err() error { return s.streamErr }
+
+// drainInboundStream calls stream.Recv() repeatedly until an error is returned.
+// It returns the last Resource received on the stream, or nil if no Resource
+// was returned. drainInboundStream always returns a non-nil error. io.EOF
+// indicates all messages were successfully read.
+func drainInboundStream(stream storagepb.Storage_BidiWriteObjectClient) (object *storagepb.Object, err error) {
+ for err == nil {
+ var resp *storagepb.BidiWriteObjectResponse
+ resp, err = stream.Recv()
+ // GetResource() returns nil on a nil response
+ if resp.GetResource() != nil {
+ object = resp.GetResource()
}
- firstMessage = s.firstMessage
- }
- req := bidiWriteObjectRequest(buf, offset, flush, finishWrite)
- if firstMessage != nil {
- proto.Merge(req, firstMessage)
}
+ return object, err
+}
- sendErr := s.stream.Send(req)
- if sendErr != nil {
- obj, err = drainInboundStream(s.stream)
- s.stream = nil
- if sendErr != io.EOF {
- err = sendErr
- }
+func (s *gRPCOneshotBidiWriteBufferSender) connect(ctx context.Context, cs gRPCBufSenderChans, opts ...gax.CallOption) {
+ s.streamErr = nil
+ ctx = gRPCWriteRequestParams{bucket: s.bucket}.apply(ctx)
+ stream, err := s.raw.BidiWriteObject(ctx, opts...)
+ if err != nil {
+ s.streamErr = err
+ close(cs.completions)
return
}
- // Oneshot uploads assume all flushes succeed
- if finishWrite {
- s.stream.CloseSend()
- // Oneshot uploads only read from the response stream on completion or
- // failure
- obj, err = drainInboundStream(s.stream)
- s.stream = nil
- if err == io.EOF {
- err = nil
+ go func() {
+ firstSend := true
+ for r := range cs.requests {
+ if r.requestAck {
+ cs.requestAcks <- struct{}{}
+ continue
+ }
+
+ req := bidiWriteObjectRequest(r.buf, r.offset, r.flush, r.finishWrite)
+ if firstSend {
+ proto.Merge(req, s.firstMessage)
+ firstSend = false
+ }
+
+ if err := stream.Send(req); err != nil {
+ _, s.streamErr = drainInboundStream(stream)
+ if err != io.EOF {
+ s.streamErr = err
+ }
+ close(cs.completions)
+ return
+ }
+
+ if r.finishWrite {
+ stream.CloseSend()
+ // Oneshot uploads only read from the response stream on completion or
+ // failure
+ obj, err := drainInboundStream(stream)
+ if obj == nil || err != io.EOF {
+ s.streamErr = err
+ } else {
+ cs.completions <- gRPCBidiWriteCompletion{flushOffset: obj.GetSize(), resource: obj}
+ }
+ close(cs.completions)
+ return
+ }
+
+ // Oneshot uploads assume all flushes succeed
+ if r.flush {
+ cs.completions <- gRPCBidiWriteCompletion{flushOffset: r.offset + int64(len(r.buf))}
+ }
}
- }
- return
+ }()
}
type gRPCResumableBidiWriteBufferSender struct {
- queryRetry *retryConfig
- upid string
- progress func(int64)
- raw *gapic.Client
- forceFirstMessage bool
- stream storagepb.Storage_BidiWriteObjectClient
- flushOffset int64
- settings *settings
-}
-
-func (w *gRPCWriter) newGRPCResumableBidiWriteBufferSender(ctx context.Context) (*gRPCResumableBidiWriteBufferSender, error) {
- req := &storagepb.StartResumableWriteRequest{
- WriteObjectSpec: w.spec,
- CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey),
- // TODO: Currently the checksums are only sent on the request to initialize
- // the upload, but in the future, we must also support sending it
- // on the *last* message of the stream.
- ObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs),
- }
+ raw *gapic.Client
+ bucket string
- var upid string
- err := run(ctx, func(ctx context.Context) error {
- upres, err := w.c.raw.StartResumableWrite(ctx, req, w.settings.gax...)
- upid = upres.GetUploadId()
- return err
- }, w.settings.retry, w.settings.idempotent)
- if err != nil {
- return nil, err
- }
+ startWriteRequest *storagepb.StartResumableWriteRequest
+ upid string
- // Set up an initial connection for the 0 offset, so we don't query state
- // unnecessarily for the first buffer. If we fail, we'll just retry in the
- // normal connect path.
- stream, err := w.c.raw.BidiWriteObject(ctx, w.settings.gax...)
- if err != nil {
- stream = nil
- }
+ streamErr error
+}
+func (w *gRPCWriter) newGRPCResumableBidiWriteBufferSender() *gRPCResumableBidiWriteBufferSender {
return &gRPCResumableBidiWriteBufferSender{
- queryRetry: w.settings.retry,
- upid: upid,
- progress: w.progress,
- raw: w.c.raw,
- forceFirstMessage: true,
- stream: stream,
- settings: w.settings,
- }, nil
+ raw: w.c.raw,
+ bucket: w.bucket,
+ startWriteRequest: &storagepb.StartResumableWriteRequest{
+ WriteObjectSpec: w.spec,
+ CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey),
+ // TODO: Currently the checksums are only sent on the request to initialize
+ // the upload, but in the future, we must also support sending it
+ // on the *last* message of the stream.
+ ObjectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs),
+ },
+ }
}
-// queryProgress is a helper that queries the status of the resumable upload
-// associated with the given upload ID.
-func (s *gRPCResumableBidiWriteBufferSender) queryProgress(ctx context.Context) (int64, error) {
- var persistedSize int64
- err := run(ctx, func(ctx context.Context) error {
- q, err := s.raw.QueryWriteStatus(ctx, &storagepb.QueryWriteStatusRequest{
- UploadId: s.upid,
- }, s.settings.gax...)
- // q.GetPersistedSize() will return 0 if q is nil.
- persistedSize = q.GetPersistedSize()
- return err
- }, s.queryRetry, true)
+func (s *gRPCResumableBidiWriteBufferSender) err() error { return s.streamErr }
- return persistedSize, err
-}
+func (s *gRPCResumableBidiWriteBufferSender) connect(ctx context.Context, cs gRPCBufSenderChans, opts ...gax.CallOption) {
+ s.streamErr = nil
+ ctx = gRPCWriteRequestParams{bucket: s.bucket}.apply(ctx)
-func (s *gRPCResumableBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) {
- if s.stream == nil {
- // Determine offset and reconnect
- s.flushOffset, err = s.queryProgress(ctx)
+ if s.startWriteRequest != nil {
+ upres, err := s.raw.StartResumableWrite(ctx, s.startWriteRequest, opts...)
if err != nil {
+ s.streamErr = err
+ close(cs.completions)
return
}
- s.stream, err = s.raw.BidiWriteObject(ctx, s.settings.gax...)
+ s.upid = upres.GetUploadId()
+ s.startWriteRequest = nil
+ } else {
+ q, err := s.raw.QueryWriteStatus(ctx, &storagepb.QueryWriteStatusRequest{UploadId: s.upid}, opts...)
if err != nil {
+ s.streamErr = err
+ close(cs.completions)
return
}
- s.forceFirstMessage = true
- }
-
- // clean up buf. We'll still write the message if a flush/finishWrite was
- // requested.
- if offset < s.flushOffset {
- trim := s.flushOffset - offset
- if int64(len(buf)) <= trim {
- trim = int64(len(buf))
- }
- buf = buf[trim:]
- offset += trim
- }
- if len(buf) == 0 && !flush && !finishWrite {
- // no need to send anything
- return nil, nil
- }
-
- req := bidiWriteObjectRequest(buf, offset, flush, finishWrite)
- if s.forceFirstMessage {
- req.FirstMessage = &storagepb.BidiWriteObjectRequest_UploadId{UploadId: s.upid}
- s.forceFirstMessage = false
- }
-
- sendErr := s.stream.Send(req)
- if sendErr != nil {
- obj, err = drainInboundStream(s.stream)
- s.stream = nil
- if err == io.EOF {
- // This is unexpected - we got an error on Send(), but not on Recv().
- // Bubble up the sendErr.
- err = sendErr
- }
- return
+ cs.completions <- gRPCBidiWriteCompletion{flushOffset: q.GetPersistedSize()}
}
- if finishWrite {
- s.stream.CloseSend()
- obj, err = drainInboundStream(s.stream)
- s.stream = nil
- if err == io.EOF {
- err = nil
- if obj.GetSize() > s.flushOffset {
- s.progress(obj.GetSize())
- }
- }
+ stream, err := s.raw.BidiWriteObject(ctx, opts...)
+ if err != nil {
+ s.streamErr = err
+ close(cs.completions)
return
}
- if flush {
- resp, err := s.stream.Recv()
- if err != nil {
- return nil, err
- }
- persistedOffset := resp.GetPersistedSize()
- if persistedOffset > s.flushOffset {
- s.flushOffset = persistedOffset
- s.progress(s.flushOffset)
- }
- }
- return
-}
+ go func() {
+ var sendErr, recvErr error
+ sendDone := make(chan struct{})
+ recvDone := make(chan struct{})
+
+ go func() {
+ sendErr = func() error {
+ firstSend := true
+ for {
+ select {
+ case <-recvDone:
+ // Because `requests` is not connected to the gRPC machinery, we
+ // have to check for asynchronous termination on the receive side.
+ return nil
+ case r, ok := <-cs.requests:
+ if !ok {
+ stream.CloseSend()
+ return nil
+ }
+ if r.requestAck {
+ cs.requestAcks <- struct{}{}
+ continue
+ }
+ req := bidiWriteObjectRequest(r.buf, r.offset, r.flush, r.finishWrite)
+ if firstSend {
+ req.FirstMessage = &storagepb.BidiWriteObjectRequest_UploadId{UploadId: s.upid}
+ firstSend = false
+ }
+ if err := stream.Send(req); err != nil {
+ return err
+ }
+ if r.finishWrite {
+ stream.CloseSend()
+ return nil
+ }
+ }
+ }
+ }()
+ close(sendDone)
+ }()
-// uploadBuffer uploads the buffer at the given offset using a bi-directional
-// Write stream. It will open a new stream if necessary (on the first call or
-// after resuming from failure) and chunk the buffer per maxPerMessageWriteSize.
-// The final Object is returned on success if doneReading is true.
-//
-// Returns object and any error that is not retriable.
-func (w *gRPCWriter) uploadBuffer(ctx context.Context, recvd int, start int64, doneReading bool) (obj *storagepb.Object, err error) {
- if w.streamSender == nil {
- if w.append {
- // Appendable object semantics
- w.streamSender, err = w.newGRPCAppendableObjectBufferSender()
- } else if doneReading || w.forceOneShot {
- // One shot semantics
- w.streamSender, err = w.newGRPCOneshotBidiWriteBufferSender()
- } else {
- // Resumable write semantics
- w.streamSender, err = w.newGRPCResumableBidiWriteBufferSender(ctx)
- }
- if err != nil {
- return
- }
- }
+ go func() {
+ recvErr = func() error {
+ for {
+ resp, err := stream.Recv()
+ if err != nil {
+ return err
+ }
+ if c := completion(resp); c != nil {
+ cs.completions <- *c
+ }
+ }
+ }()
+ close(recvDone)
+ }()
- data := w.buf[:recvd]
- offset := start
- // We want to go through this loop at least once, in case we have to
- // finishWrite with an empty buffer.
- for {
- // Send as much as we can fit into a single gRPC message. Only flush once,
- // when sending the very last message.
- l := maxPerMessageWriteSize
- flush := false
- if len(data) <= l {
- l = len(data)
- flush = true
+ <-sendDone
+ <-recvDone
+ // Prefer recvErr since that's where RPC errors are delivered
+ if recvErr != nil {
+ s.streamErr = recvErr
+ } else if sendErr != nil {
+ s.streamErr = sendErr
}
- obj, err = w.streamSender.sendBuffer(ctx, data[:l], offset, flush, flush && doneReading)
- if err != nil {
- return nil, err
- }
- data = data[l:]
- offset += int64(l)
- if len(data) == 0 {
- // Update object size to match persisted offset.
- if obj != nil {
- obj.Size = offset
- }
- break
- }
- }
- return
-}
-
-// read copies the data in the reader to the given buffer and reports how much
-// data was read into the buffer and if there is no more data to read (EOF).
-// read returns when either 1. the buffer is full, 2. Writer.Flush was called,
-// or 3. Writer.Close was called.
-func (w *gRPCWriter) read() (int, bool, error) {
- // Set n to -1 to start the Read loop.
- var n, recvd int = -1, 0
- var err error
- for err == nil && n != 0 {
- // The routine blocks here until data is received.
- n, err = w.reader.Read(w.buf[recvd:])
- recvd += n
- }
- var done bool
- if err == io.EOF {
- err = nil
- // EOF can come from Writer.Flush or Writer.Close.
- if w.iw.flushInProgress {
- // Reset pipe for additional writes after the flush.
- pr, pw := io.Pipe()
- w.reader = pr
- w.pr = pr
- w.iw.pw = pw
- } else {
- done = true
+ if s.streamErr == io.EOF {
+ s.streamErr = nil
}
- }
- return recvd, done, err
+ close(cs.completions)
+ }()
}
-func checkCanceled(err error) error {
- if status.Code(err) == codes.Canceled {
- return context.Canceled
- }
+type gRPCAppendBidiWriteBufferSender struct {
+ raw *gapic.Client
+ bucket string
+ routingToken *string
- return err
-}
+ firstMessage *storagepb.BidiWriteObjectRequest
-type gRPCAppendBidiWriteBufferSender struct {
- bucket string
- routingToken *string
- raw *gapic.Client
- settings *settings
- stream storagepb.Storage_BidiWriteObjectClient
- firstMessage *storagepb.BidiWriteObjectRequest
objectChecksums *storagepb.ObjectChecksums
-
finalizeOnClose bool
+ objResource *storagepb.Object
- forceFirstMessage bool
- progress func(int64)
- flushOffset int64
- takeoverOffset int64
- objResource *storagepb.Object // Captures received obj to set w.Attrs.
-
- // Fields used to report responses from the receive side of the stream
- // recvs is closed when the current recv goroutine is complete. recvErr is set
- // to the result of that stream (including io.EOF to indicate success)
- recvs <-chan *storagepb.BidiWriteObjectResponse
- recvErr error
+ streamErr error
}
+func (s *gRPCAppendBidiWriteBufferSender) err() error { return s.streamErr }
+
// Use for a newly created appendable object.
-func (w *gRPCWriter) newGRPCAppendableObjectBufferSender() (*gRPCAppendBidiWriteBufferSender, error) {
- s := &gRPCAppendBidiWriteBufferSender{
- bucket: w.spec.GetResource().GetBucket(),
- raw: w.c.raw,
- settings: w.settings,
+func (w *gRPCWriter) newGRPCAppendableObjectBufferSender() *gRPCAppendBidiWriteBufferSender {
+ return &gRPCAppendBidiWriteBufferSender{
+ raw: w.c.raw,
+ bucket: w.bucket,
firstMessage: &storagepb.BidiWriteObjectRequest{
FirstMessage: &storagepb.BidiWriteObjectRequest_WriteObjectSpec{
WriteObjectSpec: w.spec,
},
CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey),
},
- objectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs),
- finalizeOnClose: w.finalizeOnClose,
- forceFirstMessage: true,
- progress: w.progress,
- flushOffset: -1, // We should ack flushes to length 0.
+ objectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs),
+ finalizeOnClose: w.finalizeOnClose,
}
- return s, nil
}
-// Use for a takeover of an appendable object.
-// Unlike newGRPCAppendableObjectBufferSender, this blocks until the stream is
-// open because it needs to get the append offset from the server.
-func (w *gRPCWriter) newGRPCAppendTakeoverWriteBufferSender(ctx context.Context) (*gRPCAppendBidiWriteBufferSender, error) {
- s := &gRPCAppendBidiWriteBufferSender{
- bucket: w.spec.GetResource().GetBucket(),
- raw: w.c.raw,
- settings: w.settings,
- firstMessage: &storagepb.BidiWriteObjectRequest{
- FirstMessage: &storagepb.BidiWriteObjectRequest_AppendObjectSpec{
- AppendObjectSpec: w.appendSpec,
- },
- },
- objectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs),
- finalizeOnClose: w.finalizeOnClose,
- forceFirstMessage: true,
- progress: w.progress,
- }
- if err := s.connect(ctx); err != nil {
- return nil, fmt.Errorf("storage: opening appendable write stream: %w", err)
- }
- _, err := s.sendOnConnectedStream(nil, 0, false, false, true)
+func (s *gRPCAppendBidiWriteBufferSender) connect(ctx context.Context, cs gRPCBufSenderChans, opts ...gax.CallOption) {
+ s.streamErr = nil
+ ctx = gRPCWriteRequestParams{appendable: true, bucket: s.bucket, routingToken: s.routingToken}.apply(ctx)
+
+ stream, err := s.raw.BidiWriteObject(ctx, opts...)
if err != nil {
- return nil, err
- }
- firstResp := <-s.recvs
- // Check recvErr after getting the response.
- if s.recvErr != nil {
- return nil, s.recvErr
+ s.streamErr = err
+ close(cs.completions)
+ return
}
- // Object resource is returned in the first response on takeover, so capture
- // this now.
- s.objResource = firstResp.GetResource()
- s.takeoverOffset = firstResp.GetResource().GetSize()
- return s, nil
+ go s.handleStream(stream, cs, true)
}
-func (s *gRPCAppendBidiWriteBufferSender) connect(ctx context.Context) (err error) {
- err = func() error {
- // If this is a forced first message, we've already determined it's safe to
- // send.
- if s.forceFirstMessage {
- s.forceFirstMessage = false
- return nil
- }
-
- // It's always ok to reconnect if there is a handle. This is the common
- // case.
- if s.firstMessage.GetAppendObjectSpec().GetWriteHandle() != nil {
- return nil
- }
- // Also always okay to reconnect if there is a generation.
- if s.firstMessage.GetAppendObjectSpec().GetGeneration() != 0 {
- return nil
- }
- // Also always ok to reconnect if we've seen a redirect token
- if s.routingToken != nil {
- return nil
- }
-
- // We can also reconnect if the first message has an if_generation_match or
- // if_metageneration_match condition. Note that negative conditions like
- // if_generation_not_match are not necessarily safe to retry.
- aos := s.firstMessage.GetAppendObjectSpec()
- wos := s.firstMessage.GetWriteObjectSpec()
+func (s *gRPCAppendBidiWriteBufferSender) handleStream(stream storagepb.Storage_BidiWriteObjectClient, cs gRPCBufSenderChans, firstSend bool) {
+ var sendErr, recvErr error
+ sendDone := make(chan struct{})
+ recvDone := make(chan struct{})
- if aos != nil && aos.IfMetagenerationMatch != nil {
- return nil
- }
+ go func() {
+ sendErr = func() error {
+ for {
+ select {
+ case <-recvDone:
+ // Because `requests` is not connected to the gRPC machinery, we
+ // have to check for asynchronous termination on the receive side.
+ return nil
+ case r, ok := <-cs.requests:
+ if !ok {
+ stream.CloseSend()
+ return nil
+ }
+ if r.requestAck {
+ cs.requestAcks <- struct{}{}
+ continue
+ }
+ err := s.send(stream, r.buf, r.offset, r.flush, r.finishWrite, firstSend)
+ firstSend = false
+ if err != nil {
+ return err
+ }
+ if r.finishWrite {
+ stream.CloseSend()
+ return nil
+ }
+ }
+ }
+ }()
+ close(sendDone)
+ }()
- if wos != nil && wos.IfGenerationMatch != nil {
- return nil
- }
- if wos != nil && wos.IfMetagenerationMatch != nil {
- return nil
- }
+ go func() {
+ recvErr = func() error {
+ for {
+ resp, err := stream.Recv()
+ if err != nil {
+ return s.maybeHandleRedirectionError(err)
+ }
+ s.maybeUpdateFirstMessage(resp)
- // Otherwise, it is not safe to reconnect.
- return errors.New("cannot safely reconnect; no write handle or preconditions")
+ if c := completion(resp); c != nil {
+ cs.completions <- *c
+ }
+ }
+ }()
+ close(recvDone)
}()
- if err != nil {
- return err
+
+ <-sendDone
+ <-recvDone
+ // Prefer recvErr since that's where RPC errors are delivered
+ if recvErr != nil {
+ s.streamErr = recvErr
+ } else if sendErr != nil {
+ s.streamErr = sendErr
+ }
+ if s.streamErr == io.EOF {
+ s.streamErr = nil
}
+ close(cs.completions)
+}
+
+type gRPCAppendTakeoverBidiWriteBufferSender struct {
+ gRPCAppendBidiWriteBufferSender
+ takeoverReported bool
+ handleTakeoverCompletion func(gRPCBidiWriteCompletion)
+}
- return s.startReceiver(ctx)
+func writeObjectSpecAsAppendObjectSpec(s *storagepb.WriteObjectSpec, gen int64) *storagepb.AppendObjectSpec {
+ return &storagepb.AppendObjectSpec{
+ Bucket: s.GetResource().GetBucket(),
+ Object: s.GetResource().GetName(),
+ Generation: gen,
+ IfMetagenerationMatch: s.IfMetagenerationMatch,
+ IfMetagenerationNotMatch: s.IfMetagenerationNotMatch,
+ }
}
-func (s *gRPCAppendBidiWriteBufferSender) withRequestParams(ctx context.Context) context.Context {
- param := fmt.Sprintf("appendable=true&bucket=%s", s.bucket)
- if s.routingToken != nil {
- param = param + fmt.Sprintf("&routing_token=%s", *s.routingToken)
+// Use for a takeover of an appendable object.
+func (w *gRPCWriter) newGRPCAppendTakeoverWriteBufferSender() *gRPCAppendTakeoverBidiWriteBufferSender {
+ return &gRPCAppendTakeoverBidiWriteBufferSender{
+ gRPCAppendBidiWriteBufferSender: gRPCAppendBidiWriteBufferSender{
+ raw: w.c.raw,
+ bucket: w.bucket,
+ firstMessage: &storagepb.BidiWriteObjectRequest{
+ FirstMessage: &storagepb.BidiWriteObjectRequest_AppendObjectSpec{
+ AppendObjectSpec: writeObjectSpecAsAppendObjectSpec(w.spec, w.appendGen),
+ },
+ },
+ objectChecksums: toProtoChecksums(w.sendCRC32C, w.attrs),
+ finalizeOnClose: w.finalizeOnClose,
+ },
+ takeoverReported: false,
+ handleTakeoverCompletion: func(c gRPCBidiWriteCompletion) {
+ w.handleCompletion(c)
+ w.setTakeoverOffset(c.flushOffset)
+ },
}
- return gax.InsertMetadataIntoOutgoingContext(ctx, "x-goog-request-params", param)
}
-func (s *gRPCAppendBidiWriteBufferSender) startReceiver(ctx context.Context) (err error) {
- s.stream, err = s.raw.BidiWriteObject(s.withRequestParams(ctx), s.settings.gax...)
+func (s *gRPCAppendTakeoverBidiWriteBufferSender) connect(ctx context.Context, cs gRPCBufSenderChans, opts ...gax.CallOption) {
+ s.streamErr = nil
+ ctx = gRPCWriteRequestParams{appendable: true, bucket: s.bucket, routingToken: s.routingToken}.apply(ctx)
+
+ stream, err := s.raw.BidiWriteObject(ctx, opts...)
if err != nil {
+ s.streamErr = err
+ close(cs.completions)
return
}
- recvs := make(chan *storagepb.BidiWriteObjectResponse)
- s.recvs = recvs
- s.recvErr = nil
- go s.receiveMessages(recvs)
- return
+ // This blocks until we know the takeover offset from the server on first
+ // connection
+ firstSend := true
+ if !s.takeoverReported {
+ if err := s.send(stream, nil, 0, false, false, true); err != nil {
+ s.streamErr = err
+ close(cs.completions)
+ return
+ }
+ firstSend = false
+
+ resp, err := stream.Recv()
+ if err != nil {
+ // A Recv() error may be a redirect.
+ s.streamErr = s.maybeHandleRedirectionError(err)
+ close(cs.completions)
+ return
+ }
+
+ c := completion(resp)
+ if c == nil {
+ s.streamErr = fmt.Errorf("storage: unexpectedly no size in initial takeover response %+v", resp)
+ close(cs.completions)
+ return
+ }
+
+ s.maybeUpdateFirstMessage(resp)
+ s.takeoverReported = true
+ s.handleTakeoverCompletion(*c)
+ }
+
+ go s.handleStream(stream, cs, firstSend)
}
func (s *gRPCAppendBidiWriteBufferSender) ensureFirstMessageAppendObjectSpec() {
@@ -865,72 +1286,40 @@ func (e bidiWriteObjectRedirectionError) Error() string {
return ""
}
-func (s *gRPCAppendBidiWriteBufferSender) handleRedirectionError(e *storagepb.BidiWriteObjectRedirectedError) bool {
- if e.RoutingToken == nil {
- // This shouldn't happen, but we don't want to blindly retry here. Instead,
- // surface the error to the caller.
- return false
- }
-
- if e.WriteHandle != nil {
- // If we get back a write handle, we should use it. We can only use it
- // on an append object spec.
- s.ensureFirstMessageAppendObjectSpec()
- s.firstMessage.GetAppendObjectSpec().WriteHandle = e.WriteHandle
- // Generation is meant to only come with the WriteHandle, so ignore it
- // otherwise.
- if e.Generation != nil {
- s.firstMessage.GetAppendObjectSpec().Generation = e.GetGeneration()
- }
- }
-
- s.routingToken = e.RoutingToken
- return true
-}
-
-func (s *gRPCAppendBidiWriteBufferSender) receiveMessages(resps chan<- *storagepb.BidiWriteObjectResponse) {
- resp, err := s.stream.Recv()
- for err == nil {
- s.maybeUpdateFirstMessage(resp)
-
- if resp.WriteStatus != nil {
- // We only get a WriteStatus if this was a solicited message (either
- // state_lookup: true or finish_write: true). Unsolicited messages may
- // arrive to update our handle if necessary. We don't want to block on
- // this channel write if this was an unsolicited message.
- resps <- resp
- }
-
- resp, err = s.stream.Recv()
- }
-
+func (s *gRPCAppendBidiWriteBufferSender) maybeHandleRedirectionError(err error) error {
if st, ok := status.FromError(err); ok && st.Code() == codes.Aborted {
for _, d := range st.Details() {
if e, ok := d.(*storagepb.BidiWriteObjectRedirectedError); ok {
- // If we can handle this error, wrap it with the sentinel so it gets
- // retried.
- if ok := s.handleRedirectionError(e); ok {
- err = fmt.Errorf("%w%w", bidiWriteObjectRedirectionError{}, err)
+ if e.RoutingToken == nil {
+ // This shouldn't happen, but we don't want to blindly retry here.
+ // Instead, surface the error to the caller.
+ return err
+ }
+
+ if e.WriteHandle != nil {
+ // If we get back a write handle, we should use it. We can only use it
+ // on an append object spec.
+ s.ensureFirstMessageAppendObjectSpec()
+ s.firstMessage.GetAppendObjectSpec().WriteHandle = e.WriteHandle
+ // Generation is meant to only come with the WriteHandle, so ignore it
+ // otherwise.
+ if e.Generation != nil {
+ s.firstMessage.GetAppendObjectSpec().Generation = e.GetGeneration()
+ }
}
+
+ s.routingToken = e.RoutingToken
+ return fmt.Errorf("%w%w", bidiWriteObjectRedirectionError{}, err)
}
}
}
-
- // TODO: automatically reconnect on retriable recv errors, even if there are
- // no sends occurring.
- s.recvErr = err
- close(resps)
+ return err
}
-func (s *gRPCAppendBidiWriteBufferSender) sendOnConnectedStream(buf []byte, offset int64, flush, finishWrite, sendFirstMessage bool) (obj *storagepb.Object, err error) {
- var req *storagepb.BidiWriteObjectRequest
+func (s *gRPCAppendBidiWriteBufferSender) send(stream storagepb.Storage_BidiWriteObjectClient, buf []byte, offset int64, flush, finishWrite, sendFirstMessage bool) error {
finalizeObject := finishWrite && s.finalizeOnClose
- if finishWrite {
- // Always flush when finishing the Write, even if not finalizing.
- req = bidiWriteObjectRequest(buf, offset, true, finalizeObject)
- } else {
- req = bidiWriteObjectRequest(buf, offset, flush, false)
- }
+ flush = flush || finishWrite
+ req := bidiWriteObjectRequest(buf, offset, flush, finalizeObject)
if finalizeObject {
// appendable objects pass checksums on the finalize message only
req.ObjectChecksums = s.objectChecksums
@@ -939,90 +1328,84 @@ func (s *gRPCAppendBidiWriteBufferSender) sendOnConnectedStream(buf []byte, offs
proto.Merge(req, s.firstMessage)
}
- if err = s.stream.Send(req); err != nil {
- return nil, err
- }
+ return stream.Send(req)
+}
- if finishWrite {
- s.stream.CloseSend()
- for resp := range s.recvs {
- if resp.GetResource() != nil {
- obj = resp.GetResource()
- }
- // When closing the stream, update the object resource to reflect
- // the persisted size. We get a new object from the stream if
- // the object was finalized, but not if it's unfinalized.
- if s.objResource != nil && resp.GetPersistedSize() > 0 {
- s.objResource.Size = resp.GetPersistedSize()
- }
- }
- if s.recvErr != io.EOF {
- return nil, s.recvErr
- }
- if obj.GetSize() > s.flushOffset {
- s.flushOffset = obj.GetSize()
- s.progress(s.flushOffset)
- }
- return
+func checkCanceled(err error) error {
+ if status.Code(err) == codes.Canceled {
+ return context.Canceled
}
- if flush {
- // We don't necessarily expect multiple responses for a single flush, but
- // this allows the server to send multiple responses if it wants to.
- flushOffset := s.flushOffset
+ return err
+}
- for flushOffset < offset+int64(len(buf)) {
- resp, ok := <-s.recvs
- if !ok {
- return nil, s.recvErr
- }
- pSize := resp.GetPersistedSize()
- rSize := resp.GetResource().GetSize()
- if flushOffset < pSize {
- flushOffset = pSize
- }
- if flushOffset < rSize {
- flushOffset = rSize
- }
- // On the first flush, we expect to get an object resource back and
- // should return it.
- if resp.GetResource() != nil {
- obj = resp.GetResource()
- }
- }
- if s.flushOffset < flushOffset {
- s.flushOffset = flushOffset
- s.progress(s.flushOffset)
- }
+// gRPCChunkSize returns the chunk size to use based on the requested chunk
+// size.
+//
+// The chunk size returned is always greater than 0 and a multiple of
+// googleapi.MinUploadChunkSize
+func gRPCChunkSize(requestSize int) int {
+ size := googleapi.MinUploadChunkSize
+ if requestSize > size {
+ size = requestSize
+ }
+
+ if size%googleapi.MinUploadChunkSize != 0 {
+ size += googleapi.MinUploadChunkSize - (size % googleapi.MinUploadChunkSize)
}
- return
+ return size
}
-func (s *gRPCAppendBidiWriteBufferSender) sendBuffer(ctx context.Context, buf []byte, offset int64, flush, finishWrite bool) (obj *storagepb.Object, err error) {
- for {
- sendFirstMessage := false
- if s.stream == nil {
- sendFirstMessage = true
- if err = s.connect(ctx); err != nil {
- return
- }
- }
+type gRPCWriteRequestParams struct {
+ appendable bool
+ bucket string
+ routingToken *string
+}
- obj, err = s.sendOnConnectedStream(buf, offset, flush, finishWrite, sendFirstMessage)
- if obj != nil {
- s.objResource = obj
- }
- if err == nil {
- return
- }
+func (p gRPCWriteRequestParams) apply(ctx context.Context) context.Context {
+ hds := make([]string, 0, 3)
+ if p.appendable {
+ hds = append(hds, "appendable=true")
+ }
+ if p.bucket != "" {
+ hds = append(hds, fmt.Sprintf("bucket=projects/_/buckets/%s", url.QueryEscape(p.bucket)))
+ }
+ if p.routingToken != nil {
+ hds = append(hds, fmt.Sprintf("routing_token=%s", *p.routingToken))
+ }
+ return gax.InsertMetadataIntoOutgoingContext(ctx, "x-goog-request-params", strings.Join(hds, "&"))
+}
- // await recv stream termination
- for range s.recvs {
+func withBidiWriteObjectRedirectionErrorRetries(s *settings) (newr *retryConfig) {
+ oldr := s.retry
+ newr = oldr.clone()
+ if newr == nil {
+ newr = &retryConfig{}
+ }
+ if (oldr.policy == RetryIdempotent && !s.idempotent) || oldr.policy == RetryNever {
+ // We still retry redirection errors even when settings indicate not to
+ // retry.
+ //
+ // The protocol requires us to respect redirection errors, so RetryNever has
+ // to ignore them.
+ //
+ // Idempotency is always protected by redirection errors: they either
+ // contain a handle which can be used as idempotency information, or they do
+ // not contain a handle and are "affirmative failures" which indicate that
+ // no server-side action occurred.
+ newr.policy = RetryAlways
+ newr.shouldRetry = func(err error) bool {
+ return errors.Is(err, bidiWriteObjectRedirectionError{})
}
- if s.recvErr != io.EOF {
- err = s.recvErr
+ return newr
+ }
+ // If retry settings allow retries normally, fall back to that behavior.
+ newr.shouldRetry = func(err error) bool {
+ if errors.Is(err, bidiWriteObjectRedirectionError{}) {
+ return true
}
- s.stream = nil
- return
+ v := oldr.runShouldRetry(err)
+ return v
}
+ return newr
}
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/http_client.go b/hack/tools/vendor/cloud.google.com/go/storage/http_client.go
index a4b601300d..a0ddadf71f 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/http_client.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/http_client.go
@@ -33,7 +33,6 @@ import (
"cloud.google.com/go/auth"
"cloud.google.com/go/iam/apiv1/iampb"
"cloud.google.com/go/internal/optional"
- "cloud.google.com/go/internal/trace"
"github.com/google/uuid"
"github.com/googleapis/gax-go/v2/callctx"
"google.golang.org/api/googleapi"
@@ -847,8 +846,8 @@ func (c *httpStorageClient) NewMultiRangeDownloader(ctx context.Context, params
}
func (c *httpStorageClient) NewRangeReader(ctx context.Context, params *newRangeReaderParams, opts ...storageOption) (r *Reader, err error) {
- ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.httpStorageClient.NewRangeReader")
- defer func() { trace.EndSpan(ctx, err) }()
+ ctx, _ = startSpan(ctx, "httpStorageClient.NewRangeReader")
+ defer func() { endSpan(ctx, err) }()
s := callSettings(c.settings, opts...)
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/.repo-metadata.json b/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/.repo-metadata.json
new file mode 100644
index 0000000000..3a58e6826f
--- /dev/null
+++ b/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/.repo-metadata.json
@@ -0,0 +1,10 @@
+{
+ "api_shortname": "storage",
+ "client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/storage/latest/internal/apiv2",
+ "client_library_type": "generated",
+ "description": "Cloud Storage API",
+ "distribution_name": "cloud.google.com/go/storage/internal/apiv2",
+ "language": "go",
+ "library_type": "GAPIC_AUTO",
+ "release_level": "stable"
+}
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go b/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go
index 68133628c3..9936aa68d1 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go
@@ -432,7 +432,8 @@ type internalClient interface {
//
// API Overview and Naming SyntaxThe Cloud Storage gRPC API allows applications to read and write data through
// the abstractions of buckets and objects. For a description of these
-// abstractions please see https://cloud.google.com/storage/docs (at https://cloud.google.com/storage/docs).
+// abstractions please see Cloud Storage
+// documentation (at https://cloud.google.com/storage/docs).
//
// Resources are named as follows:
//
@@ -440,18 +441,14 @@ type internalClient interface {
// using strings like projects/123456 or projects/my-string-id.
//
// Buckets are named using string names of the form:
-// projects/{project}/buckets/{bucket}
-// For globally unique buckets, _ may be substituted for the project.
+// projects/{project}/buckets/{bucket}.
+// For globally unique buckets, _ might be substituted for the project.
//
// Objects are uniquely identified by their name along with the name of the
// bucket they belong to, as separate strings in this API. For example:
//
-// ReadObjectRequest {
-// bucket: ‘projects/_/buckets/my-bucket’
-// object: ‘my-object’
-// }
-// Note that object names can contain / characters, which are treated as
-// any other character (no special directory semantics).
+// Note that object names can contain / characters, which are treated as
+// any other character (no special directory semantics).
type Client struct {
// The internal transport-dependent client.
internalClient internalClient
@@ -484,40 +481,121 @@ func (c *Client) Connection() *grpc.ClientConn {
}
// DeleteBucket permanently deletes an empty bucket.
+// The request fails if there are any live or
+// noncurrent objects in the bucket, but the request succeeds if the
+// bucket only contains soft-deleted objects or incomplete uploads, such
+// as ongoing XML API multipart uploads. Does not permanently delete
+// soft-deleted objects.
+//
+// When this API is used to delete a bucket containing an object that has a
+// soft delete policy
+// enabled, the object becomes soft deleted, and the
+// softDeleteTime and hardDeleteTime properties are set on the
+// object.
+//
+// Objects and multipart uploads that were in the bucket at the time of
+// deletion are also retained for the specified retention duration. When
+// a soft-deleted bucket reaches the end of its retention duration, it
+// is permanently deleted. The hardDeleteTime of the bucket always
+// equals
+// or exceeds the expiration time of the last soft-deleted object in the
+// bucket.
+//
+// IAM Permissions:
+//
+// Requires storage.buckets.delete IAM permission on the bucket.
func (c *Client) DeleteBucket(ctx context.Context, req *storagepb.DeleteBucketRequest, opts ...gax.CallOption) error {
return c.internalClient.DeleteBucket(ctx, req, opts...)
}
// GetBucket returns metadata for the specified bucket.
+//
+// IAM Permissions:
+//
+// Requires storage.buckets.get
+// IAM permission on
+// the bucket. Additionally, to return specific bucket metadata, the
+// authenticated user must have the following permissions:
+//
+// To return the IAM policies: storage.buckets.getIamPolicy
+//
+// To return the bucket IP filtering rules: storage.buckets.getIpFilter
func (c *Client) GetBucket(ctx context.Context, req *storagepb.GetBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {
return c.internalClient.GetBucket(ctx, req, opts...)
}
// CreateBucket creates a new bucket.
+//
+// IAM Permissions:
+//
+// Requires storage.buckets.create IAM permission on the bucket.
+// Additionally, to enable specific bucket features, the authenticated user
+// must have the following permissions:
+//
+// To enable object retention using the enableObjectRetention query
+// parameter: storage.buckets.enableObjectRetention
+//
+// To set the bucket IP filtering rules: storage.buckets.setIpFilter
func (c *Client) CreateBucket(ctx context.Context, req *storagepb.CreateBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {
return c.internalClient.CreateBucket(ctx, req, opts...)
}
-// ListBuckets retrieves a list of buckets for a given project.
+// ListBuckets retrieves a list of buckets for a given project, ordered
+// lexicographically by name.
+//
+// IAM Permissions:
+//
+// Requires storage.buckets.list IAM permission on the bucket.
+// Additionally, to enable specific bucket features, the authenticated
+// user must have the following permissions:
+//
+// To list the IAM policies: storage.buckets.getIamPolicy
+//
+// To list the bucket IP filtering rules: storage.buckets.getIpFilter
func (c *Client) ListBuckets(ctx context.Context, req *storagepb.ListBucketsRequest, opts ...gax.CallOption) *BucketIterator {
return c.internalClient.ListBuckets(ctx, req, opts...)
}
-// LockBucketRetentionPolicy locks retention policy on a bucket.
+// LockBucketRetentionPolicy permanently locks the retention
+// policy that is
+// currently applied to the specified bucket.
+//
+// Caution: Locking a bucket is an
+// irreversible action. Once you lock a bucket:
+//
+// You cannot remove the retention policy from the bucket.
+//
+// You cannot decrease the retention period for the policy.
+//
+// Once locked, you must delete the entire bucket in order to remove the
+// bucket’s retention policy. However, before you can delete the bucket, you
+// must delete all the objects in the bucket, which is only
+// possible if all the objects have reached the retention period set by the
+// retention policy.
+//
+// IAM Permissions:
+//
+// Requires storage.buckets.update IAM permission on the bucket.
func (c *Client) LockBucketRetentionPolicy(ctx context.Context, req *storagepb.LockBucketRetentionPolicyRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {
return c.internalClient.LockBucketRetentionPolicy(ctx, req, opts...)
}
-// GetIamPolicy gets the IAM policy for a specified bucket.
+// GetIamPolicy gets the IAM policy for a specified bucket or managed folder.
// The resource field in the request should be
// projects/_/buckets/{bucket} for a bucket, or
// projects/_/buckets/{bucket}/managedFolders/{managedFolder}
// for a managed folder.
+//
+// IAM Permissions:
+//
+// Requires storage.buckets.getIamPolicy on the bucket or
+// storage.managedFolders.getIamPolicy IAM permission on the
+// managed folder.
func (c *Client) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {
return c.internalClient.GetIamPolicy(ctx, req, opts...)
}
-// SetIamPolicy updates an IAM policy for the specified bucket.
+// SetIamPolicy updates an IAM policy for the specified bucket or managed folder.
// The resource field in the request should be
// projects/_/buckets/{bucket} for a bucket, or
// projects/_/buckets/{bucket}/managedFolders/{managedFolder}
@@ -527,9 +605,8 @@ func (c *Client) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyReques
}
// TestIamPermissions tests a set of permissions on the given bucket, object, or managed folder
-// to see which, if any, are held by the caller.
-// The resource field in the request should be
-// projects/_/buckets/{bucket} for a bucket,
+// to see which, if any, are held by the caller. The resource field in the
+// request should be projects/_/buckets/{bucket} for a bucket,
// projects/_/buckets/{bucket}/objects/{object} for an object, or
// projects/_/buckets/{bucket}/managedFolders/{managedFolder}
// for a managed folder.
@@ -537,20 +614,42 @@ func (c *Client) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermi
return c.internalClient.TestIamPermissions(ctx, req, opts...)
}
-// UpdateBucket updates a bucket. Equivalent to JSON API’s storage.buckets.patch method.
+// UpdateBucket updates a bucket. Changes to the bucket are readable immediately after
+// writing, but configuration changes might take time to propagate. This
+// method supports patch semantics.
+//
+// IAM Permissions:
+//
+// Requires storage.buckets.update IAM permission on the bucket.
+// Additionally, to enable specific bucket features, the authenticated user
+// must have the following permissions:
+//
+// To set bucket IP filtering rules: storage.buckets.setIpFilter
+//
+// To update public access prevention policies or access control lists
+// (ACLs): storage.buckets.setIamPolicy
func (c *Client) UpdateBucket(ctx context.Context, req *storagepb.UpdateBucketRequest, opts ...gax.CallOption) (*storagepb.Bucket, error) {
return c.internalClient.UpdateBucket(ctx, req, opts...)
}
// ComposeObject concatenates a list of existing objects into a new object in the same
-// bucket.
+// bucket. The existing source objects are unaffected by this operation.
+//
+// IAM Permissions:
+//
+// Requires the storage.objects.create and storage.objects.get IAM
+// permissions to use this method. If the new composite object
+// overwrites an existing object, the authenticated user must also have
+// the storage.objects.delete permission. If the request body includes
+// the retention property, the authenticated user must also have the
+// storage.objects.setRetention IAM permission.
func (c *Client) ComposeObject(ctx context.Context, req *storagepb.ComposeObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {
return c.internalClient.ComposeObject(ctx, req, opts...)
}
// DeleteObject deletes an object and its metadata. Deletions are permanent if versioning
// is not enabled for the bucket, or if the generation parameter is used, or
-// if soft delete (at https://cloud.google.com/storage/docs/soft-delete) is not
+// if soft delete is not
// enabled for the bucket.
// When this API is used to delete an object from a bucket that has soft
// delete policy enabled, the object becomes soft deleted, and the
@@ -565,14 +664,56 @@ func (c *Client) ComposeObject(ctx context.Context, req *storagepb.ComposeObject
//
// IAM Permissions:
//
-// Requires storage.objects.delete
-// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on
-// the bucket.
+// Requires storage.objects.delete IAM permission on the bucket.
func (c *Client) DeleteObject(ctx context.Context, req *storagepb.DeleteObjectRequest, opts ...gax.CallOption) error {
return c.internalClient.DeleteObject(ctx, req, opts...)
}
-// RestoreObject restores a soft-deleted object.
+// RestoreObject restores a
+// soft-deleted object.
+// When a soft-deleted object is restored, a new copy of that object is
+// created in the same bucket and inherits the same metadata as the
+// soft-deleted object. The inherited metadata is the metadata that existed
+// when the original object became soft deleted, with the following
+// exceptions:
+//
+// The createTime of the new object is set to the time at which the
+// soft-deleted object was restored.
+//
+// The softDeleteTime and hardDeleteTime values are cleared.
+//
+// A new generation is assigned and the metageneration is reset to 1.
+//
+// If the soft-deleted object was in a bucket that had Autoclass enabled,
+// the new object is
+// restored to Standard storage.
+//
+// The restored object inherits the bucket’s default object ACL, unless
+// copySourceAcl is true.
+//
+// If a live object using the same name already exists in the bucket and
+// becomes overwritten, the live object becomes a noncurrent object if Object
+// Versioning is enabled on the bucket. If Object Versioning is not enabled,
+// the live object becomes soft deleted.
+//
+// IAM Permissions:
+//
+// Requires the following IAM permissions to use this method:
+//
+// storage.objects.restore
+//
+// storage.objects.create
+//
+// storage.objects.delete (only required if overwriting an existing
+// object)
+//
+// storage.objects.getIamPolicy (only required if projection is full
+// and the relevant bucket
+// has uniform bucket-level access disabled)
+//
+// storage.objects.setIamPolicy (only required if copySourceAcl is
+// true and the relevant
+// bucket has uniform bucket-level access disabled)
func (c *Client) RestoreObject(ctx context.Context, req *storagepb.RestoreObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {
return c.internalClient.RestoreObject(ctx, req, opts...)
}
@@ -580,9 +721,9 @@ func (c *Client) RestoreObject(ctx context.Context, req *storagepb.RestoreObject
// CancelResumableWrite cancels an in-progress resumable upload.
//
// Any attempts to write to the resumable upload after cancelling the upload
-// will fail.
+// fail.
//
-// The behavior for currently in progress write operations is not guaranteed -
+// The behavior for any in-progress write operations is not guaranteed;
// they could either complete before the cancellation or fail if the
// cancellation completes first.
func (c *Client) CancelResumableWrite(ctx context.Context, req *storagepb.CancelResumableWriteRequest, opts ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error) {
@@ -593,9 +734,8 @@ func (c *Client) CancelResumableWrite(ctx context.Context, req *storagepb.Cancel
//
// IAM Permissions:
//
-// Requires storage.objects.get
-// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on
-// the bucket. To return object ACLs, the authenticated user must also have
+// Requires storage.objects.get IAM permission on the bucket.
+// To return object ACLs, the authenticated user must also have
// the storage.objects.getIamPolicy permission.
func (c *Client) GetObject(ctx context.Context, req *storagepb.GetObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {
return c.internalClient.GetObject(ctx, req, opts...)
@@ -605,38 +745,34 @@ func (c *Client) GetObject(ctx context.Context, req *storagepb.GetObjectRequest,
//
// IAM Permissions:
//
-// Requires storage.objects.get
-// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on
-// the bucket.
+// Requires storage.objects.get IAM permission on the bucket.
func (c *Client) ReadObject(ctx context.Context, req *storagepb.ReadObjectRequest, opts ...gax.CallOption) (storagepb.Storage_ReadObjectClient, error) {
return c.internalClient.ReadObject(ctx, req, opts...)
}
// BidiReadObject reads an object’s data.
//
-// This is a bi-directional API with the added support for reading multiple
-// ranges within one stream both within and across multiple messages.
-// If the server encountered an error for any of the inputs, the stream will
-// be closed with the relevant error code.
-// Because the API allows for multiple outstanding requests, when the stream
-// is closed the error response will contain a BidiReadObjectRangesError proto
-// in the error extension describing the error for each outstanding read_id.
+// This bi-directional API reads data from an object, allowing you to
+// request multiple data ranges within a single stream, even across
+// several messages. If an error occurs with any request, the stream
+// closes with a relevant error code. Since you can have multiple
+// outstanding requests, the error response includes a
+// BidiReadObjectRangesError field detailing the specific error for
+// each pending read_id.
//
// IAM Permissions:
//
-// # Requires storage.objects.get
-//
-// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on
-// the bucket.
-//
-// This API is currently in preview and is not yet available for general
-// use.
+// Requires storage.objects.get IAM permission on the bucket.
func (c *Client) BidiReadObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiReadObjectClient, error) {
return c.internalClient.BidiReadObject(ctx, opts...)
}
// UpdateObject updates an object’s metadata.
-// Equivalent to JSON API’s storage.objects.patch.
+// Equivalent to JSON API’s storage.objects.patch method.
+//
+// IAM Permissions:
+//
+// Requires storage.objects.update IAM permission on the bucket.
func (c *Client) UpdateObject(ctx context.Context, req *storagepb.UpdateObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {
return c.internalClient.UpdateObject(ctx, req, opts...)
}
@@ -661,10 +797,10 @@ func (c *Client) UpdateObject(ctx context.Context, req *storagepb.UpdateObjectRe
// Check the result Status of the stream, to determine if writing can be
// resumed on this stream or must be restarted from scratch (by calling
// StartResumableWrite()). The resumable errors are DEADLINE_EXCEEDED,
-// INTERNAL, and UNAVAILABLE. For each case, the client should use binary
-// exponential backoff before retrying. Additionally, writes can be
-// resumed after RESOURCE_EXHAUSTED errors, but only after taking
-// appropriate measures, which may include reducing aggregate send rate
+// INTERNAL, and UNAVAILABLE. For each case, the client should use
+// binary exponential backoff before retrying. Additionally, writes can
+// be resumed after RESOURCE_EXHAUSTED errors, but only after taking
+// appropriate measures, which might include reducing aggregate send rate
// across clients and/or requesting a quota increase for your project.
//
// If the call to WriteObject returns ABORTED, that indicates
@@ -672,43 +808,43 @@ func (c *Client) UpdateObject(ctx context.Context, req *storagepb.UpdateObjectRe
// multiple racing clients or by a single client where the previous
// request was timed out on the client side but nonetheless reached the
// server. In this case the client should take steps to prevent further
-// concurrent writes (e.g., increase the timeouts, stop using more than
-// one process to perform the upload, etc.), and then should follow the
-// steps below for resuming the upload.
+// concurrent writes. For example, increase the timeouts and stop using
+// more than one process to perform the upload. Follow the steps below for
+// resuming the upload.
//
// For resumable errors, the client should call QueryWriteStatus() and
-// then continue writing from the returned persisted_size. This may be
+// then continue writing from the returned persisted_size. This might be
// less than the amount of data the client previously sent. Note also that
// it is acceptable to send data starting at an offset earlier than the
-// returned persisted_size; in this case, the service will skip data at
+// returned persisted_size; in this case, the service skips data at
// offsets that were already persisted (without checking that it matches
// the previously written data), and write only the data starting from the
-// persisted offset. Even though the data isn’t written, it may still
+// persisted offset. Even though the data isn’t written, it might still
// incur a performance cost over resuming at the correct write offset.
// This behavior can make client-side handling simpler in some cases.
//
// Clients must only send data that is a multiple of 256 KiB per message,
// unless the object is being finished with finish_write set to true.
//
-// The service will not view the object as complete until the client has
+// The service does not view the object as complete until the client has
// sent a WriteObjectRequest with finish_write set to true. Sending any
// requests on a stream after sending a request with finish_write set to
-// true will cause an error. The client should check the response it
-// receives to determine how much data the service was able to commit and
+// true causes an error. The client must check the response it
+// receives to determine how much data the service is able to commit and
// whether the service views the object as complete.
//
-// Attempting to resume an already finalized object will result in an OK
+// Attempting to resume an already finalized object results in an OK
// status, with a WriteObjectResponse containing the finalized object’s
// metadata.
//
-// Alternatively, the BidiWriteObject operation may be used to write an
+// Alternatively, you can use the BidiWriteObject operation to write an
// object with controls over flushing and the ability to fetch the ability to
// determine the current persisted size.
//
// IAM Permissions:
//
// Requires storage.objects.create
-// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on
+// IAM permission on
// the bucket.
func (c *Client) WriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error) {
return c.internalClient.WriteObject(ctx, opts...)
@@ -720,15 +856,15 @@ func (c *Client) WriteObject(ctx context.Context, opts ...gax.CallOption) (stora
// manual flushing of persisted state, and the ability to determine current
// persisted size without closing the stream.
//
-// The client may specify one or both of the state_lookup and flush fields
-// in each BidiWriteObjectRequest. If flush is specified, the data written
-// so far will be persisted to storage. If state_lookup is specified, the
-// service will respond with a BidiWriteObjectResponse that contains the
+// The client might specify one or both of the state_lookup and flush
+// fields in each BidiWriteObjectRequest. If flush is specified, the data
+// written so far is persisted to storage. If state_lookup is specified, the
+// service responds with a BidiWriteObjectResponse that contains the
// persisted size. If both flush and state_lookup are specified, the flush
-// will always occur before a state_lookup, so that both may be set in the
-// same request and the returned state will be the state of the object
-// post-flush. When the stream is closed, a BidiWriteObjectResponse will
-// always be sent to the client, regardless of the value of state_lookup.
+// always occurs before a state_lookup, so that both might be set in the
+// same request and the returned state is the state of the object
+// post-flush. When the stream is closed, a BidiWriteObjectResponse
+// is always sent to the client, regardless of the value of state_lookup.
func (c *Client) BidiWriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiWriteObjectClient, error) {
return c.internalClient.BidiWriteObject(ctx, opts...)
}
@@ -738,8 +874,8 @@ func (c *Client) BidiWriteObject(ctx context.Context, opts ...gax.CallOption) (s
// IAM Permissions:
//
// The authenticated user requires storage.objects.list
-// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions)
-// to use this method. To return object ACLs, the authenticated user must also
+// IAM permission to use this method. To return object ACLs, the
+// authenticated user must also
// have the storage.objects.getIamPolicy permission.
func (c *Client) ListObjects(ctx context.Context, req *storagepb.ListObjectsRequest, opts ...gax.CallOption) *ObjectIterator {
return c.internalClient.ListObjects(ctx, req, opts...)
@@ -753,7 +889,7 @@ func (c *Client) RewriteObject(ctx context.Context, req *storagepb.RewriteObject
// StartResumableWrite starts a resumable write operation. This
// method is part of the Resumable
-// upload (at https://cloud.google.com/storage/docs/resumable-uploads) feature.
+// upload feature.
// This allows you to upload large objects in multiple chunks, which is more
// resilient to network interruptions than a single upload. The validity
// duration of the write operation, and the consequences of it becoming
@@ -761,16 +897,14 @@ func (c *Client) RewriteObject(ctx context.Context, req *storagepb.RewriteObject
//
// IAM Permissions:
//
-// Requires storage.objects.create
-// IAM permission (at https://cloud.google.com/iam/docs/overview#permissions) on
-// the bucket.
+// Requires storage.objects.create IAM permission on the bucket.
func (c *Client) StartResumableWrite(ctx context.Context, req *storagepb.StartResumableWriteRequest, opts ...gax.CallOption) (*storagepb.StartResumableWriteResponse, error) {
return c.internalClient.StartResumableWrite(ctx, req, opts...)
}
// QueryWriteStatus determines the persisted_size of an object that is being written. This
// method is part of the resumable
-// upload (at https://cloud.google.com/storage/docs/resumable-uploads) feature.
+// upload feature.
// The returned value is the size of the object that has been persisted so
// far. The value can be used as the write_offset for the next Write()
// call.
@@ -790,6 +924,21 @@ func (c *Client) QueryWriteStatus(ctx context.Context, req *storagepb.QueryWrite
}
// MoveObject moves the source object to the destination object in the same bucket.
+// This operation moves a source object to a destination object in the
+// same bucket by renaming the object. The move itself is an atomic
+// transaction, ensuring all steps either complete successfully or no
+// changes are made.
+//
+// IAM Permissions:
+//
+// Requires the following IAM permissions to use this method:
+//
+// storage.objects.move
+//
+// storage.objects.create
+//
+// storage.objects.delete (only required if overwriting an existing
+// object)
func (c *Client) MoveObject(ctx context.Context, req *storagepb.MoveObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {
return c.internalClient.MoveObject(ctx, req, opts...)
}
@@ -818,7 +967,8 @@ type gRPCClient struct {
//
// API Overview and Naming SyntaxThe Cloud Storage gRPC API allows applications to read and write data through
// the abstractions of buckets and objects. For a description of these
-// abstractions please see https://cloud.google.com/storage/docs (at https://cloud.google.com/storage/docs).
+// abstractions please see Cloud Storage
+// documentation (at https://cloud.google.com/storage/docs).
//
// Resources are named as follows:
//
@@ -826,18 +976,14 @@ type gRPCClient struct {
// using strings like projects/123456 or projects/my-string-id.
//
// Buckets are named using string names of the form:
-// projects/{project}/buckets/{bucket}
-// For globally unique buckets, _ may be substituted for the project.
+// projects/{project}/buckets/{bucket}.
+// For globally unique buckets, _ might be substituted for the project.
//
// Objects are uniquely identified by their name along with the name of the
// bucket they belong to, as separate strings in this API. For example:
//
-// ReadObjectRequest {
-// bucket: ‘projects/_/buckets/my-bucket’
-// object: ‘my-object’
-// }
-// Note that object names can contain / characters, which are treated as
-// any other character (no special directory semantics).
+// Note that object names can contain / characters, which are treated as
+// any other character (no special directory semantics).
func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {
clientOpts := defaultGRPCClientOptions()
if newClientHook != nil {
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go b/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go
index ee6639e49d..b8cd9add52 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go
@@ -21,22 +21,19 @@
package storagepb
import (
+ reflect "reflect"
+ sync "sync"
+
iampb "cloud.google.com/go/iam/apiv1/iampb"
- context "context"
_ "google.golang.org/genproto/googleapis/api/annotations"
status "google.golang.org/genproto/googleapis/rpc/status"
date "google.golang.org/genproto/googleapis/type/date"
- grpc "google.golang.org/grpc"
- codes "google.golang.org/grpc/codes"
- status1 "google.golang.org/grpc/status"
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"
fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb"
timestamppb "google.golang.org/protobuf/types/known/timestamppb"
- reflect "reflect"
- sync "sync"
)
const (
@@ -52,8 +49,8 @@ type ServiceConstants_Values int32
const (
// Unused. Proto3 requires first enum to be 0.
ServiceConstants_VALUES_UNSPECIFIED ServiceConstants_Values = 0
- // The maximum size chunk that can will be returned in a single
- // ReadRequest.
+ // The maximum size chunk that can be returned in a single
+ // `ReadRequest`.
// 2 MiB.
ServiceConstants_MAX_READ_CHUNK_BYTES ServiceConstants_Values = 2097152
// The maximum size chunk that can be sent in a single WriteObjectRequest.
@@ -186,11 +183,11 @@ type Object_Retention_Mode int32
const (
// No specified mode. Object is not under retention.
Object_Retention_MODE_UNSPECIFIED Object_Retention_Mode = 0
- // Retention period may be decreased or increased.
- // The Retention configuration may be removed.
- // The mode may be changed to locked.
+ // Retention period might be decreased or increased.
+ // The Retention configuration might be removed.
+ // The mode might be changed to locked.
Object_Retention_UNLOCKED Object_Retention_Mode = 1
- // Retention period may be increased.
+ // Retention period might be increased.
// The Retention configuration cannot be removed.
// The mode cannot be changed.
Object_Retention_LOCKED Object_Retention_Mode = 2
@@ -237,7 +234,7 @@ func (Object_Retention_Mode) EnumDescriptor() ([]byte, []int) {
return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{50, 0, 0}
}
-// Request message for DeleteBucket.
+// Request message for [DeleteBucket][google.storage.v2.Storage.DeleteBucket].
type DeleteBucketRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -303,7 +300,7 @@ func (x *DeleteBucketRequest) GetIfMetagenerationNotMatch() int64 {
return 0
}
-// Request message for GetBucket.
+// Request message for [GetBucket][google.storage.v2.Storage.GetBucket].
type GetBucketRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -311,15 +308,15 @@ type GetBucketRequest struct {
// Required. Name of a bucket.
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
- // If set, and if the bucket's current metageneration does not match the
- // specified value, the request will return an error.
+ // If set, only gets the bucket metadata if its metageneration matches this
+ // value.
IfMetagenerationMatch *int64 `protobuf:"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"`
// If set, and if the bucket's current metageneration matches the specified
- // value, the request will return an error.
+ // value, the request returns an error.
IfMetagenerationNotMatch *int64 `protobuf:"varint,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"`
// Mask specifying which fields to read.
- // A "*" field may be used to indicate all fields.
- // If no mask is specified, will default to all fields.
+ // A `*` field might be used to indicate all fields.
+ // If no mask is specified, it defaults to all fields.
ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,5,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
}
@@ -381,35 +378,35 @@ func (x *GetBucketRequest) GetReadMask() *fieldmaskpb.FieldMask {
return nil
}
-// Request message for CreateBucket.
+// Request message for [CreateBucket][google.storage.v2.Storage.CreateBucket].
type CreateBucketRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // Required. The project to which this bucket will belong. This field must
- // either be empty or `projects/_`. The project ID that owns this bucket
- // should be specified in the `bucket.project` field.
+ // Required. The project to which this bucket belongs. This field must either
+ // be empty or `projects/_`. The project ID that owns this bucket should be
+ // specified in the `bucket.project` field.
Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
// Optional. Properties of the new bucket being inserted.
// The name of the bucket is specified in the `bucket_id` field. Populating
- // `bucket.name` field will result in an error.
+ // `bucket.name` field results in an error.
// The project of the bucket must be specified in the `bucket.project` field.
// This field must be in `projects/{projectIdentifier}` format,
// {projectIdentifier} can be the project ID or project number. The `parent`
// field must be either empty or `projects/_`.
Bucket *Bucket `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"`
- // Required. The ID to use for this bucket, which will become the final
- // component of the bucket's resource name. For example, the value `foo` might
- // result in a bucket with the name `projects/123456/buckets/foo`.
+ // Required. The ID to use for this bucket, which becomes the final component
+ // of the bucket's resource name. For example, the value `foo` might result in
+ // a bucket with the name `projects/123456/buckets/foo`.
BucketId string `protobuf:"bytes,3,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"`
// Optional. Apply a predefined set of access controls to this bucket.
- // Valid values are "authenticatedRead", "private", "projectPrivate",
- // "publicRead", or "publicReadWrite".
+ // Valid values are `authenticatedRead`, `private`, `projectPrivate`,
+ // `publicRead`, or `publicReadWrite`.
PredefinedAcl string `protobuf:"bytes,6,opt,name=predefined_acl,json=predefinedAcl,proto3" json:"predefined_acl,omitempty"`
// Optional. Apply a predefined set of default object access controls to this
- // bucket. Valid values are "authenticatedRead", "bucketOwnerFullControl",
- // "bucketOwnerRead", "private", "projectPrivate", or "publicRead".
+ // bucket. Valid values are `authenticatedRead`, `bucketOwnerFullControl`,
+ // `bucketOwnerRead`, `private`, `projectPrivate`, or `publicRead`.
PredefinedDefaultObjectAcl string `protobuf:"bytes,7,opt,name=predefined_default_object_acl,json=predefinedDefaultObjectAcl,proto3" json:"predefined_default_object_acl,omitempty"`
// Optional. If true, enable object retention on the bucket.
EnableObjectRetention bool `protobuf:"varint,9,opt,name=enable_object_retention,json=enableObjectRetention,proto3" json:"enable_object_retention,omitempty"`
@@ -487,7 +484,7 @@ func (x *CreateBucketRequest) GetEnableObjectRetention() bool {
return false
}
-// Request message for ListBuckets.
+// Request message for [ListBuckets][google.storage.v2.Storage.ListBuckets].
type ListBucketsRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -496,9 +493,9 @@ type ListBucketsRequest struct {
// Required. The project whose buckets we are listing.
Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
// Optional. Maximum number of buckets to return in a single response. The
- // service will use this parameter or 1,000 items, whichever is smaller. If
- // "acl" is present in the read_mask, the service will use this parameter of
- // 200 items, whichever is smaller.
+ // service uses this parameter or `1,000` items, whichever is smaller. If
+ // `acl` is present in the `read_mask`, the service uses this parameter of
+ // `200` items, whichever is smaller.
PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
// Optional. A previously-returned page token representing part of the larger
// set of results to view.
@@ -506,10 +503,13 @@ type ListBucketsRequest struct {
// Optional. Filter results to buckets whose names begin with this prefix.
Prefix string `protobuf:"bytes,4,opt,name=prefix,proto3" json:"prefix,omitempty"`
// Mask specifying which fields to read from each result.
- // If no mask is specified, will default to all fields except items.owner,
- // items.acl, and items.default_object_acl.
- // * may be used to mean "all fields".
+ // If no mask is specified, it defaults to all fields except `items.
+ // owner`, `items.acl`, and `items.default_object_acl`.
+ // `*` might be used to mean "all fields".
ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,5,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
+ // Optional. Allows listing of buckets, even if there are buckets that are
+ // unreachable.
+ ReturnPartialSuccess bool `protobuf:"varint,9,opt,name=return_partial_success,json=returnPartialSuccess,proto3" json:"return_partial_success,omitempty"`
}
func (x *ListBucketsRequest) Reset() {
@@ -577,7 +577,14 @@ func (x *ListBucketsRequest) GetReadMask() *fieldmaskpb.FieldMask {
return nil
}
-// The result of a call to Buckets.ListBuckets
+func (x *ListBucketsRequest) GetReturnPartialSuccess() bool {
+ if x != nil {
+ return x.ReturnPartialSuccess
+ }
+ return false
+}
+
+// Response message for [ListBuckets][google.storage.v2.Storage.ListBuckets].
type ListBucketsResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -588,6 +595,19 @@ type ListBucketsResponse struct {
// The continuation token, used to page through large result sets. Provide
// this value in a subsequent request to return the next page of results.
NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
+ // Unreachable resources.
+ // This field can only be present if the caller specified
+ // return_partial_success to be true in the request to receive indications
+ // of temporarily missing resources.
+ // unreachable might be:
+ // unreachable = [
+ //
+ // "projects/_/buckets/bucket1",
+ // "projects/_/buckets/bucket2",
+ // "projects/_/buckets/bucket3",
+ //
+ // ]
+ Unreachable []string `protobuf:"bytes,3,rep,name=unreachable,proto3" json:"unreachable,omitempty"`
}
func (x *ListBucketsResponse) Reset() {
@@ -634,7 +654,15 @@ func (x *ListBucketsResponse) GetNextPageToken() string {
return ""
}
-// Request message for LockBucketRetentionPolicyRequest.
+func (x *ListBucketsResponse) GetUnreachable() []string {
+ if x != nil {
+ return x.Unreachable
+ }
+ return nil
+}
+
+// Request message for
+// [LockBucketRetentionPolicy][google.storage.v2.Storage.LockBucketRetentionPolicy].
type LockBucketRetentionPolicyRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -691,35 +719,35 @@ func (x *LockBucketRetentionPolicyRequest) GetIfMetagenerationMatch() int64 {
return 0
}
-// Request for UpdateBucket method.
+// Request for [UpdateBucket][google.storage.v2.Storage.UpdateBucket] method.
type UpdateBucketRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Required. The bucket to update.
- // The bucket's `name` field will be used to identify the bucket.
+ // The bucket's `name` field is used to identify the bucket.
Bucket *Bucket `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
- // If set, will only modify the bucket if its metageneration matches this
+ // If set, the request modifies the bucket if its metageneration matches this
// value.
IfMetagenerationMatch *int64 `protobuf:"varint,2,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"`
- // If set, will only modify the bucket if its metageneration does not match
- // this value.
+ // If set, the request modifies the bucket if its metageneration doesn't
+ // match this value.
IfMetagenerationNotMatch *int64 `protobuf:"varint,3,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"`
// Optional. Apply a predefined set of access controls to this bucket.
- // Valid values are "authenticatedRead", "private", "projectPrivate",
- // "publicRead", or "publicReadWrite".
+ // Valid values are `authenticatedRead`, `private`, `projectPrivate`,
+ // `publicRead`, or `publicReadWrite`.
PredefinedAcl string `protobuf:"bytes,8,opt,name=predefined_acl,json=predefinedAcl,proto3" json:"predefined_acl,omitempty"`
// Optional. Apply a predefined set of default object access controls to this
- // bucket. Valid values are "authenticatedRead", "bucketOwnerFullControl",
- // "bucketOwnerRead", "private", "projectPrivate", or "publicRead".
+ // bucket. Valid values are `authenticatedRead`, `bucketOwnerFullControl`,
+ // `bucketOwnerRead`, `private`, `projectPrivate`, or `publicRead`.
PredefinedDefaultObjectAcl string `protobuf:"bytes,9,opt,name=predefined_default_object_acl,json=predefinedDefaultObjectAcl,proto3" json:"predefined_default_object_acl,omitempty"`
// Required. List of fields to be updated.
//
// To specify ALL fields, equivalent to the JSON API's "update" function,
// specify a single field with the value `*`. Note: not recommended. If a new
// field is introduced at a later time, an older client updating with the `*`
- // may accidentally reset the new field's value.
+ // might accidentally reset the new field's value.
//
// Not specifying any fields is an error.
UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,6,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
@@ -797,7 +825,7 @@ func (x *UpdateBucketRequest) GetUpdateMask() *fieldmaskpb.FieldMask {
return nil
}
-// Request message for ComposeObject.
+// Request message for [ComposeObject][google.storage.v2.Storage.ComposeObject].
type ComposeObjectRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -805,12 +833,12 @@ type ComposeObjectRequest struct {
// Required. Properties of the resulting object.
Destination *Object `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"`
- // Optional. The list of source objects that will be concatenated into a
- // single object.
+ // Optional. The list of source objects that is concatenated into a single
+ // object.
SourceObjects []*ComposeObjectRequest_SourceObject `protobuf:"bytes,2,rep,name=source_objects,json=sourceObjects,proto3" json:"source_objects,omitempty"`
// Optional. Apply a predefined set of access controls to the destination
- // object. Valid values are "authenticatedRead", "bucketOwnerFullControl",
- // "bucketOwnerRead", "private", "projectPrivate", or "publicRead".
+ // object. Valid values are `authenticatedRead`, `bucketOwnerFullControl`,
+ // `bucketOwnerRead`, `private`, `projectPrivate`, or `publicRead`.
DestinationPredefinedAcl string `protobuf:"bytes,9,opt,name=destination_predefined_acl,json=destinationPredefinedAcl,proto3" json:"destination_predefined_acl,omitempty"`
// Makes the operation conditional on whether the object's current generation
// matches the given value. Setting to 0 makes the operation succeed only if
@@ -821,14 +849,14 @@ type ComposeObjectRequest struct {
IfMetagenerationMatch *int64 `protobuf:"varint,5,opt,name=if_metageneration_match,json=ifMetagenerationMatch,proto3,oneof" json:"if_metageneration_match,omitempty"`
// Optional. Resource name of the Cloud KMS key, of the form
// `projects/my-project/locations/my-location/keyRings/my-kr/cryptoKeys/my-key`,
- // that will be used to encrypt the object. Overrides the object
+ // that is used to encrypt the object. Overrides the object
// metadata's `kms_key_name` value, if any.
KmsKey string `protobuf:"bytes,6,opt,name=kms_key,json=kmsKey,proto3" json:"kms_key,omitempty"`
// Optional. A set of parameters common to Storage API requests concerning an
// object.
CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,7,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"`
- // Optional. The checksums of the complete object. This will be validated
- // against the combined checksums of the component objects.
+ // Optional. The checksums of the complete object. This is validated against
+ // the combined checksums of the component objects.
ObjectChecksums *ObjectChecksums `protobuf:"bytes,10,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"`
}
@@ -918,8 +946,7 @@ func (x *ComposeObjectRequest) GetObjectChecksums() *ObjectChecksums {
return nil
}
-// Message for deleting an object.
-// `bucket` and `object` **must** be set.
+// Request message for deleting an object.
type DeleteObjectRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -1040,7 +1067,8 @@ func (x *DeleteObjectRequest) GetCommonObjectRequestParams() *CommonObjectReques
return nil
}
-// Message for restoring an object.
+// Request message for
+// [RestoreObject][google.storage.v2.Storage.RestoreObject].
// `bucket`, `object`, and `generation` **must** be set.
type RestoreObjectRequest struct {
state protoimpl.MessageState
@@ -1074,7 +1102,7 @@ type RestoreObjectRequest struct {
// Makes the operation conditional on whether the object's current
// metageneration does not match the given value.
IfMetagenerationNotMatch *int64 `protobuf:"varint,7,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"`
- // If false or unset, the bucket's default object ACL will be used.
+ // If false or unset, the bucket's default object ACL is used.
// If true, copy the source object's access controls.
// Return an error if bucket has UBLA enabled.
CopySourceAcl *bool `protobuf:"varint,9,opt,name=copy_source_acl,json=copySourceAcl,proto3,oneof" json:"copy_source_acl,omitempty"`
@@ -1183,8 +1211,8 @@ func (x *RestoreObjectRequest) GetCommonObjectRequestParams() *CommonObjectReque
return nil
}
-// Message for canceling an in-progress resumable upload.
-// `upload_id` **must** be set.
+// Request message for
+// [CancelResumableWrite][google.storage.v2.Storage.CancelResumableWrite].
type CancelResumableWriteRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -1232,7 +1260,7 @@ func (x *CancelResumableWriteRequest) GetUploadId() string {
return ""
}
-// Empty response message for canceling an in-progress resumable upload, will be
+// Empty response message for canceling an in-progress resumable upload, is
// extended as needed.
type CancelResumableWriteResponse struct {
state protoimpl.MessageState
@@ -1270,7 +1298,7 @@ func (*CancelResumableWriteResponse) Descriptor() ([]byte, []int) {
return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{11}
}
-// Request message for ReadObject.
+// Request message for [ReadObject][google.storage.v2.Storage.ReadObject].
type ReadObjectRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -1286,16 +1314,16 @@ type ReadObjectRequest struct {
// Optional. The offset for the first byte to return in the read, relative to
// the start of the object.
//
- // A negative `read_offset` value will be interpreted as the number of bytes
+ // A negative `read_offset` value is interpreted as the number of bytes
// back from the end of the object to be returned. For example, if an object's
- // length is 15 bytes, a ReadObjectRequest with `read_offset` = -5 and
- // `read_limit` = 3 would return bytes 10 through 12 of the object. Requesting
- // a negative offset with magnitude larger than the size of the object will
- // return the entire object.
+ // length is `15` bytes, a `ReadObjectRequest` with `read_offset` = `-5` and
+ // `read_limit` = `3` would return bytes `10` through `12` of the object.
+ // Requesting a negative offset with magnitude larger than the size of the
+ // object returns the entire object.
ReadOffset int64 `protobuf:"varint,4,opt,name=read_offset,json=readOffset,proto3" json:"read_offset,omitempty"`
// Optional. The maximum number of `data` bytes the server is allowed to
// return in the sum of all `Object` messages. A `read_limit` of zero
- // indicates that there is no limit, and a negative `read_limit` will cause an
+ // indicates that there is no limit, and a negative `read_limit` causes an
// error.
//
// If the stream returns fewer bytes than allowed by the `read_limit` and no
@@ -1321,10 +1349,10 @@ type ReadObjectRequest struct {
// object.
CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,10,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"`
// Mask specifying which fields to read.
- // The checksummed_data field and its children will always be present.
- // If no mask is specified, will default to all fields except metadata.owner
- // and metadata.acl.
- // * may be used to mean "all fields".
+ // The `checksummed_data` field and its children are always present.
+ // If no mask is specified, it defaults to all fields except `metadata.
+ // owner` and `metadata.acl`.
+ // `*` might be used to mean "all fields".
ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,12,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
}
@@ -1435,7 +1463,7 @@ func (x *ReadObjectRequest) GetReadMask() *fieldmaskpb.FieldMask {
return nil
}
-// Request message for GetObject.
+// Request message for [GetObject][google.storage.v2.Storage.GetObject].
type GetObjectRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -1469,15 +1497,15 @@ type GetObjectRequest struct {
// object.
CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"`
// Mask specifying which fields to read.
- // If no mask is specified, will default to all fields except metadata.acl and
- // metadata.owner.
- // * may be used to mean "all fields".
+ // If no mask is specified, it defaults to all fields except `metadata.
+ // acl` and `metadata.owner`.
+ // `*` might be used to mean "all fields".
ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,10,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
// Optional. Restore token used to differentiate soft-deleted objects with the
// same name and generation. Only applicable for hierarchical namespace
- // buckets and if soft_deleted is set to true. This parameter is optional, and
- // is only required in the rare case when there are multiple soft-deleted
- // objects with the same name and generation.
+ // buckets and if `soft_deleted` is set to `true`. This parameter is optional,
+ // and is only required in the rare case when there are multiple soft-deleted
+ // objects with the same `name` and `generation`.
RestoreToken string `protobuf:"bytes,12,opt,name=restore_token,json=restoreToken,proto3" json:"restore_token,omitempty"`
}
@@ -1588,13 +1616,13 @@ func (x *GetObjectRequest) GetRestoreToken() string {
return ""
}
-// Response message for ReadObject.
+// Response message for [ReadObject][google.storage.v2.Storage.ReadObject].
type ReadObjectResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // A portion of the data for the object. The service **may** leave `data`
+ // A portion of the data for the object. The service might leave `data`
// empty for any given `ReadResponse`. This enables the service to inform the
// client that the request is still live while it is running an operation to
// generate more data.
@@ -1603,9 +1631,9 @@ type ReadObjectResponse struct {
// the client should compute one of these checksums over the downloaded object
// and compare it against the value provided here.
ObjectChecksums *ObjectChecksums `protobuf:"bytes,2,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"`
- // If read_offset and or read_limit was specified on the
- // ReadObjectRequest, ContentRange will be populated on the first
- // ReadObjectResponse message of the read stream.
+ // If `read_offset` and or `read_limit` is specified on the
+ // `ReadObjectRequest`, `ContentRange` is populated on the first
+ // `ReadObjectResponse` message of the read stream.
ContentRange *ContentRange `protobuf:"bytes,3,opt,name=content_range,json=contentRange,proto3" json:"content_range,omitempty"`
// Metadata of the object whose media is being returned.
// Only populated in the first response in the stream.
@@ -1702,13 +1730,12 @@ type BidiReadObjectSpec struct {
// object.
CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"`
// Mask specifying which fields to read.
- // The checksummed_data field and its children will always be present.
- // If no mask is specified, will default to all fields except metadata.owner
- // and metadata.acl.
- // * may be used to mean "all fields".
+ // The `checksummed_data` field and its children are always present.
+ // If no mask is specified, it defaults to all fields except `metadata.
+ // owner` and `metadata.acl`.
+ // `*` might be used to mean "all fields".
// As per https://google.aip.dev/161, this field is deprecated.
- // As an alternative, grpc metadata can be used:
- // https://cloud.google.com/apis/docs/system-parameters#definitions
+ // As an alternative, `grpc metadata` can be used:
//
// Deprecated: Marked as deprecated in google/storage/v2/storage.proto.
ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,12,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
@@ -1829,22 +1856,23 @@ func (x *BidiReadObjectSpec) GetRoutingToken() string {
return ""
}
-// Request message for BidiReadObject.
+// Request message for
+// [BidiReadObject][google.storage.v2.Storage.BidiReadObject].
type BidiReadObjectRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Optional. The first message of each stream should set this field. If this
- // is not the first message, an error will be returned. Describes the object
- // to read.
+ // is not the first message, an error is returned. Describes the object to
+ // read.
ReadObjectSpec *BidiReadObjectSpec `protobuf:"bytes,1,opt,name=read_object_spec,json=readObjectSpec,proto3" json:"read_object_spec,omitempty"`
// Optional. Provides a list of 0 or more (up to 100) ranges to read. If a
// single range is large enough to require multiple responses, they are
- // guaranteed to be delivered in increasing offset order. There are no
- // ordering guarantees across ranges. When no ranges are provided, the
- // response message will not include ObjectRangeData. For full object
- // downloads, the offset and size can be set to 0.
+ // delivered in increasing offset order. There are no ordering guarantees
+ // across ranges. When no ranges are provided, the response message
+ // doesn't include `ObjectRangeData`. For full object downloads, the
+ // offset and size can be set to `0`.
ReadRanges []*ReadRange `protobuf:"bytes,8,rep,name=read_ranges,json=readRanges,proto3" json:"read_ranges,omitempty"`
}
@@ -1892,25 +1920,26 @@ func (x *BidiReadObjectRequest) GetReadRanges() []*ReadRange {
return nil
}
-// Response message for BidiReadObject.
+// Response message for
+// [BidiReadObject][google.storage.v2.Storage.BidiReadObject].
type BidiReadObjectResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // A portion of the object's data. The service **may** leave data
- // empty for any given ReadResponse. This enables the service to inform the
+ // A portion of the object's data. The service might leave data
+ // empty for any given `ReadResponse`. This enables the service to inform the
// client that the request is still live while it is running an operation to
// generate more data.
- // The service **may** pipeline multiple responses belonging to different read
- // requests. Each ObjectRangeData entry will have a read_id
- // set to the same value as the corresponding source read request.
+ // The service might pipeline multiple responses belonging to different read
+ // requests. Each `ObjectRangeData` entry has a `read_id` that is set
+ // to the same value as the corresponding source read request.
ObjectDataRanges []*ObjectRangeData `protobuf:"bytes,6,rep,name=object_data_ranges,json=objectDataRanges,proto3" json:"object_data_ranges,omitempty"`
// Metadata of the object whose media is being returned.
// Only populated in the first response in the stream and not populated when
// the stream is opened with a read handle.
Metadata *Object `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"`
- // This field will be periodically refreshed, however it may not be set in
+ // This field is periodically refreshed, however it might not be set in
// every response. It allows the client to more efficiently open subsequent
// bidirectional streams to the same object.
ReadHandle *BidiReadHandle `protobuf:"bytes,7,opt,name=read_handle,json=readHandle,proto3" json:"read_handle,omitempty"`
@@ -1967,15 +1996,15 @@ func (x *BidiReadObjectResponse) GetReadHandle() *BidiReadHandle {
return nil
}
-// Error proto containing details for a redirected read. This error may be
+// Error proto containing details for a redirected read. This error might be
// attached as details for an ABORTED response to BidiReadObject.
type BidiReadObjectRedirectedError struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // The read handle for the redirected read. If set, the client may use this in
- // the BidiReadObjectSpec when retrying the read stream.
+ // The read handle for the redirected read. If set, the client might use this
+ // in the BidiReadObjectSpec when retrying the read stream.
ReadHandle *BidiReadHandle `protobuf:"bytes,1,opt,name=read_handle,json=readHandle,proto3" json:"read_handle,omitempty"`
// The routing token the client must use when retrying the read stream.
// This value must be provided in the header `x-goog-request-params`, with key
@@ -2027,7 +2056,7 @@ func (x *BidiReadObjectRedirectedError) GetRoutingToken() string {
return ""
}
-// Error proto containing details for a redirected write. This error may be
+// Error proto containing details for a redirected write. This error might be
// attached as details for an ABORTED response to BidiWriteObject.
type BidiWriteObjectRedirectedError struct {
state protoimpl.MessageState
@@ -2040,11 +2069,11 @@ type BidiWriteObjectRedirectedError struct {
RoutingToken *string `protobuf:"bytes,1,opt,name=routing_token,json=routingToken,proto3,oneof" json:"routing_token,omitempty"`
// Opaque value describing a previous write. If set, the client must use this
// in an AppendObjectSpec first_message when retrying the write stream. If not
- // set, clients may retry the original request.
+ // set, clients might retry the original request.
WriteHandle *BidiWriteHandle `protobuf:"bytes,2,opt,name=write_handle,json=writeHandle,proto3,oneof" json:"write_handle,omitempty"`
- // The generation of the object that triggered the redirect. This will be set
- // iff write_handle is set. If set, the client must use this in an
- // AppendObjectSpec first_message when retrying the write stream.
+ // The generation of the object that triggered the redirect. This is set
+ // iff `write_handle` is set. If set, the client must use this in an
+ // `AppendObjectSpec` first_message when retrying the write stream.
Generation *int64 `protobuf:"varint,3,opt,name=generation,proto3,oneof" json:"generation,omitempty"`
}
@@ -2203,7 +2232,7 @@ func (x *ReadRangeError) GetStatus() *status.Status {
return nil
}
-// Describes a range of bytes to read in a BidiReadObjectRanges request.
+// Describes a range of bytes to read in a `BidiReadObjectRanges` request.
type ReadRange struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -2212,26 +2241,26 @@ type ReadRange struct {
// Required. The offset for the first byte to return in the read, relative to
// the start of the object.
//
- // A negative read_offset value will be interpreted as the number of bytes
+ // A negative read_offset value is interpreted as the number of bytes
// back from the end of the object to be returned. For example, if an object's
- // length is 15 bytes, a ReadObjectRequest with read_offset = -5 and
- // read_length = 3 would return bytes 10 through 12 of the object. Requesting
- // a negative offset with magnitude larger than the size of the object will
- // return the entire object. A read_offset larger than the size of the object
- // will result in an OutOfRange error.
+ // length is 15 bytes, a `ReadObjectRequest` with `read_offset` = -5 and
+ // `read_length` = 3 would return bytes 10 through 12 of the object.
+ // Requesting a negative offset with magnitude larger than the size of the
+ // object returns the entire object. A `read_offset` larger than the size
+ // of the object results in an `OutOfRange` error.
ReadOffset int64 `protobuf:"varint,1,opt,name=read_offset,json=readOffset,proto3" json:"read_offset,omitempty"`
// Optional. The maximum number of data bytes the server is allowed to return
- // across all response messages with the same read_id. A read_length of zero
- // indicates to read until the resource end, and a negative read_length will
- // cause an error. If the stream returns fewer bytes than allowed by the
- // read_length and no error occurred, the stream includes all data from the
- // read_offset to the resource end.
+ // across all response messages with the same `read_id`. A `read_length` of
+ // zero indicates to read until the resource end, and a negative `read_length`
+ // causes an error. If the stream returns fewer bytes than allowed by the
+ // `read_length` and no error occurred, the stream includes all data from the
+ // `read_offset` to the resource end.
ReadLength int64 `protobuf:"varint,2,opt,name=read_length,json=readLength,proto3" json:"read_length,omitempty"`
// Required. Read identifier provided by the client. When the client issues
- // more than one outstanding ReadRange on the same stream, responses can be
+ // more than one outstanding `ReadRange` on the same stream, responses can be
// mapped back to their corresponding requests using this value. Clients must
// ensure that all outstanding requests have different read_id values. The
- // server may close the stream with an error if this condition is not met.
+ // server might close the stream with an error if this condition is not met.
ReadId int64 `protobuf:"varint,3,opt,name=read_id,json=readId,proto3" json:"read_id,omitempty"`
}
@@ -2294,11 +2323,11 @@ type ObjectRangeData struct {
// A portion of the data for the object.
ChecksummedData *ChecksummedData `protobuf:"bytes,1,opt,name=checksummed_data,json=checksummedData,proto3" json:"checksummed_data,omitempty"`
- // The ReadRange describes the content being returned with read_id set to the
- // corresponding ReadObjectRequest in the stream. Multiple ObjectRangeData
- // messages may have the same read_id but increasing offsets.
- // ReadObjectResponse messages with the same read_id are guaranteed to be
- // delivered in increasing offset order.
+ // The `ReadRange` describes the content being returned with `read_id` set to
+ // the corresponding `ReadObjectRequest` in the stream. Multiple
+ // `ObjectRangeData` messages might have the same read_id but increasing
+ // offsets. `ReadObjectResponse` messages with the same `read_id` are
+ // guaranteed to be delivered in increasing offset order.
ReadRange *ReadRange `protobuf:"bytes,2,opt,name=read_range,json=readRange,proto3" json:"read_range,omitempty"`
// If set, indicates there are no more bytes to read for the given ReadRange.
RangeEnd bool `protobuf:"varint,3,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"`
@@ -2355,8 +2384,8 @@ func (x *ObjectRangeData) GetRangeEnd() bool {
return false
}
-// BidiReadHandle contains a handle from a previous BiDiReadObject
-// invocation. The client can use this instead of BidiReadObjectSpec as an
+// `BidiReadHandle` contains a handle from a previous `BiDiReadObject`
+// invocation. The client can use this instead of `BidiReadObjectSpec` as an
// optimized way of opening subsequent bidirectional streams to the same object.
type BidiReadHandle struct {
state protoimpl.MessageState
@@ -2404,9 +2433,9 @@ func (x *BidiReadHandle) GetHandle() []byte {
return nil
}
-// BidiWriteHandle contains a handle from a previous BidiWriteObject
-// invocation. The client can use this as an optimized way of opening subsequent
-// bidirectional streams to the same object.
+// `BidiWriteHandle` contains a handle from a previous `BidiWriteObject`
+// invocation. The client can use this instead of `BidiReadObjectSpec` as an
+// optimized way of opening subsequent bidirectional streams to the same object.
type BidiWriteHandle struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -2462,16 +2491,16 @@ type WriteObjectSpec struct {
// Required. Destination object, including its name and its metadata.
Resource *Object `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"`
// Optional. Apply a predefined set of access controls to this object.
- // Valid values are "authenticatedRead", "bucketOwnerFullControl",
- // "bucketOwnerRead", "private", "projectPrivate", or "publicRead".
+ // Valid values are `authenticatedRead`, `bucketOwnerFullControl`,
+ // `bucketOwnerRead`, `private`, `projectPrivate`, or `publicRead`.
PredefinedAcl string `protobuf:"bytes,7,opt,name=predefined_acl,json=predefinedAcl,proto3" json:"predefined_acl,omitempty"`
// Makes the operation conditional on whether the object's current
- // generation matches the given value. Setting to 0 makes the operation
+ // generation matches the given value. Setting to `0` makes the operation
// succeed only if there are no live versions of the object.
IfGenerationMatch *int64 `protobuf:"varint,3,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"`
// Makes the operation conditional on whether the object's live
// generation does not match the given value. If no live object exists, the
- // precondition fails. Setting to 0 makes the operation succeed only if
+ // precondition fails. Setting to `0` makes the operation succeed only if
// there is a live version of the object.
IfGenerationNotMatch *int64 `protobuf:"varint,4,opt,name=if_generation_not_match,json=ifGenerationNotMatch,proto3,oneof" json:"if_generation_not_match,omitempty"`
// Makes the operation conditional on whether the object's current
@@ -2482,14 +2511,14 @@ type WriteObjectSpec struct {
IfMetagenerationNotMatch *int64 `protobuf:"varint,6,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"`
// The expected final object size being uploaded.
// If this value is set, closing the stream after writing fewer or more than
- // `object_size` bytes will result in an OUT_OF_RANGE error.
+ // `object_size` bytes results in an `OUT_OF_RANGE` error.
//
// This situation is considered a client error, and if such an error occurs
// you must start the upload over from scratch, this time sending the correct
// number of bytes.
ObjectSize *int64 `protobuf:"varint,8,opt,name=object_size,json=objectSize,proto3,oneof" json:"object_size,omitempty"`
- // If true, the object will be created in appendable mode.
- // This field may only be set when using BidiWriteObject.
+ // If `true`, the object is created in appendable mode.
+ // This field might only be set when using `BidiWriteObject`.
Appendable *bool `protobuf:"varint,9,opt,name=appendable,proto3,oneof" json:"appendable,omitempty"`
}
@@ -2579,7 +2608,7 @@ func (x *WriteObjectSpec) GetAppendable() bool {
return false
}
-// Request message for WriteObject.
+// Request message for [WriteObject][google.storage.v2.Storage.WriteObject].
type WriteObjectRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -2604,7 +2633,7 @@ type WriteObjectRequest struct {
// first `write_offset` and the sizes of all `data` chunks sent previously on
// this stream.
//
- // An incorrect value will cause an error.
+ // An incorrect value causes an error.
WriteOffset int64 `protobuf:"varint,3,opt,name=write_offset,json=writeOffset,proto3" json:"write_offset,omitempty"`
// A portion of the data for the object.
//
@@ -2613,19 +2642,19 @@ type WriteObjectRequest struct {
// *WriteObjectRequest_ChecksummedData
Data isWriteObjectRequest_Data `protobuf_oneof:"data"`
// Optional. Checksums for the complete object. If the checksums computed by
- // the service don't match the specified checksums the call will fail. May
- // only be provided in the first or last request (either with first_message,
- // or finish_write set).
+ // the service don't match the specified checksums the call fails. This field
+ // might only be provided in the first or last request (either with
+ // `first_message`, or `finish_write` set).
ObjectChecksums *ObjectChecksums `protobuf:"bytes,6,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"`
// Optional. If `true`, this indicates that the write is complete. Sending any
// `WriteObjectRequest`s subsequent to one in which `finish_write` is `true`
- // will cause an error.
- // For a non-resumable write (where the upload_id was not set in the first
+ // causes an error.
+ // For a non-resumable write (where the `upload_id` was not set in the first
// message), it is an error not to set this field in the final message of the
// stream.
FinishWrite bool `protobuf:"varint,7,opt,name=finish_write,json=finishWrite,proto3" json:"finish_write,omitempty"`
- // Optional. A set of parameters common to Storage API requests concerning an
- // object.
+ // Optional. A set of parameters common to Cloud Storage API requests
+ // concerning an object.
CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"`
}
@@ -2748,19 +2777,20 @@ type isWriteObjectRequest_Data interface {
type WriteObjectRequest_ChecksummedData struct {
// The data to insert. If a crc32c checksum is provided that doesn't match
- // the checksum computed by the service, the request will fail.
+ // the checksum computed by the service, the request fails.
ChecksummedData *ChecksummedData `protobuf:"bytes,4,opt,name=checksummed_data,json=checksummedData,proto3,oneof"`
}
func (*WriteObjectRequest_ChecksummedData) isWriteObjectRequest_Data() {}
-// Response message for WriteObject.
+// Response message for
+// [WriteObject][google.storage.v2.Storage.WriteObject].
type WriteObjectResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // The response will set one of the following.
+ // The response sets one of the following.
//
// Types that are assignable to WriteStatus:
//
@@ -2865,7 +2895,7 @@ type AppendObjectSpec struct {
// is empty.
IfMetagenerationNotMatch *int64 `protobuf:"varint,5,opt,name=if_metageneration_not_match,json=ifMetagenerationNotMatch,proto3,oneof" json:"if_metageneration_not_match,omitempty"`
// An optional routing token that influences request routing for the stream.
- // Must be provided if a BidiWriteObjectRedirectedError is returned.
+ // Must be provided if a `BidiWriteObjectRedirectedError` is returned.
RoutingToken *string `protobuf:"bytes,6,opt,name=routing_token,json=routingToken,proto3,oneof" json:"routing_token,omitempty"`
// An optional write handle returned from a previous BidiWriteObjectResponse
// message or a BidiWriteObjectRedirectedError error.
@@ -2954,7 +2984,8 @@ func (x *AppendObjectSpec) GetWriteHandle() *BidiWriteHandle {
return nil
}
-// Request message for BidiWriteObject.
+// Request message for
+// [BidiWriteObject][google.storage.v2.Storage.BidiWriteObject].
type BidiWriteObjectRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -2972,15 +3003,15 @@ type BidiWriteObjectRequest struct {
// should be written.
//
// In the first `WriteObjectRequest` of a `WriteObject()` action, it
- // indicates the initial offset for the `Write()` call. The value **must** be
+ // indicates the initial offset for the `Write()` call. The value must be
// equal to the `persisted_size` that a call to `QueryWriteStatus()` would
// return (0 if this is the first write to the object).
//
- // On subsequent calls, this value **must** be no larger than the sum of the
+ // On subsequent calls, this value must be no larger than the sum of the
// first `write_offset` and the sizes of all `data` chunks sent previously on
// this stream.
//
- // An invalid value will cause an error.
+ // An invalid value causes an error.
WriteOffset int64 `protobuf:"varint,3,opt,name=write_offset,json=writeOffset,proto3" json:"write_offset,omitempty"`
// A portion of the data for the object.
//
@@ -2989,30 +3020,30 @@ type BidiWriteObjectRequest struct {
// *BidiWriteObjectRequest_ChecksummedData
Data isBidiWriteObjectRequest_Data `protobuf_oneof:"data"`
// Optional. Checksums for the complete object. If the checksums computed by
- // the service don't match the specified checksums the call will fail. May
- // only be provided in the first request or the last request (with
- // finish_write set).
+ // the service don't match the specified checksums the call fails. Might only
+ // be provided in the first request or the last request (with finish_write
+ // set).
ObjectChecksums *ObjectChecksums `protobuf:"bytes,6,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"`
- // Optional. For each BidiWriteObjectRequest where state_lookup is `true` or
- // the client closes the stream, the service will send a
- // BidiWriteObjectResponse containing the current persisted size. The
+ // Optional. For each `BidiWriteObjectRequest` where `state_lookup` is `true`
+ // or the client closes the stream, the service sends a
+ // `BidiWriteObjectResponse` containing the current persisted size. The
// persisted size sent in responses covers all the bytes the server has
// persisted thus far and can be used to decide what data is safe for the
// client to drop. Note that the object's current size reported by the
- // BidiWriteObjectResponse may lag behind the number of bytes written by the
- // client. This field is ignored if `finish_write` is set to true.
+ // `BidiWriteObjectResponse` might lag behind the number of bytes written by
+ // the client. This field is ignored if `finish_write` is set to true.
StateLookup bool `protobuf:"varint,7,opt,name=state_lookup,json=stateLookup,proto3" json:"state_lookup,omitempty"`
// Optional. Persists data written on the stream, up to and including the
// current message, to permanent storage. This option should be used sparingly
- // as it may reduce performance. Ongoing writes will periodically be persisted
+ // as it might reduce performance. Ongoing writes are periodically persisted
// on the server even when `flush` is not set. This field is ignored if
// `finish_write` is set to true since there's no need to checkpoint or flush
// if this message completes the write.
Flush bool `protobuf:"varint,8,opt,name=flush,proto3" json:"flush,omitempty"`
// Optional. If `true`, this indicates that the write is complete. Sending any
// `WriteObjectRequest`s subsequent to one in which `finish_write` is `true`
- // will cause an error.
- // For a non-resumable write (where the upload_id was not set in the first
+ // causes an error.
+ // For a non-resumable write (where the `upload_id` was not set in the first
// message), it is an error not to set this field in the final message of the
// stream.
FinishWrite bool `protobuf:"varint,9,opt,name=finish_write,json=finishWrite,proto3" json:"finish_write,omitempty"`
@@ -3168,7 +3199,7 @@ type isBidiWriteObjectRequest_Data interface {
type BidiWriteObjectRequest_ChecksummedData struct {
// The data to insert. If a crc32c checksum is provided that doesn't match
- // the checksum computed by the service, the request will fail.
+ // the checksum computed by the service, the request fails.
ChecksummedData *ChecksummedData `protobuf:"bytes,4,opt,name=checksummed_data,json=checksummedData,proto3,oneof"`
}
@@ -3180,14 +3211,14 @@ type BidiWriteObjectResponse struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // The response will set one of the following.
+ // The response sets one of the following.
//
// Types that are assignable to WriteStatus:
//
// *BidiWriteObjectResponse_PersistedSize
// *BidiWriteObjectResponse_Resource
WriteStatus isBidiWriteObjectResponse_WriteStatus `protobuf_oneof:"write_status"`
- // An optional write handle that will periodically be present in response
+ // An optional write handle that is returned periodically in response
// messages. Clients should save it for later use in establishing a new stream
// if a connection is interrupted.
WriteHandle *BidiWriteHandle `protobuf:"bytes,3,opt,name=write_handle,json=writeHandle,proto3,oneof" json:"write_handle,omitempty"`
@@ -3271,7 +3302,7 @@ func (*BidiWriteObjectResponse_PersistedSize) isBidiWriteObjectResponse_WriteSta
func (*BidiWriteObjectResponse_Resource) isBidiWriteObjectResponse_WriteStatus() {}
-// Request message for ListObjects.
+// Request message for [ListObjects][google.storage.v2.Storage.ListObjects].
type ListObjectsRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -3281,58 +3312,57 @@ type ListObjectsRequest struct {
Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
// Optional. Maximum number of `items` plus `prefixes` to return
// in a single page of responses. As duplicate `prefixes` are
- // omitted, fewer total results may be returned than requested. The service
- // will use this parameter or 1,000 items, whichever is smaller.
+ // omitted, fewer total results might be returned than requested. The service
+ // uses this parameter or 1,000 items, whichever is smaller.
PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
// Optional. A previously-returned page token representing part of the larger
// set of results to view.
PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
- // Optional. If set, returns results in a directory-like mode. `items` will
- // contain only objects whose names, aside from the `prefix`, do not contain
+ // Optional. If set, returns results in a directory-like mode. `items`
+ // contains only objects whose names, aside from the `prefix`, do not contain
// `delimiter`. Objects whose names, aside from the `prefix`, contain
- // `delimiter` will have their name, truncated after the `delimiter`, returned
- // in `prefixes`. Duplicate `prefixes` are omitted.
+ // `delimiter` has their name, truncated after the `delimiter`, returned in
+ // `prefixes`. Duplicate `prefixes` are omitted.
Delimiter string `protobuf:"bytes,4,opt,name=delimiter,proto3" json:"delimiter,omitempty"`
// Optional. If true, objects that end in exactly one instance of `delimiter`
- // will have their metadata included in `items` in addition to
+ // has their metadata included in `items` in addition to
// `prefixes`.
IncludeTrailingDelimiter bool `protobuf:"varint,5,opt,name=include_trailing_delimiter,json=includeTrailingDelimiter,proto3" json:"include_trailing_delimiter,omitempty"`
// Optional. Filter results to objects whose names begin with this prefix.
Prefix string `protobuf:"bytes,6,opt,name=prefix,proto3" json:"prefix,omitempty"`
// Optional. If `true`, lists all versions of an object as distinct results.
- // For more information, see
- // [Object
- // Versioning](https://cloud.google.com/storage/docs/object-versioning).
Versions bool `protobuf:"varint,7,opt,name=versions,proto3" json:"versions,omitempty"`
// Mask specifying which fields to read from each result.
- // If no mask is specified, will default to all fields except items.acl and
- // items.owner.
- // * may be used to mean "all fields".
+ // If no mask is specified, defaults to all fields except `items.acl` and
+ // `items.owner`.
+ // `*` might be used to mean all fields.
ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,8,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
// Optional. Filter results to objects whose names are lexicographically equal
- // to or after lexicographic_start. If lexicographic_end is also set, the
- // objects listed have names between lexicographic_start (inclusive) and
- // lexicographic_end (exclusive).
+ // to or after `lexicographic_start`. If `lexicographic_end` is also set, the
+ // objects listed have names between `lexicographic_start` (inclusive) and
+ // `lexicographic_end` (exclusive).
LexicographicStart string `protobuf:"bytes,10,opt,name=lexicographic_start,json=lexicographicStart,proto3" json:"lexicographic_start,omitempty"`
// Optional. Filter results to objects whose names are lexicographically
- // before lexicographic_end. If lexicographic_start is also set, the objects
- // listed have names between lexicographic_start (inclusive) and
- // lexicographic_end (exclusive).
+ // before `lexicographic_end`. If `lexicographic_start` is also set, the
+ // objects listed have names between `lexicographic_start` (inclusive) and
+ // `lexicographic_end` (exclusive).
LexicographicEnd string `protobuf:"bytes,11,opt,name=lexicographic_end,json=lexicographicEnd,proto3" json:"lexicographic_end,omitempty"`
// Optional. If true, only list all soft-deleted versions of the object.
// Soft delete policy is required to set this option.
SoftDeleted bool `protobuf:"varint,12,opt,name=soft_deleted,json=softDeleted,proto3" json:"soft_deleted,omitempty"`
- // Optional. If true, will also include folders and managed folders (besides
- // objects) in the returned `prefixes`. Requires `delimiter` to be set to '/'.
+ // Optional. If true, includes folders and managed folders (besides objects)
+ // in the returned `prefixes`. Requires `delimiter` to be set to '/'.
IncludeFoldersAsPrefixes bool `protobuf:"varint,13,opt,name=include_folders_as_prefixes,json=includeFoldersAsPrefixes,proto3" json:"include_folders_as_prefixes,omitempty"`
// Optional. Filter results to objects and prefixes that match this glob
- // pattern. See [List Objects Using
- // Glob](https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-objects-and-prefixes-using-glob)
+ // pattern. See [List objects using
+ // glob](https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-objects-and-prefixes-using-glob)
// for the full syntax.
MatchGlob string `protobuf:"bytes,14,opt,name=match_glob,json=matchGlob,proto3" json:"match_glob,omitempty"`
- // Optional. Filter the returned objects. Currently only supported for the
- // `contexts` field. If `delimiter` is set, the returned `prefixes` are exempt
- // from this filter.
+ // Optional. An expression used to filter the returned objects by the
+ // `context` field. For the full syntax, see [Filter objects by contexts
+ // syntax](https://cloud.google.com/storage/docs/listing-objects#filter-by-object-contexts-syntax).
+ // If a `delimiter` is set, the returned `prefixes` are exempt from this
+ // filter.
Filter string `protobuf:"bytes,15,opt,name=filter,proto3" json:"filter,omitempty"`
}
@@ -3464,7 +3494,8 @@ func (x *ListObjectsRequest) GetFilter() string {
return ""
}
-// Request object for `QueryWriteStatus`.
+// Request object for
+// [QueryWriteStatus][google.storage.v2.Storage.QueryWriteStatus].
type QueryWriteStatusRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -3522,13 +3553,14 @@ func (x *QueryWriteStatusRequest) GetCommonObjectRequestParams() *CommonObjectRe
return nil
}
-// Response object for `QueryWriteStatus`.
+// Response object for
+// [QueryWriteStatus][google.storage.v2.Storage.QueryWriteStatus].
type QueryWriteStatusResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // The response will set one of the following.
+ // The response sets one of the following.
//
// Types that are assignable to WriteStatus:
//
@@ -3610,14 +3642,15 @@ func (*QueryWriteStatusResponse_PersistedSize) isQueryWriteStatusResponse_WriteS
func (*QueryWriteStatusResponse_Resource) isQueryWriteStatusResponse_WriteStatus() {}
-// Request message for RewriteObject.
+// Request message for [RewriteObject][google.storage.v2.Storage.RewriteObject].
// If the source object is encrypted using a Customer-Supplied Encryption Key
-// the key information must be provided in the copy_source_encryption_algorithm,
-// copy_source_encryption_key_bytes, and copy_source_encryption_key_sha256_bytes
-// fields. If the destination object should be encrypted the keying information
-// should be provided in the encryption_algorithm, encryption_key_bytes, and
-// encryption_key_sha256_bytes fields of the
-// common_object_request_params.customer_encryption field.
+// the key information must be provided in the
+// `copy_source_encryption_algorithm`, `copy_source_encryption_key_bytes`, and
+// `copy_source_encryption_key_sha256_bytes` fields. If the destination object
+// should be encrypted the keying information should be provided in the
+// `encryption_algorithm`, `encryption_key_bytes`, and
+// `encryption_key_sha256_bytes` fields of the
+// `common_object_request_params.customer_encryption` field.
type RewriteObjectRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -3634,7 +3667,7 @@ type RewriteObjectRequest struct {
// Required. Immutable. The name of the bucket containing the destination
// object.
DestinationBucket string `protobuf:"bytes,25,opt,name=destination_bucket,json=destinationBucket,proto3" json:"destination_bucket,omitempty"`
- // Optional. The name of the Cloud KMS key that will be used to encrypt the
+ // Optional. The name of the Cloud KMS key that is used to encrypt the
// destination object. The Cloud KMS key must be located in same location as
// the object. If the parameter is not specified, the request uses the
// destination bucket's default encryption key, if any, or else the
@@ -3644,8 +3677,8 @@ type RewriteObjectRequest struct {
// The `name`, `bucket` and `kms_key` fields must not be populated (these
// values are specified in the `destination_name`, `destination_bucket`, and
// `destination_kms_key` fields).
- // If `destination` is present it will be used to construct the destination
- // object's metadata; otherwise the destination object's metadata will be
+ // If `destination` is present it is used to construct the destination
+ // object's metadata; otherwise the destination object's metadata is
// copied from the source object.
Destination *Object `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"`
// Required. Name of the bucket in which to find the source object.
@@ -3662,8 +3695,8 @@ type RewriteObjectRequest struct {
// first rewrite request.
RewriteToken string `protobuf:"bytes,5,opt,name=rewrite_token,json=rewriteToken,proto3" json:"rewrite_token,omitempty"`
// Optional. Apply a predefined set of access controls to the destination
- // object. Valid values are "authenticatedRead", "bucketOwnerFullControl",
- // "bucketOwnerRead", "private", "projectPrivate", or "publicRead".
+ // object. Valid values are `authenticatedRead`, `bucketOwnerFullControl`,
+ // `bucketOwnerRead`, `private`, `projectPrivate`, or `publicRead`.
DestinationPredefinedAcl string `protobuf:"bytes,28,opt,name=destination_predefined_acl,json=destinationPredefinedAcl,proto3" json:"destination_predefined_acl,omitempty"`
// Makes the operation conditional on whether the object's current generation
// matches the given value. Setting to 0 makes the operation succeed only if
@@ -3692,7 +3725,7 @@ type RewriteObjectRequest struct {
// Makes the operation conditional on whether the source object's current
// metageneration does not match the given value.
IfSourceMetagenerationNotMatch *int64 `protobuf:"varint,14,opt,name=if_source_metageneration_not_match,json=ifSourceMetagenerationNotMatch,proto3,oneof" json:"if_source_metageneration_not_match,omitempty"`
- // Optional. The maximum number of bytes that will be rewritten per rewrite
+ // Optional. The maximum number of bytes that are rewritten per rewrite
// request. Most callers shouldn't need to specify this parameter - it is
// primarily in place to support testing. If specified the value must be an
// integral multiple of 1 MiB (1048576). Also, this only applies to requests
@@ -3714,8 +3747,8 @@ type RewriteObjectRequest struct {
// Optional. A set of parameters common to Storage API requests concerning an
// object.
CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,19,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"`
- // Optional. The checksums of the complete object. This will be used to
- // validate the destination object after rewriting.
+ // Optional. The checksums of the complete object. This is used to validate
+ // the destination object after rewriting.
ObjectChecksums *ObjectChecksums `protobuf:"bytes,29,opt,name=object_checksums,json=objectChecksums,proto3" json:"object_checksums,omitempty"`
}
@@ -3998,7 +4031,7 @@ func (x *RewriteResponse) GetResource() *Object {
return nil
}
-// Request message for MoveObject.
+// Request message for [MoveObject][google.storage.v2.Storage.MoveObject].
type MoveObjectRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -4167,7 +4200,8 @@ func (x *MoveObjectRequest) GetIfMetagenerationNotMatch() int64 {
return 0
}
-// Request message StartResumableWrite.
+// Request message for
+// [StartResumableWrite][google.storage.v2.Storage.StartResumableWrite].
type StartResumableWriteRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -4237,7 +4271,8 @@ func (x *StartResumableWriteRequest) GetObjectChecksums() *ObjectChecksums {
return nil
}
-// Response object for `StartResumableWrite`.
+// Response object for
+// [StartResumableWrite][google.storage.v2.Storage.StartResumableWrite].
type StartResumableWriteResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -4288,7 +4323,7 @@ func (x *StartResumableWriteResponse) GetUploadId() string {
return ""
}
-// Request message for UpdateObject.
+// Request message for [UpdateObject][google.storage.v2.Storage.UpdateObject].
type UpdateObjectRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -4324,7 +4359,7 @@ type UpdateObjectRequest struct {
// To specify ALL fields, equivalent to the JSON API's "update" function,
// specify a single field with the value `*`. Note: not recommended. If a new
// field is introduced at a later time, an older client updating with the `*`
- // may accidentally reset the new field's value.
+ // might accidentally reset the new field's value.
//
// Not specifying any fields is an error.
UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,7,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
@@ -4440,8 +4475,8 @@ type CommonObjectRequestParams struct {
// Optional. Encryption key used with the Customer-Supplied Encryption Keys
// feature. In raw bytes format (not base64-encoded).
EncryptionKeyBytes []byte `protobuf:"bytes,4,opt,name=encryption_key_bytes,json=encryptionKeyBytes,proto3" json:"encryption_key_bytes,omitempty"`
- // Optional. SHA256 hash of encryption key used with the Customer-Supplied
- // Encryption Keys feature.
+ // Optional. SHA256 hash of encryption key used with the Customer-supplied
+ // encryption keys feature.
EncryptionKeySha256Bytes []byte `protobuf:"bytes,5,opt,name=encryption_key_sha256_bytes,json=encryptionKeySha256Bytes,proto3" json:"encryption_key_sha256_bytes,omitempty"`
}
@@ -4544,25 +4579,23 @@ type Bucket struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Output only. The user-chosen part of the bucket name. The `{bucket}`
// portion of the `name` field. For globally unique buckets, this is equal to
- // the "bucket name" of other Cloud Storage APIs. Example: "pub".
+ // the `bucket name` of other Cloud Storage APIs. Example: `pub`.
BucketId string `protobuf:"bytes,2,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"`
// The etag of the bucket.
- // If included in the metadata of an UpdateBucketRequest, the operation will
- // only be performed if the etag matches that of the bucket.
+ // If included in the metadata of an `UpdateBucketRequest`, the operation is
+ // only performed if the `etag` matches that of the bucket.
Etag string `protobuf:"bytes,29,opt,name=etag,proto3" json:"etag,omitempty"`
// Immutable. The project which owns this bucket, in the format of
- // "projects/{projectIdentifier}".
- // {projectIdentifier} can be the project ID or project number.
- // Output values will always be in project number format.
+ // `projects/{projectIdentifier}`.
+ // `{projectIdentifier}` can be the project ID or project number.
+ // Output values are always in the project number format.
Project string `protobuf:"bytes,3,opt,name=project,proto3" json:"project,omitempty"`
// Output only. The metadata generation of this bucket.
Metageneration int64 `protobuf:"varint,4,opt,name=metageneration,proto3" json:"metageneration,omitempty"`
// Immutable. The location of the bucket. Object data for objects in the
// bucket resides in physical storage within this region. Defaults to `US`.
- // See the
- // [https://developers.google.com/storage/docs/concepts-techniques#specifyinglocations"][developer's
- // guide] for the authoritative list. Attempting to update this field after
- // the bucket is created will result in an error.
+ // Attempting to update this field after the bucket is created results in an
+ // error.
Location string `protobuf:"bytes,5,opt,name=location,proto3" json:"location,omitempty"`
// Output only. The location type of the bucket (region, dual-region,
// multi-region, etc).
@@ -4570,44 +4603,44 @@ type Bucket struct {
// Optional. The bucket's default storage class, used whenever no storageClass
// is specified for a newly-created object. This defines how objects in the
// bucket are stored and determines the SLA and the cost of storage.
- // If this value is not specified when the bucket is created, it will default
- // to `STANDARD`. For more information, see
- // https://developers.google.com/storage/docs/storage-classes.
+ // If this value is not specified when the bucket is created, it defaults
+ // to `STANDARD`. For more information, see [Storage
+ // classes](https://developers.google.com/storage/docs/storage-classes).
StorageClass string `protobuf:"bytes,7,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"`
// Optional. The recovery point objective for cross-region replication of the
- // bucket. Applicable only for dual- and multi-region buckets. "DEFAULT" uses
- // default replication. "ASYNC_TURBO" enables turbo replication, valid for
+ // bucket. Applicable only for dual- and multi-region buckets. `DEFAULT` uses
+ // default replication. `ASYNC_TURBO` enables turbo replication, valid for
// dual-region buckets only. If rpo is not specified when the bucket is
- // created, it defaults to "DEFAULT". For more information, see
- // https://cloud.google.com/storage/docs/availability-durability#turbo-replication.
+ // created, it defaults to `DEFAULT`. For more information, see [Turbo
+ // replication](https://cloud.google.com/storage/docs/availability-durability#turbo-replication).
Rpo string `protobuf:"bytes,27,opt,name=rpo,proto3" json:"rpo,omitempty"`
// Optional. Access controls on the bucket.
- // If iam_config.uniform_bucket_level_access is enabled on this bucket,
+ // If `iam_config.uniform_bucket_level_access` is enabled on this bucket,
// requests to set, read, or modify acl is an error.
Acl []*BucketAccessControl `protobuf:"bytes,8,rep,name=acl,proto3" json:"acl,omitempty"`
// Optional. Default access controls to apply to new objects when no ACL is
- // provided. If iam_config.uniform_bucket_level_access is enabled on this
+ // provided. If `iam_config.uniform_bucket_level_access` is enabled on this
// bucket, requests to set, read, or modify acl is an error.
DefaultObjectAcl []*ObjectAccessControl `protobuf:"bytes,9,rep,name=default_object_acl,json=defaultObjectAcl,proto3" json:"default_object_acl,omitempty"`
- // Optional. The bucket's lifecycle config. See
- // [https://developers.google.com/storage/docs/lifecycle]Lifecycle Management]
- // for more information.
+ // Optional. The bucket's lifecycle configuration. See [Lifecycle
+ // Management](https://developers.google.com/storage/docs/lifecycle) for more
+ // information.
Lifecycle *Bucket_Lifecycle `protobuf:"bytes,10,opt,name=lifecycle,proto3" json:"lifecycle,omitempty"`
// Output only. The creation time of the bucket.
CreateTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
- // Optional. The bucket's [https://www.w3.org/TR/cors/][Cross-Origin Resource
- // Sharing] (CORS) config.
+ // Optional. The bucket's [CORS](https://www.w3.org/TR/cors/)
+ // configuration.
Cors []*Bucket_Cors `protobuf:"bytes,12,rep,name=cors,proto3" json:"cors,omitempty"`
// Output only. The modification time of the bucket.
UpdateTime *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
// Optional. The default value for event-based hold on newly created objects
// in this bucket. Event-based hold is a way to retain objects indefinitely
// until an event occurs, signified by the hold's release. After being
- // released, such objects will be subject to bucket-level retention (if any).
- // One sample use case of this flag is for banks to hold loan documents for at
+ // released, such objects are subject to bucket-level retention (if any). One
+ // sample use case of this flag is for banks to hold loan documents for at
// least 3 years after loan is paid in full. Here, bucket-level retention is 3
// years and the event is loan being paid in full. In this example, these
- // objects will be held intact for any number of years until the event has
+ // objects are held intact for any number of years until the event has
// occurred (event-based hold on the object is released) and then 3 more years
// after that. That means retention duration of the objects begins from the
// moment event-based hold transitioned from true to false. Objects under
@@ -4617,11 +4650,11 @@ type Bucket struct {
// Optional. User-provided labels, in key/value pairs.
Labels map[string]string `protobuf:"bytes,15,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Optional. The bucket's website config, controlling how the service behaves
- // when accessing bucket contents as a web site. See the
- // [https://cloud.google.com/storage/docs/static-website][Static Website
- // Examples] for more information.
+ // when accessing bucket contents as a web site. See the [Static website
+ // examples](https://cloud.google.com/storage/docs/static-website) for more
+ // information.
Website *Bucket_Website `protobuf:"bytes,16,opt,name=website,proto3" json:"website,omitempty"`
- // Optional. The bucket's versioning config.
+ // Optional. The bucket's versioning configuration.
Versioning *Bucket_Versioning `protobuf:"bytes,17,opt,name=versioning,proto3" json:"versioning,omitempty"`
// Optional. The bucket's logging config, which defines the destination bucket
// and name prefix (if any) for the current bucket's logs.
@@ -4631,40 +4664,39 @@ type Bucket struct {
Owner *Owner `protobuf:"bytes,19,opt,name=owner,proto3" json:"owner,omitempty"`
// Optional. Encryption config for a bucket.
Encryption *Bucket_Encryption `protobuf:"bytes,20,opt,name=encryption,proto3" json:"encryption,omitempty"`
- // Optional. The bucket's billing config.
+ // Optional. The bucket's billing configuration.
Billing *Bucket_Billing `protobuf:"bytes,21,opt,name=billing,proto3" json:"billing,omitempty"`
// Optional. The bucket's retention policy. The retention policy enforces a
// minimum retention time for all objects contained in the bucket, based on
// their creation time. Any attempt to overwrite or delete objects younger
- // than the retention period will result in a PERMISSION_DENIED error. An
+ // than the retention period results in a `PERMISSION_DENIED` error. An
// unlocked retention policy can be modified or removed from the bucket via a
// storage.buckets.update operation. A locked retention policy cannot be
// removed or shortened in duration for the lifetime of the bucket.
- // Attempting to remove or decrease period of a locked retention policy will
- // result in a PERMISSION_DENIED error.
+ // Attempting to remove or decrease period of a locked retention policy
+ // results in a `PERMISSION_DENIED` error.
RetentionPolicy *Bucket_RetentionPolicy `protobuf:"bytes,22,opt,name=retention_policy,json=retentionPolicy,proto3" json:"retention_policy,omitempty"`
- // Optional. The bucket's IAM config.
+ // Optional. The bucket's IAM configuration.
IamConfig *Bucket_IamConfig `protobuf:"bytes,23,opt,name=iam_config,json=iamConfig,proto3" json:"iam_config,omitempty"`
// Optional. Reserved for future use.
SatisfiesPzs bool `protobuf:"varint,25,opt,name=satisfies_pzs,json=satisfiesPzs,proto3" json:"satisfies_pzs,omitempty"`
// Optional. Configuration that, if present, specifies the data placement for
- // a
- // [https://cloud.google.com/storage/docs/locations#location-dr][configurable
- // dual-region].
+ // a [configurable
+ // dual-region](https://cloud.google.com/storage/docs/locations#location-dr).
CustomPlacementConfig *Bucket_CustomPlacementConfig `protobuf:"bytes,26,opt,name=custom_placement_config,json=customPlacementConfig,proto3" json:"custom_placement_config,omitempty"`
// Optional. The bucket's Autoclass configuration. If there is no
- // configuration, the Autoclass feature will be disabled and have no effect on
- // the bucket.
+ // configuration, the Autoclass feature is disabled and has no effect on the
+ // bucket.
Autoclass *Bucket_Autoclass `protobuf:"bytes,28,opt,name=autoclass,proto3" json:"autoclass,omitempty"`
// Optional. The bucket's hierarchical namespace configuration. If there is no
- // configuration, the hierarchical namespace feature will be disabled and have
+ // configuration, the hierarchical namespace feature is disabled and has
// no effect on the bucket.
HierarchicalNamespace *Bucket_HierarchicalNamespace `protobuf:"bytes,32,opt,name=hierarchical_namespace,json=hierarchicalNamespace,proto3" json:"hierarchical_namespace,omitempty"`
// Optional. The bucket's soft delete policy. The soft delete policy prevents
// soft-deleted objects from being permanently deleted.
SoftDeletePolicy *Bucket_SoftDeletePolicy `protobuf:"bytes,31,opt,name=soft_delete_policy,json=softDeletePolicy,proto3" json:"soft_delete_policy,omitempty"`
// Optional. The bucket's object retention configuration. Must be enabled
- // before objects in the bucket may have retention configured.
+ // before objects in the bucket might have retention configured.
ObjectRetention *Bucket_ObjectRetention `protobuf:"bytes,33,opt,name=object_retention,json=objectRetention,proto3" json:"object_retention,omitempty"`
// Optional. The bucket's IP filter configuration.
IpFilter *Bucket_IpFilter `protobuf:"bytes,38,opt,name=ip_filter,json=ipFilter,proto3,oneof" json:"ip_filter,omitempty"`
@@ -4950,18 +4982,18 @@ type BucketAccessControl struct {
// `group-example@googlegroups.com`
// * All members of the Google Apps for Business domain `example.com` would be
// `domain-example.com`
- // For project entities, `project-{team}-{projectnumber}` format will be
+ // For project entities, `project-{team}-{projectnumber}` format is
// returned on response.
Entity string `protobuf:"bytes,3,opt,name=entity,proto3" json:"entity,omitempty"`
// Output only. The alternative entity format, if exists. For project
- // entities, `project-{team}-{projectid}` format will be returned on response.
+ // entities, `project-{team}-{projectid}` format is returned in the response.
EntityAlt string `protobuf:"bytes,9,opt,name=entity_alt,json=entityAlt,proto3" json:"entity_alt,omitempty"`
// Optional. The ID for the entity, if any.
EntityId string `protobuf:"bytes,4,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"`
- // Optional. The etag of the BucketAccessControl.
+ // Optional. The `etag` of the `BucketAccessControl`.
// If included in the metadata of an update or delete request message, the
- // operation operation will only be performed if the etag matches that of the
- // bucket's BucketAccessControl.
+ // operation operation is only performed if the etag matches that of the
+ // bucket's `BucketAccessControl`.
Etag string `protobuf:"bytes,8,opt,name=etag,proto3" json:"etag,omitempty"`
// Optional. The email address associated with the entity, if any.
Email string `protobuf:"bytes,5,opt,name=email,proto3" json:"email,omitempty"`
@@ -5129,16 +5161,15 @@ type ObjectChecksums struct {
// CRC32C digest of the object data. Computed by the Cloud Storage service for
// all written objects.
- // If set in a WriteObjectRequest, service will validate that the stored
+ // If set in a WriteObjectRequest, service validates that the stored
// object matches this checksum.
Crc32C *uint32 `protobuf:"fixed32,1,opt,name=crc32c,proto3,oneof" json:"crc32c,omitempty"`
- // Optional. 128 bit MD5 hash of the object data.
- // For more information about using the MD5 hash, see
- // [https://cloud.google.com/storage/docs/hashes-etags#json-api][Hashes and
- // ETags: Best Practices].
- // Not all objects will provide an MD5 hash. For example, composite objects
- // provide only crc32c hashes. This value is equivalent to running `cat
- // object.txt | openssl md5 -binary`
+ // Optional. 128 bit MD5 hash of the object data. For more information about
+ // using the MD5 hash, see [Data validation and change
+ // detection](https://cloud.google.com/storage/docs/data-validation). Not all
+ // objects provide an MD5 hash. For example, composite objects provide only
+ // crc32c hashes. This value is equivalent to running `cat object.txt |
+ // openssl md5 -binary`
Md5Hash []byte `protobuf:"bytes,2,opt,name=md5_hash,json=md5Hash,proto3" json:"md5_hash,omitempty"`
}
@@ -5298,8 +5329,8 @@ func (x *ObjectContexts) GetCustom() map[string]*ObjectCustomContextPayload {
return nil
}
-// Describes the Customer-Supplied Encryption Key mechanism used to store an
-// Object's data at rest.
+// Describes the customer-supplied encryption key mechanism used to store an
+// object's data at rest.
type CustomerEncryption struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -5372,9 +5403,9 @@ type Object struct {
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Immutable. The name of the bucket containing this object.
Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"`
- // Optional. The etag of the object.
+ // Optional. The `etag` of an object.
// If included in the metadata of an update or delete request message, the
- // operation will only be performed if the etag matches that of the live
+ // operation is only performed if the etag matches that of the live
// object.
Etag string `protobuf:"bytes,27,opt,name=etag,proto3" json:"etag,omitempty"`
// Immutable. The content generation of this object. Used for object
@@ -5392,25 +5423,25 @@ type Object struct {
// Optional. Storage class of the object.
StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"`
// Output only. Content-Length of the object data in bytes, matching
- // [https://tools.ietf.org/html/rfc7230#section-3.3.2][RFC 7230 §3.3.2].
+ // [RFC 7230 §3.3.2](https://tools.ietf.org/html/rfc7230#section-3.3.2]).
Size int64 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"`
// Optional. Content-Encoding of the object data, matching
- // [https://tools.ietf.org/html/rfc7231#section-3.1.2.2][RFC 7231 §3.1.2.2]
+ // [RFC 7231 §3.1.2.2](https://tools.ietf.org/html/rfc7231#section-3.1.2.2)
ContentEncoding string `protobuf:"bytes,7,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"`
// Optional. Content-Disposition of the object data, matching
- // [https://tools.ietf.org/html/rfc6266][RFC 6266].
+ // [RFC 6266](https://tools.ietf.org/html/rfc6266).
ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"`
// Optional. Cache-Control directive for the object data, matching
- // [https://tools.ietf.org/html/rfc7234#section-5.2"][RFC 7234 §5.2].
+ // [RFC 7234 §5.2](https://tools.ietf.org/html/rfc7234#section-5.2).
// If omitted, and the object is accessible to all anonymous users, the
- // default will be `public, max-age=3600`.
+ // default is `public, max-age=3600`.
CacheControl string `protobuf:"bytes,9,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"`
// Optional. Access controls on the object.
- // If iam_config.uniform_bucket_level_access is enabled on the parent
+ // If `iam_config.uniform_bucket_level_access` is enabled on the parent
// bucket, requests to set, read, or modify acl is an error.
Acl []*ObjectAccessControl `protobuf:"bytes,10,rep,name=acl,proto3" json:"acl,omitempty"`
// Optional. Content-Language of the object data, matching
- // [https://tools.ietf.org/html/rfc7231#section-3.1.3.2][RFC 7231 §3.1.3.2].
+ // [RFC 7231 §3.1.3.2](https://tools.ietf.org/html/rfc7231#section-3.1.3.2).
ContentLanguage string `protobuf:"bytes,11,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"`
// Output only. If this object is noncurrent, this is the time when the object
// became noncurrent.
@@ -5418,7 +5449,7 @@ type Object struct {
// Output only. The time when the object was finalized.
FinalizeTime *timestamppb.Timestamp `protobuf:"bytes,36,opt,name=finalize_time,json=finalizeTime,proto3" json:"finalize_time,omitempty"`
// Optional. Content-Type of the object data, matching
- // [https://tools.ietf.org/html/rfc7231#section-3.1.1.5][RFC 7231 §3.1.1.5].
+ // [RFC 7231 §3.1.1.5](https://tools.ietf.org/html/rfc7231#section-3.1.1.5).
// If an object is stored without a Content-Type, it is served as
// `application/octet-stream`.
ContentType string `protobuf:"bytes,13,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"`
@@ -5428,7 +5459,7 @@ type Object struct {
// Components are accumulated by compose operations.
ComponentCount int32 `protobuf:"varint,15,opt,name=component_count,json=componentCount,proto3" json:"component_count,omitempty"`
// Output only. Hashes for the data part of this object. This field is used
- // for output only and will be silently ignored if provided in requests. The
+ // for output only and is silently ignored if provided in requests. The
// checksums of the complete object regardless of data range. If the object is
// downloaded in full, the client should compute one of these checksums over
// the downloaded object and compare it against the value provided here.
@@ -5444,7 +5475,7 @@ type Object struct {
// encrypted by such a key.
KmsKey string `protobuf:"bytes,18,opt,name=kms_key,json=kmsKey,proto3" json:"kms_key,omitempty"`
// Output only. The time at which the object's storage class was last changed.
- // When the object is initially created, it will be set to time_created.
+ // When the object is initially created, it is set to `time_created`.
UpdateStorageClassTime *timestamppb.Timestamp `protobuf:"bytes,19,opt,name=update_storage_class_time,json=updateStorageClassTime,proto3" json:"update_storage_class_time,omitempty"`
// Optional. Whether an object is under temporary hold. While this flag is set
// to true, the object is protected against deletion and overwrites. A common
@@ -5469,19 +5500,19 @@ type Object struct {
// Whether an object is under event-based hold.
// An event-based hold is a way to force the retention of an object until
// after some event occurs. Once the hold is released by explicitly setting
- // this field to false, the object will become subject to any bucket-level
- // retention policy, except that the retention duration will be calculated
+ // this field to `false`, the object becomes subject to any bucket-level
+ // retention policy, except that the retention duration is calculated
// from the time the event based hold was lifted, rather than the time the
// object was created.
//
- // In a WriteObject request, not setting this field implies that the value
- // should be taken from the parent bucket's "default_event_based_hold" field.
- // In a response, this field will always be set to true or false.
+ // In a `WriteObject` request, not setting this field implies that the value
+ // should be taken from the parent bucket's `default_event_based_hold` field.
+ // In a response, this field is always set to `true` or `false`.
EventBasedHold *bool `protobuf:"varint,23,opt,name=event_based_hold,json=eventBasedHold,proto3,oneof" json:"event_based_hold,omitempty"`
- // Output only. The owner of the object. This will always be the uploader of
- // the object.
+ // Output only. The owner of the object. This is always the uploader of the
+ // object.
Owner *Owner `protobuf:"bytes,24,opt,name=owner,proto3" json:"owner,omitempty"`
- // Optional. Metadata of Customer-Supplied Encryption Key, if the object is
+ // Optional. Metadata of customer-supplied encryption key, if the object is
// encrypted by such a key.
CustomerEncryption *CustomerEncryption `protobuf:"bytes,25,opt,name=customer_encryption,json=customerEncryption,proto3" json:"customer_encryption,omitempty"`
// Optional. A user-specified timestamp set on an object.
@@ -5489,15 +5520,15 @@ type Object struct {
// Output only. This is the time when the object became soft-deleted.
//
// Soft-deleted objects are only accessible if a soft_delete_policy is
- // enabled. Also see hard_delete_time.
+ // enabled. Also see `hard_delete_time`.
SoftDeleteTime *timestamppb.Timestamp `protobuf:"bytes,28,opt,name=soft_delete_time,json=softDeleteTime,proto3,oneof" json:"soft_delete_time,omitempty"`
- // Output only. The time when the object will be permanently deleted.
+ // Output only. The time when the object is permanently deleted.
//
- // Only set when an object becomes soft-deleted with a soft_delete_policy.
- // Otherwise, the object will not be accessible.
+ // Only set when an object becomes soft-deleted with a `soft_delete_policy`.
+ // Otherwise, the object is not accessible.
HardDeleteTime *timestamppb.Timestamp `protobuf:"bytes,29,opt,name=hard_delete_time,json=hardDeleteTime,proto3,oneof" json:"hard_delete_time,omitempty"`
// Optional. Retention configuration of this object.
- // May only be configured if the bucket has object retention enabled.
+ // Might only be configured if the bucket has object retention enabled.
Retention *Object_Retention `protobuf:"bytes,30,opt,name=retention,proto3" json:"retention,omitempty"`
}
@@ -5792,17 +5823,17 @@ type ObjectAccessControl struct {
// `group-example@googlegroups.com`.
// * All members of the Google Apps for Business domain `example.com` would be
// `domain-example.com`.
- // For project entities, `project-{team}-{projectnumber}` format will be
- // returned on response.
+ // For project entities, `project-{team}-{projectnumber}` format is
+ // returned in the response.
Entity string `protobuf:"bytes,3,opt,name=entity,proto3" json:"entity,omitempty"`
// Output only. The alternative entity format, if exists. For project
- // entities, `project-{team}-{projectid}` format will be returned on response.
+ // entities, `project-{team}-{projectid}` format is returned in the response.
EntityAlt string `protobuf:"bytes,9,opt,name=entity_alt,json=entityAlt,proto3" json:"entity_alt,omitempty"`
// Optional. The ID for the entity, if any.
EntityId string `protobuf:"bytes,4,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"`
// Optional. The etag of the ObjectAccessControl.
// If included in the metadata of an update or delete request message, the
- // operation will only be performed if the etag matches that of the live
+ // operation is only performed if the etag matches that of the live
// object's ObjectAccessControl.
Etag string `protobuf:"bytes,8,opt,name=etag,proto3" json:"etag,omitempty"`
// Optional. The email address associated with the entity, if any.
@@ -6224,7 +6255,7 @@ type ComposeObjectRequest_SourceObject_ObjectPreconditions struct {
// Only perform the composition if the generation of the source object
// that would be used matches this value. If this value and a generation
- // are both specified, they must be the same value or the call will fail.
+ // are both specified, they must be the same value or the call fails.
IfGenerationMatch *int64 `protobuf:"varint,1,opt,name=if_generation_match,json=ifGenerationMatch,proto3,oneof" json:"if_generation_match,omitempty"`
}
@@ -6321,22 +6352,23 @@ type Bucket_Cors struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // Optional. The list of Origins eligible to receive CORS response headers.
- // See [https://tools.ietf.org/html/rfc6454][RFC 6454] for more on origins.
- // Note: "*" is permitted in the list of origins, and means "any Origin".
+ // Optional. The list of origins eligible to receive CORS response headers.
+ // For more information about origins, see [RFC
+ // 6454](https://tools.ietf.org/html/rfc6454). Note: `*` is permitted in the
+ // list of origins, and means `any origin`.
Origin []string `protobuf:"bytes,1,rep,name=origin,proto3" json:"origin,omitempty"`
// Optional. The list of HTTP methods on which to include CORS response
// headers,
- // (`GET`, `OPTIONS`, `POST`, etc) Note: "*" is permitted in the list of
+ // (`GET`, `OPTIONS`, `POST`, etc) Note: `*` is permitted in the list of
// methods, and means "any method".
Method []string `protobuf:"bytes,2,rep,name=method,proto3" json:"method,omitempty"`
- // Optional. The list of HTTP headers other than the
- // [https://www.w3.org/TR/cors/#simple-response-header][simple response
- // headers] to give permission for the user-agent to share across domains.
+ // Optional. The list of HTTP headers other than the [simple response
+ // headers](https://www.w3.org/TR/cors/#simple-response-headers) to give
+ // permission for the user-agent to share across domains.
ResponseHeader []string `protobuf:"bytes,3,rep,name=response_header,json=responseHeader,proto3" json:"response_header,omitempty"`
- // Optional. The value, in seconds, to return in the
- // [https://www.w3.org/TR/cors/#access-control-max-age-response-header][Access-Control-Max-Age
- // header] used in preflight responses.
+ // Optional. The value, in seconds, to return in the [Access-Control-Max-Age
+ // header](https://www.w3.org/TR/cors/#access-control-max-age-response-header)
+ // used in preflight responses.
MaxAgeSeconds int32 `protobuf:"varint,4,opt,name=max_age_seconds,json=maxAgeSeconds,proto3" json:"max_age_seconds,omitempty"`
}
@@ -6404,8 +6436,8 @@ type Bucket_Encryption struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // Optional. The name of the Cloud KMS key that will be used to encrypt
- // objects inserted into this bucket, if no encryption method is specified.
+ // Optional. The name of the Cloud KMS key that is used to encrypt objects
+ // inserted into this bucket, if no encryption method is specified.
DefaultKmsKey string `protobuf:"bytes,1,opt,name=default_kms_key,json=defaultKmsKey,proto3" json:"default_kms_key,omitempty"`
// Optional. If omitted, then new objects with GMEK encryption-type is
// allowed. If set, then new objects created in this bucket must comply with
@@ -6490,8 +6522,8 @@ type Bucket_IamConfig struct {
// Optional. Bucket restriction options currently enforced on the bucket.
UniformBucketLevelAccess *Bucket_IamConfig_UniformBucketLevelAccess `protobuf:"bytes,1,opt,name=uniform_bucket_level_access,json=uniformBucketLevelAccess,proto3" json:"uniform_bucket_level_access,omitempty"`
- // Optional. Whether IAM will enforce public access prevention. Valid values
- // are "enforced" or "inherited".
+ // Optional. Whether IAM enforces public access prevention. Valid values are
+ // `enforced` or `inherited`.
PublicAccessPrevention string `protobuf:"bytes,3,opt,name=public_access_prevention,json=publicAccessPrevention,proto3" json:"public_access_prevention,omitempty"`
}
@@ -6540,14 +6572,15 @@ func (x *Bucket_IamConfig) GetPublicAccessPrevention() string {
}
// Lifecycle properties of a bucket.
-// For more information, see https://cloud.google.com/storage/docs/lifecycle.
+// For more information, see [Object Lifecycle
+// Management](https://cloud.google.com/storage/docs/lifecycle).
type Bucket_Lifecycle struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Optional. A lifecycle management rule, which is made of an action to take
- // and the condition(s) under which the action will be taken.
+ // and the condition under which the action is taken.
Rule []*Bucket_Lifecycle_Rule `protobuf:"bytes,1,rep,name=rule,proto3" json:"rule,omitempty"`
}
@@ -6708,7 +6741,7 @@ type Bucket_RetentionPolicy struct {
// duration must be greater than zero and less than 100 years. Note that
// enforcement of retention periods less than a day is not guaranteed. Such
// periods should only be used for testing purposes. Any `nanos` value
- // specified will be rounded down to the nearest second.
+ // specified is rounded down to the nearest second.
RetentionDuration *durationpb.Duration `protobuf:"bytes,4,opt,name=retention_duration,json=retentionDuration,proto3" json:"retention_duration,omitempty"`
}
@@ -6822,8 +6855,8 @@ func (x *Bucket_SoftDeletePolicy) GetEffectiveTime() *timestamppb.Timestamp {
}
// Properties of a bucket related to versioning.
-// For more on Cloud Storage versioning, see
-// https://cloud.google.com/storage/docs/object-versioning.
+// For more information about Cloud Storage versioning, see [Object
+// versioning](https://cloud.google.com/storage/docs/object-versioning).
type Bucket_Versioning struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -6871,22 +6904,22 @@ func (x *Bucket_Versioning) GetEnabled() bool {
}
// Properties of a bucket related to accessing the contents as a static
-// website. For more on hosting a static website via Cloud Storage, see
-// https://cloud.google.com/storage/docs/hosting-static-website.
+// website. For details, see [hosting a static website using Cloud
+// Storage](https://cloud.google.com/storage/docs/hosting-static-website).
type Bucket_Website struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // Optional. If the requested object path is missing, the service will
- // ensure the path has a trailing '/', append this suffix, and attempt to
- // retrieve the resulting object. This allows the creation of `index.html`
- // objects to represent directory pages.
+ // Optional. If the requested object path is missing, the service ensures
+ // the path has a trailing '/', append this suffix, and attempt to retrieve
+ // the resulting object. This allows the creation of `index.html` objects to
+ // represent directory pages.
MainPageSuffix string `protobuf:"bytes,1,opt,name=main_page_suffix,json=mainPageSuffix,proto3" json:"main_page_suffix,omitempty"`
// Optional. If the requested object path is missing, and any
// `mainPageSuffix` object is missing, if applicable, the service
- // will return the named object from this bucket as the content for a
- // [https://tools.ietf.org/html/rfc7231#section-6.5.4][404 Not Found]
+ // returns the named object from this bucket as the content for a
+ // [404 Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)
// result.
NotFoundPage string `protobuf:"bytes,2,opt,name=not_found_page,json=notFoundPage,proto3" json:"not_found_page,omitempty"`
}
@@ -6935,9 +6968,11 @@ func (x *Bucket_Website) GetNotFoundPage() string {
return ""
}
-// Configuration for Custom Dual Regions. It should specify precisely two
-// eligible regions within the same Multiregion. More information on regions
-// may be found [here](https://cloud.google.com/storage/docs/locations).
+// Configuration for [configurable dual-
+// regions](https://cloud.google.com/storage/docs/locations#configurable). It
+// should specify precisely two eligible regions within the same multi-region.
+// For details, see
+// [locations](https://cloud.google.com/storage/docs/locations).
type Bucket_CustomPlacementConfig struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -6994,10 +7029,10 @@ type Bucket_Autoclass struct {
Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
// Output only. Latest instant at which the `enabled` field was set to true
// after being disabled/unconfigured or set to false after being enabled. If
- // Autoclass is enabled when the bucket is created, the toggle_time is set
- // to the bucket creation time.
+ // Autoclass is enabled when the bucket is created, the value of the
+ // `toggle_time` field is set to the bucket `create_time`.
ToggleTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=toggle_time,json=toggleTime,proto3" json:"toggle_time,omitempty"`
- // An object in an Autoclass bucket will eventually cool down to the
+ // An object in an Autoclass bucket eventually cools down to the
// terminal storage class if there is no access to the object.
// The only valid values are NEARLINE and ARCHIVE.
TerminalStorageClass *string `protobuf:"bytes,3,opt,name=terminal_storage_class,json=terminalStorageClass,proto3,oneof" json:"terminal_storage_class,omitempty"`
@@ -7077,7 +7112,7 @@ type Bucket_IpFilter struct {
// `Disabled`. When set to `Enabled`, IP filtering rules are applied to a
// bucket and all incoming requests to the bucket are evaluated against
// these rules. When set to `Disabled`, IP filtering rules are not applied
- // to a bucket.".
+ // to a bucket.
Mode *string `protobuf:"bytes,1,opt,name=mode,proto3,oneof" json:"mode,omitempty"`
// Public IPs allowed to operate or access the bucket.
PublicNetworkSource *Bucket_IpFilter_PublicNetworkSource `protobuf:"bytes,2,opt,name=public_network_source,json=publicNetworkSource,proto3,oneof" json:"public_network_source,omitempty"`
@@ -7087,11 +7122,11 @@ type Bucket_IpFilter struct {
// Optional. Whether or not to allow VPCs from orgs different than the
// bucket's parent org to access the bucket. When set to true, validations
// on the existence of the VPCs won't be performed. If set to false, each
- // VPC network source will be checked to belong to the same org as the
- // bucket as well as validated for existence.
+ // VPC network source is checked to belong to the same org as the bucket as
+ // well as validated for existence.
AllowCrossOrgVpcs bool `protobuf:"varint,4,opt,name=allow_cross_org_vpcs,json=allowCrossOrgVpcs,proto3" json:"allow_cross_org_vpcs,omitempty"`
// Whether or not to allow all P4SA access to the bucket. When set to true,
- // IP filter config validation will not apply.
+ // IP filter config validation doesn't apply.
AllowAllServiceAgentAccess *bool `protobuf:"varint,5,opt,name=allow_all_service_agent_access,json=allowAllServiceAgentAccess,proto3,oneof" json:"allow_all_service_agent_access,omitempty"`
}
@@ -7214,7 +7249,7 @@ type Bucket_Encryption_GoogleManagedEncryptionEnforcementConfig struct {
unknownFields protoimpl.UnknownFields
// Restriction mode for google-managed encryption for new objects within
- // the bucket. Valid values are: "NotRestricted", "FullyRestricted".
+ // the bucket. Valid values are: `NotRestricted` and `FullyRestricted`.
// If `NotRestricted` or unset, creation of new objects with
// google-managed encryption is allowed.
// If `FullyRestricted`, new objects can't be created using google-managed
@@ -7275,7 +7310,7 @@ type Bucket_Encryption_CustomerManagedEncryptionEnforcementConfig struct {
unknownFields protoimpl.UnknownFields
// Restriction mode for customer-managed encryption for new objects within
- // the bucket. Valid values are: "NotRestricted", "FullyRestricted".
+ // the bucket. Valid values are: `NotRestricted` and `FullyRestricted`.
// If `NotRestricted` or unset, creation of new objects with
// customer-managed encryption is allowed.
// If `FullyRestricted`, new objects can't be created using
@@ -7336,8 +7371,8 @@ type Bucket_Encryption_CustomerSuppliedEncryptionEnforcementConfig struct {
unknownFields protoimpl.UnknownFields
// Restriction mode for customer-supplied encryption for new objects
- // within the bucket. Valid values are: "NotRestricted",
- // "FullyRestricted".
+ // within the bucket. Valid values are: `NotRestricted` and
+ // `FullyRestricted`.
// If `NotRestricted` or unset, creation of new objects with
// customer-supplied encryption is allowed.
// If `FullyRestricted`, new objects can't be created using
@@ -7453,7 +7488,7 @@ func (x *Bucket_IamConfig_UniformBucketLevelAccess) GetLockTime() *timestamppb.T
}
// A lifecycle Rule, combining an action to take on an object and a
-// condition which will trigger that action.
+// condition which triggers that action.
type Bucket_Lifecycle_Rule struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -7461,7 +7496,7 @@ type Bucket_Lifecycle_Rule struct {
// Optional. The action to take.
Action *Bucket_Lifecycle_Rule_Action `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"`
- // Optional. The condition(s) under which the action will be taken.
+ // Optional. The condition under which the action is taken.
Condition *Bucket_Lifecycle_Rule_Condition `protobuf:"bytes,2,opt,name=condition,proto3" json:"condition,omitempty"`
}
@@ -7591,8 +7626,8 @@ type Bucket_Lifecycle_Rule_Condition struct {
// the live version) newer than this version of the object.
NumNewerVersions *int32 `protobuf:"varint,4,opt,name=num_newer_versions,json=numNewerVersions,proto3,oneof" json:"num_newer_versions,omitempty"`
// Optional. Objects having any of the storage classes specified by this
- // condition will be matched. Values include `MULTI_REGIONAL`,
- // `REGIONAL`, `NEARLINE`, `COLDLINE`, `STANDARD`, and
+ // condition are matched. Values include `MULTI_REGIONAL`, `REGIONAL`,
+ // `NEARLINE`, `COLDLINE`, `STANDARD`, and
// `DURABLE_REDUCED_AVAILABILITY`.
MatchesStorageClass []string `protobuf:"bytes,5,rep,name=matches_storage_class,json=matchesStorageClass,proto3" json:"matches_storage_class,omitempty"`
// Number of days that have elapsed since the custom timestamp set on an
@@ -7605,7 +7640,7 @@ type Bucket_Lifecycle_Rule_Condition struct {
// This condition is relevant only for versioned objects. An object
// version satisfies this condition only if these many days have been
// passed since it became noncurrent. The value of the field must be a
- // nonnegative integer. If it's zero, the object version will become
+ // nonnegative integer. If it's zero, the object version becomes
// eligible for Lifecycle action as soon as it becomes noncurrent.
DaysSinceNoncurrentTime *int32 `protobuf:"varint,9,opt,name=days_since_noncurrent_time,json=daysSinceNoncurrentTime,proto3,oneof" json:"days_since_noncurrent_time,omitempty"`
// Optional. This condition is relevant only for versioned objects. An
@@ -7985,7 +8020,7 @@ var file_google_storage_v2_storage_proto_rawDesc = []byte{
0x0a, 0x17, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,
0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x42,
0x03, 0xe0, 0x41, 0x01, 0x52, 0x15, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x62, 0x6a, 0x65,
- 0x63, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x82, 0x02, 0x0a, 0x12,
+ 0x63, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xbd, 0x02, 0x0a, 0x12,
0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x12, 0x1d, 0x73, 0x74, 0x6f, 0x72,
@@ -8001,140 +8036,612 @@ var file_google_storage_v2_storage_proto_rawDesc = []byte{
0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d,
0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88,
- 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b,
- 0x22, 0x72, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f,
- 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54,
- 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x20, 0x4c, 0x6f, 0x63, 0x6b, 0x42, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69,
- 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41,
- 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d,
+ 0x01, 0x01, 0x12, 0x39, 0x0a, 0x16, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x70, 0x61, 0x72,
+ 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01,
+ 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x14, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x50,
+ 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x0c, 0x0a,
+ 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0x94, 0x01, 0x0a, 0x13,
+ 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01,
+ 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52,
+ 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74,
+ 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
+ 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62, 0x6c, 0x65, 0x18,
+ 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x61, 0x62,
+ 0x6c, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x20, 0x4c, 0x6f, 0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a,
+ 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,
+ 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74,
+ 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x15, 0x69, 0x66,
+ 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61,
+ 0x74, 0x63, 0x68, 0x22, 0xc0, 0x03, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
+ 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01,
+ 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,
+ 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63,
+ 0x68, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e,
+ 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
+ 0x01, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c,
+ 0x12, 0x46, 0x0a, 0x1d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x64,
+ 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x63,
+ 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x1a, 0x70, 0x72,
+ 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+ 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a,
+ 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69,
+ 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65,
+ 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74,
+ 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xe5, 0x07, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x70, 0x6f,
+ 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+ 0x40, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42,
+ 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x60, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f,
+ 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x1a, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63,
+ 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x64, 0x65,
+ 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69,
+ 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20,
+ 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69,
+ 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x15,
+ 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x07, 0x6b, 0x6d, 0x73, 0x5f,
+ 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41,
+ 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74,
+ 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x72, 0x0a, 0x1c,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
+ 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
+ 0x12, 0x52, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b,
+ 0x73, 0x75, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b,
+ 0x73, 0x75, 0x6d, 0x73, 0x1a, 0xb3, 0x02, 0x0a, 0x0c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23,
+ 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x12, 0x80, 0x01, 0x0a, 0x14, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x70,
+ 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
+ 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50,
+ 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x03, 0xe0, 0x41,
+ 0x01, 0x52, 0x13, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x62, 0x0a, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a,
+ 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66,
+ 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,
+ 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69,
+ 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xec,
+ 0x04, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,
+ 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05,
+ 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17,
+ 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52,
+ 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74,
+ 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d,
0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61,
- 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x15,
+ 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d,
+ 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74,
+ 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,
+ 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66,
+ 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f,
+ 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d,
+ 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65,
+ 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x16, 0x0a,
+ 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a,
+ 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xd8, 0x05,
+ 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,
+ 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f,
+ 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x6b, 0x65,
+ 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00,
+ 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61,
+ 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,
+ 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20,
+ 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,
+ 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68,
+ 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0d,
+ 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x63, 0x6c, 0x88, 0x01, 0x01,
+ 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73,
+ 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,
+ 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61,
+ 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
+ 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61,
+ 0x72, 0x61, 0x6d, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18,
+ 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e,
+ 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f,
+ 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,
+ 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x6c, 0x22, 0x3f, 0x0a, 0x1b, 0x43, 0x61, 0x6e, 0x63,
+ 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61,
+ 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,
+ 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x43, 0x61, 0x6e,
+ 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74,
+ 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, 0x06, 0x0a, 0x11, 0x52, 0x65,
+ 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
+ 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42,
+ 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+ 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b,
+ 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
+ 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64,
+ 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x22, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c,
+ 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
+ 0x09, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66,
+ 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,
+ 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,
+ 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69,
+ 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15,
0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x4d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xc0, 0x03, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
- 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a,
- 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
- 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,
- 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
+ 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d,
+ 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52,
+ 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x72, 0x0a, 0x1c,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
+ 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
+ 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0c, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x48,
+ 0x04, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x16,
+ 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e,
+ 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c,
+ 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0x98, 0x06, 0x0a,
+ 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a,
+ 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0c, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74,
+ 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x6f, 0x66, 0x74,
+ 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66,
+ 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,
+ 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03,
+ 0x48, 0x02, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69,
+ 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x15,
+ 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d,
+ 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52,
+ 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x72, 0x0a, 0x1c,
+ 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
+ 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
+ 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0a, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x48,
+ 0x05, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x28,
+ 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18,
+ 0x0c, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74,
+ 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x73, 0x6f, 0x66,
+ 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66,
+ 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63,
+ 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a,
+ 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66,
+ 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65,
+ 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xaf, 0x02, 0x0a, 0x12, 0x52, 0x65, 0x61, 0x64,
+ 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d,
+ 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61,
+ 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65,
+ 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0f, 0x63, 0x68,
+ 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a,
+ 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d,
+ 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x44, 0x0a, 0x0d,
+ 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
+ 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52,
+ 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61, 0x6e,
+ 0x67, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,
+ 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd0, 0x06, 0x0a, 0x12, 0x42, 0x69,
+ 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63,
+ 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12,
+ 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42,
+ 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a,
+ 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00,
+ 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61,
+ 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e,
0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63,
- 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74,
- 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61,
- 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66,
- 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
- 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41,
- 0x63, 0x6c, 0x12, 0x46, 0x0a, 0x1d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64,
- 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,
- 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x1a,
- 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c,
- 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70,
- 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
- 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02,
- 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x1a, 0x0a, 0x18,
+ 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,
+ 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20,
+ 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,
+ 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68,
+ 0x88, 0x01, 0x01, 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72,
+ 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f,
+ 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f,
+ 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x40, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f,
+ 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65,
+ 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x02, 0x18, 0x01, 0x48, 0x04, 0x52, 0x08, 0x72, 0x65,
+ 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x0b, 0x72, 0x65, 0x61,
+ 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
+ 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c,
+ 0x65, 0x48, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x88,
+ 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f,
+ 0x6b, 0x65, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0c, 0x72, 0x6f, 0x75,
+ 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14,
+ 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d,
+ 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
+ 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c,
0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f,
+ 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c, 0x0a, 0x0a,
+ 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72,
+ 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72,
+ 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb1, 0x01, 0x0a,
+ 0x15, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x72, 0x65,
+ 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0b,
+ 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28,
+ 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73,
+ 0x22, 0xe5, 0x01, 0x0a, 0x16, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65,
+ 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x35, 0x0a,
+ 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61,
+ 0x64, 0x61, 0x74, 0x61, 0x12, 0x42, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e,
+ 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69,
+ 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x0a, 0x72, 0x65,
+ 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x1d, 0x42, 0x69, 0x64,
+ 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x42, 0x0a, 0x0b, 0x72, 0x65,
+ 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64,
+ 0x6c, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x28,
+ 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67,
+ 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75,
+ 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xed, 0x01, 0x0a, 0x1e, 0x42,
+ 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x28, 0x0a,
+ 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54,
+ 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65,
+ 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c,
+ 0x65, 0x48, 0x01, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65,
+ 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75,
+ 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77,
+ 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f,
+ 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x64, 0x0a, 0x13, 0x42, 0x69,
+ 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x72, 0x72, 0x6f,
+ 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
+ 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52,
+ 0x0f, 0x72, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73,
+ 0x22, 0x55, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72,
+ 0x6f, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x03, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73,
+ 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
+ 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x75, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x52,
+ 0x61, 0x6e, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66,
+ 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a,
+ 0x72, 0x65, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65,
+ 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+ 0x12, 0x1c, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x22, 0xba,
+ 0x01, 0x0a, 0x0f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61,
+ 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65,
+ 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
+ 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61,
+ 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74,
+ 0x61, 0x12, 0x3b, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
+ 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61,
+ 0x6e, 0x67, 0x65, 0x52, 0x09, 0x72, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1b,
+ 0x0a, 0x09, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x08, 0x52, 0x08, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x6e, 0x64, 0x22, 0x2d, 0x0a, 0x0e, 0x42,
+ 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1b, 0x0a,
+ 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0,
+ 0x41, 0x02, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2e, 0x0a, 0x0f, 0x42, 0x69,
+ 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1b, 0x0a,
+ 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0,
+ 0x41, 0x02, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0xc5, 0x04, 0x0a, 0x0f, 0x57,
+ 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3a,
+ 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02,
+ 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x0e, 0x70, 0x72,
+ 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x07, 0x20, 0x01,
+ 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69,
+ 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20,
+ 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69,
+ 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74,
+ 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14,
+ 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d,
+ 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65,
+ 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65,
+ 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63,
+ 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61,
+ 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d,
+ 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74,
+ 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52,
+ 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x23,
+ 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01,
+ 0x28, 0x08, 0x48, 0x05, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65,
+ 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f,
+ 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d,
+ 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61,
+ 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61,
+ 0x74, 0x63, 0x68, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73,
+ 0x69, 0x7a, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62,
+ 0x6c, 0x65, 0x22, 0x87, 0x04, 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x09, 0x75, 0x70, 0x6c,
+ 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08,
+ 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x50, 0x0a, 0x11, 0x77, 0x72, 0x69, 0x74,
+ 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
+ 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65,
+ 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x72,
+ 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+ 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73,
+ 0x65, 0x74, 0x12, 0x4f, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65,
+ 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
+ 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61,
+ 0x48, 0x01, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44,
+ 0x61, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68,
+ 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d,
+ 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68,
+ 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73,
+ 0x68, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12,
+ 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18,
+ 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
+ 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+ 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72,
+ 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+ 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72,
+ 0x61, 0x6d, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x73,
+ 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x01, 0x0a,
+ 0x13, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65,
+ 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d,
+ 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x37, 0x0a,
+ 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f,
+ 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xe9, 0x03, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x65, 0x6e,
+ 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x06, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02,
+ 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,
+ 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02,
+ 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x17,
+ 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52,
+ 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f,
0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e,
- 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xe5, 0x07, 0x0a, 0x14, 0x43, 0x6f, 0x6d,
- 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01,
+ 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a,
+ 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06,
+ 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54,
+ 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65,
+ 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c,
+ 0x65, 0x48, 0x03, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65,
+ 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42,
+ 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42,
+ 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65,
+ 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64,
+ 0x6c, 0x65, 0x22, 0xa3, 0x05, 0x0a, 0x16, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65,
+ 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a,
+ 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x48, 0x00, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x50, 0x0a, 0x11,
+ 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65,
+ 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74,
+ 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x0f, 0x77,
+ 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x53,
+ 0x0a, 0x12, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,
+ 0x73, 0x70, 0x65, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x41,
+ 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x48,
+ 0x00, 0x52, 0x10, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53,
+ 0x70, 0x65, 0x63, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66,
+ 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b,
+ 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x4f, 0x0a, 0x10, 0x63,
+ 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
+ 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73,
+ 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x01, 0x52, 0x0f, 0x63, 0x68, 0x65,
+ 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x10,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73,
+ 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x12, 0x60, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
- 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71,
- 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x1a, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f,
- 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18,
- 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x64, 0x65,
- 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,
- 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a,
- 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01,
- 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x07, 0x6b, 0x6d,
- 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01,
- 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79,
- 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x72,
- 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,
- 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07,
- 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
- 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61,
- 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61,
- 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65,
- 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
- 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65,
- 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x1a, 0xb3, 0x02, 0x0a, 0x0c, 0x53, 0x6f, 0x75, 0x72, 0x63,
- 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
- 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x80, 0x01, 0x0a, 0x14, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
- 0x5f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03,
- 0x20, 0x01, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
- 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65,
- 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x03,
- 0xe0, 0x41, 0x01, 0x52, 0x13, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f,
- 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x62, 0x0a, 0x13, 0x4f, 0x62, 0x6a, 0x65,
- 0x63, 0x74, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
- 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11,
- 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63,
- 0x68, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65,
- 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x16, 0x0a, 0x14,
- 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d,
- 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x22, 0xec, 0x04, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f,
- 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52,
- 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65,
- 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a,
- 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48,
- 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e,
- 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66,
- 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69,
- 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
- 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65,
- 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74,
- 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18,
- 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x72, 0x0a, 0x1c, 0x63,
+ 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
+ 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73,
+ 0x12, 0x26, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70,
+ 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x6c, 0x75, 0x73,
+ 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x66, 0x6c,
+ 0x75, 0x73, 0x68, 0x12, 0x26, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f, 0x77, 0x72,
+ 0x69, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b,
+ 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x72, 0x0a, 0x1c, 0x63,
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
@@ -8142,1833 +8649,1367 @@ var file_google_storage_v2_storage_proto_rawDesc = []byte{
0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42,
0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65,
0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42,
- 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61,
- 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42,
- 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22,
- 0xd8, 0x05, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f,
- 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52,
- 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x73,
- 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f,
- 0x6b, 0x65, 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,
- 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61,
- 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63,
- 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,
- 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,
- 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,
- 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74,
- 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04,
- 0x52, 0x0d, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x63, 0x6c, 0x88,
- 0x01, 0x01, 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a,
+ 0x0f, 0x0a, 0x0d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+ 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe8, 0x01, 0x0a, 0x17, 0x42, 0x69, 0x64,
+ 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70,
+ 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65,
+ 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d,
+ 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x37, 0x0a,
+ 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f,
+ 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
+ 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65,
+ 0x48, 0x01, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x88,
+ 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74,
+ 0x75, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e,
+ 0x64, 0x6c, 0x65, 0x22, 0x9e, 0x05, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x61,
+ 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa,
+ 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x61, 0x67,
+ 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41,
+ 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70,
+ 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12,
+ 0x21, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74,
+ 0x65, 0x72, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x72,
+ 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x69,
+ 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18,
+ 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66,
+ 0x69, 0x78, 0x12, 0x1f, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69,
+ 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b,
+ 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61,
+ 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01,
+ 0x01, 0x12, 0x34, 0x0a, 0x13, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68,
+ 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x52, 0x12, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68,
+ 0x69, 0x63, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x6c, 0x65, 0x78, 0x69, 0x63,
+ 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01,
+ 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67,
+ 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x12, 0x26, 0x0a, 0x0c, 0x73, 0x6f, 0x66,
+ 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+ 0x64, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x66, 0x6f, 0x6c,
+ 0x64, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73,
+ 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x63,
+ 0x6c, 0x75, 0x64, 0x65, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x41, 0x73, 0x50, 0x72, 0x65,
+ 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x67,
+ 0x6c, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x47, 0x6c, 0x6f, 0x62, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c,
+ 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06,
+ 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f,
+ 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xaf, 0x01, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72,
+ 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x12, 0x20, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,
+ 0x49, 0x64, 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a,
0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61,
- 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d,
0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d,
0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65,
- 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a,
- 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69,
- 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65,
- 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74,
- 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f,
- 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x6c, 0x22, 0x3f, 0x0a, 0x1b, 0x43, 0x61,
- 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69,
- 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x70, 0x6c,
- 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
- 0x02, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x43,
- 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72,
- 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, 0x06, 0x0a, 0x11,
- 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,
- 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a,
- 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,
- 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65,
- 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x72, 0x65,
- 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x22, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64,
- 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41,
- 0x01, 0x52, 0x09, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x13,
+ 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79,
+ 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64,
+ 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d, 0x70,
+ 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x37, 0x0a, 0x08,
+ 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
+ 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73,
+ 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xea, 0x0e, 0x0a, 0x14, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74,
+ 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31,
+ 0x0a, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61,
+ 0x6d, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05,
+ 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d,
+ 0x65, 0x12, 0x57, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x42, 0x28, 0xe0,
+ 0x41, 0x02, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x59, 0x0a, 0x13, 0x64, 0x65,
+ 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65,
+ 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x23, 0x0a,
+ 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b,
+ 0x65, 0x79, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b,
+ 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74,
+ 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25,
+ 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,
+ 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x30, 0x0a,
+ 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x77,
+ 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x1a, 0x64, 0x65, 0x73,
+ 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69,
+ 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x18, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50,
+ 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13,
0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61,
- 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47,
+ 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47,
0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,
0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01,
+ 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01,
0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a,
0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,
+ 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02,
0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66,
0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x48,
+ 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x48,
0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x72,
+ 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x40,
+ 0x0a, 0x1a, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01,
+ 0x28, 0x03, 0x48, 0x04, 0x52, 0x17, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01,
+ 0x12, 0x47, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, 0x52, 0x1a, 0x69, 0x66, 0x53, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f,
+ 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x1e, 0x69, 0x66, 0x5f,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28,
+ 0x03, 0x48, 0x06, 0x52, 0x1b, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74,
+ 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68,
+ 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x22, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x48,
+ 0x07, 0x52, 0x1e, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63,
+ 0x68, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x1c, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65,
+ 0x73, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f,
+ 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
+ 0x18, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74,
+ 0x65, 0x6e, 0x50, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x4c, 0x0a, 0x20, 0x63, 0x6f, 0x70,
+ 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x10, 0x20,
+ 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x1d, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c,
+ 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x4b, 0x0a, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x5f,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28,
+ 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x1c, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x42,
+ 0x79, 0x74, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x27, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b,
+ 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18,
+ 0x16, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x22, 0x63, 0x6f, 0x70, 0x79,
+ 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x4b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x72,
0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,
- 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a,
+ 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x13,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f,
0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61,
0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f,
0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61,
- 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18,
- 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73,
- 0x6b, 0x48, 0x04, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01,
- 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f,
+ 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65,
+ 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
+ 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65,
+ 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a,
+ 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69,
+ 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65,
+ 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74,
+ 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e,
+ 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x25, 0x0a, 0x23, 0x5f,
+ 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x22, 0xd6, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f,
+ 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79, 0x74, 0x65,
+ 0x73, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,
+ 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64,
+ 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12,
+ 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
+ 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54,
+ 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xec, 0x07, 0x0a, 0x11,
+ 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x32, 0x0a, 0x12, 0x64, 0x65,
+ 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x11, 0x64, 0x65, 0x73,
+ 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x45,
+ 0x0a, 0x1a, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01,
+ 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x00, 0x52, 0x17, 0x69, 0x66, 0x53, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74,
+ 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f,
+ 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x48, 0x01, 0x52, 0x1a, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68,
+ 0x88, 0x01, 0x01, 0x12, 0x4d, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01,
+ 0x48, 0x02, 0x52, 0x1b, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61,
+ 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,
+ 0x01, 0x01, 0x12, 0x54, 0x0a, 0x22, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f,
+ 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e,
+ 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x48, 0x03, 0x52, 0x1e, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d,
+ 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74,
+ 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,
+ 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x04, 0x52, 0x11, 0x69, 0x66,
+ 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,
+ 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x09, 0x20,
+ 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x05, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68,
+ 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0a,
+ 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x06, 0x52, 0x15, 0x69, 0x66, 0x4d,
+ 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74,
+ 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,
0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d,
- 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,
+ 0x61, 0x74, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48,
+ 0x07, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x1d,
+ 0x0a, 0x1b, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e,
+ 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a,
+ 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0x98,
- 0x06, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,
- 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12,
- 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,
- 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0c, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c,
- 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x6f,
- 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13,
- 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61,
- 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x11, 0x69, 0x66, 0x47,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,
- 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01,
- 0x28, 0x03, 0x48, 0x02, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a,
- 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03,
- 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66,
- 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48,
- 0x04, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x72,
+ 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d,
+ 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61,
+ 0x74, 0x63, 0x68, 0x42, 0x25, 0x0a, 0x23, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63,
+ 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69,
+ 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a,
+ 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69,
+ 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb9, 0x02, 0x0a, 0x1a, 0x53,
+ 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69,
+ 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x11, 0x77, 0x72, 0x69,
+ 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0f, 0x77,
+ 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x72,
0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,
- 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08,
+ 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f,
0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61,
0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f,
0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61,
- 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18,
- 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+ 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65,
+ 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
+ 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65,
+ 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x22, 0x3a, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52,
+ 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f,
+ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,
+ 0x49, 0x64, 0x22, 0xd6, 0x05, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48,
+ 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
+ 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,
+ 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68,
+ 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01,
+ 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67,
+ 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63,
+ 0x68, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e,
+ 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
+ 0x01, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c,
+ 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18,
+ 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73,
- 0x6b, 0x48, 0x05, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01,
- 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65,
- 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x72, 0x65,
- 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x73,
- 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f,
+ 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61,
+ 0x73, 0x6b, 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61,
+ 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d,
+ 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d,
+ 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x43, 0x0a, 0x1b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69,
+ 0x64, 0x65, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x74, 0x65,
+ 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01,
+ 0x52, 0x19, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x65, 0x64, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f,
0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61,
0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42,
0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f,
0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f,
- 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xaf, 0x02, 0x0a, 0x12, 0x52, 0x65,
- 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x12, 0x4d, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f,
- 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43,
- 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0f,
- 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12,
- 0x4d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73,
- 0x75, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x52, 0x0f, 0x6f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x44,
- 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18,
- 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
- 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
- 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52,
- 0x61, 0x6e, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
- 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
- 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd0, 0x06, 0x0a, 0x12,
- 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70,
- 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63,
- 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23,
- 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,
- 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,
- 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61,
- 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63,
- 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,
- 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01,
- 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,
- 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74,
- 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f,
- 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70,
- 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
+ 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xce, 0x01, 0x0a, 0x19,
0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19,
- 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x40, 0x0a, 0x09, 0x72, 0x65, 0x61,
- 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46,
- 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x02, 0x18, 0x01, 0x48, 0x04, 0x52, 0x08,
- 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x0b, 0x72,
- 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e,
- 0x64, 0x6c, 0x65, 0x48, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c,
- 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f,
- 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0c, 0x72,
- 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x16,
- 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65,
- 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,
- 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65,
- 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e,
- 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0c,
- 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x42, 0x0e, 0x0a, 0x0c,
- 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e,
- 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb1,
- 0x01, 0x0a, 0x15, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x64,
- 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e,
- 0x72, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x42,
- 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x08, 0x20,
- 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67,
- 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67,
- 0x65, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x16, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a,
- 0x12, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x61, 0x6e,
- 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x6f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12,
- 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28,
- 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65,
- 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x42, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68,
- 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
- 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x0a,
- 0x72, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x1d, 0x42,
- 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x64,
- 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x42, 0x0a, 0x0b,
- 0x72, 0x65, 0x61, 0x64, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61,
- 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65,
- 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65,
- 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69,
- 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72,
- 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xed, 0x01, 0x0a,
- 0x1e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
- 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12,
- 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e,
- 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69,
- 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
- 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e,
- 0x64, 0x6c, 0x65, 0x48, 0x01, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64,
- 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x0a, 0x67, 0x65, 0x6e,
- 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72,
- 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d,
- 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x42, 0x0d, 0x0a,
- 0x0b, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x64, 0x0a, 0x13,
- 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x72,
- 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67,
- 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72, 0x6f,
- 0x72, 0x52, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x72, 0x72, 0x6f,
- 0x72, 0x73, 0x22, 0x55, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x45,
- 0x72, 0x72, 0x6f, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64, 0x12, 0x2a, 0x0a,
- 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e,
- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
- 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x75, 0x0a, 0x09, 0x52, 0x65, 0x61,
- 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f,
- 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02,
- 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0b,
- 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x65, 0x6e, 0x67,
- 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
- 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x49, 0x64,
- 0x22, 0xba, 0x01, 0x0a, 0x0f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65,
- 0x44, 0x61, 0x74, 0x61, 0x12, 0x4d, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d,
- 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61,
- 0x74, 0x61, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44,
- 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67,
- 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64,
- 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x72, 0x65, 0x61, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65,
- 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20,
- 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x6e, 0x64, 0x22, 0x2d, 0x0a,
- 0x0e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12,
- 0x1b, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42,
- 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x2e, 0x0a, 0x0f,
- 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12,
- 0x1b, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42,
- 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0xc5, 0x04, 0x0a,
- 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63,
- 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0,
- 0x41, 0x02, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x0e,
- 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x07,
- 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65,
- 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,
- 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a,
- 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e,
- 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01,
- 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f,
- 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f,
- 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d,
- 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66,
- 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61,
- 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74,
- 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f,
- 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69,
- 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e,
- 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48,
- 0x04, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01,
- 0x12, 0x23, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09,
- 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62,
- 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e,
- 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a,
- 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66,
- 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74,
- 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f,
- 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
- 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64,
- 0x61, 0x62, 0x6c, 0x65, 0x22, 0x87, 0x04, 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x09, 0x75,
- 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00,
- 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x50, 0x0a, 0x11, 0x77, 0x72,
- 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
- 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x0f, 0x77, 0x72, 0x69,
- 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x26, 0x0a, 0x0c,
- 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01,
- 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x66,
- 0x66, 0x73, 0x65, 0x74, 0x12, 0x4f, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d,
- 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61,
- 0x74, 0x61, 0x48, 0x01, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65,
- 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,
- 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
- 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73,
- 0x75, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
- 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x66, 0x69, 0x6e,
- 0x69, 0x73, 0x68, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x57, 0x72, 0x69, 0x74,
- 0x65, 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65,
- 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d,
- 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,
- 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,
- 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d,
- 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,
- 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6d,
- 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87,
- 0x01, 0x0a, 0x13, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73,
- 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00,
- 0x52, 0x0d, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12,
- 0x37, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08,
- 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74,
- 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xe9, 0x03, 0x0a, 0x10, 0x41, 0x70, 0x70,
- 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a,
- 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0,
- 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x06,
- 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
- 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e,
- 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0,
- 0x41, 0x02, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b,
- 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48,
- 0x00, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69,
- 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03,
- 0x48, 0x01, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,
- 0x28, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
- 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e,
- 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69,
- 0x74, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
- 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e,
- 0x64, 0x6c, 0x65, 0x48, 0x03, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64,
- 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74,
- 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63,
- 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
- 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63,
- 0x68, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f,
- 0x6b, 0x65, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x61,
- 0x6e, 0x64, 0x6c, 0x65, 0x22, 0xa3, 0x05, 0x0a, 0x16, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69,
- 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
- 0x1d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x50,
- 0x0a, 0x11, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73,
- 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72,
- 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52,
- 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63,
- 0x12, 0x53, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
- 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65,
- 0x63, 0x48, 0x00, 0x52, 0x10, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f,
- 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x02,
- 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x4f, 0x0a,
- 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74,
- 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63,
- 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x48, 0x01, 0x52, 0x0f, 0x63,
- 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x52,
- 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75,
- 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a,
- 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41,
- 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75,
- 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b,
- 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x73,
- 0x74, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x12, 0x19, 0x0a, 0x05, 0x66, 0x6c,
- 0x75, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05,
- 0x66, 0x6c, 0x75, 0x73, 0x68, 0x12, 0x26, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x5f,
- 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01,
- 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x72, 0x0a,
- 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d,
- 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d,
- 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,
- 0x67, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe8, 0x01, 0x0a, 0x17, 0x42,
- 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73,
- 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00,
- 0x52, 0x0d, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12,
- 0x37, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08,
- 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74,
- 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64,
- 0x6c, 0x65, 0x48, 0x01, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c,
- 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74,
- 0x61, 0x74, 0x75, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68,
- 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x9e, 0x05, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06,
- 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41,
- 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x70,
- 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03,
- 0xe0, 0x41, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a,
- 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,
- 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65,
- 0x6e, 0x12, 0x21, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x04,
- 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d,
- 0x69, 0x74, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f,
- 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74,
- 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x69,
- 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x44, 0x65,
- 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69,
- 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x70, 0x72,
- 0x65, 0x66, 0x69, 0x78, 0x12, 0x1f, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73,
- 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x76, 0x65, 0x72,
- 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61,
- 0x73, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,
- 0x4d, 0x61, 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x73, 0x6b,
- 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61,
- 0x70, 0x68, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x12, 0x6c, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61,
- 0x70, 0x68, 0x69, 0x63, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x6c, 0x65, 0x78,
- 0x69, 0x63, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0b,
- 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x6c, 0x65, 0x78, 0x69, 0x63,
- 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x12, 0x26, 0x0a, 0x0c, 0x73,
- 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28,
- 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65,
- 0x74, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x66,
- 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
- 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x69,
- 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x41, 0x73, 0x50,
- 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01,
- 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x47, 0x6c, 0x6f, 0x62, 0x12, 0x1b, 0x0a, 0x06, 0x66,
- 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01,
- 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61,
- 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xaf, 0x01, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79,
- 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f,
- 0x61, 0x64, 0x49, 0x64, 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61,
- 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43,
- 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63,
- 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, 0x51, 0x75, 0x65,
- 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73,
- 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74,
- 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52,
- 0x0d, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x37,
- 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72,
- 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65,
- 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xea, 0x0e, 0x0a, 0x14, 0x52, 0x65, 0x77, 0x72,
- 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x12, 0x31, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0,
- 0x41, 0x05, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e,
- 0x61, 0x6d, 0x65, 0x12, 0x57, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x42,
- 0x28, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63,
- 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69,
- 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x59, 0x0a, 0x13,
- 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x6d, 0x73, 0x5f,
- 0x6b, 0x65, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41,
- 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74,
- 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69,
- 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
- 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x64, 0x65,
- 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x0d, 0x73, 0x6f, 0x75,
- 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,
- 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f,
- 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
- 0x02, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12,
- 0x30, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
- 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b,
- 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x72,
- 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x1a, 0x64,
- 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x64, 0x65,
- 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33,
- 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x11, 0x69,
- 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68,
- 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08,
- 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12,
- 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03,
- 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b,
- 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28,
- 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01,
- 0x12, 0x40, 0x0a, 0x1a, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65,
- 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0b,
- 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x17, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,
- 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,
- 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d,
- 0x61, 0x74, 0x63, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, 0x52, 0x1a, 0x69, 0x66,
- 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x1e, 0x69,
- 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
- 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0d, 0x20,
- 0x01, 0x28, 0x03, 0x48, 0x06, 0x52, 0x1b, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d,
- 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74,
- 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x22, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72,
- 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28,
- 0x03, 0x48, 0x07, 0x52, 0x1e, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74,
- 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61,
- 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x1c, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79,
- 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x65,
- 0x72, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41,
- 0x01, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x77, 0x72, 0x69,
- 0x74, 0x74, 0x65, 0x6e, 0x50, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x4c, 0x0a, 0x20, 0x63,
- 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79,
- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18,
- 0x10, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x1d, 0x63, 0x6f, 0x70, 0x79,
- 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
- 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x4b, 0x0a, 0x20, 0x63, 0x6f, 0x70,
- 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74,
- 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x15, 0x20,
- 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x1c, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65,
- 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x27, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73,
- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x62, 0x79, 0x74, 0x65,
- 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x22, 0x63, 0x6f,
- 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73,
- 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73,
- 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
- 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,
- 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61,
- 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
- 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61,
- 0x72, 0x61, 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63,
- 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75,
- 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43,
- 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x66, 0x5f,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18,
- 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x69, 0x66, 0x5f,
- 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e,
- 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x66, 0x5f,
- 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73,
- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69,
- 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
- 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x25, 0x0a,
- 0x23, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d,
- 0x61, 0x74, 0x63, 0x68, 0x22, 0xd6, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61,
- 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65,
- 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79,
- 0x74, 0x65, 0x73, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b,
- 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x03, 0x52, 0x0a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a,
- 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e,
- 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x6b,
- 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74,
- 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
- 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a,
- 0x65, 0x63, 0x74, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xec, 0x07,
- 0x0a, 0x11, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x02, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,
- 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a,
- 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c,
- 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x32, 0x0a, 0x12,
- 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65,
- 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x11, 0x64,
- 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
- 0x12, 0x45, 0x0a, 0x1a, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65,
- 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04,
- 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x00, 0x52, 0x17, 0x69, 0x66, 0x53,
- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
- 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x48, 0x01, 0x52, 0x1a, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65,
- 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74,
- 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x4d, 0x0a, 0x1e, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72,
- 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0,
- 0x41, 0x01, 0x48, 0x02, 0x52, 0x1b, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65,
- 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63,
- 0x68, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x22, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63,
- 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x03, 0x52, 0x1e, 0x69, 0x66, 0x53, 0x6f, 0x75, 0x72, 0x63,
- 0x65, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e,
- 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x13, 0x69, 0x66,
- 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63,
- 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x04, 0x52, 0x11,
- 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63,
- 0x68, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,
- 0x09, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x05, 0x52, 0x14, 0x69, 0x66,
- 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74,
- 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x06, 0x52, 0x15, 0x69,
- 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
- 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65,
- 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74,
- 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41,
- 0x01, 0x48, 0x07, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01,
- 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42,
- 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65,
- 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74,
- 0x63, 0x68, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
- 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x25, 0x0a, 0x23, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x6f, 0x75,
- 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x16, 0x0a, 0x14,
- 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d,
- 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65,
- 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,
- 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a, 0x1c,
- 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb9, 0x02, 0x0a,
- 0x1a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57,
- 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x11, 0x77,
- 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
- 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65,
- 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,
- 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x70, 0x65, 0x63,
- 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
- 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,
- 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61,
- 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
- 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61,
- 0x72, 0x61, 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63,
- 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75,
- 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43,
- 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x22, 0x3a, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72,
- 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61,
- 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f,
- 0x61, 0x64, 0x49, 0x64, 0x22, 0xd6, 0x05, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x06,
- 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
- 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x6f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x12, 0x33, 0x0a, 0x13, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x03, 0x48, 0x00, 0x52, 0x11, 0x69, 0x66, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x66, 0x5f,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d,
- 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x14, 0x69, 0x66,
- 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x74,
- 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
- 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x15, 0x69, 0x66, 0x4d, 0x65, 0x74, 0x61,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x88,
- 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
- 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63,
- 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x18, 0x69, 0x66, 0x4d, 0x65, 0x74,
- 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x4d, 0x61,
- 0x74, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66,
- 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
- 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x41,
- 0x63, 0x6c, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73,
- 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d,
- 0x61, 0x73, 0x6b, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
- 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x72, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61,
- 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43,
- 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x19, 0x63,
- 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x43, 0x0a, 0x1b, 0x6f, 0x76, 0x65, 0x72,
- 0x72, 0x69, 0x64, 0x65, 0x5f, 0x75, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x72, 0x65,
- 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0,
- 0x41, 0x01, 0x52, 0x19, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x55, 0x6e, 0x6c, 0x6f,
- 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x16, 0x0a,
- 0x14, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x67, 0x65, 0x6e,
- 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63,
- 0x68, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e,
- 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x1e, 0x0a,
- 0x1c, 0x5f, 0x69, 0x66, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
- 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xce, 0x01,
- 0x0a, 0x19, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x36, 0x0a, 0x14, 0x65,
- 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69,
- 0x74, 0x68, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x13,
- 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69,
- 0x74, 0x68, 0x6d, 0x12, 0x35, 0x0a, 0x14, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28,
- 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x1b, 0x65, 0x6e,
- 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61,
- 0x32, 0x35, 0x36, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
- 0x4b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xca,
- 0x05, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61,
- 0x6e, 0x74, 0x73, 0x22, 0xb5, 0x05, 0x0a, 0x06, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x16,
- 0x0a, 0x12, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49,
- 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x14, 0x4d, 0x41, 0x58, 0x5f, 0x52, 0x45,
- 0x41, 0x44, 0x5f, 0x43, 0x48, 0x55, 0x4e, 0x4b, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80,
- 0x80, 0x80, 0x01, 0x12, 0x1c, 0x0a, 0x15, 0x4d, 0x41, 0x58, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45,
+ 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x36, 0x0a, 0x14, 0x65, 0x6e, 0x63,
+ 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68,
+ 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x13, 0x65, 0x6e,
+ 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68,
+ 0x6d, 0x12, 0x35, 0x0a, 0x14, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x1b, 0x65, 0x6e, 0x63, 0x72,
+ 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35,
+ 0x36, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x18, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65,
+ 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xca, 0x05, 0x0a,
+ 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74,
+ 0x73, 0x22, 0xb5, 0x05, 0x0a, 0x06, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x12,
+ 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
+ 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x14, 0x4d, 0x41, 0x58, 0x5f, 0x52, 0x45, 0x41, 0x44,
0x5f, 0x43, 0x48, 0x55, 0x4e, 0x4b, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x80, 0x80,
- 0x01, 0x12, 0x19, 0x0a, 0x12, 0x4d, 0x41, 0x58, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f,
- 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x4d, 0x42, 0x10, 0x80, 0x80, 0xc0, 0x02, 0x12, 0x29, 0x0a, 0x24,
- 0x4d, 0x41, 0x58, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44,
- 0x41, 0x54, 0x41, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x42,
- 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x08, 0x12, 0x2a, 0x0a, 0x25, 0x4d, 0x41, 0x58, 0x5f, 0x43,
- 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x46,
- 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53,
- 0x10, 0x80, 0x20, 0x12, 0x29, 0x0a, 0x24, 0x4d, 0x41, 0x58, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f,
- 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c,
- 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x40, 0x12, 0x2a,
- 0x0a, 0x24, 0x4d, 0x41, 0x58, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x45, 0x54,
- 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45,
- 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0xa0, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x41,
- 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43,
- 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45,
- 0x54, 0x10, 0x64, 0x12, 0x22, 0x0a, 0x1e, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x49, 0x46, 0x45, 0x43,
- 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x42,
- 0x55, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x64, 0x12, 0x26, 0x0a, 0x22, 0x4d, 0x41, 0x58, 0x5f, 0x4e,
- 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54,
- 0x4f, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x53, 0x10, 0x05, 0x12,
- 0x31, 0x0a, 0x2c, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54,
- 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49,
- 0x42, 0x55, 0x54, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10,
- 0x80, 0x02, 0x12, 0x33, 0x0a, 0x2e, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49,
- 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x41, 0x54,
- 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4c, 0x45,
- 0x4e, 0x47, 0x54, 0x48, 0x10, 0x80, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, 0x58, 0x5f, 0x4c,
- 0x41, 0x42, 0x45, 0x4c, 0x53, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x49, 0x45, 0x53, 0x5f, 0x43, 0x4f,
- 0x55, 0x4e, 0x54, 0x10, 0x40, 0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41, 0x42,
- 0x45, 0x4c, 0x53, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4c, 0x45,
- 0x4e, 0x47, 0x54, 0x48, 0x10, 0x3f, 0x12, 0x1f, 0x0a, 0x1a, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41,
- 0x42, 0x45, 0x4c, 0x53, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x42,
- 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x01, 0x12, 0x2e, 0x0a, 0x29, 0x4d, 0x41, 0x58, 0x5f, 0x4f,
- 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x44, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x44, 0x45,
- 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x53, 0x5f, 0x52, 0x45, 0x51,
- 0x55, 0x45, 0x53, 0x54, 0x10, 0xe8, 0x07, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x50, 0x4c, 0x49, 0x54,
- 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44,
- 0x5f, 0x44, 0x41, 0x59, 0x53, 0x10, 0x0e, 0x1a, 0x02, 0x10, 0x01, 0x22, 0xb5, 0x37, 0x0a, 0x06,
- 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
- 0x20, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49,
- 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52,
- 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x2d, 0x0a, 0x2b,
- 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x6e,
- 0x61, 0x67, 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,
- 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f,
- 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65,
- 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41,
- 0x03, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x12, 0x1f, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20,
- 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74,
- 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c,
- 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x0d,
- 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x07, 0x20,
- 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x03, 0x72, 0x70, 0x6f, 0x18, 0x1b, 0x20,
- 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x03, 0x72, 0x70, 0x6f, 0x12, 0x3d, 0x0a,
- 0x03, 0x61, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72,
- 0x6f, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x59, 0x0a, 0x12,
- 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61,
- 0x63, 0x6c, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a,
- 0x65, 0x63, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x46, 0x0a, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63,
- 0x79, 0x63, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x12,
- 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b,
- 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,
- 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d,
- 0x65, 0x12, 0x37, 0x0a, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32,
- 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
- 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x43, 0x6f, 0x72, 0x73, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70,
- 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 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, 0x42, 0x03, 0xe0, 0x41, 0x03,
- 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x18,
- 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61,
- 0x73, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03,
- 0xe0, 0x41, 0x01, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x76, 0x65, 0x6e,
- 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x48, 0x6f, 0x6c, 0x64, 0x12, 0x42, 0x0a, 0x06, 0x6c, 0x61,
- 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x01, 0x12, 0x1c, 0x0a, 0x15, 0x4d, 0x41, 0x58, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x5f, 0x43,
+ 0x48, 0x55, 0x4e, 0x4b, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x80, 0x80, 0x01, 0x12,
+ 0x19, 0x0a, 0x12, 0x4d, 0x41, 0x58, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x49,
+ 0x5a, 0x45, 0x5f, 0x4d, 0x42, 0x10, 0x80, 0x80, 0xc0, 0x02, 0x12, 0x29, 0x0a, 0x24, 0x4d, 0x41,
+ 0x58, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54,
+ 0x41, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x42, 0x59, 0x54,
+ 0x45, 0x53, 0x10, 0x80, 0x08, 0x12, 0x2a, 0x0a, 0x25, 0x4d, 0x41, 0x58, 0x5f, 0x43, 0x55, 0x53,
+ 0x54, 0x4f, 0x4d, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x46, 0x49, 0x45,
+ 0x4c, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80,
+ 0x20, 0x12, 0x29, 0x0a, 0x24, 0x4d, 0x41, 0x58, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f,
+ 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53,
+ 0x49, 0x5a, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0x40, 0x12, 0x2a, 0x0a, 0x24,
+ 0x4d, 0x41, 0x58, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44,
+ 0x41, 0x54, 0x41, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x42,
+ 0x59, 0x54, 0x45, 0x53, 0x10, 0x80, 0xa0, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x41, 0x58, 0x5f,
+ 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e,
+ 0x46, 0x49, 0x47, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x10,
+ 0x64, 0x12, 0x22, 0x0a, 0x1e, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x49, 0x46, 0x45, 0x43, 0x59, 0x43,
+ 0x4c, 0x45, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x42, 0x55, 0x43,
+ 0x4b, 0x45, 0x54, 0x10, 0x64, 0x12, 0x26, 0x0a, 0x22, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54,
+ 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d,
+ 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x53, 0x10, 0x05, 0x12, 0x31, 0x0a,
+ 0x2c, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f,
+ 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52, 0x49, 0x42, 0x55,
+ 0x54, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x80, 0x02,
+ 0x12, 0x33, 0x0a, 0x2e, 0x4d, 0x41, 0x58, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41,
+ 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x52,
+ 0x49, 0x42, 0x55, 0x54, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47,
+ 0x54, 0x48, 0x10, 0x80, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41, 0x42,
+ 0x45, 0x4c, 0x53, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x49, 0x45, 0x53, 0x5f, 0x43, 0x4f, 0x55, 0x4e,
+ 0x54, 0x10, 0x40, 0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c,
+ 0x53, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47,
+ 0x54, 0x48, 0x10, 0x3f, 0x12, 0x1f, 0x0a, 0x1a, 0x4d, 0x41, 0x58, 0x5f, 0x4c, 0x41, 0x42, 0x45,
+ 0x4c, 0x53, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x42, 0x59, 0x54,
+ 0x45, 0x53, 0x10, 0x80, 0x01, 0x12, 0x2e, 0x0a, 0x29, 0x4d, 0x41, 0x58, 0x5f, 0x4f, 0x42, 0x4a,
+ 0x45, 0x43, 0x54, 0x5f, 0x49, 0x44, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45,
+ 0x54, 0x45, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45,
+ 0x53, 0x54, 0x10, 0xe8, 0x07, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x50, 0x4c, 0x49, 0x54, 0x5f, 0x54,
+ 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x44,
+ 0x41, 0x59, 0x53, 0x10, 0x0e, 0x1a, 0x02, 0x10, 0x01, 0x22, 0xb5, 0x37, 0x0a, 0x06, 0x42, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x08, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a,
+ 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12,
+ 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65,
+ 0x74, 0x61, 0x67, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x2d, 0x0a, 0x2b, 0x63, 0x6c,
+ 0x6f, 0x75, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x67,
+ 0x65, 0x72, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+ 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+ 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52,
+ 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x1f, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28,
+ 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x12, 0x28, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70,
+ 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c, 0x6c, 0x6f,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28,
+ 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43,
+ 0x6c, 0x61, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x03, 0x72, 0x70, 0x6f, 0x18, 0x1b, 0x20, 0x01, 0x28,
+ 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x03, 0x72, 0x70, 0x6f, 0x12, 0x3d, 0x0a, 0x03, 0x61,
+ 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x59, 0x0a, 0x12, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x63, 0x6c,
+ 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x41, 0x63, 0x6c, 0x12, 0x46, 0x0a, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63,
+ 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x40, 0x0a,
+ 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 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, 0x42, 0x03,
+ 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12,
+ 0x37, 0x0a, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x43, 0x6f, 0x72, 0x73, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a,
+ 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x18, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65,
+ 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41,
+ 0x01, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42,
+ 0x61, 0x73, 0x65, 0x64, 0x48, 0x6f, 0x6c, 0x64, 0x12, 0x42, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x07,
+ 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49,
+ 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x11, 0x20, 0x01,
+ 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
+ 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x56, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x76,
+ 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x40, 0x0a, 0x07, 0x6c, 0x6f, 0x67,
+ 0x67, 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72,
- 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x40,
- 0x0a, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
- 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69,
- 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65,
- 0x12, 0x49, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x11,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x05, 0x6f,
+ 0x77, 0x6e, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f,
+ 0x77, 0x6e, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72,
+ 0x12, 0x49, 0x0a, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e,
- 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
- 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x40, 0x0a, 0x07, 0x6c,
- 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67,
+ 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
+ 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x07, 0x62,
+ 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
- 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a,
- 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67,
+ 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x59, 0x0a,
+ 0x10, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63,
+ 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x2e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69,
+ 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69,
+ 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0a, 0x69, 0x61, 0x6d, 0x5f,
+ 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
- 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x6f, 0x77, 0x6e,
- 0x65, 0x72, 0x12, 0x49, 0x0a, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
- 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
- 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41,
- 0x01, 0x52, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a,
- 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e,
- 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x12,
- 0x59, 0x0a, 0x10, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c,
- 0x69, 0x63, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f,
- 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x65, 0x6e,
- 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x47, 0x0a, 0x0a, 0x69, 0x61,
- 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x61, 0x6d, 0x43, 0x6f, 0x6e,
- 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x69, 0x61, 0x6d, 0x43, 0x6f, 0x6e,
- 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x73,
- 0x5f, 0x70, 0x7a, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
- 0x0c, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x73, 0x50, 0x7a, 0x73, 0x12, 0x6c, 0x0a,
- 0x17, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e,
- 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d,
- 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x15, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6c, 0x61, 0x63,
- 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x46, 0x0a, 0x09, 0x61,
- 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6c,
- 0x61, 0x73, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6c,
- 0x61, 0x73, 0x73, 0x12, 0x6b, 0x0a, 0x16, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69,
- 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x20, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x48,
- 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73,
- 0x70, 0x61, 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x15, 0x68, 0x69, 0x65, 0x72, 0x61,
- 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65,
- 0x12, 0x5d, 0x0a, 0x12, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f,
- 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67,
+ 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+ 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x69, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+ 0x67, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x73, 0x5f, 0x70,
+ 0x7a, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x73,
+ 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x73, 0x50, 0x7a, 0x73, 0x12, 0x6c, 0x0a, 0x17, 0x63,
+ 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
+ 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
- 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65,
- 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x73,
- 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12,
- 0x59, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74,
- 0x69, 0x6f, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e,
- 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x09, 0x69, 0x70,
- 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e,
- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
- 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65,
- 0x72, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x00, 0x52, 0x08, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x74,
- 0x65, 0x72, 0x88, 0x01, 0x01, 0x1a, 0x35, 0x0a, 0x07, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67,
- 0x12, 0x2a, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x61,
- 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x72,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x50, 0x61, 0x79, 0x73, 0x1a, 0x9b, 0x01, 0x0a,
- 0x04, 0x43, 0x6f, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18,
- 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67,
- 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x03,
- 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12,
- 0x2c, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64,
- 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x72,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a,
- 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73,
- 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x6d, 0x61, 0x78,
- 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x1a, 0xa0, 0x0b, 0x0a, 0x0a, 0x45,
- 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x0f, 0x64, 0x65, 0x66,
- 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75,
- 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e,
- 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x64,
- 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0xb7, 0x01, 0x0a,
- 0x2c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f,
- 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72,
- 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x4d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x45,
- 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66,
- 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x00, 0x52, 0x28, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e,
- 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0xbd, 0x01, 0x0a, 0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f,
- 0x6d, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x72,
- 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65,
- 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x4f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
- 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79,
- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4d, 0x61,
+ 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6c,
+ 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x15, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d,
+ 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x46, 0x0a, 0x09, 0x61, 0x75, 0x74,
+ 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
+ 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x12, 0x6b, 0x0a, 0x16, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61,
+ 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x48, 0x69, 0x65,
+ 0x72, 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
+ 0x63, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x15, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63,
+ 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5d,
+ 0x0a, 0x12, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x70, 0x6f,
+ 0x6c, 0x69, 0x63, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+ 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x73, 0x6f, 0x66,
+ 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x59, 0x0a,
+ 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f,
+ 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69,
+ 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,
+ 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66,
+ 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
+ 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x48, 0x00, 0x52, 0x08, 0x69, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
+ 0x88, 0x01, 0x01, 0x1a, 0x35, 0x0a, 0x07, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2a,
+ 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x79, 0x73,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x50, 0x61, 0x79, 0x73, 0x1a, 0x9b, 0x01, 0x0a, 0x04, 0x43,
+ 0x6f, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20,
+ 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e,
+ 0x12, 0x1b, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2c, 0x0a,
+ 0x0f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72,
+ 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x72, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x0f, 0x6d,
+ 0x61, 0x78, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x41, 0x67,
+ 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x1a, 0xa0, 0x0b, 0x0a, 0x0a, 0x45, 0x6e, 0x63,
+ 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75,
+ 0x6c, 0x74, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+ 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b,
+ 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0xb7, 0x01, 0x0a, 0x2c, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x65, 0x6e,
+ 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x4d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x63,
+ 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x4d, 0x61,
0x6e, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45,
0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x01, 0x52, 0x2a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x00, 0x52, 0x28, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x4d,
+ 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+ 0x67, 0x88, 0x01, 0x01, 0x12, 0xbd, 0x01, 0x0a, 0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65,
+ 0x72, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4f, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x61,
+ 0x67, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x66,
+ 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x48, 0x01, 0x52, 0x2a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4d,
+ 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+ 0x67, 0x88, 0x01, 0x01, 0x12, 0xc0, 0x01, 0x0a, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65,
+ 0x72, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e,
+ 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x50,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
+ 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x53, 0x75, 0x70,
+ 0x70, 0x6c, 0x69, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45,
+ 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x02, 0x52, 0x2b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65,
+ 0x72, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f,
+ 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x1a, 0xca, 0x01, 0x0a, 0x28, 0x47, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74,
+ 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f,
+ 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00,
+ 0x52, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64,
+ 0x65, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76,
+ 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, 0x01, 0x52, 0x0d, 0x65, 0x66, 0x66, 0x65,
+ 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11,
+ 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64,
+ 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f,
+ 0x74, 0x69, 0x6d, 0x65, 0x1a, 0xcc, 0x01, 0x0a, 0x2a, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65,
0x72, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,
0x6f, 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e,
- 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0xc0, 0x01, 0x0a, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f,
- 0x6d, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x63,
- 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d,
- 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x50, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x63, 0x72,
- 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x53,
- 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66,
- 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x48, 0x02, 0x52, 0x2b, 0x63, 0x75, 0x73, 0x74, 0x6f,
- 0x6d, 0x65, 0x72, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79,
- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74,
- 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x1a, 0xca, 0x01, 0x0a, 0x28, 0x47, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79,
- 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74,
- 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69,
- 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
- 0x48, 0x00, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d,
- 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74,
- 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, 0x01, 0x52, 0x0d, 0x65, 0x66,
- 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x13,
- 0x0a, 0x11, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d,
- 0x6f, 0x64, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76,
- 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0xcc, 0x01, 0x0a, 0x2a, 0x43, 0x75, 0x73, 0x74, 0x6f,
- 0x6d, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70,
- 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43,
- 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48,
- 0x00, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f,
- 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69,
- 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, 0x01, 0x52, 0x0d, 0x65, 0x66, 0x66,
- 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a,
- 0x11, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f,
- 0x64, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65,
- 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0xcd, 0x01, 0x0a, 0x2b, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d,
- 0x65, 0x72, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70,
- 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43,
- 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63,
- 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48,
- 0x00, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f,
- 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69,
- 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, 0x01, 0x52, 0x0d, 0x65, 0x66, 0x66,
- 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a,
- 0x11, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f,
- 0x64, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65,
- 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x2f, 0x0a, 0x2d, 0x5f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74,
- 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
- 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x31, 0x0a, 0x2f, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f,
- 0x6d, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x72,
- 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65,
- 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x32, 0x0a, 0x30, 0x5f, 0x63, 0x75,
- 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f,
- 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72,
- 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc6, 0x02,
- 0x0a, 0x09, 0x49, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x80, 0x01, 0x0a, 0x1b,
- 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6c,
- 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x61, 0x6d,
- 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x18, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x3d,
- 0x0a, 0x18, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f,
- 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x63, 0x63,
- 0x65, 0x73, 0x73, 0x50, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x77, 0x0a,
- 0x18, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4c, 0x65,
- 0x76, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61,
- 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
- 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,
+ 0x0f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65,
+ 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65,
0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x6c, 0x6f,
- 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x92, 0x08, 0x0a, 0x09, 0x4c, 0x69, 0x66, 0x65, 0x63,
- 0x79, 0x63, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x03,
- 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69,
- 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41,
- 0x01, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x1a, 0xc1, 0x07, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65,
- 0x12, 0x4c, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
- 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65,
- 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f,
- 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55,
- 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66,
- 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x64,
- 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64,
- 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x4b, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
- 0x17, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,
- 0x41, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61,
- 0x73, 0x73, 0x1a, 0xc6, 0x05, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
- 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x05, 0x48, 0x00, 0x52, 0x07, 0x61, 0x67, 0x65, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01,
- 0x12, 0x3d, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x66, 0x6f,
- 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01,
- 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12,
- 0x1c, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08,
- 0x48, 0x01, 0x52, 0x06, 0x69, 0x73, 0x4c, 0x69, 0x76, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a,
- 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69,
- 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x10, 0x6e, 0x75, 0x6d,
- 0x4e, 0x65, 0x77, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01,
- 0x12, 0x37, 0x0a, 0x15, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x13, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x53, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x16, 0x64, 0x61, 0x79,
- 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74,
- 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x13, 0x64, 0x61, 0x79,
- 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x69, 0x6d, 0x65,
- 0x88, 0x01, 0x01, 0x12, 0x44, 0x0a, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69,
- 0x6d, 0x65, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32,
- 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61,
- 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54,
- 0x69, 0x6d, 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x1a, 0x64, 0x61, 0x79,
- 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65,
- 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52,
- 0x17, 0x64, 0x61, 0x79, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x75, 0x72,
- 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x16, 0x6e,
- 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x62,
- 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x42, 0x03,
- 0xe0, 0x41, 0x01, 0x52, 0x14, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54,
- 0x69, 0x6d, 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x0e, 0x6d, 0x61, 0x74,
- 0x63, 0x68, 0x65, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0b, 0x20, 0x03, 0x28,
- 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x50,
- 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x2a, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73,
- 0x5f, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0,
- 0x41, 0x01, 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x53, 0x75, 0x66, 0x66, 0x69,
- 0x78, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x42, 0x0a,
- 0x0a, 0x08, 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e,
- 0x75, 0x6d, 0x5f, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
- 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65,
- 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x1d, 0x0a, 0x1b,
- 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x63,
- 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x5e, 0x0a, 0x07, 0x4c,
- 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
- 0x09, 0x6c, 0x6f, 0x67, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2f, 0x0a, 0x11, 0x6c, 0x6f,
- 0x67, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18,
- 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6c, 0x6f, 0x67, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x33, 0x0a, 0x0f, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20,
- 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42,
- 0x06, 0xe0, 0x41, 0x01, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
- 0x1a, 0xca, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f,
- 0x6c, 0x69, 0x63, 0x79, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76,
- 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x65,
- 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x09,
- 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x4d,
- 0x0a, 0x12, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x11, 0x72, 0x65, 0x74, 0x65,
- 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xd3, 0x01,
- 0x0a, 0x10, 0x53, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69,
- 0x63, 0x79, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x48, 0x00, 0x52, 0x11, 0x72, 0x65, 0x74,
- 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01,
- 0x01, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63,
+ 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f,
+ 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65,
+ 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74,
+ 0x69, 0x6d, 0x65, 0x1a, 0xcd, 0x01, 0x0a, 0x2b, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72,
+ 0x53, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e,
+ 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,
+ 0x0f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65,
+ 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65,
+ 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, 0x01, 0x52, 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63,
+ 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f,
+ 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65,
+ 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74,
+ 0x69, 0x6d, 0x65, 0x42, 0x2f, 0x0a, 0x2d, 0x5f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x6d,
+ 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f,
+ 0x6e, 0x66, 0x69, 0x67, 0x42, 0x31, 0x0a, 0x2f, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65,
+ 0x72, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70,
+ 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+ 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x32, 0x0a, 0x30, 0x5f, 0x63, 0x75, 0x73, 0x74,
+ 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x65, 0x6e,
+ 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc6, 0x02, 0x0a, 0x09,
+ 0x49, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x80, 0x01, 0x0a, 0x1b, 0x75, 0x6e,
+ 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6c, 0x65, 0x76,
+ 0x65, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x61, 0x6d, 0x43, 0x6f,
+ 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x18, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x3d, 0x0a, 0x18,
+ 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x72,
+ 0x65, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x52, 0x16, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x63, 0x63, 0x65, 0x73,
+ 0x73, 0x50, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x77, 0x0a, 0x18, 0x55,
+ 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4c, 0x65, 0x76, 0x65,
+ 0x6c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c,
+ 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65,
+ 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74,
0x69, 0x6d, 0x65, 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, 0x48, 0x01, 0x52, 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69,
- 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x72, 0x65,
- 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
- 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74,
- 0x69, 0x6d, 0x65, 0x1a, 0x2b, 0x0a, 0x0a, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e,
- 0x67, 0x12, 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
- 0x1a, 0x63, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x10, 0x6d,
- 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x6d, 0x61, 0x69, 0x6e,
- 0x50, 0x61, 0x67, 0x65, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x29, 0x0a, 0x0e, 0x6e, 0x6f,
- 0x74, 0x5f, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e,
- 0x64, 0x50, 0x61, 0x67, 0x65, 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50,
- 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2a,
- 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
- 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x64, 0x61, 0x74,
- 0x61, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xdb, 0x02, 0x0a, 0x09, 0x41,
- 0x75, 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62,
- 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07,
- 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0b, 0x74, 0x6f, 0x67, 0x67, 0x6c,
- 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x74,
- 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x16, 0x74, 0x65, 0x72,
- 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c,
- 0x61, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x74, 0x65, 0x72,
- 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73,
- 0x73, 0x88, 0x01, 0x01, 0x12, 0x70, 0x0a, 0x22, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c,
- 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x75,
- 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x42, 0x03, 0xe0, 0x41,
- 0x03, 0x48, 0x01, 0x52, 0x1e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54,
- 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69,
+ 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b,
+ 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x92, 0x08, 0x0a, 0x09, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63,
+ 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
+ 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65,
+ 0x63, 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
+ 0x04, 0x72, 0x75, 0x6c, 0x65, 0x1a, 0xc1, 0x07, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4c,
+ 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
+ 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63, 0x79,
+ 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x09,
+ 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x63,
+ 0x79, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x1a, 0x4b, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a,
+ 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01,
+ 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73,
+ 0x1a, 0xc6, 0x05, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e,
+ 0x0a, 0x08, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
+ 0x48, 0x00, 0x52, 0x07, 0x61, 0x67, 0x65, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3d,
+ 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d,
+ 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x1c, 0x0a,
+ 0x07, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01,
+ 0x52, 0x06, 0x69, 0x73, 0x4c, 0x69, 0x76, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6e,
+ 0x75, 0x6d, 0x5f, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+ 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x4e, 0x65,
+ 0x77, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x37,
+ 0x0a, 0x15, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x13, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x53, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x16, 0x64, 0x61, 0x79, 0x73, 0x5f,
+ 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d,
+ 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x13, 0x64, 0x61, 0x79, 0x73, 0x53,
+ 0x69, 0x6e, 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01,
+ 0x01, 0x12, 0x44, 0x0a, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65,
+ 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x69, 0x6d,
+ 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x1a, 0x64, 0x61, 0x79, 0x73, 0x5f,
+ 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74,
+ 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x17, 0x64,
+ 0x61, 0x79, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65,
+ 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x16, 0x6e, 0x6f, 0x6e,
+ 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x62, 0x65, 0x66,
+ 0x6f, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41,
+ 0x01, 0x52, 0x14, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d,
+ 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68,
+ 0x65, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x50, 0x72, 0x65,
+ 0x66, 0x69, 0x78, 0x12, 0x2a, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x73,
+ 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01,
+ 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x42,
+ 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x42, 0x0a, 0x0a, 0x08,
+ 0x5f, 0x69, 0x73, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x75, 0x6d,
+ 0x5f, 0x6e, 0x65, 0x77, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42,
+ 0x19, 0x0a, 0x17, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x63,
+ 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x64,
+ 0x61, 0x79, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x75, 0x72,
+ 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x5e, 0x0a, 0x07, 0x4c, 0x6f, 0x67,
+ 0x67, 0x69, 0x6e, 0x67, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x6c,
+ 0x6f, 0x67, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2f, 0x0a, 0x11, 0x6c, 0x6f, 0x67, 0x5f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20,
+ 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x6c, 0x6f, 0x67, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x1a, 0x33, 0x0a, 0x0f, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x07,
+ 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x06, 0xe0,
+ 0x41, 0x01, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0xca,
+ 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69,
+ 0x63, 0x79, 0x12, 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f,
+ 0x74, 0x69, 0x6d, 0x65, 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, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x65, 0x66, 0x66,
+ 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x09, 0x69, 0x73,
+ 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x4d, 0x0a, 0x12,
+ 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x18, 0x04, 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, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x11, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74,
+ 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xd3, 0x01, 0x0a, 0x10,
+ 0x53, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
+ 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75,
+ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x48, 0x00, 0x52, 0x11, 0x72, 0x65, 0x74, 0x65, 0x6e,
+ 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12,
+ 0x46, 0x0a, 0x0e, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d,
+ 0x65, 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, 0x48, 0x01, 0x52, 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65,
+ 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x72, 0x65, 0x74, 0x65,
+ 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x11,
+ 0x0a, 0x0f, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d,
+ 0x65, 0x1a, 0x2b, 0x0a, 0x0a, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x12,
+ 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x63,
+ 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x10, 0x6d, 0x61, 0x69,
+ 0x6e, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e, 0x6d, 0x61, 0x69, 0x6e, 0x50, 0x61,
+ 0x67, 0x65, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x29, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x5f,
+ 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x50,
+ 0x61, 0x67, 0x65, 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x6c, 0x61,
+ 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2a, 0x0a, 0x0e,
+ 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01,
+ 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x4c,
+ 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xdb, 0x02, 0x0a, 0x09, 0x41, 0x75, 0x74,
+ 0x6f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+ 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65, 0x6e,
+ 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0b, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x5f,
+ 0x74, 0x69, 0x6d, 0x65, 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x67,
+ 0x67, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x16, 0x74, 0x65, 0x72, 0x6d, 0x69,
0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73,
- 0x73, 0x42, 0x25, 0x0a, 0x23, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73,
+ 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x69,
+ 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x88,
+ 0x01, 0x01, 0x12, 0x70, 0x0a, 0x22, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73,
0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x75, 0x70, 0x64,
- 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x8d, 0x05, 0x0a, 0x08, 0x49, 0x70, 0x46,
- 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x6f,
- 0x0a, 0x15, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
- 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e,
- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
- 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65,
- 0x72, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53,
- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x01, 0x52, 0x13, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4e,
- 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12,
- 0x68, 0x0a, 0x13, 0x76, 0x70, 0x63, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73,
- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
- 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
- 0x2e, 0x56, 0x70, 0x63, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f, 0x75, 0x72, 0x63,
- 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x11, 0x76, 0x70, 0x63, 0x4e, 0x65, 0x74, 0x77, 0x6f,
- 0x72, 0x6b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x14, 0x61, 0x6c, 0x6c,
- 0x6f, 0x77, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x76, 0x70, 0x63,
- 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x11, 0x61, 0x6c,
- 0x6c, 0x6f, 0x77, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x4f, 0x72, 0x67, 0x56, 0x70, 0x63, 0x73, 0x12,
- 0x47, 0x0a, 0x1e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x72,
- 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73,
- 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
- 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41,
- 0x63, 0x63, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x1a, 0x4f, 0x0a, 0x13, 0x50, 0x75, 0x62, 0x6c,
- 0x69, 0x63, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12,
- 0x38, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x69, 0x70, 0x5f, 0x63, 0x69,
- 0x64, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x49, 0x70, 0x43,
- 0x69, 0x64, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x1a, 0x77, 0x0a, 0x10, 0x56, 0x70, 0x63,
- 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1d, 0x0a,
- 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00,
- 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16,
- 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x69, 0x70, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x5f,
- 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
- 0x01, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x49, 0x70, 0x43, 0x69, 0x64, 0x72,
- 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f,
- 0x72, 0x6b, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f,
+ 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48,
+ 0x01, 0x52, 0x1e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d,
+ 0x65, 0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61,
+ 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x42,
+ 0x25, 0x0a, 0x23, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f,
+ 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x1a, 0x8d, 0x05, 0x0a, 0x08, 0x49, 0x70, 0x46, 0x69, 0x6c,
+ 0x74, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x09, 0x48, 0x00, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x6f, 0x0a, 0x15,
0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73,
- 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f,
- 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x67, 0x65, 0x6e,
- 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x1a, 0x36, 0x0a, 0x15, 0x48, 0x69, 0x65, 0x72,
- 0x61, 0x72, 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63,
- 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
- 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, 0x3a, 0x58, 0xea, 0x41, 0x55,
- 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12,
- 0x23, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65,
- 0x63, 0x74, 0x7d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x7d, 0x2a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x32, 0x06, 0x62,
- 0x75, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x69, 0x70, 0x5f, 0x66, 0x69, 0x6c,
- 0x74, 0x65, 0x72, 0x22, 0xbf, 0x02, 0x0a, 0x13, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63,
- 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x17, 0x0a, 0x04, 0x72,
- 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04,
- 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x74,
- 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06,
- 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
- 0x5f, 0x61, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52,
- 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e,
- 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,
- 0x41, 0x01, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x04,
- 0x65, 0x74, 0x61, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
- 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x05,
- 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c,
- 0x12, 0x1b, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x46, 0x0a,
- 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x07, 0x20,
- 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54,
- 0x65, 0x61, 0x6d, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
- 0x74, 0x54, 0x65, 0x61, 0x6d, 0x22, 0x5a, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75,
- 0x6d, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74,
- 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x05, 0xe0, 0x41, 0x01, 0x08, 0x01,
- 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x72, 0x63,
- 0x33, 0x32, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x07, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x63,
- 0x33, 0x32, 0x63, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x72, 0x63, 0x33, 0x32,
- 0x63, 0x22, 0x59, 0x0a, 0x0f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b,
- 0x73, 0x75, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x07, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x88, 0x01,
- 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x64, 0x35, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20,
- 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6d, 0x64, 0x35, 0x48, 0x61, 0x73,
- 0x68, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x22, 0xbb, 0x01, 0x0a,
- 0x1a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6f, 0x6e,
- 0x74, 0x65, 0x78, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x0a, 0x05, 0x76,
- 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,
- 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
+ 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e,
+ 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x48, 0x01, 0x52, 0x13, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4e, 0x65, 0x74,
+ 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x68, 0x0a,
+ 0x13, 0x76, 0x70, 0x63, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x49, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x56,
+ 0x70, 0x63, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x11, 0x76, 0x70, 0x63, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+ 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
+ 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x6f, 0x72, 0x67, 0x5f, 0x76, 0x70, 0x63, 0x73, 0x18,
+ 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x4f, 0x72, 0x67, 0x56, 0x70, 0x63, 0x73, 0x12, 0x47, 0x0a,
+ 0x1e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69,
+ 0x63, 0x65, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c,
+ 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x63,
+ 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x1a, 0x4f, 0x0a, 0x13, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63,
+ 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x0a,
+ 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x69, 0x70, 0x5f, 0x63, 0x69, 0x64, 0x72,
+ 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x49, 0x70, 0x43, 0x69, 0x64,
+ 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x1a, 0x77, 0x0a, 0x10, 0x56, 0x70, 0x63, 0x4e, 0x65,
+ 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x6e,
+ 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07,
+ 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x61, 0x6c,
+ 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x69, 0x70, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x5f, 0x72, 0x61,
+ 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
+ 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x49, 0x70, 0x43, 0x69, 0x64, 0x72, 0x52, 0x61,
+ 0x6e, 0x67, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+ 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, 0x75,
+ 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x6f, 0x75,
+ 0x72, 0x63, 0x65, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x6c,
+ 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f,
+ 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x1a, 0x36, 0x0a, 0x15, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72,
+ 0x63, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12,
+ 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 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, 0x3a, 0x58, 0xea, 0x41, 0x55, 0x0a, 0x1d,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,
+ 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x23, 0x70,
+ 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+ 0x7d, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x7d, 0x2a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x32, 0x06, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x69, 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65,
+ 0x72, 0x22, 0xbf, 0x02, 0x0a, 0x13, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65,
+ 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x17, 0x0a, 0x04, 0x72, 0x6f, 0x6c,
+ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x72, 0x6f,
+ 0x6c, 0x65, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x61,
+ 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69,
+ 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01,
+ 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x04, 0x65, 0x74,
+ 0x61, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x65,
+ 0x74, 0x61, 0x67, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x05, 0x20, 0x01,
+ 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1b,
+ 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x70,
+ 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61,
+ 0x6d, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54,
+ 0x65, 0x61, 0x6d, 0x22, 0x5a, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x6d,
+ 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+ 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x05, 0xe0, 0x41, 0x01, 0x08, 0x01, 0x52, 0x07,
+ 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32,
+ 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x07, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32,
+ 0x63, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x22,
+ 0x59, 0x0a, 0x0f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75,
+ 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x07, 0x48, 0x00, 0x52, 0x06, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x88, 0x01, 0x01, 0x12,
+ 0x1e, 0x0a, 0x08, 0x6d, 0x64, 0x35, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x07, 0x6d, 0x64, 0x35, 0x48, 0x61, 0x73, 0x68, 0x42,
+ 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x72, 0x63, 0x33, 0x32, 0x63, 0x22, 0xbb, 0x01, 0x0a, 0x1a, 0x4f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x65,
+ 0x78, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x05, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74,
+ 0x69, 0x6d, 0x65, 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72,
- 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61,
- 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70,
+ 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x0e, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x12, 0x4a, 0x0a, 0x06, 0x63,
+ 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
+ 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2e, 0x43,
+ 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
+ 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x1a, 0x68, 0x0a, 0x0b, 0x43, 0x75, 0x73, 0x74, 0x6f,
+ 0x6d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x43, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x50,
+ 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
+ 0x01, 0x22, 0x7b, 0x0a, 0x12, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x6e, 0x63,
+ 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x14, 0x65, 0x6e, 0x63, 0x72, 0x79,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x13, 0x65, 0x6e, 0x63, 0x72,
+ 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12,
+ 0x2d, 0x0a, 0x10, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x62, 0x79,
+ 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0e,
+ 0x6b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xe3,
+ 0x11, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+ 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x04, 0x6e, 0x61,
+ 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01,
+ 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72,
+ 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63,
+ 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x12, 0x17, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x42,
+ 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03,
+ 0xe0, 0x41, 0x05, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+ 0x2d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
+ 0x18, 0x23, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x0c, 0x72,
+ 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2b,
+ 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x6d, 0x65, 0x74,
+ 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x73,
+ 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01,
+ 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20,
+ 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x2e,
+ 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69,
+ 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x63,
+ 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x34,
+ 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01,
+ 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69,
+ 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f,
+ 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01,
+ 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x3d,
+ 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
+ 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74,
+ 0x72, 0x6f, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x2e, 0x0a,
+ 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
+ 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x63, 0x6f,
+ 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x40, 0x0a,
+ 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 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, 0x42, 0x03,
+ 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12,
+ 0x44, 0x0a, 0x0d, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65,
+ 0x18, 0x24, 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a,
+ 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01,
+ 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x40, 0x0a,
+ 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 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, 0x42, 0x03,
+ 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12,
+ 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75,
+ 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x63,
+ 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a,
+ 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b,
+ 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b,
+ 0x73, 0x75, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b,
+ 0x73, 0x75, 0x6d, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74,
+ 0x69, 0x6d, 0x65, 0x18, 0x11, 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61,
+ 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x07, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65,
+ 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41, 0x23, 0x0a,
+ 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b,
+ 0x65, 0x79, 0x52, 0x06, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x5a, 0x0a, 0x19, 0x75, 0x70,
+ 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x13, 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a,
- 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x0e, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x12, 0x4a, 0x0a,
- 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e,
- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
- 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73,
- 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41,
- 0x01, 0x52, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x1a, 0x68, 0x0a, 0x0b, 0x43, 0x75, 0x73,
- 0x74, 0x6f, 0x6d, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x43, 0x0a, 0x05, 0x76, 0x61,
- 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x16,
+ 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61,
+ 0x73, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72,
+ 0x61, 0x72, 0x79, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x48, 0x6f,
+ 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15, 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, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x13, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x70,
+ 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,
+ 0x61, 0x74, 0x61, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78,
- 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,
- 0x02, 0x38, 0x01, 0x22, 0x7b, 0x0a, 0x12, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45,
- 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x14, 0x65, 0x6e, 0x63,
- 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68,
- 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x13, 0x65, 0x6e,
- 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68,
- 0x6d, 0x12, 0x2d, 0x0a, 0x10, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f,
- 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0x03, 0xe0, 0x41, 0x01,
- 0x52, 0x0e, 0x6b, 0x65, 0x79, 0x53, 0x68, 0x61, 0x32, 0x35, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73,
- 0x22, 0xe3, 0x11, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x6e,
- 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x04,
- 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02,
- 0x20, 0x01, 0x28, 0x09, 0x42, 0x25, 0xe0, 0x41, 0x05, 0xfa, 0x41, 0x1f, 0x0a, 0x1d, 0x73, 0x74,
- 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73,
- 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x1b, 0x20, 0x01, 0x28,
- 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x23, 0x0a, 0x0a,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
- 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
- 0x6e, 0x12, 0x2d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x6b,
- 0x65, 0x6e, 0x18, 0x23, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52,
- 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01,
- 0x12, 0x2b, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
- 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0e, 0x6d,
- 0x65, 0x74, 0x61, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a,
- 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05,
- 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18,
- 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65,
- 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f,
- 0x64, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
- 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
- 0x12, 0x34, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70,
- 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,
- 0x41, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f,
- 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f,
- 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,
- 0x41, 0x01, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
- 0x12, 0x3d, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e,
- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
- 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f,
- 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12,
- 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75,
- 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f,
- 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12,
- 0x40, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c,
- 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,
- 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d,
- 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x69,
- 0x6d, 0x65, 0x18, 0x24, 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c,
- 0x69, 0x7a, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65,
- 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,
- 0x41, 0x01, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12,
- 0x40, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e,
- 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,
- 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d,
- 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x63,
- 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52,
- 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12,
- 0x45, 0x0a, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x18, 0x10, 0x20, 0x01,
- 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x68, 0x65,
- 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x63, 0x68, 0x65,
- 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
- 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
+ 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74,
+ 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+ 0x61, 0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x18, 0x26, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
+ 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f,
+ 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x63, 0x6f, 0x6e,
+ 0x74, 0x65, 0x78, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x62,
+ 0x61, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x48,
+ 0x01, 0x52, 0x0e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x48, 0x6f, 0x6c,
+ 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x18, 0x20,
+ 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
+ 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x42, 0x03, 0xe0,
+ 0x41, 0x03, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x13, 0x63, 0x75, 0x73,
+ 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f,
+ 0x6d, 0x65, 0x72, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0,
+ 0x41, 0x01, 0x52, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x6e, 0x63, 0x72,
+ 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,
+ 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1a, 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, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0a, 0x75, 0x70,
- 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x07, 0x6b, 0x6d, 0x73, 0x5f,
- 0x6b, 0x65, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0xe0, 0x41, 0x01, 0xfa, 0x41,
- 0x23, 0x0a, 0x21, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74,
- 0x6f, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x5a, 0x0a, 0x19,
- 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63,
- 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x13, 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, 0x42, 0x03, 0xe0, 0x41, 0x03,
- 0x52, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43,
- 0x6c, 0x61, 0x73, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x0e, 0x74, 0x65, 0x6d, 0x70,
- 0x6f, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79,
- 0x48, 0x6f, 0x6c, 0x64, 0x12, 0x53, 0x0a, 0x15, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f,
- 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15, 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, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x13, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x45,
- 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x08, 0x6d, 0x65, 0x74,
- 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f,
+ 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a, 0x63, 0x75,
+ 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x73, 0x6f, 0x66, 0x74,
+ 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1c, 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, 0x42, 0x03,
+ 0xe0, 0x41, 0x03, 0x48, 0x02, 0x52, 0x0e, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74,
+ 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x10, 0x68, 0x61, 0x72, 0x64,
+ 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1d, 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, 0x42, 0x03,
+ 0xe0, 0x41, 0x03, 0x48, 0x03, 0x52, 0x0e, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74,
+ 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x65,
+ 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
- 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45,
- 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,
- 0x61, 0x74, 0x61, 0x12, 0x42, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x18,
- 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
- 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
- 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x63,
- 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x65, 0x76, 0x65, 0x6e, 0x74,
- 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28,
- 0x08, 0x48, 0x01, 0x52, 0x0e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x73, 0x65, 0x64, 0x48,
- 0x6f, 0x6c, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18,
- 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
- 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x42,
- 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x13, 0x63,
- 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x75, 0x73,
- 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42,
- 0x03, 0xe0, 0x41, 0x01, 0x52, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x6e,
- 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74,
- 0x6f, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1a, 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, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0a,
- 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x73, 0x6f,
- 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1c,
- 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,
- 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x02, 0x52, 0x0e, 0x73, 0x6f, 0x66, 0x74, 0x44, 0x65, 0x6c,
- 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x10, 0x68, 0x61,
- 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1d,
- 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,
- 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x03, 0x52, 0x0e, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c,
- 0x65, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x09, 0x72, 0x65,
- 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
- 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69,
- 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69,
- 0x6f, 0x6e, 0x1a, 0xd3, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e,
- 0x12, 0x41, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74,
- 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x6d,
- 0x6f, 0x64, 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x75, 0x6e,
- 0x74, 0x69, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
- 0x0f, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x54, 0x69, 0x6d, 0x65,
- 0x22, 0x36, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x44, 0x45,
- 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c,
- 0x0a, 0x08, 0x55, 0x4e, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06,
- 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x02, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61,
- 0x64, 0x61, 0x74, 0x61, 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, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72,
- 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x65, 0x76, 0x65, 0x6e,
- 0x74, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x13, 0x0a, 0x11,
- 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d,
- 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74,
- 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xbf, 0x02, 0x0a, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x17,
- 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
- 0x01, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20,
- 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x06,
- 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41,
- 0x01, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x6e, 0x74,
- 0x69, 0x74, 0x79, 0x5f, 0x61, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,
- 0x41, 0x03, 0x52, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x6c, 0x74, 0x12, 0x20, 0x0a,
- 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12,
- 0x17, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0,
- 0x41, 0x01, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69,
- 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x65, 0x6d,
- 0x61, 0x69, 0x6c, 0x12, 0x1b, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20,
- 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
- 0x12, 0x46, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x65, 0x61, 0x6d,
- 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
- 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65,
- 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x6f,
- 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x22, 0x8e, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73,
- 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x12, 0x33, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
- 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65,
- 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65,
- 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74,
- 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74,
- 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x52, 0x0a, 0x0b, 0x50, 0x72, 0x6f,
- 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2a, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6a,
- 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
- 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75,
- 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x46, 0x0a,
- 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x65, 0x6e, 0x74,
- 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64,
- 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x65, 0x6e, 0x74,
- 0x69, 0x74, 0x79, 0x49, 0x64, 0x22, 0x5f, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
- 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65,
- 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x27, 0x0a,
- 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
- 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65,
- 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x32, 0x9f, 0x1f, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x12, 0x72, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63,
- 0x6b, 0x65, 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, 0x22, 0x22, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x8a, 0xd3, 0xe4, 0x93, 0x02,
- 0x15, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x6f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x22, 0x22, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x8a, 0xd3, 0xe4, 0x93,
- 0x02, 0x15, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61,
- 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65,
- 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x58, 0xda, 0x41, 0x17,
- 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x16, 0x0a,
- 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0c, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
- 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x1e, 0x0a, 0x0e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e,
- 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0c, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
- 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
- 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67,
+ 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e,
+ 0x1a, 0xd3, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41,
+ 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
- 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x8a,
- 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12,
- 0x0c, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x93, 0x01,
- 0x0a, 0x19, 0x4c, 0x6f, 0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65,
- 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x33, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
- 0x4c, 0x6f, 0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74,
- 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x26, 0xda, 0x41, 0x06,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d,
- 0x2a, 0x2a, 0x7d, 0x12, 0xa3, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f,
- 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61,
- 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63,
- 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22,
- 0x58, 0xda, 0x41, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x8a, 0xd3, 0xe4, 0x93,
- 0x02, 0x47, 0x12, 0x17, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0b,
- 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x2c, 0x0a, 0x08, 0x72,
- 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x2a, 0x2a, 0x12, 0xaa, 0x01, 0x0a, 0x0c, 0x53, 0x65,
- 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x49, 0x61,
- 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50,
- 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5f, 0xda, 0x41, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
- 0x63, 0x65, 0x2c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12,
- 0x17, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x2c, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f,
- 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72,
- 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73,
- 0x2f, 0x2a, 0x7d, 0x2f, 0x2a, 0x2a, 0x12, 0x96, 0x02, 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, 0x49,
- 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e,
- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65,
- 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73,
- 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50,
- 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
- 0x73, 0x65, 0x22, 0xaa, 0x01, 0xda, 0x41, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
- 0x2c, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x8a, 0xd3, 0xe4, 0x93,
- 0x02, 0x8c, 0x01, 0x12, 0x17, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12,
- 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x34, 0x0a, 0x08,
- 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x28, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f,
- 0x2a, 0x2a, 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2f,
- 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73,
- 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x61,
- 0x6e, 0x61, 0x67, 0x65, 0x64, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2a, 0x12,
- 0x8a, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f,
+ 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x6d, 0x6f, 0x64,
+ 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x74, 0x69,
+ 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0f, 0x72,
+ 0x65, 0x74, 0x61, 0x69, 0x6e, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x36,
+ 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55,
+ 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08,
+ 0x55, 0x4e, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x4f,
+ 0x43, 0x4b, 0x45, 0x44, 0x10, 0x02, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61,
+ 0x74, 0x61, 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, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f,
+ 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f,
+ 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73,
+ 0x6f, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42,
+ 0x13, 0x0a, 0x11, 0x5f, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f,
+ 0x74, 0x69, 0x6d, 0x65, 0x22, 0xbf, 0x02, 0x0a, 0x13, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41,
+ 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x17, 0x0a, 0x04,
+ 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
+ 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e,
+ 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52,
+ 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x5f, 0x61, 0x6c, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03,
+ 0x52, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x65,
+ 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a,
+ 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01,
+ 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18,
+ 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69,
+ 0x6c, 0x12, 0x1b, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28,
+ 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x46,
+ 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+ 0x54, 0x65, 0x61, 0x6d, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+ 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x22, 0x8e, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33,
+ 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+ 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18,
+ 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x12,
+ 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b,
+ 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61,
+ 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x52, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x6a, 0x65,
+ 0x63, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2a, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+ 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03,
+ 0xe0, 0x41, 0x01, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x75, 0x6d, 0x62,
+ 0x65, 0x72, 0x12, 0x17, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+ 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x46, 0x0a, 0x05, 0x4f,
+ 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01,
+ 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02,
+ 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x01, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74,
+ 0x79, 0x49, 0x64, 0x22, 0x5f, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x61,
+ 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x63,
+ 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03,
+ 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4c, 0x65,
+ 0x6e, 0x67, 0x74, 0x68, 0x32, 0x9f, 0x1f, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x12, 0x72, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74,
0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x22, 0x37, 0xda, 0x41, 0x12, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x75,
- 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x1c,
- 0x12, 0x1a, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x12,
- 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x7e, 0x0a, 0x0d,
- 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e,
- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
- 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52,
+ 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65,
+ 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,
+ 0x22, 0x22, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12,
+ 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x6f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
- 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x22, 0x29, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x0a, 0x12, 0x64, 0x65, 0x73,
- 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12,
- 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x98, 0x01, 0x0a,
- 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e,
- 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
- 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 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, 0x22, 0x48, 0xda,
- 0x41, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xda,
- 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17,
- 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x8d, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74,
- 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65,
- 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x38, 0xda,
- 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c,
- 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17,
- 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xba, 0x01, 0x0a, 0x14, 0x43, 0x61, 0x6e, 0x63,
- 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65,
- 0x12, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d,
- 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
- 0x1a, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d,
- 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
- 0x65, 0x22, 0x41, 0xda, 0x41, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x8a,
- 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f,
- 0x69, 0x64, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x22, 0x22, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x15,
+ 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
+ 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x58, 0xda, 0x41, 0x17, 0x70, 0x61,
+ 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x5f, 0x69, 0x64, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x16, 0x0a, 0x06, 0x70,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0c, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3d,
+ 0x2a, 0x2a, 0x7d, 0x12, 0x1e, 0x0a, 0x0e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72,
+ 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0c, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3d,
+ 0x2a, 0x2a, 0x7d, 0x12, 0x85, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
+ 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c,
+ 0x69, 0x73, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x22, 0x27, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x8a, 0xd3, 0xe4,
+ 0x93, 0x02, 0x18, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0c, 0x7b,
+ 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x93, 0x01, 0x0a, 0x19,
+ 0x4c, 0x6f, 0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74,
+ 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x6f,
+ 0x63, 0x6b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f,
+ 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
+ 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x26, 0xda, 0x41, 0x06, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a,
+ 0x7d, 0x12, 0xa3, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69,
+ 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e,
+ 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x58, 0xda,
+ 0x41, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x47,
+ 0x12, 0x17, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0b, 0x7b, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x2c, 0x0a, 0x08, 0x72, 0x65, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70,
+ 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x2a, 0x2a, 0x12, 0xaa, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x49,
+ 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x49, 0x61, 0x6d, 0x50,
+ 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c,
+ 0x69, 0x63, 0x79, 0x22, 0x5f, 0xda, 0x41, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+ 0x2c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12, 0x17, 0x0a,
+ 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x2c, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a,
0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a,
- 0x7d, 0x2f, 0x2a, 0x2a, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65,
- 0x63, 0x74, 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
- 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x7d, 0x2f, 0x2a, 0x2a, 0x12, 0x96, 0x02, 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d,
+ 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74,
+ 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x69,
+ 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x49, 0x61, 0x6d, 0x50, 0x65, 0x72,
+ 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x22, 0xaa, 0x01, 0xda, 0x41, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x70,
+ 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x8c,
+ 0x01, 0x12, 0x17, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0b, 0x7b,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x34, 0x0a, 0x08, 0x72, 0x65,
+ 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x28, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d,
+ 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2a,
+ 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2f, 0x7b, 0x62,
+ 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a,
+ 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x6d, 0x61, 0x6e, 0x61,
+ 0x67, 0x65, 0x64, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2a, 0x12, 0x8a, 0x01,
+ 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x26,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
+ 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x22, 0x37, 0xda, 0x41, 0x12, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x75, 0x70, 0x64,
+ 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a,
+ 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x7b,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x7e, 0x0a, 0x0d, 0x43, 0x6f,
+ 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
+ 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71,
+ 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
+ 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22,
+ 0x29, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69,
+ 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x0c, 0x44,
+ 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f,
+ 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
+ 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 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, 0x22, 0x48, 0xda, 0x41, 0x0d,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xda, 0x41, 0x18,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15,
+ 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x8d, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72,
+ 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x73, 0x74,
+ 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x38, 0xda, 0x41, 0x18,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65,
+ 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15,
+ 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xba, 0x01, 0x0a, 0x14, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c,
+ 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x2e,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
+ 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62,
+ 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f,
+ 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
+ 0x76, 0x32, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62,
+ 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+ 0x41, 0xda, 0x41, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x8a, 0xd3, 0xe4,
+ 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64,
+ 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+ 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x2f,
+ 0x2a, 0x2a, 0x12, 0x95, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x12, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+ 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65,
+ 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
+ 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x22, 0x48, 0xda, 0x41, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0xda, 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4,
+ 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xa5, 0x01, 0x0a, 0x0a, 0x52,
+ 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65,
+ 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+ 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0xda, 0x41, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xda, 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65,
+ 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63,
+ 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d,
+ 0x30, 0x01, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
+ 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65,
+ 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+ 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x8a, 0xd3, 0xe4, 0x93,
+ 0x02, 0x28, 0x12, 0x26, 0x0a, 0x17, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b,
+ 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x28, 0x01, 0x30, 0x01, 0x12, 0x8c,
+ 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12,
+ 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a, 0x65,
- 0x63, 0x74, 0x22, 0x48, 0xda, 0x41, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0xda, 0x41, 0x18, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a,
- 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12,
- 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xa5, 0x01, 0x0a,
- 0x0a, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
- 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
- 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0xda, 0x41, 0x0d, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xda, 0x41, 0x18, 0x62, 0x75, 0x63,
- 0x6b, 0x65, 0x74, 0x2c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x67, 0x65, 0x6e, 0x65, 0x72,
- 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62,
+ 0x63, 0x74, 0x22, 0x39, 0xda, 0x41, 0x12, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x75, 0x70,
+ 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12,
+ 0x1c, 0x0a, 0x0d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
+ 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x60, 0x0a,
+ 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x2e, 0x67,
+ 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32,
+ 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
+ 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12,
+ 0x6e, 0x0a, 0x0f, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
+ 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65,
+ 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
+ 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12,
+ 0x84, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12,
+ 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
+ 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+ 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26,
+ 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12,
+ 0x15, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b,
+ 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x77, 0x72, 0x69,
+ 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x77,
+ 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
+ 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73,
+ 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x0f, 0x0a,
+ 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x21,
+ 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75,
+ 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a,
+ 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d,
+ 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+ 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74,
+ 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74,
+ 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61,
+ 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x32,
+ 0x12, 0x30, 0x0a, 0x21, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x62,
0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a,
- 0x2a, 0x7d, 0x30, 0x01, 0x12, 0x99, 0x01, 0x0a, 0x0e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61,
- 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69,
- 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
- 0x74, 0x1a, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x8a, 0xd3,
- 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x0a, 0x17, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x62, 0x6a,
- 0x65, 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12,
- 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x28, 0x01, 0x30, 0x01,
- 0x12, 0x8c, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x12, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65,
- 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x22, 0x39, 0xda, 0x41, 0x12, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c,
- 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x8a, 0xd3, 0xe4, 0x93, 0x02,
- 0x1e, 0x12, 0x1c, 0x0a, 0x0d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x62, 0x75, 0x63, 0x6b,
- 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12,
- 0x60, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25,
- 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
- 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
- 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28,
- 0x01, 0x12, 0x6e, 0x0a, 0x0f, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
- 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69,
- 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
- 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
- 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x69, 0x64, 0x69, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a,
- 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30,
- 0x01, 0x12, 0x84, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
- 0x73, 0x12, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
- 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
- 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
- 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73,
- 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x22, 0x26, 0xda, 0x41, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02,
- 0x17, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75,
- 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x98, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x77,
- 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52,
- 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
- 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52,
- 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12,
- 0x0f, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x12, 0x21, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
- 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d,
- 0x2a, 0x2a, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73,
- 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x67, 0x6f,
- 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e,
- 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72,
- 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x53,
- 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x72, 0x69,
- 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x8a, 0xd3, 0xe4, 0x93,
- 0x02, 0x32, 0x12, 0x30, 0x0a, 0x21, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65,
- 0x63, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
- 0x2e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72,
- 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75,
- 0x65, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73,
- 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57,
- 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
- 0x73, 0x65, 0x22, 0x41, 0xda, 0x41, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64,
- 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,
- 0x5f, 0x69, 0x64, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f,
- 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f,
- 0x2a, 0x7d, 0x2f, 0x2a, 0x2a, 0x12, 0x96, 0x01, 0x0a, 0x0a, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62,
- 0x6a, 0x65, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74,
- 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6a,
- 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
- 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f,
- 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x47, 0xda, 0x41, 0x27, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
- 0x2c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x64,
- 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
- 0x74, 0x8a, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65,
- 0x74, 0x12, 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x1a, 0xa7,
- 0x02, 0xca, 0x41, 0x16, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x8a, 0x02, 0x68, 0x74,
- 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c,
- 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74,
- 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,
- 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f,
- 0x75, 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64,
- 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
- 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d,
- 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x64, 0x65, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
- 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2c, 0x68, 0x74,
- 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
- 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x64, 0x65,
- 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e,
- 0x6c, 0x79, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67,
- 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75,
- 0x74, 0x68, 0x2f, 0x64, 0x65, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x65,
- 0x61, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0xe2, 0x01, 0xea, 0x41, 0x78, 0x0a, 0x21,
- 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,
- 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65,
- 0x79, 0x12, 0x53, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f,
- 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
- 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x52, 0x69,
- 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x2f, 0x63,
- 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x63, 0x72, 0x79, 0x70, 0x74,
- 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x7d, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
- 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x42, 0x0c, 0x53,
- 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x63,
- 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
- 0x67, 0x6f, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
- 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
- 0x65, 0x70, 0x62, 0x3b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70,
- 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x2a, 0x7d, 0x12, 0xae, 0x01, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74,
+ 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x65, 0x72,
+ 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f,
+ 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x69,
+ 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+ 0x22, 0x41, 0xda, 0x41, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x8a, 0xd3,
+ 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69,
+ 0x64, 0x12, 0x20, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+ 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x2a, 0x7d,
+ 0x2f, 0x2a, 0x2a, 0x12, 0x96, 0x01, 0x0a, 0x0a, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x12, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72,
+ 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+ 0x65, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x22, 0x47, 0xda, 0x41, 0x27, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2c, 0x73,
+ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x64, 0x65, 0x73,
+ 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x8a,
+ 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12,
+ 0x0b, 0x7b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x3d, 0x2a, 0x2a, 0x7d, 0x1a, 0xa7, 0x02, 0xca,
+ 0x41, 0x16, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x8a, 0x02, 0x68, 0x74, 0x74, 0x70,
+ 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,
+ 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75,
+ 0x64, 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73,
+ 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69,
+ 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64,
+ 0x2d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x2d, 0x6f,
+ 0x6e, 0x6c, 0x79, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61,
+ 0x75, 0x74, 0x68, 0x2f, 0x64, 0x65, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x66,
+ 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2c, 0x68, 0x74, 0x74, 0x70,
+ 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,
+ 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x64, 0x65, 0x76, 0x73,
+ 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79,
+ 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68,
+ 0x2f, 0x64, 0x65, 0x76, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64,
+ 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0xe2, 0x01, 0xea, 0x41, 0x78, 0x0a, 0x21, 0x63, 0x6c,
+ 0x6f, 0x75, 0x64, 0x6b, 0x6d, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69,
+ 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x12,
+ 0x53, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65,
+ 0x63, 0x74, 0x7d, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6c,
+ 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x6b, 0x65, 0x79, 0x52, 0x69, 0x6e, 0x67,
+ 0x73, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x2f, 0x63, 0x72, 0x79,
+ 0x70, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x5f,
+ 0x6b, 0x65, 0x79, 0x7d, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+ 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x32, 0x42, 0x0c, 0x53, 0x74, 0x6f,
+ 0x72, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x63, 0x6c, 0x6f,
+ 0x75, 0x64, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f,
+ 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x2f, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x70,
+ 0x62, 0x3b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x33,
}
var (
@@ -10352,1459 +10393,3 @@ func file_google_storage_v2_storage_proto_init() {
file_google_storage_v2_storage_proto_goTypes = nil
file_google_storage_v2_storage_proto_depIdxs = nil
}
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConnInterface
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
-
-// StorageClient is the client API for Storage service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type StorageClient interface {
- // Permanently deletes an empty bucket.
- DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
- // Returns metadata for the specified bucket.
- GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error)
- // Creates a new bucket.
- CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error)
- // Retrieves a list of buckets for a given project.
- ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error)
- // Locks retention policy on a bucket.
- LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error)
- // Gets the IAM policy for a specified bucket.
- // The `resource` field in the request should be
- // `projects/_/buckets/{bucket}` for a bucket, or
- // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
- // for a managed folder.
- GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error)
- // Updates an IAM policy for the specified bucket.
- // The `resource` field in the request should be
- // `projects/_/buckets/{bucket}` for a bucket, or
- // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
- // for a managed folder.
- SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error)
- // Tests a set of permissions on the given bucket, object, or managed folder
- // to see which, if any, are held by the caller.
- // The `resource` field in the request should be
- // `projects/_/buckets/{bucket}` for a bucket,
- // `projects/_/buckets/{bucket}/objects/{object}` for an object, or
- // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
- // for a managed folder.
- TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error)
- // Updates a bucket. Equivalent to JSON API's storage.buckets.patch method.
- UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error)
- // Concatenates a list of existing objects into a new object in the same
- // bucket.
- ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error)
- // Deletes an object and its metadata. Deletions are permanent if versioning
- // is not enabled for the bucket, or if the generation parameter is used, or
- // if [soft delete](https://cloud.google.com/storage/docs/soft-delete) is not
- // enabled for the bucket.
- // When this API is used to delete an object from a bucket that has soft
- // delete policy enabled, the object becomes soft deleted, and the
- // `softDeleteTime` and `hardDeleteTime` properties are set on the object.
- // This API cannot be used to permanently delete soft-deleted objects.
- // Soft-deleted objects are permanently deleted according to their
- // `hardDeleteTime`.
- //
- // You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject]
- // API to restore soft-deleted objects until the soft delete retention period
- // has passed.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.delete`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket.
- DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
- // Restores a soft-deleted object.
- RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error)
- // Cancels an in-progress resumable upload.
- //
- // Any attempts to write to the resumable upload after cancelling the upload
- // will fail.
- //
- // The behavior for currently in progress write operations is not guaranteed -
- // they could either complete before the cancellation or fail if the
- // cancellation completes first.
- CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error)
- // Retrieves object metadata.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.get`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket. To return object ACLs, the authenticated user must also have
- // the `storage.objects.getIamPolicy` permission.
- GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error)
- // Retrieves object data.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.get`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket.
- ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error)
- // Reads an object's data.
- //
- // This is a bi-directional API with the added support for reading multiple
- // ranges within one stream both within and across multiple messages.
- // If the server encountered an error for any of the inputs, the stream will
- // be closed with the relevant error code.
- // Because the API allows for multiple outstanding requests, when the stream
- // is closed the error response will contain a BidiReadObjectRangesError proto
- // in the error extension describing the error for each outstanding read_id.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.get`
- //
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket.
- //
- // This API is currently in preview and is not yet available for general
- // use.
- BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error)
- // Updates an object's metadata.
- // Equivalent to JSON API's storage.objects.patch.
- UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error)
- // Stores a new object and metadata.
- //
- // An object can be written either in a single message stream or in a
- // resumable sequence of message streams. To write using a single stream,
- // the client should include in the first message of the stream an
- // `WriteObjectSpec` describing the destination bucket, object, and any
- // preconditions. Additionally, the final message must set 'finish_write' to
- // true, or else it is an error.
- //
- // For a resumable write, the client should instead call
- // `StartResumableWrite()`, populating a `WriteObjectSpec` into that request.
- // They should then attach the returned `upload_id` to the first message of
- // each following call to `WriteObject`. If the stream is closed before
- // finishing the upload (either explicitly by the client or due to a network
- // error or an error response from the server), the client should do as
- // follows:
- // - Check the result Status of the stream, to determine if writing can be
- // resumed on this stream or must be restarted from scratch (by calling
- // `StartResumableWrite()`). The resumable errors are DEADLINE_EXCEEDED,
- // INTERNAL, and UNAVAILABLE. For each case, the client should use binary
- // exponential backoff before retrying. Additionally, writes can be
- // resumed after RESOURCE_EXHAUSTED errors, but only after taking
- // appropriate measures, which may include reducing aggregate send rate
- // across clients and/or requesting a quota increase for your project.
- // - If the call to `WriteObject` returns `ABORTED`, that indicates
- // concurrent attempts to update the resumable write, caused either by
- // multiple racing clients or by a single client where the previous
- // request was timed out on the client side but nonetheless reached the
- // server. In this case the client should take steps to prevent further
- // concurrent writes (e.g., increase the timeouts, stop using more than
- // one process to perform the upload, etc.), and then should follow the
- // steps below for resuming the upload.
- // - For resumable errors, the client should call `QueryWriteStatus()` and
- // then continue writing from the returned `persisted_size`. This may be
- // less than the amount of data the client previously sent. Note also that
- // it is acceptable to send data starting at an offset earlier than the
- // returned `persisted_size`; in this case, the service will skip data at
- // offsets that were already persisted (without checking that it matches
- // the previously written data), and write only the data starting from the
- // persisted offset. Even though the data isn't written, it may still
- // incur a performance cost over resuming at the correct write offset.
- // This behavior can make client-side handling simpler in some cases.
- // - Clients must only send data that is a multiple of 256 KiB per message,
- // unless the object is being finished with `finish_write` set to `true`.
- //
- // The service will not view the object as complete until the client has
- // sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any
- // requests on a stream after sending a request with `finish_write` set to
- // `true` will cause an error. The client **should** check the response it
- // receives to determine how much data the service was able to commit and
- // whether the service views the object as complete.
- //
- // Attempting to resume an already finalized object will result in an OK
- // status, with a `WriteObjectResponse` containing the finalized object's
- // metadata.
- //
- // Alternatively, the BidiWriteObject operation may be used to write an
- // object with controls over flushing and the ability to fetch the ability to
- // determine the current persisted size.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.create`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket.
- WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error)
- // Stores a new object and metadata.
- //
- // This is similar to the WriteObject call with the added support for
- // manual flushing of persisted state, and the ability to determine current
- // persisted size without closing the stream.
- //
- // The client may specify one or both of the `state_lookup` and `flush` fields
- // in each BidiWriteObjectRequest. If `flush` is specified, the data written
- // so far will be persisted to storage. If `state_lookup` is specified, the
- // service will respond with a BidiWriteObjectResponse that contains the
- // persisted size. If both `flush` and `state_lookup` are specified, the flush
- // will always occur before a `state_lookup`, so that both may be set in the
- // same request and the returned state will be the state of the object
- // post-flush. When the stream is closed, a BidiWriteObjectResponse will
- // always be sent to the client, regardless of the value of `state_lookup`.
- BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error)
- // Retrieves a list of objects matching the criteria.
- //
- // **IAM Permissions**:
- //
- // The authenticated user requires `storage.objects.list`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions)
- // to use this method. To return object ACLs, the authenticated user must also
- // have the `storage.objects.getIamPolicy` permission.
- ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error)
- // Rewrites a source object to a destination object. Optionally overrides
- // metadata.
- RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error)
- // Starts a resumable write operation. This
- // method is part of the [Resumable
- // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature.
- // This allows you to upload large objects in multiple chunks, which is more
- // resilient to network interruptions than a single upload. The validity
- // duration of the write operation, and the consequences of it becoming
- // invalid, are service-dependent.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.create`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket.
- StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error)
- // Determines the `persisted_size` of an object that is being written. This
- // method is part of the [resumable
- // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature.
- // The returned value is the size of the object that has been persisted so
- // far. The value can be used as the `write_offset` for the next `Write()`
- // call.
- //
- // If the object does not exist, meaning if it was deleted, or the
- // first `Write()` has not yet reached the service, this method returns the
- // error `NOT_FOUND`.
- //
- // This method is useful for clients that buffer data and need to know which
- // data can be safely evicted. The client can call `QueryWriteStatus()` at any
- // time to determine how much data has been logged for this object.
- // For any sequence of `QueryWriteStatus()` calls for a given
- // object name, the sequence of returned `persisted_size` values are
- // non-decreasing.
- QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error)
- // Moves the source object to the destination object in the same bucket.
- MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error)
-}
-
-type storageClient struct {
- cc grpc.ClientConnInterface
-}
-
-func NewStorageClient(cc grpc.ClientConnInterface) StorageClient {
- return &storageClient{cc}
-}
-
-func (c *storageClient) DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
- out := new(emptypb.Empty)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/DeleteBucket", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) {
- out := new(Bucket)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/GetBucket", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) {
- out := new(Bucket)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/CreateBucket", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) {
- out := new(ListBucketsResponse)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/ListBuckets", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) {
- out := new(Bucket)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/LockBucketRetentionPolicy", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) {
- out := new(iampb.Policy)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/GetIamPolicy", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) {
- out := new(iampb.Policy)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/SetIamPolicy", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) {
- out := new(iampb.TestIamPermissionsResponse)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/TestIamPermissions", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) {
- out := new(Bucket)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/UpdateBucket", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) {
- out := new(Object)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/ComposeObject", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
- out := new(emptypb.Empty)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/DeleteObject", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error) {
- out := new(Object)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/RestoreObject", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error) {
- out := new(CancelResumableWriteResponse)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/CancelResumableWrite", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) {
- out := new(Object)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/GetObject", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error) {
- stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[0], "/google.storage.v2.Storage/ReadObject", opts...)
- if err != nil {
- return nil, err
- }
- x := &storageReadObjectClient{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 Storage_ReadObjectClient interface {
- Recv() (*ReadObjectResponse, error)
- grpc.ClientStream
-}
-
-type storageReadObjectClient struct {
- grpc.ClientStream
-}
-
-func (x *storageReadObjectClient) Recv() (*ReadObjectResponse, error) {
- m := new(ReadObjectResponse)
- if err := x.ClientStream.RecvMsg(m); err != nil {
- return nil, err
- }
- return m, nil
-}
-
-func (c *storageClient) BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error) {
- stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[1], "/google.storage.v2.Storage/BidiReadObject", opts...)
- if err != nil {
- return nil, err
- }
- x := &storageBidiReadObjectClient{stream}
- return x, nil
-}
-
-type Storage_BidiReadObjectClient interface {
- Send(*BidiReadObjectRequest) error
- Recv() (*BidiReadObjectResponse, error)
- grpc.ClientStream
-}
-
-type storageBidiReadObjectClient struct {
- grpc.ClientStream
-}
-
-func (x *storageBidiReadObjectClient) Send(m *BidiReadObjectRequest) error {
- return x.ClientStream.SendMsg(m)
-}
-
-func (x *storageBidiReadObjectClient) Recv() (*BidiReadObjectResponse, error) {
- m := new(BidiReadObjectResponse)
- if err := x.ClientStream.RecvMsg(m); err != nil {
- return nil, err
- }
- return m, nil
-}
-
-func (c *storageClient) UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) {
- out := new(Object)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/UpdateObject", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error) {
- stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[2], "/google.storage.v2.Storage/WriteObject", opts...)
- if err != nil {
- return nil, err
- }
- x := &storageWriteObjectClient{stream}
- return x, nil
-}
-
-type Storage_WriteObjectClient interface {
- Send(*WriteObjectRequest) error
- CloseAndRecv() (*WriteObjectResponse, error)
- grpc.ClientStream
-}
-
-type storageWriteObjectClient struct {
- grpc.ClientStream
-}
-
-func (x *storageWriteObjectClient) Send(m *WriteObjectRequest) error {
- return x.ClientStream.SendMsg(m)
-}
-
-func (x *storageWriteObjectClient) CloseAndRecv() (*WriteObjectResponse, error) {
- if err := x.ClientStream.CloseSend(); err != nil {
- return nil, err
- }
- m := new(WriteObjectResponse)
- if err := x.ClientStream.RecvMsg(m); err != nil {
- return nil, err
- }
- return m, nil
-}
-
-func (c *storageClient) BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error) {
- stream, err := c.cc.NewStream(ctx, &_Storage_serviceDesc.Streams[3], "/google.storage.v2.Storage/BidiWriteObject", opts...)
- if err != nil {
- return nil, err
- }
- x := &storageBidiWriteObjectClient{stream}
- return x, nil
-}
-
-type Storage_BidiWriteObjectClient interface {
- Send(*BidiWriteObjectRequest) error
- Recv() (*BidiWriteObjectResponse, error)
- grpc.ClientStream
-}
-
-type storageBidiWriteObjectClient struct {
- grpc.ClientStream
-}
-
-func (x *storageBidiWriteObjectClient) Send(m *BidiWriteObjectRequest) error {
- return x.ClientStream.SendMsg(m)
-}
-
-func (x *storageBidiWriteObjectClient) Recv() (*BidiWriteObjectResponse, error) {
- m := new(BidiWriteObjectResponse)
- if err := x.ClientStream.RecvMsg(m); err != nil {
- return nil, err
- }
- return m, nil
-}
-
-func (c *storageClient) ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) {
- out := new(ListObjectsResponse)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/ListObjects", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) {
- out := new(RewriteResponse)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/RewriteObject", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) {
- out := new(StartResumableWriteResponse)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/StartResumableWrite", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) {
- out := new(QueryWriteStatusResponse)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/QueryWriteStatus", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-func (c *storageClient) MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error) {
- out := new(Object)
- err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/MoveObject", in, out, opts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-// StorageServer is the server API for Storage service.
-type StorageServer interface {
- // Permanently deletes an empty bucket.
- DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error)
- // Returns metadata for the specified bucket.
- GetBucket(context.Context, *GetBucketRequest) (*Bucket, error)
- // Creates a new bucket.
- CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error)
- // Retrieves a list of buckets for a given project.
- ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error)
- // Locks retention policy on a bucket.
- LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error)
- // Gets the IAM policy for a specified bucket.
- // The `resource` field in the request should be
- // `projects/_/buckets/{bucket}` for a bucket, or
- // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
- // for a managed folder.
- GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error)
- // Updates an IAM policy for the specified bucket.
- // The `resource` field in the request should be
- // `projects/_/buckets/{bucket}` for a bucket, or
- // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
- // for a managed folder.
- SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error)
- // Tests a set of permissions on the given bucket, object, or managed folder
- // to see which, if any, are held by the caller.
- // The `resource` field in the request should be
- // `projects/_/buckets/{bucket}` for a bucket,
- // `projects/_/buckets/{bucket}/objects/{object}` for an object, or
- // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
- // for a managed folder.
- TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error)
- // Updates a bucket. Equivalent to JSON API's storage.buckets.patch method.
- UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error)
- // Concatenates a list of existing objects into a new object in the same
- // bucket.
- ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error)
- // Deletes an object and its metadata. Deletions are permanent if versioning
- // is not enabled for the bucket, or if the generation parameter is used, or
- // if [soft delete](https://cloud.google.com/storage/docs/soft-delete) is not
- // enabled for the bucket.
- // When this API is used to delete an object from a bucket that has soft
- // delete policy enabled, the object becomes soft deleted, and the
- // `softDeleteTime` and `hardDeleteTime` properties are set on the object.
- // This API cannot be used to permanently delete soft-deleted objects.
- // Soft-deleted objects are permanently deleted according to their
- // `hardDeleteTime`.
- //
- // You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject]
- // API to restore soft-deleted objects until the soft delete retention period
- // has passed.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.delete`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket.
- DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error)
- // Restores a soft-deleted object.
- RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error)
- // Cancels an in-progress resumable upload.
- //
- // Any attempts to write to the resumable upload after cancelling the upload
- // will fail.
- //
- // The behavior for currently in progress write operations is not guaranteed -
- // they could either complete before the cancellation or fail if the
- // cancellation completes first.
- CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error)
- // Retrieves object metadata.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.get`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket. To return object ACLs, the authenticated user must also have
- // the `storage.objects.getIamPolicy` permission.
- GetObject(context.Context, *GetObjectRequest) (*Object, error)
- // Retrieves object data.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.get`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket.
- ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error
- // Reads an object's data.
- //
- // This is a bi-directional API with the added support for reading multiple
- // ranges within one stream both within and across multiple messages.
- // If the server encountered an error for any of the inputs, the stream will
- // be closed with the relevant error code.
- // Because the API allows for multiple outstanding requests, when the stream
- // is closed the error response will contain a BidiReadObjectRangesError proto
- // in the error extension describing the error for each outstanding read_id.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.get`
- //
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket.
- //
- // This API is currently in preview and is not yet available for general
- // use.
- BidiReadObject(Storage_BidiReadObjectServer) error
- // Updates an object's metadata.
- // Equivalent to JSON API's storage.objects.patch.
- UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error)
- // Stores a new object and metadata.
- //
- // An object can be written either in a single message stream or in a
- // resumable sequence of message streams. To write using a single stream,
- // the client should include in the first message of the stream an
- // `WriteObjectSpec` describing the destination bucket, object, and any
- // preconditions. Additionally, the final message must set 'finish_write' to
- // true, or else it is an error.
- //
- // For a resumable write, the client should instead call
- // `StartResumableWrite()`, populating a `WriteObjectSpec` into that request.
- // They should then attach the returned `upload_id` to the first message of
- // each following call to `WriteObject`. If the stream is closed before
- // finishing the upload (either explicitly by the client or due to a network
- // error or an error response from the server), the client should do as
- // follows:
- // - Check the result Status of the stream, to determine if writing can be
- // resumed on this stream or must be restarted from scratch (by calling
- // `StartResumableWrite()`). The resumable errors are DEADLINE_EXCEEDED,
- // INTERNAL, and UNAVAILABLE. For each case, the client should use binary
- // exponential backoff before retrying. Additionally, writes can be
- // resumed after RESOURCE_EXHAUSTED errors, but only after taking
- // appropriate measures, which may include reducing aggregate send rate
- // across clients and/or requesting a quota increase for your project.
- // - If the call to `WriteObject` returns `ABORTED`, that indicates
- // concurrent attempts to update the resumable write, caused either by
- // multiple racing clients or by a single client where the previous
- // request was timed out on the client side but nonetheless reached the
- // server. In this case the client should take steps to prevent further
- // concurrent writes (e.g., increase the timeouts, stop using more than
- // one process to perform the upload, etc.), and then should follow the
- // steps below for resuming the upload.
- // - For resumable errors, the client should call `QueryWriteStatus()` and
- // then continue writing from the returned `persisted_size`. This may be
- // less than the amount of data the client previously sent. Note also that
- // it is acceptable to send data starting at an offset earlier than the
- // returned `persisted_size`; in this case, the service will skip data at
- // offsets that were already persisted (without checking that it matches
- // the previously written data), and write only the data starting from the
- // persisted offset. Even though the data isn't written, it may still
- // incur a performance cost over resuming at the correct write offset.
- // This behavior can make client-side handling simpler in some cases.
- // - Clients must only send data that is a multiple of 256 KiB per message,
- // unless the object is being finished with `finish_write` set to `true`.
- //
- // The service will not view the object as complete until the client has
- // sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any
- // requests on a stream after sending a request with `finish_write` set to
- // `true` will cause an error. The client **should** check the response it
- // receives to determine how much data the service was able to commit and
- // whether the service views the object as complete.
- //
- // Attempting to resume an already finalized object will result in an OK
- // status, with a `WriteObjectResponse` containing the finalized object's
- // metadata.
- //
- // Alternatively, the BidiWriteObject operation may be used to write an
- // object with controls over flushing and the ability to fetch the ability to
- // determine the current persisted size.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.create`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket.
- WriteObject(Storage_WriteObjectServer) error
- // Stores a new object and metadata.
- //
- // This is similar to the WriteObject call with the added support for
- // manual flushing of persisted state, and the ability to determine current
- // persisted size without closing the stream.
- //
- // The client may specify one or both of the `state_lookup` and `flush` fields
- // in each BidiWriteObjectRequest. If `flush` is specified, the data written
- // so far will be persisted to storage. If `state_lookup` is specified, the
- // service will respond with a BidiWriteObjectResponse that contains the
- // persisted size. If both `flush` and `state_lookup` are specified, the flush
- // will always occur before a `state_lookup`, so that both may be set in the
- // same request and the returned state will be the state of the object
- // post-flush. When the stream is closed, a BidiWriteObjectResponse will
- // always be sent to the client, regardless of the value of `state_lookup`.
- BidiWriteObject(Storage_BidiWriteObjectServer) error
- // Retrieves a list of objects matching the criteria.
- //
- // **IAM Permissions**:
- //
- // The authenticated user requires `storage.objects.list`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions)
- // to use this method. To return object ACLs, the authenticated user must also
- // have the `storage.objects.getIamPolicy` permission.
- ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error)
- // Rewrites a source object to a destination object. Optionally overrides
- // metadata.
- RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error)
- // Starts a resumable write operation. This
- // method is part of the [Resumable
- // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature.
- // This allows you to upload large objects in multiple chunks, which is more
- // resilient to network interruptions than a single upload. The validity
- // duration of the write operation, and the consequences of it becoming
- // invalid, are service-dependent.
- //
- // **IAM Permissions**:
- //
- // Requires `storage.objects.create`
- // [IAM permission](https://cloud.google.com/iam/docs/overview#permissions) on
- // the bucket.
- StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error)
- // Determines the `persisted_size` of an object that is being written. This
- // method is part of the [resumable
- // upload](https://cloud.google.com/storage/docs/resumable-uploads) feature.
- // The returned value is the size of the object that has been persisted so
- // far. The value can be used as the `write_offset` for the next `Write()`
- // call.
- //
- // If the object does not exist, meaning if it was deleted, or the
- // first `Write()` has not yet reached the service, this method returns the
- // error `NOT_FOUND`.
- //
- // This method is useful for clients that buffer data and need to know which
- // data can be safely evicted. The client can call `QueryWriteStatus()` at any
- // time to determine how much data has been logged for this object.
- // For any sequence of `QueryWriteStatus()` calls for a given
- // object name, the sequence of returned `persisted_size` values are
- // non-decreasing.
- QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error)
- // Moves the source object to the destination object in the same bucket.
- MoveObject(context.Context, *MoveObjectRequest) (*Object, error)
-}
-
-// UnimplementedStorageServer can be embedded to have forward compatible implementations.
-type UnimplementedStorageServer struct {
-}
-
-func (*UnimplementedStorageServer) DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method DeleteBucket not implemented")
-}
-func (*UnimplementedStorageServer) GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method GetBucket not implemented")
-}
-func (*UnimplementedStorageServer) CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method CreateBucket not implemented")
-}
-func (*UnimplementedStorageServer) ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method ListBuckets not implemented")
-}
-func (*UnimplementedStorageServer) LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method LockBucketRetentionPolicy not implemented")
-}
-func (*UnimplementedStorageServer) GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented")
-}
-func (*UnimplementedStorageServer) SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented")
-}
-func (*UnimplementedStorageServer) TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented")
-}
-func (*UnimplementedStorageServer) UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method UpdateBucket not implemented")
-}
-func (*UnimplementedStorageServer) ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method ComposeObject not implemented")
-}
-func (*UnimplementedStorageServer) DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method DeleteObject not implemented")
-}
-func (*UnimplementedStorageServer) RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method RestoreObject not implemented")
-}
-func (*UnimplementedStorageServer) CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method CancelResumableWrite not implemented")
-}
-func (*UnimplementedStorageServer) GetObject(context.Context, *GetObjectRequest) (*Object, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method GetObject not implemented")
-}
-func (*UnimplementedStorageServer) ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error {
- return status1.Errorf(codes.Unimplemented, "method ReadObject not implemented")
-}
-func (*UnimplementedStorageServer) BidiReadObject(Storage_BidiReadObjectServer) error {
- return status1.Errorf(codes.Unimplemented, "method BidiReadObject not implemented")
-}
-func (*UnimplementedStorageServer) UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method UpdateObject not implemented")
-}
-func (*UnimplementedStorageServer) WriteObject(Storage_WriteObjectServer) error {
- return status1.Errorf(codes.Unimplemented, "method WriteObject not implemented")
-}
-func (*UnimplementedStorageServer) BidiWriteObject(Storage_BidiWriteObjectServer) error {
- return status1.Errorf(codes.Unimplemented, "method BidiWriteObject not implemented")
-}
-func (*UnimplementedStorageServer) ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method ListObjects not implemented")
-}
-func (*UnimplementedStorageServer) RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method RewriteObject not implemented")
-}
-func (*UnimplementedStorageServer) StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method StartResumableWrite not implemented")
-}
-func (*UnimplementedStorageServer) QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method QueryWriteStatus not implemented")
-}
-func (*UnimplementedStorageServer) MoveObject(context.Context, *MoveObjectRequest) (*Object, error) {
- return nil, status1.Errorf(codes.Unimplemented, "method MoveObject not implemented")
-}
-
-func RegisterStorageServer(s *grpc.Server, srv StorageServer) {
- s.RegisterService(&_Storage_serviceDesc, srv)
-}
-
-func _Storage_DeleteBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(DeleteBucketRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).DeleteBucket(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/DeleteBucket",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).DeleteBucket(ctx, req.(*DeleteBucketRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_GetBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(GetBucketRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).GetBucket(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/GetBucket",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).GetBucket(ctx, req.(*GetBucketRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_CreateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(CreateBucketRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).CreateBucket(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/CreateBucket",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).CreateBucket(ctx, req.(*CreateBucketRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_ListBuckets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(ListBucketsRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).ListBuckets(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/ListBuckets",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).ListBuckets(ctx, req.(*ListBucketsRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_LockBucketRetentionPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(LockBucketRetentionPolicyRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).LockBucketRetentionPolicy(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/LockBucketRetentionPolicy",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).LockBucketRetentionPolicy(ctx, req.(*LockBucketRetentionPolicyRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(iampb.GetIamPolicyRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).GetIamPolicy(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/GetIamPolicy",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).GetIamPolicy(ctx, req.(*iampb.GetIamPolicyRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(iampb.SetIamPolicyRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).SetIamPolicy(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/SetIamPolicy",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).SetIamPolicy(ctx, req.(*iampb.SetIamPolicyRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(iampb.TestIamPermissionsRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).TestIamPermissions(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/TestIamPermissions",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).TestIamPermissions(ctx, req.(*iampb.TestIamPermissionsRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_UpdateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(UpdateBucketRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).UpdateBucket(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/UpdateBucket",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).UpdateBucket(ctx, req.(*UpdateBucketRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_ComposeObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(ComposeObjectRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).ComposeObject(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/ComposeObject",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).ComposeObject(ctx, req.(*ComposeObjectRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(DeleteObjectRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).DeleteObject(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/DeleteObject",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).DeleteObject(ctx, req.(*DeleteObjectRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(RestoreObjectRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).RestoreObject(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/RestoreObject",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).RestoreObject(ctx, req.(*RestoreObjectRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_CancelResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(CancelResumableWriteRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).CancelResumableWrite(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/CancelResumableWrite",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).CancelResumableWrite(ctx, req.(*CancelResumableWriteRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_GetObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(GetObjectRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).GetObject(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/GetObject",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).GetObject(ctx, req.(*GetObjectRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_ReadObject_Handler(srv interface{}, stream grpc.ServerStream) error {
- m := new(ReadObjectRequest)
- if err := stream.RecvMsg(m); err != nil {
- return err
- }
- return srv.(StorageServer).ReadObject(m, &storageReadObjectServer{stream})
-}
-
-type Storage_ReadObjectServer interface {
- Send(*ReadObjectResponse) error
- grpc.ServerStream
-}
-
-type storageReadObjectServer struct {
- grpc.ServerStream
-}
-
-func (x *storageReadObjectServer) Send(m *ReadObjectResponse) error {
- return x.ServerStream.SendMsg(m)
-}
-
-func _Storage_BidiReadObject_Handler(srv interface{}, stream grpc.ServerStream) error {
- return srv.(StorageServer).BidiReadObject(&storageBidiReadObjectServer{stream})
-}
-
-type Storage_BidiReadObjectServer interface {
- Send(*BidiReadObjectResponse) error
- Recv() (*BidiReadObjectRequest, error)
- grpc.ServerStream
-}
-
-type storageBidiReadObjectServer struct {
- grpc.ServerStream
-}
-
-func (x *storageBidiReadObjectServer) Send(m *BidiReadObjectResponse) error {
- return x.ServerStream.SendMsg(m)
-}
-
-func (x *storageBidiReadObjectServer) Recv() (*BidiReadObjectRequest, error) {
- m := new(BidiReadObjectRequest)
- if err := x.ServerStream.RecvMsg(m); err != nil {
- return nil, err
- }
- return m, nil
-}
-
-func _Storage_UpdateObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(UpdateObjectRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).UpdateObject(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/UpdateObject",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).UpdateObject(ctx, req.(*UpdateObjectRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_WriteObject_Handler(srv interface{}, stream grpc.ServerStream) error {
- return srv.(StorageServer).WriteObject(&storageWriteObjectServer{stream})
-}
-
-type Storage_WriteObjectServer interface {
- SendAndClose(*WriteObjectResponse) error
- Recv() (*WriteObjectRequest, error)
- grpc.ServerStream
-}
-
-type storageWriteObjectServer struct {
- grpc.ServerStream
-}
-
-func (x *storageWriteObjectServer) SendAndClose(m *WriteObjectResponse) error {
- return x.ServerStream.SendMsg(m)
-}
-
-func (x *storageWriteObjectServer) Recv() (*WriteObjectRequest, error) {
- m := new(WriteObjectRequest)
- if err := x.ServerStream.RecvMsg(m); err != nil {
- return nil, err
- }
- return m, nil
-}
-
-func _Storage_BidiWriteObject_Handler(srv interface{}, stream grpc.ServerStream) error {
- return srv.(StorageServer).BidiWriteObject(&storageBidiWriteObjectServer{stream})
-}
-
-type Storage_BidiWriteObjectServer interface {
- Send(*BidiWriteObjectResponse) error
- Recv() (*BidiWriteObjectRequest, error)
- grpc.ServerStream
-}
-
-type storageBidiWriteObjectServer struct {
- grpc.ServerStream
-}
-
-func (x *storageBidiWriteObjectServer) Send(m *BidiWriteObjectResponse) error {
- return x.ServerStream.SendMsg(m)
-}
-
-func (x *storageBidiWriteObjectServer) Recv() (*BidiWriteObjectRequest, error) {
- m := new(BidiWriteObjectRequest)
- if err := x.ServerStream.RecvMsg(m); err != nil {
- return nil, err
- }
- return m, nil
-}
-
-func _Storage_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(ListObjectsRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).ListObjects(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/ListObjects",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).ListObjects(ctx, req.(*ListObjectsRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_RewriteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(RewriteObjectRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).RewriteObject(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/RewriteObject",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).RewriteObject(ctx, req.(*RewriteObjectRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_StartResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(StartResumableWriteRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).StartResumableWrite(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/StartResumableWrite",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).StartResumableWrite(ctx, req.(*StartResumableWriteRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_QueryWriteStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(QueryWriteStatusRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).QueryWriteStatus(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/QueryWriteStatus",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).QueryWriteStatus(ctx, req.(*QueryWriteStatusRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-func _Storage_MoveObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(MoveObjectRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StorageServer).MoveObject(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: "/google.storage.v2.Storage/MoveObject",
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StorageServer).MoveObject(ctx, req.(*MoveObjectRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-var _Storage_serviceDesc = grpc.ServiceDesc{
- ServiceName: "google.storage.v2.Storage",
- HandlerType: (*StorageServer)(nil),
- Methods: []grpc.MethodDesc{
- {
- MethodName: "DeleteBucket",
- Handler: _Storage_DeleteBucket_Handler,
- },
- {
- MethodName: "GetBucket",
- Handler: _Storage_GetBucket_Handler,
- },
- {
- MethodName: "CreateBucket",
- Handler: _Storage_CreateBucket_Handler,
- },
- {
- MethodName: "ListBuckets",
- Handler: _Storage_ListBuckets_Handler,
- },
- {
- MethodName: "LockBucketRetentionPolicy",
- Handler: _Storage_LockBucketRetentionPolicy_Handler,
- },
- {
- MethodName: "GetIamPolicy",
- Handler: _Storage_GetIamPolicy_Handler,
- },
- {
- MethodName: "SetIamPolicy",
- Handler: _Storage_SetIamPolicy_Handler,
- },
- {
- MethodName: "TestIamPermissions",
- Handler: _Storage_TestIamPermissions_Handler,
- },
- {
- MethodName: "UpdateBucket",
- Handler: _Storage_UpdateBucket_Handler,
- },
- {
- MethodName: "ComposeObject",
- Handler: _Storage_ComposeObject_Handler,
- },
- {
- MethodName: "DeleteObject",
- Handler: _Storage_DeleteObject_Handler,
- },
- {
- MethodName: "RestoreObject",
- Handler: _Storage_RestoreObject_Handler,
- },
- {
- MethodName: "CancelResumableWrite",
- Handler: _Storage_CancelResumableWrite_Handler,
- },
- {
- MethodName: "GetObject",
- Handler: _Storage_GetObject_Handler,
- },
- {
- MethodName: "UpdateObject",
- Handler: _Storage_UpdateObject_Handler,
- },
- {
- MethodName: "ListObjects",
- Handler: _Storage_ListObjects_Handler,
- },
- {
- MethodName: "RewriteObject",
- Handler: _Storage_RewriteObject_Handler,
- },
- {
- MethodName: "StartResumableWrite",
- Handler: _Storage_StartResumableWrite_Handler,
- },
- {
- MethodName: "QueryWriteStatus",
- Handler: _Storage_QueryWriteStatus_Handler,
- },
- {
- MethodName: "MoveObject",
- Handler: _Storage_MoveObject_Handler,
- },
- },
- Streams: []grpc.StreamDesc{
- {
- StreamName: "ReadObject",
- Handler: _Storage_ReadObject_Handler,
- ServerStreams: true,
- },
- {
- StreamName: "BidiReadObject",
- Handler: _Storage_BidiReadObject_Handler,
- ServerStreams: true,
- ClientStreams: true,
- },
- {
- StreamName: "WriteObject",
- Handler: _Storage_WriteObject_Handler,
- ClientStreams: true,
- },
- {
- StreamName: "BidiWriteObject",
- Handler: _Storage_BidiWriteObject_Handler,
- ServerStreams: true,
- ClientStreams: true,
- },
- },
- Metadata: "google/storage/v2/storage.proto",
-}
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage_grpc.pb.go b/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage_grpc.pb.go
new file mode 100644
index 0000000000..e1c9161c27
--- /dev/null
+++ b/hack/tools/vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage_grpc.pb.go
@@ -0,0 +1,1799 @@
+// Copyright 2025 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.
+
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc v4.25.7
+// source: google/storage/v2/storage.proto
+
+package storagepb
+
+import (
+ context "context"
+
+ iampb "cloud.google.com/go/iam/apiv1/iampb"
+ 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 (
+ Storage_DeleteBucket_FullMethodName = "/google.storage.v2.Storage/DeleteBucket"
+ Storage_GetBucket_FullMethodName = "/google.storage.v2.Storage/GetBucket"
+ Storage_CreateBucket_FullMethodName = "/google.storage.v2.Storage/CreateBucket"
+ Storage_ListBuckets_FullMethodName = "/google.storage.v2.Storage/ListBuckets"
+ Storage_LockBucketRetentionPolicy_FullMethodName = "/google.storage.v2.Storage/LockBucketRetentionPolicy"
+ Storage_GetIamPolicy_FullMethodName = "/google.storage.v2.Storage/GetIamPolicy"
+ Storage_SetIamPolicy_FullMethodName = "/google.storage.v2.Storage/SetIamPolicy"
+ Storage_TestIamPermissions_FullMethodName = "/google.storage.v2.Storage/TestIamPermissions"
+ Storage_UpdateBucket_FullMethodName = "/google.storage.v2.Storage/UpdateBucket"
+ Storage_ComposeObject_FullMethodName = "/google.storage.v2.Storage/ComposeObject"
+ Storage_DeleteObject_FullMethodName = "/google.storage.v2.Storage/DeleteObject"
+ Storage_RestoreObject_FullMethodName = "/google.storage.v2.Storage/RestoreObject"
+ Storage_CancelResumableWrite_FullMethodName = "/google.storage.v2.Storage/CancelResumableWrite"
+ Storage_GetObject_FullMethodName = "/google.storage.v2.Storage/GetObject"
+ Storage_ReadObject_FullMethodName = "/google.storage.v2.Storage/ReadObject"
+ Storage_BidiReadObject_FullMethodName = "/google.storage.v2.Storage/BidiReadObject"
+ Storage_UpdateObject_FullMethodName = "/google.storage.v2.Storage/UpdateObject"
+ Storage_WriteObject_FullMethodName = "/google.storage.v2.Storage/WriteObject"
+ Storage_BidiWriteObject_FullMethodName = "/google.storage.v2.Storage/BidiWriteObject"
+ Storage_ListObjects_FullMethodName = "/google.storage.v2.Storage/ListObjects"
+ Storage_RewriteObject_FullMethodName = "/google.storage.v2.Storage/RewriteObject"
+ Storage_StartResumableWrite_FullMethodName = "/google.storage.v2.Storage/StartResumableWrite"
+ Storage_QueryWriteStatus_FullMethodName = "/google.storage.v2.Storage/QueryWriteStatus"
+ Storage_MoveObject_FullMethodName = "/google.storage.v2.Storage/MoveObject"
+)
+
+// StorageClient is the client API for Storage 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 StorageClient interface {
+ // Permanently deletes an empty bucket.
+ // The request fails if there are any live or
+ // noncurrent objects in the bucket, but the request succeeds if the
+ // bucket only contains soft-deleted objects or incomplete uploads, such
+ // as ongoing XML API multipart uploads. Does not permanently delete
+ // soft-deleted objects.
+ //
+ // When this API is used to delete a bucket containing an object that has a
+ // soft delete policy
+ // enabled, the object becomes soft deleted, and the
+ // `softDeleteTime` and `hardDeleteTime` properties are set on the
+ // object.
+ //
+ // Objects and multipart uploads that were in the bucket at the time of
+ // deletion are also retained for the specified retention duration. When
+ // a soft-deleted bucket reaches the end of its retention duration, it
+ // is permanently deleted. The `hardDeleteTime` of the bucket always
+ // equals
+ // or exceeds the expiration time of the last soft-deleted object in the
+ // bucket.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.delete` IAM permission on the bucket.
+ DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+ // Returns metadata for the specified bucket.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.get`
+ // IAM permission on
+ // the bucket. Additionally, to return specific bucket metadata, the
+ // authenticated user must have the following permissions:
+ //
+ // - To return the IAM policies: `storage.buckets.getIamPolicy`
+ // - To return the bucket IP filtering rules: `storage.buckets.getIpFilter`
+ GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error)
+ // Creates a new bucket.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.create` IAM permission on the bucket.
+ // Additionally, to enable specific bucket features, the authenticated user
+ // must have the following permissions:
+ //
+ // - To enable object retention using the `enableObjectRetention` query
+ // parameter: `storage.buckets.enableObjectRetention`
+ // - To set the bucket IP filtering rules: `storage.buckets.setIpFilter`
+ CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error)
+ // Retrieves a list of buckets for a given project, ordered
+ // lexicographically by name.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.list` IAM permission on the bucket.
+ // Additionally, to enable specific bucket features, the authenticated
+ // user must have the following permissions:
+ //
+ // - To list the IAM policies: `storage.buckets.getIamPolicy`
+ // - To list the bucket IP filtering rules: `storage.buckets.getIpFilter`
+ ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error)
+ // Permanently locks the retention
+ // policy that is
+ // currently applied to the specified bucket.
+ //
+ // Caution: Locking a bucket is an
+ // irreversible action. Once you lock a bucket:
+ //
+ // - You cannot remove the retention policy from the bucket.
+ // - You cannot decrease the retention period for the policy.
+ //
+ // Once locked, you must delete the entire bucket in order to remove the
+ // bucket's retention policy. However, before you can delete the bucket, you
+ // must delete all the objects in the bucket, which is only
+ // possible if all the objects have reached the retention period set by the
+ // retention policy.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.update` IAM permission on the bucket.
+ LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error)
+ // Gets the IAM policy for a specified bucket or managed folder.
+ // The `resource` field in the request should be
+ // `projects/_/buckets/{bucket}` for a bucket, or
+ // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
+ // for a managed folder.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.getIamPolicy` on the bucket or
+ // `storage.managedFolders.getIamPolicy` IAM permission on the
+ // managed folder.
+ GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error)
+ // Updates an IAM policy for the specified bucket or managed folder.
+ // The `resource` field in the request should be
+ // `projects/_/buckets/{bucket}` for a bucket, or
+ // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
+ // for a managed folder.
+ SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error)
+ // Tests a set of permissions on the given bucket, object, or managed folder
+ // to see which, if any, are held by the caller. The `resource` field in the
+ // request should be `projects/_/buckets/{bucket}` for a bucket,
+ // `projects/_/buckets/{bucket}/objects/{object}` for an object, or
+ // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
+ // for a managed folder.
+ TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error)
+ // Updates a bucket. Changes to the bucket are readable immediately after
+ // writing, but configuration changes might take time to propagate. This
+ // method supports `patch` semantics.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.update` IAM permission on the bucket.
+ // Additionally, to enable specific bucket features, the authenticated user
+ // must have the following permissions:
+ //
+ // - To set bucket IP filtering rules: `storage.buckets.setIpFilter`
+ // - To update public access prevention policies or access control lists
+ // (ACLs): `storage.buckets.setIamPolicy`
+ UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error)
+ // Concatenates a list of existing objects into a new object in the same
+ // bucket. The existing source objects are unaffected by this operation.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires the `storage.objects.create` and `storage.objects.get` IAM
+ // permissions to use this method. If the new composite object
+ // overwrites an existing object, the authenticated user must also have
+ // the `storage.objects.delete` permission. If the request body includes
+ // the retention property, the authenticated user must also have the
+ // `storage.objects.setRetention` IAM permission.
+ ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error)
+ // Deletes an object and its metadata. Deletions are permanent if versioning
+ // is not enabled for the bucket, or if the generation parameter is used, or
+ // if soft delete is not
+ // enabled for the bucket.
+ // When this API is used to delete an object from a bucket that has soft
+ // delete policy enabled, the object becomes soft deleted, and the
+ // `softDeleteTime` and `hardDeleteTime` properties are set on the object.
+ // This API cannot be used to permanently delete soft-deleted objects.
+ // Soft-deleted objects are permanently deleted according to their
+ // `hardDeleteTime`.
+ //
+ // You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject]
+ // API to restore soft-deleted objects until the soft delete retention period
+ // has passed.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.delete` IAM permission on the bucket.
+ DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
+ // Restores a
+ // soft-deleted object.
+ // When a soft-deleted object is restored, a new copy of that object is
+ // created in the same bucket and inherits the same metadata as the
+ // soft-deleted object. The inherited metadata is the metadata that existed
+ // when the original object became soft deleted, with the following
+ // exceptions:
+ //
+ // - The `createTime` of the new object is set to the time at which the
+ // soft-deleted object was restored.
+ // - The `softDeleteTime` and `hardDeleteTime` values are cleared.
+ // - A new generation is assigned and the metageneration is reset to 1.
+ // - If the soft-deleted object was in a bucket that had Autoclass enabled,
+ // the new object is
+ // restored to Standard storage.
+ // - The restored object inherits the bucket's default object ACL, unless
+ // `copySourceAcl` is `true`.
+ //
+ // If a live object using the same name already exists in the bucket and
+ // becomes overwritten, the live object becomes a noncurrent object if Object
+ // Versioning is enabled on the bucket. If Object Versioning is not enabled,
+ // the live object becomes soft deleted.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires the following IAM permissions to use this method:
+ //
+ // - `storage.objects.restore`
+ // - `storage.objects.create`
+ // - `storage.objects.delete` (only required if overwriting an existing
+ // object)
+ // - `storage.objects.getIamPolicy` (only required if `projection` is `full`
+ // and the relevant bucket
+ // has uniform bucket-level access disabled)
+ // - `storage.objects.setIamPolicy` (only required if `copySourceAcl` is
+ // `true` and the relevant
+ // bucket has uniform bucket-level access disabled)
+ RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error)
+ // Cancels an in-progress resumable upload.
+ //
+ // Any attempts to write to the resumable upload after cancelling the upload
+ // fail.
+ //
+ // The behavior for any in-progress write operations is not guaranteed;
+ // they could either complete before the cancellation or fail if the
+ // cancellation completes first.
+ CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error)
+ // Retrieves object metadata.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.get` IAM permission on the bucket.
+ // To return object ACLs, the authenticated user must also have
+ // the `storage.objects.getIamPolicy` permission.
+ GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error)
+ // Retrieves object data.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.get` IAM permission on the bucket.
+ ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error)
+ // Reads an object's data.
+ //
+ // This bi-directional API reads data from an object, allowing you to
+ // request multiple data ranges within a single stream, even across
+ // several messages. If an error occurs with any request, the stream
+ // closes with a relevant error code. Since you can have multiple
+ // outstanding requests, the error response includes a
+ // `BidiReadObjectRangesError` field detailing the specific error for
+ // each pending `read_id`.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.get` IAM permission on the bucket.
+ BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error)
+ // Updates an object's metadata.
+ // Equivalent to JSON API's `storage.objects.patch` method.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.update` IAM permission on the bucket.
+ UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error)
+ // Stores a new object and metadata.
+ //
+ // An object can be written either in a single message stream or in a
+ // resumable sequence of message streams. To write using a single stream,
+ // the client should include in the first message of the stream an
+ // `WriteObjectSpec` describing the destination bucket, object, and any
+ // preconditions. Additionally, the final message must set 'finish_write' to
+ // true, or else it is an error.
+ //
+ // For a resumable write, the client should instead call
+ // `StartResumableWrite()`, populating a `WriteObjectSpec` into that request.
+ // They should then attach the returned `upload_id` to the first message of
+ // each following call to `WriteObject`. If the stream is closed before
+ // finishing the upload (either explicitly by the client or due to a network
+ // error or an error response from the server), the client should do as
+ // follows:
+ //
+ // - Check the result Status of the stream, to determine if writing can be
+ // resumed on this stream or must be restarted from scratch (by calling
+ // `StartResumableWrite()`). The resumable errors are `DEADLINE_EXCEEDED`,
+ // `INTERNAL`, and `UNAVAILABLE`. For each case, the client should use
+ // binary exponential backoff before retrying. Additionally, writes can
+ // be resumed after `RESOURCE_EXHAUSTED` errors, but only after taking
+ // appropriate measures, which might include reducing aggregate send rate
+ // across clients and/or requesting a quota increase for your project.
+ // - If the call to `WriteObject` returns `ABORTED`, that indicates
+ // concurrent attempts to update the resumable write, caused either by
+ // multiple racing clients or by a single client where the previous
+ // request was timed out on the client side but nonetheless reached the
+ // server. In this case the client should take steps to prevent further
+ // concurrent writes. For example, increase the timeouts and stop using
+ // more than one process to perform the upload. Follow the steps below for
+ // resuming the upload.
+ // - For resumable errors, the client should call `QueryWriteStatus()` and
+ // then continue writing from the returned `persisted_size`. This might be
+ // less than the amount of data the client previously sent. Note also that
+ // it is acceptable to send data starting at an offset earlier than the
+ // returned `persisted_size`; in this case, the service skips data at
+ // offsets that were already persisted (without checking that it matches
+ // the previously written data), and write only the data starting from the
+ // persisted offset. Even though the data isn't written, it might still
+ // incur a performance cost over resuming at the correct write offset.
+ // This behavior can make client-side handling simpler in some cases.
+ // - Clients must only send data that is a multiple of 256 KiB per message,
+ // unless the object is being finished with `finish_write` set to `true`.
+ //
+ // The service does not view the object as complete until the client has
+ // sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any
+ // requests on a stream after sending a request with `finish_write` set to
+ // `true` causes an error. The client must check the response it
+ // receives to determine how much data the service is able to commit and
+ // whether the service views the object as complete.
+ //
+ // Attempting to resume an already finalized object results in an `OK`
+ // status, with a `WriteObjectResponse` containing the finalized object's
+ // metadata.
+ //
+ // Alternatively, you can use the `BidiWriteObject` operation to write an
+ // object with controls over flushing and the ability to fetch the ability to
+ // determine the current persisted size.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.create`
+ // IAM permission on
+ // the bucket.
+ WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error)
+ // Stores a new object and metadata.
+ //
+ // This is similar to the `WriteObject` call with the added support for
+ // manual flushing of persisted state, and the ability to determine current
+ // persisted size without closing the stream.
+ //
+ // The client might specify one or both of the `state_lookup` and `flush`
+ // fields in each `BidiWriteObjectRequest`. If `flush` is specified, the data
+ // written so far is persisted to storage. If `state_lookup` is specified, the
+ // service responds with a `BidiWriteObjectResponse` that contains the
+ // persisted size. If both `flush` and `state_lookup` are specified, the flush
+ // always occurs before a `state_lookup`, so that both might be set in the
+ // same request and the returned state is the state of the object
+ // post-flush. When the stream is closed, a `BidiWriteObjectResponse`
+ // is always sent to the client, regardless of the value of `state_lookup`.
+ BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error)
+ // Retrieves a list of objects matching the criteria.
+ //
+ // **IAM Permissions**:
+ //
+ // The authenticated user requires `storage.objects.list`
+ // IAM permission to use this method. To return object ACLs, the
+ // authenticated user must also
+ // have the `storage.objects.getIamPolicy` permission.
+ ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error)
+ // Rewrites a source object to a destination object. Optionally overrides
+ // metadata.
+ RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error)
+ // Starts a resumable write operation. This
+ // method is part of the Resumable
+ // upload feature.
+ // This allows you to upload large objects in multiple chunks, which is more
+ // resilient to network interruptions than a single upload. The validity
+ // duration of the write operation, and the consequences of it becoming
+ // invalid, are service-dependent.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.create` IAM permission on the bucket.
+ StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error)
+ // Determines the `persisted_size` of an object that is being written. This
+ // method is part of the resumable
+ // upload feature.
+ // The returned value is the size of the object that has been persisted so
+ // far. The value can be used as the `write_offset` for the next `Write()`
+ // call.
+ //
+ // If the object does not exist, meaning if it was deleted, or the
+ // first `Write()` has not yet reached the service, this method returns the
+ // error `NOT_FOUND`.
+ //
+ // This method is useful for clients that buffer data and need to know which
+ // data can be safely evicted. The client can call `QueryWriteStatus()` at any
+ // time to determine how much data has been logged for this object.
+ // For any sequence of `QueryWriteStatus()` calls for a given
+ // object name, the sequence of returned `persisted_size` values are
+ // non-decreasing.
+ QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error)
+ // Moves the source object to the destination object in the same bucket.
+ // This operation moves a source object to a destination object in the
+ // same bucket by renaming the object. The move itself is an atomic
+ // transaction, ensuring all steps either complete successfully or no
+ // changes are made.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires the following IAM permissions to use this method:
+ //
+ // - `storage.objects.move`
+ // - `storage.objects.create`
+ // - `storage.objects.delete` (only required if overwriting an existing
+ // object)
+ MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error)
+}
+
+type storageClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewStorageClient(cc grpc.ClientConnInterface) StorageClient {
+ return &storageClient{cc}
+}
+
+func (c *storageClient) DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+ out := new(emptypb.Empty)
+ err := c.cc.Invoke(ctx, Storage_DeleteBucket_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error) {
+ out := new(Bucket)
+ err := c.cc.Invoke(ctx, Storage_GetBucket_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) CreateBucket(ctx context.Context, in *CreateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) {
+ out := new(Bucket)
+ err := c.cc.Invoke(ctx, Storage_CreateBucket_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) ListBuckets(ctx context.Context, in *ListBucketsRequest, opts ...grpc.CallOption) (*ListBucketsResponse, error) {
+ out := new(ListBucketsResponse)
+ err := c.cc.Invoke(ctx, Storage_ListBuckets_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) LockBucketRetentionPolicy(ctx context.Context, in *LockBucketRetentionPolicyRequest, opts ...grpc.CallOption) (*Bucket, error) {
+ out := new(Bucket)
+ err := c.cc.Invoke(ctx, Storage_LockBucketRetentionPolicy_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) GetIamPolicy(ctx context.Context, in *iampb.GetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) {
+ out := new(iampb.Policy)
+ err := c.cc.Invoke(ctx, Storage_GetIamPolicy_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) SetIamPolicy(ctx context.Context, in *iampb.SetIamPolicyRequest, opts ...grpc.CallOption) (*iampb.Policy, error) {
+ out := new(iampb.Policy)
+ err := c.cc.Invoke(ctx, Storage_SetIamPolicy_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) TestIamPermissions(ctx context.Context, in *iampb.TestIamPermissionsRequest, opts ...grpc.CallOption) (*iampb.TestIamPermissionsResponse, error) {
+ out := new(iampb.TestIamPermissionsResponse)
+ err := c.cc.Invoke(ctx, Storage_TestIamPermissions_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error) {
+ out := new(Bucket)
+ err := c.cc.Invoke(ctx, Storage_UpdateBucket_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error) {
+ out := new(Object)
+ err := c.cc.Invoke(ctx, Storage_ComposeObject_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+ out := new(emptypb.Empty)
+ err := c.cc.Invoke(ctx, Storage_DeleteObject_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) RestoreObject(ctx context.Context, in *RestoreObjectRequest, opts ...grpc.CallOption) (*Object, error) {
+ out := new(Object)
+ err := c.cc.Invoke(ctx, Storage_RestoreObject_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error) {
+ out := new(CancelResumableWriteResponse)
+ err := c.cc.Invoke(ctx, Storage_CancelResumableWrite_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) GetObject(ctx context.Context, in *GetObjectRequest, opts ...grpc.CallOption) (*Object, error) {
+ out := new(Object)
+ err := c.cc.Invoke(ctx, Storage_GetObject_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) ReadObject(ctx context.Context, in *ReadObjectRequest, opts ...grpc.CallOption) (Storage_ReadObjectClient, error) {
+ stream, err := c.cc.NewStream(ctx, &Storage_ServiceDesc.Streams[0], Storage_ReadObject_FullMethodName, opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &storageReadObjectClient{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 Storage_ReadObjectClient interface {
+ Recv() (*ReadObjectResponse, error)
+ grpc.ClientStream
+}
+
+type storageReadObjectClient struct {
+ grpc.ClientStream
+}
+
+func (x *storageReadObjectClient) Recv() (*ReadObjectResponse, error) {
+ m := new(ReadObjectResponse)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func (c *storageClient) BidiReadObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiReadObjectClient, error) {
+ stream, err := c.cc.NewStream(ctx, &Storage_ServiceDesc.Streams[1], Storage_BidiReadObject_FullMethodName, opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &storageBidiReadObjectClient{stream}
+ return x, nil
+}
+
+type Storage_BidiReadObjectClient interface {
+ Send(*BidiReadObjectRequest) error
+ Recv() (*BidiReadObjectResponse, error)
+ grpc.ClientStream
+}
+
+type storageBidiReadObjectClient struct {
+ grpc.ClientStream
+}
+
+func (x *storageBidiReadObjectClient) Send(m *BidiReadObjectRequest) error {
+ return x.ClientStream.SendMsg(m)
+}
+
+func (x *storageBidiReadObjectClient) Recv() (*BidiReadObjectResponse, error) {
+ m := new(BidiReadObjectResponse)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func (c *storageClient) UpdateObject(ctx context.Context, in *UpdateObjectRequest, opts ...grpc.CallOption) (*Object, error) {
+ out := new(Object)
+ err := c.cc.Invoke(ctx, Storage_UpdateObject_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) WriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_WriteObjectClient, error) {
+ stream, err := c.cc.NewStream(ctx, &Storage_ServiceDesc.Streams[2], Storage_WriteObject_FullMethodName, opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &storageWriteObjectClient{stream}
+ return x, nil
+}
+
+type Storage_WriteObjectClient interface {
+ Send(*WriteObjectRequest) error
+ CloseAndRecv() (*WriteObjectResponse, error)
+ grpc.ClientStream
+}
+
+type storageWriteObjectClient struct {
+ grpc.ClientStream
+}
+
+func (x *storageWriteObjectClient) Send(m *WriteObjectRequest) error {
+ return x.ClientStream.SendMsg(m)
+}
+
+func (x *storageWriteObjectClient) CloseAndRecv() (*WriteObjectResponse, error) {
+ if err := x.ClientStream.CloseSend(); err != nil {
+ return nil, err
+ }
+ m := new(WriteObjectResponse)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func (c *storageClient) BidiWriteObject(ctx context.Context, opts ...grpc.CallOption) (Storage_BidiWriteObjectClient, error) {
+ stream, err := c.cc.NewStream(ctx, &Storage_ServiceDesc.Streams[3], Storage_BidiWriteObject_FullMethodName, opts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &storageBidiWriteObjectClient{stream}
+ return x, nil
+}
+
+type Storage_BidiWriteObjectClient interface {
+ Send(*BidiWriteObjectRequest) error
+ Recv() (*BidiWriteObjectResponse, error)
+ grpc.ClientStream
+}
+
+type storageBidiWriteObjectClient struct {
+ grpc.ClientStream
+}
+
+func (x *storageBidiWriteObjectClient) Send(m *BidiWriteObjectRequest) error {
+ return x.ClientStream.SendMsg(m)
+}
+
+func (x *storageBidiWriteObjectClient) Recv() (*BidiWriteObjectResponse, error) {
+ m := new(BidiWriteObjectResponse)
+ if err := x.ClientStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func (c *storageClient) ListObjects(ctx context.Context, in *ListObjectsRequest, opts ...grpc.CallOption) (*ListObjectsResponse, error) {
+ out := new(ListObjectsResponse)
+ err := c.cc.Invoke(ctx, Storage_ListObjects_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) RewriteObject(ctx context.Context, in *RewriteObjectRequest, opts ...grpc.CallOption) (*RewriteResponse, error) {
+ out := new(RewriteResponse)
+ err := c.cc.Invoke(ctx, Storage_RewriteObject_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) StartResumableWrite(ctx context.Context, in *StartResumableWriteRequest, opts ...grpc.CallOption) (*StartResumableWriteResponse, error) {
+ out := new(StartResumableWriteResponse)
+ err := c.cc.Invoke(ctx, Storage_StartResumableWrite_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) QueryWriteStatus(ctx context.Context, in *QueryWriteStatusRequest, opts ...grpc.CallOption) (*QueryWriteStatusResponse, error) {
+ out := new(QueryWriteStatusResponse)
+ err := c.cc.Invoke(ctx, Storage_QueryWriteStatus_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *storageClient) MoveObject(ctx context.Context, in *MoveObjectRequest, opts ...grpc.CallOption) (*Object, error) {
+ out := new(Object)
+ err := c.cc.Invoke(ctx, Storage_MoveObject_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// StorageServer is the server API for Storage service.
+// All implementations should embed UnimplementedStorageServer
+// for forward compatibility
+type StorageServer interface {
+ // Permanently deletes an empty bucket.
+ // The request fails if there are any live or
+ // noncurrent objects in the bucket, but the request succeeds if the
+ // bucket only contains soft-deleted objects or incomplete uploads, such
+ // as ongoing XML API multipart uploads. Does not permanently delete
+ // soft-deleted objects.
+ //
+ // When this API is used to delete a bucket containing an object that has a
+ // soft delete policy
+ // enabled, the object becomes soft deleted, and the
+ // `softDeleteTime` and `hardDeleteTime` properties are set on the
+ // object.
+ //
+ // Objects and multipart uploads that were in the bucket at the time of
+ // deletion are also retained for the specified retention duration. When
+ // a soft-deleted bucket reaches the end of its retention duration, it
+ // is permanently deleted. The `hardDeleteTime` of the bucket always
+ // equals
+ // or exceeds the expiration time of the last soft-deleted object in the
+ // bucket.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.delete` IAM permission on the bucket.
+ DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error)
+ // Returns metadata for the specified bucket.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.get`
+ // IAM permission on
+ // the bucket. Additionally, to return specific bucket metadata, the
+ // authenticated user must have the following permissions:
+ //
+ // - To return the IAM policies: `storage.buckets.getIamPolicy`
+ // - To return the bucket IP filtering rules: `storage.buckets.getIpFilter`
+ GetBucket(context.Context, *GetBucketRequest) (*Bucket, error)
+ // Creates a new bucket.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.create` IAM permission on the bucket.
+ // Additionally, to enable specific bucket features, the authenticated user
+ // must have the following permissions:
+ //
+ // - To enable object retention using the `enableObjectRetention` query
+ // parameter: `storage.buckets.enableObjectRetention`
+ // - To set the bucket IP filtering rules: `storage.buckets.setIpFilter`
+ CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error)
+ // Retrieves a list of buckets for a given project, ordered
+ // lexicographically by name.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.list` IAM permission on the bucket.
+ // Additionally, to enable specific bucket features, the authenticated
+ // user must have the following permissions:
+ //
+ // - To list the IAM policies: `storage.buckets.getIamPolicy`
+ // - To list the bucket IP filtering rules: `storage.buckets.getIpFilter`
+ ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error)
+ // Permanently locks the retention
+ // policy that is
+ // currently applied to the specified bucket.
+ //
+ // Caution: Locking a bucket is an
+ // irreversible action. Once you lock a bucket:
+ //
+ // - You cannot remove the retention policy from the bucket.
+ // - You cannot decrease the retention period for the policy.
+ //
+ // Once locked, you must delete the entire bucket in order to remove the
+ // bucket's retention policy. However, before you can delete the bucket, you
+ // must delete all the objects in the bucket, which is only
+ // possible if all the objects have reached the retention period set by the
+ // retention policy.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.update` IAM permission on the bucket.
+ LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error)
+ // Gets the IAM policy for a specified bucket or managed folder.
+ // The `resource` field in the request should be
+ // `projects/_/buckets/{bucket}` for a bucket, or
+ // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
+ // for a managed folder.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.getIamPolicy` on the bucket or
+ // `storage.managedFolders.getIamPolicy` IAM permission on the
+ // managed folder.
+ GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error)
+ // Updates an IAM policy for the specified bucket or managed folder.
+ // The `resource` field in the request should be
+ // `projects/_/buckets/{bucket}` for a bucket, or
+ // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
+ // for a managed folder.
+ SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error)
+ // Tests a set of permissions on the given bucket, object, or managed folder
+ // to see which, if any, are held by the caller. The `resource` field in the
+ // request should be `projects/_/buckets/{bucket}` for a bucket,
+ // `projects/_/buckets/{bucket}/objects/{object}` for an object, or
+ // `projects/_/buckets/{bucket}/managedFolders/{managedFolder}`
+ // for a managed folder.
+ TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error)
+ // Updates a bucket. Changes to the bucket are readable immediately after
+ // writing, but configuration changes might take time to propagate. This
+ // method supports `patch` semantics.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.buckets.update` IAM permission on the bucket.
+ // Additionally, to enable specific bucket features, the authenticated user
+ // must have the following permissions:
+ //
+ // - To set bucket IP filtering rules: `storage.buckets.setIpFilter`
+ // - To update public access prevention policies or access control lists
+ // (ACLs): `storage.buckets.setIamPolicy`
+ UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error)
+ // Concatenates a list of existing objects into a new object in the same
+ // bucket. The existing source objects are unaffected by this operation.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires the `storage.objects.create` and `storage.objects.get` IAM
+ // permissions to use this method. If the new composite object
+ // overwrites an existing object, the authenticated user must also have
+ // the `storage.objects.delete` permission. If the request body includes
+ // the retention property, the authenticated user must also have the
+ // `storage.objects.setRetention` IAM permission.
+ ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error)
+ // Deletes an object and its metadata. Deletions are permanent if versioning
+ // is not enabled for the bucket, or if the generation parameter is used, or
+ // if soft delete is not
+ // enabled for the bucket.
+ // When this API is used to delete an object from a bucket that has soft
+ // delete policy enabled, the object becomes soft deleted, and the
+ // `softDeleteTime` and `hardDeleteTime` properties are set on the object.
+ // This API cannot be used to permanently delete soft-deleted objects.
+ // Soft-deleted objects are permanently deleted according to their
+ // `hardDeleteTime`.
+ //
+ // You can use the [`RestoreObject`][google.storage.v2.Storage.RestoreObject]
+ // API to restore soft-deleted objects until the soft delete retention period
+ // has passed.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.delete` IAM permission on the bucket.
+ DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error)
+ // Restores a
+ // soft-deleted object.
+ // When a soft-deleted object is restored, a new copy of that object is
+ // created in the same bucket and inherits the same metadata as the
+ // soft-deleted object. The inherited metadata is the metadata that existed
+ // when the original object became soft deleted, with the following
+ // exceptions:
+ //
+ // - The `createTime` of the new object is set to the time at which the
+ // soft-deleted object was restored.
+ // - The `softDeleteTime` and `hardDeleteTime` values are cleared.
+ // - A new generation is assigned and the metageneration is reset to 1.
+ // - If the soft-deleted object was in a bucket that had Autoclass enabled,
+ // the new object is
+ // restored to Standard storage.
+ // - The restored object inherits the bucket's default object ACL, unless
+ // `copySourceAcl` is `true`.
+ //
+ // If a live object using the same name already exists in the bucket and
+ // becomes overwritten, the live object becomes a noncurrent object if Object
+ // Versioning is enabled on the bucket. If Object Versioning is not enabled,
+ // the live object becomes soft deleted.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires the following IAM permissions to use this method:
+ //
+ // - `storage.objects.restore`
+ // - `storage.objects.create`
+ // - `storage.objects.delete` (only required if overwriting an existing
+ // object)
+ // - `storage.objects.getIamPolicy` (only required if `projection` is `full`
+ // and the relevant bucket
+ // has uniform bucket-level access disabled)
+ // - `storage.objects.setIamPolicy` (only required if `copySourceAcl` is
+ // `true` and the relevant
+ // bucket has uniform bucket-level access disabled)
+ RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error)
+ // Cancels an in-progress resumable upload.
+ //
+ // Any attempts to write to the resumable upload after cancelling the upload
+ // fail.
+ //
+ // The behavior for any in-progress write operations is not guaranteed;
+ // they could either complete before the cancellation or fail if the
+ // cancellation completes first.
+ CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error)
+ // Retrieves object metadata.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.get` IAM permission on the bucket.
+ // To return object ACLs, the authenticated user must also have
+ // the `storage.objects.getIamPolicy` permission.
+ GetObject(context.Context, *GetObjectRequest) (*Object, error)
+ // Retrieves object data.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.get` IAM permission on the bucket.
+ ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error
+ // Reads an object's data.
+ //
+ // This bi-directional API reads data from an object, allowing you to
+ // request multiple data ranges within a single stream, even across
+ // several messages. If an error occurs with any request, the stream
+ // closes with a relevant error code. Since you can have multiple
+ // outstanding requests, the error response includes a
+ // `BidiReadObjectRangesError` field detailing the specific error for
+ // each pending `read_id`.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.get` IAM permission on the bucket.
+ BidiReadObject(Storage_BidiReadObjectServer) error
+ // Updates an object's metadata.
+ // Equivalent to JSON API's `storage.objects.patch` method.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.update` IAM permission on the bucket.
+ UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error)
+ // Stores a new object and metadata.
+ //
+ // An object can be written either in a single message stream or in a
+ // resumable sequence of message streams. To write using a single stream,
+ // the client should include in the first message of the stream an
+ // `WriteObjectSpec` describing the destination bucket, object, and any
+ // preconditions. Additionally, the final message must set 'finish_write' to
+ // true, or else it is an error.
+ //
+ // For a resumable write, the client should instead call
+ // `StartResumableWrite()`, populating a `WriteObjectSpec` into that request.
+ // They should then attach the returned `upload_id` to the first message of
+ // each following call to `WriteObject`. If the stream is closed before
+ // finishing the upload (either explicitly by the client or due to a network
+ // error or an error response from the server), the client should do as
+ // follows:
+ //
+ // - Check the result Status of the stream, to determine if writing can be
+ // resumed on this stream or must be restarted from scratch (by calling
+ // `StartResumableWrite()`). The resumable errors are `DEADLINE_EXCEEDED`,
+ // `INTERNAL`, and `UNAVAILABLE`. For each case, the client should use
+ // binary exponential backoff before retrying. Additionally, writes can
+ // be resumed after `RESOURCE_EXHAUSTED` errors, but only after taking
+ // appropriate measures, which might include reducing aggregate send rate
+ // across clients and/or requesting a quota increase for your project.
+ // - If the call to `WriteObject` returns `ABORTED`, that indicates
+ // concurrent attempts to update the resumable write, caused either by
+ // multiple racing clients or by a single client where the previous
+ // request was timed out on the client side but nonetheless reached the
+ // server. In this case the client should take steps to prevent further
+ // concurrent writes. For example, increase the timeouts and stop using
+ // more than one process to perform the upload. Follow the steps below for
+ // resuming the upload.
+ // - For resumable errors, the client should call `QueryWriteStatus()` and
+ // then continue writing from the returned `persisted_size`. This might be
+ // less than the amount of data the client previously sent. Note also that
+ // it is acceptable to send data starting at an offset earlier than the
+ // returned `persisted_size`; in this case, the service skips data at
+ // offsets that were already persisted (without checking that it matches
+ // the previously written data), and write only the data starting from the
+ // persisted offset. Even though the data isn't written, it might still
+ // incur a performance cost over resuming at the correct write offset.
+ // This behavior can make client-side handling simpler in some cases.
+ // - Clients must only send data that is a multiple of 256 KiB per message,
+ // unless the object is being finished with `finish_write` set to `true`.
+ //
+ // The service does not view the object as complete until the client has
+ // sent a `WriteObjectRequest` with `finish_write` set to `true`. Sending any
+ // requests on a stream after sending a request with `finish_write` set to
+ // `true` causes an error. The client must check the response it
+ // receives to determine how much data the service is able to commit and
+ // whether the service views the object as complete.
+ //
+ // Attempting to resume an already finalized object results in an `OK`
+ // status, with a `WriteObjectResponse` containing the finalized object's
+ // metadata.
+ //
+ // Alternatively, you can use the `BidiWriteObject` operation to write an
+ // object with controls over flushing and the ability to fetch the ability to
+ // determine the current persisted size.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.create`
+ // IAM permission on
+ // the bucket.
+ WriteObject(Storage_WriteObjectServer) error
+ // Stores a new object and metadata.
+ //
+ // This is similar to the `WriteObject` call with the added support for
+ // manual flushing of persisted state, and the ability to determine current
+ // persisted size without closing the stream.
+ //
+ // The client might specify one or both of the `state_lookup` and `flush`
+ // fields in each `BidiWriteObjectRequest`. If `flush` is specified, the data
+ // written so far is persisted to storage. If `state_lookup` is specified, the
+ // service responds with a `BidiWriteObjectResponse` that contains the
+ // persisted size. If both `flush` and `state_lookup` are specified, the flush
+ // always occurs before a `state_lookup`, so that both might be set in the
+ // same request and the returned state is the state of the object
+ // post-flush. When the stream is closed, a `BidiWriteObjectResponse`
+ // is always sent to the client, regardless of the value of `state_lookup`.
+ BidiWriteObject(Storage_BidiWriteObjectServer) error
+ // Retrieves a list of objects matching the criteria.
+ //
+ // **IAM Permissions**:
+ //
+ // The authenticated user requires `storage.objects.list`
+ // IAM permission to use this method. To return object ACLs, the
+ // authenticated user must also
+ // have the `storage.objects.getIamPolicy` permission.
+ ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error)
+ // Rewrites a source object to a destination object. Optionally overrides
+ // metadata.
+ RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error)
+ // Starts a resumable write operation. This
+ // method is part of the Resumable
+ // upload feature.
+ // This allows you to upload large objects in multiple chunks, which is more
+ // resilient to network interruptions than a single upload. The validity
+ // duration of the write operation, and the consequences of it becoming
+ // invalid, are service-dependent.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires `storage.objects.create` IAM permission on the bucket.
+ StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error)
+ // Determines the `persisted_size` of an object that is being written. This
+ // method is part of the resumable
+ // upload feature.
+ // The returned value is the size of the object that has been persisted so
+ // far. The value can be used as the `write_offset` for the next `Write()`
+ // call.
+ //
+ // If the object does not exist, meaning if it was deleted, or the
+ // first `Write()` has not yet reached the service, this method returns the
+ // error `NOT_FOUND`.
+ //
+ // This method is useful for clients that buffer data and need to know which
+ // data can be safely evicted. The client can call `QueryWriteStatus()` at any
+ // time to determine how much data has been logged for this object.
+ // For any sequence of `QueryWriteStatus()` calls for a given
+ // object name, the sequence of returned `persisted_size` values are
+ // non-decreasing.
+ QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error)
+ // Moves the source object to the destination object in the same bucket.
+ // This operation moves a source object to a destination object in the
+ // same bucket by renaming the object. The move itself is an atomic
+ // transaction, ensuring all steps either complete successfully or no
+ // changes are made.
+ //
+ // **IAM Permissions**:
+ //
+ // Requires the following IAM permissions to use this method:
+ //
+ // - `storage.objects.move`
+ // - `storage.objects.create`
+ // - `storage.objects.delete` (only required if overwriting an existing
+ // object)
+ MoveObject(context.Context, *MoveObjectRequest) (*Object, error)
+}
+
+// UnimplementedStorageServer should be embedded to have forward compatible implementations.
+type UnimplementedStorageServer struct {
+}
+
+func (UnimplementedStorageServer) DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method DeleteBucket not implemented")
+}
+func (UnimplementedStorageServer) GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetBucket not implemented")
+}
+func (UnimplementedStorageServer) CreateBucket(context.Context, *CreateBucketRequest) (*Bucket, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method CreateBucket not implemented")
+}
+func (UnimplementedStorageServer) ListBuckets(context.Context, *ListBucketsRequest) (*ListBucketsResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ListBuckets not implemented")
+}
+func (UnimplementedStorageServer) LockBucketRetentionPolicy(context.Context, *LockBucketRetentionPolicyRequest) (*Bucket, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method LockBucketRetentionPolicy not implemented")
+}
+func (UnimplementedStorageServer) GetIamPolicy(context.Context, *iampb.GetIamPolicyRequest) (*iampb.Policy, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetIamPolicy not implemented")
+}
+func (UnimplementedStorageServer) SetIamPolicy(context.Context, *iampb.SetIamPolicyRequest) (*iampb.Policy, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method SetIamPolicy not implemented")
+}
+func (UnimplementedStorageServer) TestIamPermissions(context.Context, *iampb.TestIamPermissionsRequest) (*iampb.TestIamPermissionsResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method TestIamPermissions not implemented")
+}
+func (UnimplementedStorageServer) UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method UpdateBucket not implemented")
+}
+func (UnimplementedStorageServer) ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ComposeObject not implemented")
+}
+func (UnimplementedStorageServer) DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method DeleteObject not implemented")
+}
+func (UnimplementedStorageServer) RestoreObject(context.Context, *RestoreObjectRequest) (*Object, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method RestoreObject not implemented")
+}
+func (UnimplementedStorageServer) CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method CancelResumableWrite not implemented")
+}
+func (UnimplementedStorageServer) GetObject(context.Context, *GetObjectRequest) (*Object, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetObject not implemented")
+}
+func (UnimplementedStorageServer) ReadObject(*ReadObjectRequest, Storage_ReadObjectServer) error {
+ return status.Errorf(codes.Unimplemented, "method ReadObject not implemented")
+}
+func (UnimplementedStorageServer) BidiReadObject(Storage_BidiReadObjectServer) error {
+ return status.Errorf(codes.Unimplemented, "method BidiReadObject not implemented")
+}
+func (UnimplementedStorageServer) UpdateObject(context.Context, *UpdateObjectRequest) (*Object, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method UpdateObject not implemented")
+}
+func (UnimplementedStorageServer) WriteObject(Storage_WriteObjectServer) error {
+ return status.Errorf(codes.Unimplemented, "method WriteObject not implemented")
+}
+func (UnimplementedStorageServer) BidiWriteObject(Storage_BidiWriteObjectServer) error {
+ return status.Errorf(codes.Unimplemented, "method BidiWriteObject not implemented")
+}
+func (UnimplementedStorageServer) ListObjects(context.Context, *ListObjectsRequest) (*ListObjectsResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ListObjects not implemented")
+}
+func (UnimplementedStorageServer) RewriteObject(context.Context, *RewriteObjectRequest) (*RewriteResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method RewriteObject not implemented")
+}
+func (UnimplementedStorageServer) StartResumableWrite(context.Context, *StartResumableWriteRequest) (*StartResumableWriteResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method StartResumableWrite not implemented")
+}
+func (UnimplementedStorageServer) QueryWriteStatus(context.Context, *QueryWriteStatusRequest) (*QueryWriteStatusResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method QueryWriteStatus not implemented")
+}
+func (UnimplementedStorageServer) MoveObject(context.Context, *MoveObjectRequest) (*Object, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method MoveObject not implemented")
+}
+
+// UnsafeStorageServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to StorageServer will
+// result in compilation errors.
+type UnsafeStorageServer interface {
+ mustEmbedUnimplementedStorageServer()
+}
+
+func RegisterStorageServer(s grpc.ServiceRegistrar, srv StorageServer) {
+ s.RegisterService(&Storage_ServiceDesc, srv)
+}
+
+func _Storage_DeleteBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(DeleteBucketRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).DeleteBucket(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_DeleteBucket_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).DeleteBucket(ctx, req.(*DeleteBucketRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_GetBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(GetBucketRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).GetBucket(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_GetBucket_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).GetBucket(ctx, req.(*GetBucketRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_CreateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(CreateBucketRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).CreateBucket(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_CreateBucket_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).CreateBucket(ctx, req.(*CreateBucketRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_ListBuckets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ListBucketsRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).ListBuckets(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_ListBuckets_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).ListBuckets(ctx, req.(*ListBucketsRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_LockBucketRetentionPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(LockBucketRetentionPolicyRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).LockBucketRetentionPolicy(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_LockBucketRetentionPolicy_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).LockBucketRetentionPolicy(ctx, req.(*LockBucketRetentionPolicyRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_GetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(iampb.GetIamPolicyRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).GetIamPolicy(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_GetIamPolicy_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).GetIamPolicy(ctx, req.(*iampb.GetIamPolicyRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_SetIamPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(iampb.SetIamPolicyRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).SetIamPolicy(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_SetIamPolicy_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).SetIamPolicy(ctx, req.(*iampb.SetIamPolicyRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_TestIamPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(iampb.TestIamPermissionsRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).TestIamPermissions(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_TestIamPermissions_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).TestIamPermissions(ctx, req.(*iampb.TestIamPermissionsRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_UpdateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(UpdateBucketRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).UpdateBucket(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_UpdateBucket_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).UpdateBucket(ctx, req.(*UpdateBucketRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_ComposeObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ComposeObjectRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).ComposeObject(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_ComposeObject_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).ComposeObject(ctx, req.(*ComposeObjectRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_DeleteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(DeleteObjectRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).DeleteObject(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_DeleteObject_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).DeleteObject(ctx, req.(*DeleteObjectRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_RestoreObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(RestoreObjectRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).RestoreObject(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_RestoreObject_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).RestoreObject(ctx, req.(*RestoreObjectRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_CancelResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(CancelResumableWriteRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).CancelResumableWrite(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_CancelResumableWrite_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).CancelResumableWrite(ctx, req.(*CancelResumableWriteRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_GetObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(GetObjectRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).GetObject(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_GetObject_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).GetObject(ctx, req.(*GetObjectRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_ReadObject_Handler(srv interface{}, stream grpc.ServerStream) error {
+ m := new(ReadObjectRequest)
+ if err := stream.RecvMsg(m); err != nil {
+ return err
+ }
+ return srv.(StorageServer).ReadObject(m, &storageReadObjectServer{stream})
+}
+
+type Storage_ReadObjectServer interface {
+ Send(*ReadObjectResponse) error
+ grpc.ServerStream
+}
+
+type storageReadObjectServer struct {
+ grpc.ServerStream
+}
+
+func (x *storageReadObjectServer) Send(m *ReadObjectResponse) error {
+ return x.ServerStream.SendMsg(m)
+}
+
+func _Storage_BidiReadObject_Handler(srv interface{}, stream grpc.ServerStream) error {
+ return srv.(StorageServer).BidiReadObject(&storageBidiReadObjectServer{stream})
+}
+
+type Storage_BidiReadObjectServer interface {
+ Send(*BidiReadObjectResponse) error
+ Recv() (*BidiReadObjectRequest, error)
+ grpc.ServerStream
+}
+
+type storageBidiReadObjectServer struct {
+ grpc.ServerStream
+}
+
+func (x *storageBidiReadObjectServer) Send(m *BidiReadObjectResponse) error {
+ return x.ServerStream.SendMsg(m)
+}
+
+func (x *storageBidiReadObjectServer) Recv() (*BidiReadObjectRequest, error) {
+ m := new(BidiReadObjectRequest)
+ if err := x.ServerStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func _Storage_UpdateObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(UpdateObjectRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).UpdateObject(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_UpdateObject_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).UpdateObject(ctx, req.(*UpdateObjectRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_WriteObject_Handler(srv interface{}, stream grpc.ServerStream) error {
+ return srv.(StorageServer).WriteObject(&storageWriteObjectServer{stream})
+}
+
+type Storage_WriteObjectServer interface {
+ SendAndClose(*WriteObjectResponse) error
+ Recv() (*WriteObjectRequest, error)
+ grpc.ServerStream
+}
+
+type storageWriteObjectServer struct {
+ grpc.ServerStream
+}
+
+func (x *storageWriteObjectServer) SendAndClose(m *WriteObjectResponse) error {
+ return x.ServerStream.SendMsg(m)
+}
+
+func (x *storageWriteObjectServer) Recv() (*WriteObjectRequest, error) {
+ m := new(WriteObjectRequest)
+ if err := x.ServerStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func _Storage_BidiWriteObject_Handler(srv interface{}, stream grpc.ServerStream) error {
+ return srv.(StorageServer).BidiWriteObject(&storageBidiWriteObjectServer{stream})
+}
+
+type Storage_BidiWriteObjectServer interface {
+ Send(*BidiWriteObjectResponse) error
+ Recv() (*BidiWriteObjectRequest, error)
+ grpc.ServerStream
+}
+
+type storageBidiWriteObjectServer struct {
+ grpc.ServerStream
+}
+
+func (x *storageBidiWriteObjectServer) Send(m *BidiWriteObjectResponse) error {
+ return x.ServerStream.SendMsg(m)
+}
+
+func (x *storageBidiWriteObjectServer) Recv() (*BidiWriteObjectRequest, error) {
+ m := new(BidiWriteObjectRequest)
+ if err := x.ServerStream.RecvMsg(m); err != nil {
+ return nil, err
+ }
+ return m, nil
+}
+
+func _Storage_ListObjects_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ListObjectsRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).ListObjects(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_ListObjects_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).ListObjects(ctx, req.(*ListObjectsRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_RewriteObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(RewriteObjectRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).RewriteObject(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_RewriteObject_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).RewriteObject(ctx, req.(*RewriteObjectRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_StartResumableWrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(StartResumableWriteRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).StartResumableWrite(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_StartResumableWrite_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).StartResumableWrite(ctx, req.(*StartResumableWriteRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_QueryWriteStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(QueryWriteStatusRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).QueryWriteStatus(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_QueryWriteStatus_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).QueryWriteStatus(ctx, req.(*QueryWriteStatusRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Storage_MoveObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(MoveObjectRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(StorageServer).MoveObject(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Storage_MoveObject_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(StorageServer).MoveObject(ctx, req.(*MoveObjectRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// Storage_ServiceDesc is the grpc.ServiceDesc for Storage service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Storage_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "google.storage.v2.Storage",
+ HandlerType: (*StorageServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "DeleteBucket",
+ Handler: _Storage_DeleteBucket_Handler,
+ },
+ {
+ MethodName: "GetBucket",
+ Handler: _Storage_GetBucket_Handler,
+ },
+ {
+ MethodName: "CreateBucket",
+ Handler: _Storage_CreateBucket_Handler,
+ },
+ {
+ MethodName: "ListBuckets",
+ Handler: _Storage_ListBuckets_Handler,
+ },
+ {
+ MethodName: "LockBucketRetentionPolicy",
+ Handler: _Storage_LockBucketRetentionPolicy_Handler,
+ },
+ {
+ MethodName: "GetIamPolicy",
+ Handler: _Storage_GetIamPolicy_Handler,
+ },
+ {
+ MethodName: "SetIamPolicy",
+ Handler: _Storage_SetIamPolicy_Handler,
+ },
+ {
+ MethodName: "TestIamPermissions",
+ Handler: _Storage_TestIamPermissions_Handler,
+ },
+ {
+ MethodName: "UpdateBucket",
+ Handler: _Storage_UpdateBucket_Handler,
+ },
+ {
+ MethodName: "ComposeObject",
+ Handler: _Storage_ComposeObject_Handler,
+ },
+ {
+ MethodName: "DeleteObject",
+ Handler: _Storage_DeleteObject_Handler,
+ },
+ {
+ MethodName: "RestoreObject",
+ Handler: _Storage_RestoreObject_Handler,
+ },
+ {
+ MethodName: "CancelResumableWrite",
+ Handler: _Storage_CancelResumableWrite_Handler,
+ },
+ {
+ MethodName: "GetObject",
+ Handler: _Storage_GetObject_Handler,
+ },
+ {
+ MethodName: "UpdateObject",
+ Handler: _Storage_UpdateObject_Handler,
+ },
+ {
+ MethodName: "ListObjects",
+ Handler: _Storage_ListObjects_Handler,
+ },
+ {
+ MethodName: "RewriteObject",
+ Handler: _Storage_RewriteObject_Handler,
+ },
+ {
+ MethodName: "StartResumableWrite",
+ Handler: _Storage_StartResumableWrite_Handler,
+ },
+ {
+ MethodName: "QueryWriteStatus",
+ Handler: _Storage_QueryWriteStatus_Handler,
+ },
+ {
+ MethodName: "MoveObject",
+ Handler: _Storage_MoveObject_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{
+ {
+ StreamName: "ReadObject",
+ Handler: _Storage_ReadObject_Handler,
+ ServerStreams: true,
+ },
+ {
+ StreamName: "BidiReadObject",
+ Handler: _Storage_BidiReadObject_Handler,
+ ServerStreams: true,
+ ClientStreams: true,
+ },
+ {
+ StreamName: "WriteObject",
+ Handler: _Storage_WriteObject_Handler,
+ ClientStreams: true,
+ },
+ {
+ StreamName: "BidiWriteObject",
+ Handler: _Storage_BidiWriteObject_Handler,
+ ServerStreams: true,
+ ClientStreams: true,
+ },
+ },
+ Metadata: "google/storage/v2/storage.proto",
+}
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/internal/experimental.go b/hack/tools/vendor/cloud.google.com/go/storage/internal/experimental.go
index 4482eab8a3..b8c5731fe3 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/internal/experimental.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/internal/experimental.go
@@ -26,6 +26,10 @@ var (
// Set an alternate client-side metric Exporter to emit metrics through.
WithMetricExporter any // func (*metric.Exporter) option.ClientOption
+ // WithMeterProvider is a function which is implemented by storage package.
+ // Set an alternate client-side meter provider to emit metrics through.
+ WithMeterProvider any // func (*metric.MeterProvider) option.ClientOption
+
// WithReadStallTimeout is a function which is implemented by storage package.
// It takes ReadStallTimeoutConfig as inputs and returns a option.ClientOption.
WithReadStallTimeout any // func (*ReadStallTimeoutConfig) option.ClientOption
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/internal/version.go b/hack/tools/vendor/cloud.google.com/go/storage/internal/version.go
index f801fb63b9..53ebe1de12 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/internal/version.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/internal/version.go
@@ -1,4 +1,4 @@
-// Copyright 2022 Google LLC
+// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+// Code generated by gapicgen. DO NOT EDIT.
+
package internal
// Version is the current tagged release of the library.
-const Version = "1.56.0"
+const Version = "1.57.2"
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/option.go b/hack/tools/vendor/cloud.google.com/go/storage/option.go
index 6548cc18e8..6afc669386 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/option.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/option.go
@@ -39,6 +39,7 @@ func init() {
// initialize experimental options
storageinternal.WithMetricExporter = withMetricExporter
storageinternal.WithMetricInterval = withMetricInterval
+ storageinternal.WithMeterProvider = withMeterProvider
storageinternal.WithReadStallTimeout = withReadStallTimeout
storageinternal.WithGRPCBidiReads = withGRPCBidiReads
storageinternal.WithZonalBucketAPIs = withZonalBucketAPIs
@@ -81,6 +82,7 @@ type storageConfig struct {
disableClientMetrics bool
metricExporter *metric.Exporter
metricInterval time.Duration
+ meterProvider *metric.MeterProvider
manualReader *metric.ManualReader
readStallTimeoutConfig *experimental.ReadStallTimeoutConfig
grpcBidiReads bool
@@ -203,6 +205,20 @@ type withTestMetricReaderConfig struct {
metricReader *metric.ManualReader
}
+type withMeterProviderConfig struct {
+ internaloption.EmbeddableAdapter
+ // meter provider override
+ meterProvider *metric.MeterProvider
+}
+
+func withMeterProvider(provider *metric.MeterProvider) option.ClientOption {
+ return &withMeterProviderConfig{meterProvider: provider}
+}
+
+func (w *withMeterProviderConfig) ApplyStorageOpt(c *storageConfig) {
+ c.meterProvider = w.meterProvider
+}
+
func withTestMetricReader(ex *metric.ManualReader) option.ClientOption {
return &withTestMetricReaderConfig{metricReader: ex}
}
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/post_policy_v4.go b/hack/tools/vendor/cloud.google.com/go/storage/post_policy_v4.go
index 6bc73fb7af..4b2feea954 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/post_policy_v4.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/post_policy_v4.go
@@ -252,9 +252,6 @@ func GenerateSignedPostPolicyV4(bucket, object string, opts *PostPolicyV4Options
if bucket == "" {
return nil, errors.New("storage: bucket must be non-empty")
}
- if object == "" {
- return nil, errors.New("storage: object must be non-empty")
- }
now := utcNow()
if err := validatePostPolicyV4Options(opts, now); err != nil {
return nil, err
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/reader.go b/hack/tools/vendor/cloud.google.com/go/storage/reader.go
index 793c1b2e0e..0c5f5be0ab 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/reader.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/reader.go
@@ -23,8 +23,6 @@ import (
"strings"
"sync"
"time"
-
- "cloud.google.com/go/internal/trace"
)
var crc32cTable = crc32.MakeTable(crc32.Castagnoli)
@@ -116,7 +114,8 @@ func (o *ObjectHandle) NewReader(ctx context.Context) (*Reader, error) {
func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64) (r *Reader, err error) {
// This span covers the life of the reader. It is closed via the context
// in Reader.Close.
- ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.Reader")
+ ctx, _ = startSpan(ctx, "Object.Reader")
+ defer func() { endSpan(ctx, err) }()
if err := o.validate(); err != nil {
return nil, err
@@ -150,8 +149,6 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64)
// span now if there is an error.
if err == nil {
r.ctx = ctx
- } else {
- trace.EndSpan(ctx, err)
}
return r, err
@@ -167,7 +164,8 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64)
func (o *ObjectHandle) NewMultiRangeDownloader(ctx context.Context) (mrd *MultiRangeDownloader, err error) {
// This span covers the life of the reader. It is closed via the context
// in Reader.Close.
- ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.MultiRangeDownloader")
+ ctx, _ = startSpan(ctx, "Object.MultiRangeDownloader")
+ defer func() { endSpan(ctx, err) }()
if err := o.validate(); err != nil {
return nil, err
@@ -195,8 +193,6 @@ func (o *ObjectHandle) NewMultiRangeDownloader(ctx context.Context) (mrd *MultiR
// span now if there is an error.
if err == nil {
r.ctx = ctx
- } else {
- trace.EndSpan(ctx, err)
}
return r, err
@@ -285,7 +281,7 @@ type Reader struct {
// Close closes the Reader. It must be called when done reading.
func (r *Reader) Close() error {
err := r.reader.Close()
- trace.EndSpan(r.ctx, err)
+ endSpan(r.ctx, err)
return err
}
@@ -436,7 +432,7 @@ func (mrd *MultiRangeDownloader) Add(output io.Writer, offset, length int64, cal
// Call [MultiRangeDownloader.Wait] to avoid this error.
func (mrd *MultiRangeDownloader) Close() error {
err := mrd.reader.close()
- trace.EndSpan(mrd.ctx, err)
+ endSpan(mrd.ctx, err)
return err
}
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/storage.go b/hack/tools/vendor/cloud.google.com/go/storage/storage.go
index d8455425fd..32a145b8d5 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/storage.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/storage.go
@@ -40,7 +40,6 @@ import (
"cloud.google.com/go/auth"
"cloud.google.com/go/internal/optional"
- "cloud.google.com/go/internal/trace"
"cloud.google.com/go/storage/internal"
"cloud.google.com/go/storage/internal/apiv2/storagepb"
"github.com/googleapis/gax-go/v2"
@@ -208,7 +207,9 @@ func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error
return nil, fmt.Errorf("dialing: %w", err)
}
// RawService should be created with the chosen endpoint to take account of user override.
- rawService, err := raw.NewService(ctx, option.WithEndpoint(ep), option.WithHTTPClient(hc))
+ // Preserve other user-supplied options as well.
+ opts = append(opts, option.WithEndpoint(ep), option.WithHTTPClient(hc))
+ rawService, err := raw.NewService(ctx, opts...)
if err != nil {
return nil, fmt.Errorf("storage client: %w", err)
}
@@ -1197,8 +1198,7 @@ func (o *ObjectHandle) Restore(ctx context.Context, opts *RestoreOptions) (*Obje
}
// Move changes the name of the object to the destination name.
-// It can only be used to rename an object within the same bucket. The
-// bucket must have [HierarchicalNamespace] enabled to use this method.
+// It can only be used to rename an object within the same bucket.
//
// Any preconditions set on the ObjectHandle will be applied for the source
// object. Set preconditions on the destination object using
@@ -1247,7 +1247,7 @@ type MoveObjectDestination struct {
// It is the caller's responsibility to call Close when writing is done. To
// stop writing without saving the data, cancel the context.
func (o *ObjectHandle) NewWriter(ctx context.Context) *Writer {
- ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.Writer")
+ ctx, _ = startSpan(ctx, "Object.Writer")
return &Writer{
ctx: ctx,
o: o,
@@ -1283,16 +1283,18 @@ func (o *ObjectHandle) NewWriter(ctx context.Context) *Writer {
// objects which were created append semantics and not finalized.
// This feature is in preview and is not yet available for general use.
func (o *ObjectHandle) NewWriterFromAppendableObject(ctx context.Context, opts *AppendableWriterOpts) (*Writer, int64, error) {
- ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.Object.Writer")
+ ctx, _ = startSpan(ctx, "Object.WriterFromAppendableObject")
if o.gen < 0 {
return nil, 0, errors.New("storage: ObjectHandle.Generation must be set to use NewWriterFromAppendableObject")
}
+ toc := make(chan int64)
w := &Writer{
- ctx: ctx,
- o: o,
- donec: make(chan struct{}),
- ObjectAttrs: ObjectAttrs{Name: o.object},
- Append: true,
+ ctx: ctx,
+ o: o,
+ donec: make(chan struct{}),
+ ObjectAttrs: ObjectAttrs{Name: o.object},
+ Append: true,
+ setTakeoverOffset: func(to int64) { toc <- to },
}
opts.apply(w)
if w.ChunkSize == 0 {
@@ -1302,7 +1304,16 @@ func (o *ObjectHandle) NewWriterFromAppendableObject(ctx context.Context, opts *
if err != nil {
return nil, 0, err
}
- return w, w.takeoverOffset, nil
+ // Block until we discover the takeover offset, or the stream fails
+ select {
+ case to, ok := <-toc:
+ if !ok {
+ return nil, 0, errors.New("storage: unexpectedly did not discover takeover offset")
+ }
+ return w, to, nil
+ case <-w.donec:
+ return nil, 0, w.err
+ }
}
// AppendableWriterOpts provides options to set on a Writer initialized
@@ -1661,6 +1672,12 @@ type ObjectAttrs struct {
HardDeleteTime time.Time
}
+// isZero reports whether the ObjectAttrs struct is empty (i.e. all the
+// fields are their zero value).
+func (o *ObjectAttrs) isZero() bool {
+ return reflect.DeepEqual(o, &ObjectAttrs{})
+}
+
// ObjectRetention contains the retention configuration for this object.
type ObjectRetention struct {
// Mode is the retention policy's mode on this object. Valid values are
diff --git a/hack/tools/vendor/cloud.google.com/go/storage/writer.go b/hack/tools/vendor/cloud.google.com/go/storage/writer.go
index bc0893eeac..ae5a4d667f 100644
--- a/hack/tools/vendor/cloud.google.com/go/storage/writer.go
+++ b/hack/tools/vendor/cloud.google.com/go/storage/writer.go
@@ -22,8 +22,6 @@ import (
"sync"
"time"
"unicode/utf8"
-
- "cloud.google.com/go/internal/trace"
)
// Interface internalWriter wraps low-level implementations which may vary
@@ -159,9 +157,9 @@ type Writer struct {
donec chan struct{} // closed after err and obj are set.
obj *ObjectAttrs
- mu sync.Mutex
- err error
- takeoverOffset int64 // offset from which the writer started appending to the object.
+ mu sync.Mutex
+ err error
+ setTakeoverOffset func(int64)
}
// Write appends to w. It implements the io.Writer interface.
@@ -261,7 +259,7 @@ func (w *Writer) Close() error {
w.closed = true
w.mu.Lock()
defer w.mu.Unlock()
- trace.EndSpan(w.ctx, w.err)
+ endSpan(w.ctx, w.err)
return w.err
}
@@ -274,6 +272,8 @@ func (w *Writer) openWriter() (err error) {
}
isIdempotent := w.o.conds != nil && (w.o.conds.GenerationMatch >= 0 || w.o.conds.DoesNotExist)
+ // Append operations that takeover a specific generation are idempotent.
+ isIdempotent = isIdempotent || w.Append && w.o.gen > 0
opts := makeStorageOpts(isIdempotent, w.o.retry, w.o.userProject)
params := &openWriterParams{
ctx: w.ctx,
@@ -297,7 +297,7 @@ func (w *Writer) openWriter() (err error) {
w.obj.Size = n
}
},
- setTakeoverOffset: func(n int64) { w.takeoverOffset = n },
+ setTakeoverOffset: w.setTakeoverOffset,
forceEmptyContentType: w.ForceEmptyContentType,
}
if err := w.ctx.Err(); err != nil {
diff --git a/hack/tools/vendor/github.com/Abirdcfly/dupword/README.md b/hack/tools/vendor/github.com/Abirdcfly/dupword/README.md
index e6c5b919fa..a3db4c5037 100644
--- a/hack/tools/vendor/github.com/Abirdcfly/dupword/README.md
+++ b/hack/tools/vendor/github.com/Abirdcfly/dupword/README.md
@@ -101,10 +101,14 @@ Flags:
no effect (deprecated)
-c int
display offending line with this many lines of context (default -1)
+ -comments-only
+ check only comments, skip strings
-cpuprofile string
write CPU profile to this file
-debug string
debug flags, any subset of "fpstv"
+ -diff
+ with -fix, don't update the files, but print a unified diff
-fix
apply all suggested fixes
-flags
@@ -130,7 +134,7 @@ Flags:
### 5. my advice
-use `--keyword=the,and,a` and `-fix` together. I think that specifying only commonly repeated prepositions can effectively avoid false positives.
+use `--keyword=the,and,a` and `-fix` together. I think that specifying only commonly repeated prepositions can effectively avoid false positives.
see [dupword#4](https://github.com/Abirdcfly/dupword/issues/4) for real code example.
diff --git a/hack/tools/vendor/github.com/Abirdcfly/dupword/dupword.go b/hack/tools/vendor/github.com/Abirdcfly/dupword/dupword.go
index c066f9a035..a3eaced8a2 100644
--- a/hack/tools/vendor/github.com/Abirdcfly/dupword/dupword.go
+++ b/hack/tools/vendor/github.com/Abirdcfly/dupword/dupword.go
@@ -98,20 +98,25 @@ func NewAnalyzer() *analysis.Analyzer {
a.Flags.Init(Name, flag.ExitOnError)
a.Flags.Var(&analyzer.keywords, "keyword", "keywords for detecting duplicate words")
a.Flags.Var(&analyzer.ignoreWords, "ignore", "ignore words")
+ a.Flags.BoolVar(&analyzer.commentsOnly, "comments-only", false, "check only comments, skip strings")
a.Flags.Var(version{}, "V", "print version and exit")
return a
}
type analyzer struct {
- keywords keywords
- ignoreWords ignore
+ keywords keywords
+ ignoreWords ignore
+ commentsOnly bool
}
func (a *analyzer) run(pass *analysis.Pass) (interface{}, error) {
for _, file := range pass.Files {
a.fixDuplicateWordInComment(pass, file)
}
+ if a.commentsOnly {
+ return nil, nil
+ }
inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
nodeFilter := []ast.Node{
(*ast.BasicLit)(nil),
diff --git a/hack/tools/vendor/github.com/AdminBenni/iota-mixing/LICENSE b/hack/tools/vendor/github.com/AdminBenni/iota-mixing/LICENSE
new file mode 100644
index 0000000000..06e009ffaf
--- /dev/null
+++ b/hack/tools/vendor/github.com/AdminBenni/iota-mixing/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Benedikt Aron Þjóðbjargarson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/hack/tools/vendor/github.com/AdminBenni/iota-mixing/pkg/analyzer/analyzer.go b/hack/tools/vendor/github.com/AdminBenni/iota-mixing/pkg/analyzer/analyzer.go
new file mode 100644
index 0000000000..4c56ebddeb
--- /dev/null
+++ b/hack/tools/vendor/github.com/AdminBenni/iota-mixing/pkg/analyzer/analyzer.go
@@ -0,0 +1,118 @@
+package analyzer
+
+import (
+ "go/ast"
+ "go/token"
+ "log"
+ "strings"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/inspect"
+ "golang.org/x/tools/go/ast/inspector"
+
+ "github.com/AdminBenni/iota-mixing/pkg/analyzer/flags"
+)
+
+func GetIotaMixingAnalyzer() *analysis.Analyzer {
+ return &analysis.Analyzer{
+ Name: "iotamixing",
+ Doc: "checks if iotas are being used in const blocks with other non-iota declarations.",
+ Run: run,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ }
+}
+
+func run(pass *analysis.Pass) (interface{}, error) {
+ ASTInspector := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) //nolint:forcetypeassert // will always be correct type
+
+ // we only need to check Generic Declarations
+ nodeFilter := []ast.Node{
+ (*ast.GenDecl)(nil),
+ }
+
+ ASTInspector.Preorder(nodeFilter, func(node ast.Node) { checkGenericDeclaration(node, pass) })
+
+ return interface{}(nil), nil
+}
+
+func checkGenericDeclaration(node ast.Node, pass *analysis.Pass) {
+ decl := node.(*ast.GenDecl) //nolint:forcetypeassert // filtered for this node, will always be this type
+
+ if decl.Tok != token.CONST {
+ return
+ }
+
+ checkConstDeclaration(decl, pass)
+}
+
+func checkConstDeclaration(decl *ast.GenDecl, pass *analysis.Pass) {
+ iotaFound := false
+ valued := make([]*ast.ValueSpec, 0, len(decl.Specs))
+
+ // traverse specs inside const block
+ for _, spec := range decl.Specs {
+ if specVal, ok := spec.(*ast.ValueSpec); ok {
+ iotaFound, valued = checkValueSpec(specVal, iotaFound, valued)
+ }
+ }
+
+ if !iotaFound {
+ return
+ }
+
+ // there was an iota, now depending on the report-individual flag we must either
+ // report the const block or all regular valued specs that are mixing with the iota
+ switch flags.ReportIndividualFlag() {
+ case flags.TrueString:
+ for _, value := range valued {
+ pass.Reportf(
+ value.Pos(),
+ "%s is a const with r-val in same const block as iota. keep iotas in separate const blocks",
+ getName(value),
+ )
+ }
+ default: //nolint:gocritic // default logs error and falls through to "false" case, simplest in this order
+ log.Printf(
+ "warning: unsupported value '%s' for flag %s, assuming value 'false'.",
+ flags.ReportIndividualFlag(), flags.ReportIndividualFlagName,
+ )
+
+ fallthrough
+ case flags.FalseString:
+ if len(valued) == 0 {
+ return
+ }
+
+ pass.Reportf(decl.Pos(), "iota mixing. keep iotas in separate blocks to consts with r-val")
+ }
+}
+
+func checkValueSpec(spec *ast.ValueSpec, iotaFound bool, valued []*ast.ValueSpec) (bool, []*ast.ValueSpec) {
+ // traverse through values (r-val) of spec and look for iota
+ for _, expr := range spec.Values {
+ if idn, ok := expr.(*ast.Ident); ok && idn.Name == "iota" {
+ return true, valued
+ }
+ }
+
+ // iota wasn't found, add to valued spec list if there is an r-val
+ if len(spec.Values) > 0 {
+ return iotaFound, append(valued, spec)
+ }
+
+ return iotaFound, valued
+}
+
+func getName(spec *ast.ValueSpec) string {
+ sb := strings.Builder{}
+
+ for i, ident := range spec.Names {
+ sb.WriteString(ident.Name)
+
+ if i < len(spec.Names)-1 {
+ sb.WriteString(", ")
+ }
+ }
+
+ return sb.String()
+}
diff --git a/hack/tools/vendor/github.com/AdminBenni/iota-mixing/pkg/analyzer/flags/flags.go b/hack/tools/vendor/github.com/AdminBenni/iota-mixing/pkg/analyzer/flags/flags.go
new file mode 100644
index 0000000000..8f9b73b64d
--- /dev/null
+++ b/hack/tools/vendor/github.com/AdminBenni/iota-mixing/pkg/analyzer/flags/flags.go
@@ -0,0 +1,23 @@
+package flags
+
+import "flag"
+
+const (
+ TrueString = "true"
+ FalseString = "false"
+
+ ReportIndividualFlagName = "report-individual"
+ reportIndividualFlagUsage = "whether or not to report individual consts rather than just the const block."
+)
+
+var (
+ reportIndividualFlag *string //nolint:gochecknoglobals // only used in this file, not too plussed
+)
+
+func SetupFlags(flags *flag.FlagSet) {
+ reportIndividualFlag = flags.String(ReportIndividualFlagName, FalseString, reportIndividualFlagUsage)
+}
+
+func ReportIndividualFlag() string {
+ return *reportIndividualFlag
+}
diff --git a/hack/tools/vendor/github.com/Antonboom/errname/pkg/analyzer/analyzer.go b/hack/tools/vendor/github.com/Antonboom/errname/pkg/analyzer/analyzer.go
index 2b8794dc2c..669edcc209 100644
--- a/hack/tools/vendor/github.com/Antonboom/errname/pkg/analyzer/analyzer.go
+++ b/hack/tools/vendor/github.com/Antonboom/errname/pkg/analyzer/analyzer.go
@@ -21,7 +21,7 @@ func New() *analysis.Analyzer {
}
}
-func run(pass *analysis.Pass) (interface{}, error) {
+func run(pass *analysis.Pass) (any, error) {
insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
insp.Nodes([]ast.Node{
@@ -72,12 +72,12 @@ func run(pass *analysis.Pass) (interface{}, error) {
return true
})
- return nil, nil //nolint:nilnil
+ return nil, nil //nolint:nilnil // Integration interface of analysis.Analyzer.
}
func reportAboutErrorType(pass *analysis.Pass, typePos token.Pos, typeName string) {
var form string
- if unicode.IsLower([]rune(typeName)[0]) {
+ if startsWithLower(typeName) {
form = "xxxError"
} else {
form = "XxxError"
@@ -88,7 +88,7 @@ func reportAboutErrorType(pass *analysis.Pass, typePos token.Pos, typeName strin
func reportAboutArrayErrorType(pass *analysis.Pass, typePos token.Pos, typeName string) {
var forms string
- if unicode.IsLower([]rune(typeName)[0]) {
+ if startsWithLower(typeName) {
forms = "`xxxErrors` or `xxxError`"
} else {
forms = "`XxxErrors` or `XxxError`"
@@ -99,10 +99,14 @@ func reportAboutArrayErrorType(pass *analysis.Pass, typePos token.Pos, typeName
func reportAboutSentinelError(pass *analysis.Pass, pos token.Pos, varName string) {
var form string
- if unicode.IsLower([]rune(varName)[0]) {
+ if startsWithLower(varName) {
form = "errXxx"
} else {
form = "ErrXxx"
}
pass.Reportf(pos, "the sentinel error name `%s` should conform to the `%s` format", varName, form)
}
+
+func startsWithLower(n string) bool {
+ return unicode.IsLower([]rune(n)[0]) //nolint:gocritic // Source code is Unicode text encoded in UTF-8.
+}
diff --git a/hack/tools/vendor/github.com/Antonboom/nilnil/pkg/analyzer/analyzer.go b/hack/tools/vendor/github.com/Antonboom/nilnil/pkg/analyzer/analyzer.go
index 09ca1a8d9f..443d537148 100644
--- a/hack/tools/vendor/github.com/Antonboom/nilnil/pkg/analyzer/analyzer.go
+++ b/hack/tools/vendor/github.com/Antonboom/nilnil/pkg/analyzer/analyzer.go
@@ -58,7 +58,7 @@ var funcAndReturns = []ast.Node{
(*ast.ReturnStmt)(nil),
}
-func (n *nilNil) run(pass *analysis.Pass) (interface{}, error) {
+func (n *nilNil) run(pass *analysis.Pass) (any, error) {
insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
var fs funcTypeStack
@@ -128,7 +128,7 @@ func (n *nilNil) run(pass *analysis.Pass) (interface{}, error) {
return true
})
- return nil, nil //nolint:nilnil
+ return nil, nil //nolint:nilnil // Integration interface of analysis.Analyzer.
}
type zeroValue int
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/analyzer/analyzer.go b/hack/tools/vendor/github.com/Antonboom/testifylint/analyzer/analyzer.go
index a9e41b0a8a..7111797141 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/analyzer/analyzer.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/analyzer/analyzer.go
@@ -5,9 +5,9 @@ import (
"go/ast"
"golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/inspect"
"golang.org/x/tools/go/ast/inspector"
- "github.com/Antonboom/testifylint/internal/analysisutil"
"github.com/Antonboom/testifylint/internal/checkers"
"github.com/Antonboom/testifylint/internal/config"
"github.com/Antonboom/testifylint/internal/testify"
@@ -24,9 +24,10 @@ func New() *analysis.Analyzer {
cfg := config.NewDefault()
analyzer := &analysis.Analyzer{
- Name: name,
- Doc: doc,
- URL: url,
+ Name: name,
+ Doc: doc,
+ URL: url,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
Run: func(pass *analysis.Pass) (any, error) {
regularCheckers, advancedCheckers, err := newCheckers(cfg)
if err != nil {
@@ -51,16 +52,14 @@ type testifyLint struct {
}
func (tl *testifyLint) run(pass *analysis.Pass) (any, error) {
- filesToAnalysis := make([]*ast.File, 0, len(pass.Files))
- for _, f := range pass.Files {
- if !analysisutil.Imports(f, testify.AssertPkgPath, testify.RequirePkgPath, testify.SuitePkgPath) {
- continue
- }
- filesToAnalysis = append(filesToAnalysis, f)
+ // NOTE(a.telyshev): There are no premature optimizations like "scan only _test.go" or
+ // "scan only files with testify imports", since it could lead to skip files
+ // with assertions (etc. test helpers in regular Go files or suite methods).
+ insp, ok := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+ if !ok {
+ return nil, nil
}
- insp := inspector.New(filesToAnalysis)
-
// Regular checkers.
insp.Preorder([]ast.Node{(*ast.CallExpr)(nil)}, func(node ast.Node) {
tl.regularCheck(pass, node.(*ast.CallExpr))
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/call_meta.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/call_meta.go
index 96b5b19b09..3d9c3428ac 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/call_meta.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/call_meta.go
@@ -93,7 +93,7 @@ func NewCallMeta(pass *analysis.Pass, ce *ast.CallExpr) *CallMeta {
isAssert := analysisutil.IsPkg(initiatorPkg, testify.AssertPkgName, testify.AssertPkgPath)
isRequire := analysisutil.IsPkg(initiatorPkg, testify.RequirePkgName, testify.RequirePkgPath)
- if !(isAssert || isRequire) {
+ if !isAssert && !isRequire {
return nil
}
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/checker.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/checker.go
index ac23af6f6f..0d8e9d2f4f 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/checker.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/checker.go
@@ -19,5 +19,5 @@ type RegularChecker interface {
// AdvancedChecker implements complex Check logic different from trivial CallMeta check.
type AdvancedChecker interface {
Checker
- Check(pass *analysis.Pass, inspector *inspector.Inspector) []analysis.Diagnostic
+ Check(pass *analysis.Pass, insp *inspector.Inspector) []analysis.Diagnostic
}
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/empty.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/empty.go
index a05423dfe0..854421e6a9 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/empty.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/empty.go
@@ -59,7 +59,7 @@ func (checker Empty) Check(pass *analysis.Pass, call *CallMeta) *analysis.Diagno
return checker.checkNotEmpty(pass, call)
}
-func (checker Empty) checkEmpty(pass *analysis.Pass, call *CallMeta) *analysis.Diagnostic { //nolint:gocognit
+func (checker Empty) checkEmpty(pass *analysis.Pass, call *CallMeta) *analysis.Diagnostic { //nolint:gocognit // It is ok.
newUseEmptyDiagnostic := func(replaceStart, replaceEnd token.Pos, replaceWith ast.Expr) *analysis.Diagnostic {
const proposed = "Empty"
return newUseFunctionDiagnostic(checker.Name(), call, proposed,
@@ -136,7 +136,7 @@ func (checker Empty) checkEmpty(pass *analysis.Pass, call *CallMeta) *analysis.D
return nil
}
-func (checker Empty) checkNotEmpty(pass *analysis.Pass, call *CallMeta) *analysis.Diagnostic { //nolint:gocognit
+func (checker Empty) checkNotEmpty(pass *analysis.Pass, call *CallMeta) *analysis.Diagnostic { //nolint:gocognit // It is ok.
newUseNotEmptyDiagnostic := func(replaceStart, replaceEnd token.Pos, replaceWith ast.Expr) *analysis.Diagnostic {
const proposed = "NotEmpty"
return newUseFunctionDiagnostic(checker.Name(), call, proposed,
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/equal_values.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/equal_values.go
index df7be57795..c8f305c3e2 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/equal_values.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/equal_values.go
@@ -43,9 +43,17 @@ func (checker EqualValues) Check(pass *analysis.Pass, call *CallMeta) *analysis.
}
ft, st := pass.TypesInfo.TypeOf(first), pass.TypesInfo.TypeOf(second)
- if types.Identical(ft, st) {
- proposed := strings.TrimSuffix(assrn, "Values")
- return newUseFunctionDiagnostic(checker.Name(), call, proposed)
+ if !types.Identical(ft, st) {
+ return nil
}
- return nil
+
+ // Type of one of arguments is equivalent to any.
+ if isEmptyInterfaceType(ft) || isEmptyInterfaceType(st) {
+ // EqualValues is ok here.
+ // Equal would check their types and would fail.
+ return nil
+ }
+
+ proposed := strings.TrimSuffix(assrn, "Values")
+ return newUseFunctionDiagnostic(checker.Name(), call, proposed)
}
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/error_is_as.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/error_is_as.go
index 0e6217875f..ac9d968b8e 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/error_is_as.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/error_is_as.go
@@ -15,6 +15,10 @@ import (
//
// assert.Error(t, err, errSentinel)
// assert.NoError(t, err, errSentinel)
+// assert.IsType(t, err, errSentinel)
+// assert.IsType(t, (*http.MaxBytesError)(nil), err)
+// assert.IsNotType(t, err, errSentinel)
+// assert.IsNotType(t, store.NotFoundError{}, err)
// assert.True(t, errors.Is(err, errSentinel))
// assert.False(t, errors.Is(err, errSentinel))
// assert.True(t, errors.As(err, &target))
@@ -50,6 +54,18 @@ func (checker ErrorIsAs) Check(pass *analysis.Pass, call *CallMeta) *analysis.Di
return newDiagnostic(checker.Name(), call, msg, newSuggestedFuncReplacement(call, proposed))
}
+ case "IsType":
+ if len(call.Args) >= 2 && isError(pass, call.Args[0]) || isError(pass, call.Args[1]) {
+ msg := fmt.Sprintf("use %[1]s.ErrorIs or %[1]s.ErrorAs depending on the case", call.SelectorXStr)
+ return newDiagnostic(checker.Name(), call, msg)
+ }
+
+ case "IsNotType":
+ if len(call.Args) >= 2 && isError(pass, call.Args[0]) || isError(pass, call.Args[1]) {
+ msg := fmt.Sprintf("use %[1]s.NotErrorIs or %[1]s.NotErrorAs depending on the case", call.SelectorXStr)
+ return newDiagnostic(checker.Name(), call, msg)
+ }
+
case "True":
if len(call.Args) < 1 {
return nil
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/error_nil.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/error_nil.go
index b9f28df218..b7ced9a8d0 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/error_nil.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/error_nil.go
@@ -18,6 +18,7 @@ import (
// assert.EqualValues(t, nil, err)
// assert.Exactly(t, nil, err)
// assert.ErrorIs(t, err, nil)
+// assert.IsType(t, err, nil)
//
// assert.NotNil(t, err)
// assert.NotEmpty(t, err)
@@ -25,6 +26,7 @@ import (
// assert.NotEqual(t, nil, err)
// assert.NotEqualValues(t, nil, err)
// assert.NotErrorIs(t, err, nil)
+// assert.IsNotType(t, err, nil)
//
// and requires
//
@@ -54,7 +56,7 @@ func (checker ErrorNil) Check(pass *analysis.Pass, call *CallMeta) *analysis.Dia
return errorFn, call.Args[0], call.Args[0].End()
}
- case "Equal", "EqualValues", "Exactly", "ErrorIs":
+ case "Equal", "EqualValues", "Exactly", "ErrorIs", "IsType":
if len(call.Args) < 2 {
return "", nil, token.NoPos
}
@@ -67,7 +69,7 @@ func (checker ErrorNil) Check(pass *analysis.Pass, call *CallMeta) *analysis.Dia
return noErrorFn, b, b.End()
}
- case "NotEqual", "NotEqualValues", "NotErrorIs":
+ case "NotEqual", "NotEqualValues", "NotErrorIs", "IsNotType":
if len(call.Args) < 2 {
return "", nil, token.NoPos
}
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/expected_actual.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/expected_actual.go
index 31ea3ff44f..e0467ac70b 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/expected_actual.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/expected_actual.go
@@ -73,6 +73,7 @@ func (checker ExpectedActual) Check(pass *analysis.Pass, call *CallMeta) *analys
"InDeltaSlice",
"InEpsilon",
"InEpsilonSlice",
+ "IsNotType",
"IsType",
"JSONEq",
"NotEqual",
@@ -120,7 +121,9 @@ func (checker ExpectedActual) isExpectedValueCandidate(pass *analysis.Pass, expr
return checker.isExpectedValueCandidate(pass, v.X)
case *ast.UnaryExpr:
- return (v.Op == token.AND) && checker.isExpectedValueCandidate(pass, v.X) // &value
+ if v.Op == token.AND || v.Op == token.SUB { // &value, -value
+ return checker.isExpectedValueCandidate(pass, v.X)
+ }
case *ast.CompositeLit:
return true
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/go_require.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/go_require.go
index 8b0d39999e..4a0eb294e4 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/go_require.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/go_require.go
@@ -57,9 +57,9 @@ func (checker *GoRequire) SetIgnoreHTTPHandlers(v bool) *GoRequire {
// Other test functions called in the test function are also analyzed to make a verdict about the current function.
// This leads to recursion, which the cache of processed functions (processedFuncs) helps reduce the impact of.
// Also, because of this, we have to pre-collect a list of test function declarations (testsDecls).
-func (checker GoRequire) Check(pass *analysis.Pass, inspector *inspector.Inspector) (diagnostics []analysis.Diagnostic) {
+func (checker GoRequire) Check(pass *analysis.Pass, insp *inspector.Inspector) (diagnostics []analysis.Diagnostic) {
testsDecls := make(funcDeclarations)
- inspector.Preorder([]ast.Node{(*ast.FuncDecl)(nil)}, func(node ast.Node) {
+ insp.Preorder([]ast.Node{(*ast.FuncDecl)(nil)}, func(node ast.Node) {
fd := node.(*ast.FuncDecl)
if isTestingFuncOrMethod(pass, fd) {
@@ -78,7 +78,7 @@ func (checker GoRequire) Check(pass *analysis.Pass, inspector *inspector.Inspect
(*ast.GoStmt)(nil),
(*ast.CallExpr)(nil),
}
- inspector.Nodes(nodesFilter, func(node ast.Node, push bool) bool {
+ insp.Nodes(nodesFilter, func(node ast.Node, push bool) bool {
if fd, ok := node.(*ast.FuncDecl); ok {
if !isTestingFuncOrMethod(pass, fd) {
return false
@@ -171,7 +171,7 @@ func (checker GoRequire) Check(pass *analysis.Pass, inspector *inspector.Inspect
})
if !checker.ignoreHTTPHandlers {
- diagnostics = append(diagnostics, checker.checkHTTPHandlers(pass, inspector)...)
+ diagnostics = append(diagnostics, checker.checkHTTPHandlers(pass, insp)...)
}
return diagnostics
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_basic_type.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_basic_type.go
index 0e15cc1bfa..a716cb0e2f 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_basic_type.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_basic_type.go
@@ -37,7 +37,7 @@ func isTypedUnsignedIntNumber(e ast.Expr, v int) bool {
return isTypedIntNumber(e, v, "uint", "uint8", "uint16", "uint32", "uint64")
}
-func isTypedIntNumber(e ast.Expr, v int, types ...string) bool {
+func isTypedIntNumber(e ast.Expr, v int, goTypes ...string) bool {
ce, ok := e.(*ast.CallExpr)
if !ok || len(ce.Args) != 1 {
return false
@@ -48,7 +48,7 @@ func isTypedIntNumber(e ast.Expr, v int, types ...string) bool {
return false
}
- for _, t := range types {
+ for _, t := range goTypes {
if fn.Name == t {
return isIntNumber(ce.Args[0], v)
}
@@ -72,6 +72,12 @@ func isEmptyStringLit(e ast.Expr) bool {
}
func isBasicLit(e ast.Expr) bool {
+ if un, ok := e.(*ast.UnaryExpr); ok {
+ if un.Op == token.SUB {
+ return isBasicLit(un.X)
+ }
+ }
+
_, ok := e.(*ast.BasicLit)
return ok
}
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_comparison.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_comparison.go
index ac11d73990..e628443074 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_comparison.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_comparison.go
@@ -55,7 +55,7 @@ func isStrictComparisonWith(
lhs predicate,
op token.Token,
rhs predicate,
-) (ast.Expr, ast.Expr, bool) {
+) (leftOperand ast.Expr, rightOperand ast.Expr, fact bool) {
be, ok := e.(*ast.BinaryExpr)
if !ok {
return nil, nil, false
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_context.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_context.go
index e8505fad0a..2ad0ae4a36 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_context.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/helpers_context.go
@@ -54,7 +54,7 @@ func findSurroundingFunc(pass *analysis.Pass, stack []ast.Node) *funcID {
isHTTPHandler = true
}
- if i >= 2 { //nolint:nestif
+ if i >= 2 { //nolint:nestif // Already clear code.
if ce, ok := stack[i-1].(*ast.CallExpr); ok {
if se, ok := ce.Fun.(*ast.SelectorExpr); ok {
isTestCleanup = implementsTestingT(pass, se.X) && se.Sel != nil && (se.Sel.Name == "Cleanup")
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/len.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/len.go
index 9bdd8ff985..51a883b142 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/len.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/len.go
@@ -22,7 +22,7 @@ import (
// assert.EqualValues(t, value, len(arr))
// assert.Exactly(t, value, len(arr))
// assert.True(t, len(arr) == value)
-
+//
// assert.Equal(t, len(expArr), len(arr))
// assert.EqualValues(t, len(expArr), len(arr))
// assert.Exactly(t, len(expArr), len(arr))
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/require_error.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/require_error.go
index e4e30aaf4a..e965163102 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/require_error.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/require_error.go
@@ -50,12 +50,12 @@ func (checker *RequireError) SetFnPattern(p *regexp.Regexp) *RequireError {
return checker
}
-func (checker RequireError) Check(pass *analysis.Pass, inspector *inspector.Inspector) []analysis.Diagnostic {
+func (checker RequireError) Check(pass *analysis.Pass, insp *inspector.Inspector) []analysis.Diagnostic {
callsByFunc := make(map[funcID][]*callMeta)
// Stage 1. Collect meta information about any calls inside functions.
- inspector.WithStack([]ast.Node{(*ast.CallExpr)(nil)}, func(node ast.Node, push bool, stack []ast.Node) bool {
+ insp.WithStack([]ast.Node{(*ast.CallExpr)(nil)}, func(node ast.Node, push bool, stack []ast.Node) bool {
if !push {
return false
}
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/suite_method_signature.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/suite_method_signature.go
index 5293fc7be4..9ceba5db7c 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/suite_method_signature.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/suite_method_signature.go
@@ -20,8 +20,8 @@ type SuiteMethodSignature struct{}
func NewSuiteMethodSignature() SuiteMethodSignature { return SuiteMethodSignature{} }
func (SuiteMethodSignature) Name() string { return "suite-method-signature" }
-func (checker SuiteMethodSignature) Check(pass *analysis.Pass, inspector *inspector.Inspector) (diags []analysis.Diagnostic) {
- inspector.Preorder([]ast.Node{(*ast.FuncDecl)(nil)}, func(node ast.Node) {
+func (checker SuiteMethodSignature) Check(pass *analysis.Pass, insp *inspector.Inspector) (diags []analysis.Diagnostic) {
+ insp.Preorder([]ast.Node{(*ast.FuncDecl)(nil)}, func(node ast.Node) {
fd := node.(*ast.FuncDecl)
if !isSuiteMethod(pass, fd) {
return
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/suite_thelper.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/suite_thelper.go
index 94f0b4c451..074de4f764 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/suite_thelper.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/suite_thelper.go
@@ -22,8 +22,8 @@ type SuiteTHelper struct{}
func NewSuiteTHelper() SuiteTHelper { return SuiteTHelper{} }
func (SuiteTHelper) Name() string { return "suite-thelper" }
-func (checker SuiteTHelper) Check(pass *analysis.Pass, inspector *inspector.Inspector) (diagnostics []analysis.Diagnostic) {
- inspector.Preorder([]ast.Node{(*ast.FuncDecl)(nil)}, func(node ast.Node) {
+func (checker SuiteTHelper) Check(pass *analysis.Pass, insp *inspector.Inspector) (diagnostics []analysis.Diagnostic) {
+ insp.Preorder([]ast.Node{(*ast.FuncDecl)(nil)}, func(node ast.Node) {
fd := node.(*ast.FuncDecl)
if !isSuiteMethod(pass, fd) {
return
diff --git a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/useless_assert.go b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/useless_assert.go
index 70387cca46..15de9c6c59 100644
--- a/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/useless_assert.go
+++ b/hack/tools/vendor/github.com/Antonboom/testifylint/internal/checkers/useless_assert.go
@@ -146,6 +146,7 @@ func (checker UselessAssert) checkSameVars(pass *analysis.Pass, call *CallMeta)
"InDeltaSlice",
"InEpsilon",
"InEpsilonSlice",
+ "IsNotType",
"IsType",
"JSONEq",
"Less",
diff --git a/hack/tools/vendor/github.com/Djarvur/go-err113/.travis.yml b/hack/tools/vendor/github.com/Djarvur/go-err113/.travis.yml
index 44fe77d53a..142be3e8b0 100644
--- a/hack/tools/vendor/github.com/Djarvur/go-err113/.travis.yml
+++ b/hack/tools/vendor/github.com/Djarvur/go-err113/.travis.yml
@@ -1,18 +1,14 @@
language: go
go:
- - "1.13"
- - "1.14"
+ - "1.23"
+ - "1.24"
+ - "1.25"
- tip
-env:
- - GO111MODULE=on
-
before_install:
- - go get github.com/axw/gocov/gocov
- - go get github.com/mattn/goveralls
- - go get golang.org/x/tools/cmd/cover
- - go get golang.org/x/tools/cmd/goimports
+ - go install github.com/mattn/goveralls@v0.0.12
+ - go install golang.org/x/tools/cmd/goimports@v0.36.0
- wget -O - -q https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh
script:
@@ -21,4 +17,4 @@ script:
- go test -v -race ./...
after_success:
- - test "$TRAVIS_GO_VERSION" = "1.14" && goveralls -service=travis-ci
+ - test "$TRAVIS_GO_VERSION" = "1.25" && goveralls -service=travis-ci
diff --git a/hack/tools/vendor/github.com/Djarvur/go-err113/comparison.go b/hack/tools/vendor/github.com/Djarvur/go-err113/comparison.go
index 8a85557837..a267ebdce8 100644
--- a/hack/tools/vendor/github.com/Djarvur/go-err113/comparison.go
+++ b/hack/tools/vendor/github.com/Djarvur/go-err113/comparison.go
@@ -7,9 +7,10 @@ import (
"go/types"
"golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/ast/inspector"
)
-func inspectComparision(pass *analysis.Pass, n ast.Node) bool { // nolint: unparam
+func inspectComparision(file *ast.File, pass *analysis.Pass, n ast.Node) bool { // nolint: unparam
// check whether the call expression matches time.Now().Sub()
be, ok := n.(*ast.BinaryExpr)
if !ok {
@@ -25,6 +26,18 @@ func inspectComparision(pass *analysis.Pass, n ast.Node) bool { // nolint: unpar
return true
}
+ root := inspector.New([]*ast.File{file}).Root()
+ c, ok := root.FindNode(n)
+ if !ok {
+ panic(fmt.Errorf("could not find node %T in inspector for file %q", n, file.Name.Name))
+ }
+
+ for cur := c.Parent(); cur != root; cur = cur.Parent() {
+ if isMethodNamed(cur, pass, "Is") {
+ return true
+ }
+ }
+
oldExpr := render(pass.Fset, be)
negate := ""
@@ -56,6 +69,23 @@ func inspectComparision(pass *analysis.Pass, n ast.Node) bool { // nolint: unpar
return true
}
+var errorType = types.Universe.Lookup("error").Type().Underlying().(*types.Interface)
+
+func isMethodNamed(cur inspector.Cursor, pass *analysis.Pass, name string) bool {
+ funcNode, ok := cur.Node().(*ast.FuncDecl)
+
+ if !ok || funcNode.Name == nil || funcNode.Name.Name != name {
+ return false
+ }
+
+ if funcNode.Recv == nil && len(funcNode.Recv.List) != 1 {
+ return false
+ }
+
+ typ := pass.TypesInfo.Types[funcNode.Recv.List[0].Type]
+ return typ.Type != nil && types.Implements(typ.Type, errorType)
+}
+
func isError(v ast.Expr, info *types.Info) bool {
if intf, ok := info.TypeOf(v).Underlying().(*types.Interface); ok {
return intf.NumMethods() == 1 && intf.Method(0).FullName() == "(error).Error"
diff --git a/hack/tools/vendor/github.com/Djarvur/go-err113/err113.go b/hack/tools/vendor/github.com/Djarvur/go-err113/err113.go
index ec4f52ac72..190a7ded96 100644
--- a/hack/tools/vendor/github.com/Djarvur/go-err113/err113.go
+++ b/hack/tools/vendor/github.com/Djarvur/go-err113/err113.go
@@ -2,10 +2,10 @@
package err113
import (
- "bytes"
"go/ast"
"go/printer"
"go/token"
+ "strings"
"golang.org/x/tools/go/analysis"
)
@@ -19,14 +19,14 @@ func NewAnalyzer() *analysis.Analyzer {
}
}
-func run(pass *analysis.Pass) (interface{}, error) {
+func run(pass *analysis.Pass) (any, error) {
for _, file := range pass.Files {
tlds := enumerateFileDecls(file)
ast.Inspect(
file,
func(n ast.Node) bool {
- return inspectComparision(pass, n) &&
+ return inspectComparision(file, pass, n) &&
inspectDefinition(pass, tlds, n)
},
)
@@ -36,8 +36,8 @@ func run(pass *analysis.Pass) (interface{}, error) {
}
// render returns the pretty-print of the given node.
-func render(fset *token.FileSet, x interface{}) string {
- var buf bytes.Buffer
+func render(fset *token.FileSet, x any) string {
+ var buf strings.Builder
if err := printer.Fprint(&buf, fset, x); err != nil {
panic(err)
}
diff --git a/hack/tools/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md b/hack/tools/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md
index f95a504fe7..fabe5e43dc 100644
--- a/hack/tools/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md
+++ b/hack/tools/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md
@@ -1,5 +1,31 @@
# Changelog
+## 3.4.0 (2025-06-27)
+
+### Added
+
+- #268: Added property to Constraints to include prereleases for Check and Validate
+
+### Changed
+
+- #263: Updated Go testing for 1.24, 1.23, and 1.22
+- #269: Updated the error message handling for message case and wrapping errors
+- #266: Restore the ability to have leading 0's when parsing with NewVersion.
+ Opt-out of this by setting CoerceNewVersion to false.
+
+### Fixed
+
+- #257: Fixed the CodeQL link (thanks @dmitris)
+- #262: Restored detailed errors when failed to parse with NewVersion. Opt-out
+ of this by setting DetailedNewVersionErrors to false for faster performance.
+- #267: Handle pre-releases for an "and" group if one constraint includes them
+
+## 3.3.1 (2024-11-19)
+
+### Fixed
+
+- #253: Fix for allowing some version that were invalid
+
## 3.3.0 (2024-08-27)
### Added
@@ -137,7 +163,7 @@ functions. These are described in the added and changed sections below.
- #78: Fix unchecked error in example code (thanks @ravron)
- #70: Fix the handling of pre-releases and the 0.0.0 release edge case
- #97: Fixed copyright file for proper display on GitHub
-- #107: Fix handling prerelease when sorting alphanum and num
+- #107: Fix handling prerelease when sorting alphanum and num
- #109: Fixed where Validate sometimes returns wrong message on error
## 1.4.2 (2018-04-10)
diff --git a/hack/tools/vendor/github.com/Masterminds/semver/v3/README.md b/hack/tools/vendor/github.com/Masterminds/semver/v3/README.md
index ed56936084..2f56c676a5 100644
--- a/hack/tools/vendor/github.com/Masterminds/semver/v3/README.md
+++ b/hack/tools/vendor/github.com/Masterminds/semver/v3/README.md
@@ -50,6 +50,18 @@ other versions, convert the version back into a string, and get the original
string. Getting the original string is useful if the semantic version was coerced
into a valid form.
+There are package level variables that affect how `NewVersion` handles parsing.
+
+- `CoerceNewVersion` is `true` by default. When set to `true` it coerces non-compliant
+ versions into SemVer. For example, allowing a leading 0 in a major, minor, or patch
+ part. This enables the use of CalVer in versions even when not compliant with SemVer.
+ When set to `false` less coercion work is done.
+- `DetailedNewVersionErrors` provides more detailed errors. It only has an affect when
+ `CoerceNewVersion` is set to `false`. When `DetailedNewVersionErrors` is set to `true`
+ it can provide some more insight into why a version is invalid. Setting
+ `DetailedNewVersionErrors` to `false` is faster on performance but provides less
+ detailed error messages if a version fails to parse.
+
## Sorting Semantic Versions
A set of versions can be sorted using the `sort` package from the standard library.
@@ -160,6 +172,10 @@ means `>=1.2.3-BETA` will return `1.2.3-alpha`. What you might expect from case
sensitivity doesn't apply here. This is due to ASCII sort ordering which is what
the spec specifies.
+The `Constraints` instance returned from `semver.NewConstraint()` has a property
+`IncludePrerelease` that, when set to true, will return prerelease versions when calls
+to `Check()` and `Validate()` are made.
+
### Hyphen Range Comparisons
There are multiple methods to handle ranges and the first is hyphens ranges.
@@ -250,7 +266,7 @@ or [create a pull request](https://github.com/Masterminds/semver/pulls).
Security is an important consideration for this project. The project currently
uses the following tools to help discover security issues:
-* [CodeQL](https://github.com/Masterminds/semver)
+* [CodeQL](https://codeql.github.com)
* [gosec](https://github.com/securego/gosec)
* Daily Fuzz testing
diff --git a/hack/tools/vendor/github.com/Masterminds/semver/v3/constraints.go b/hack/tools/vendor/github.com/Masterminds/semver/v3/constraints.go
index 8461c7ed90..8b7a10f836 100644
--- a/hack/tools/vendor/github.com/Masterminds/semver/v3/constraints.go
+++ b/hack/tools/vendor/github.com/Masterminds/semver/v3/constraints.go
@@ -12,6 +12,13 @@ import (
// checked against.
type Constraints struct {
constraints [][]*constraint
+ containsPre []bool
+
+ // IncludePrerelease specifies if pre-releases should be included in
+ // the results. Note, if a constraint range has a prerelease than
+ // prereleases will be included for that AND group even if this is
+ // set to false.
+ IncludePrerelease bool
}
// NewConstraint returns a Constraints instance that a Version instance can
@@ -22,11 +29,10 @@ func NewConstraint(c string) (*Constraints, error) {
c = rewriteRange(c)
ors := strings.Split(c, "||")
- or := make([][]*constraint, len(ors))
+ lenors := len(ors)
+ or := make([][]*constraint, lenors)
+ hasPre := make([]bool, lenors)
for k, v := range ors {
-
- // TODO: Find a way to validate and fetch all the constraints in a simpler form
-
// Validate the segment
if !validConstraintRegex.MatchString(v) {
return nil, fmt.Errorf("improper constraint: %s", v)
@@ -43,12 +49,22 @@ func NewConstraint(c string) (*Constraints, error) {
return nil, err
}
+ // If one of the constraints has a prerelease record this.
+ // This information is used when checking all in an "and"
+ // group to ensure they all check for prereleases.
+ if pc.con.pre != "" {
+ hasPre[k] = true
+ }
+
result[i] = pc
}
or[k] = result
}
- o := &Constraints{constraints: or}
+ o := &Constraints{
+ constraints: or,
+ containsPre: hasPre,
+ }
return o, nil
}
@@ -57,10 +73,10 @@ func (cs Constraints) Check(v *Version) bool {
// TODO(mattfarina): For v4 of this library consolidate the Check and Validate
// functions as the underlying functions make that possible now.
// loop over the ORs and check the inner ANDs
- for _, o := range cs.constraints {
+ for i, o := range cs.constraints {
joy := true
for _, c := range o {
- if check, _ := c.check(v); !check {
+ if check, _ := c.check(v, (cs.IncludePrerelease || cs.containsPre[i])); !check {
joy = false
break
}
@@ -83,12 +99,12 @@ func (cs Constraints) Validate(v *Version) (bool, []error) {
// Capture the prerelease message only once. When it happens the first time
// this var is marked
var prerelesase bool
- for _, o := range cs.constraints {
+ for i, o := range cs.constraints {
joy := true
for _, c := range o {
// Before running the check handle the case there the version is
// a prerelease and the check is not searching for prereleases.
- if c.con.pre == "" && v.pre != "" {
+ if !(cs.IncludePrerelease || cs.containsPre[i]) && v.pre != "" {
if !prerelesase {
em := fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v)
e = append(e, em)
@@ -98,7 +114,7 @@ func (cs Constraints) Validate(v *Version) (bool, []error) {
} else {
- if _, err := c.check(v); err != nil {
+ if _, err := c.check(v, (cs.IncludePrerelease || cs.containsPre[i])); err != nil {
e = append(e, err)
joy = false
}
@@ -227,8 +243,8 @@ type constraint struct {
}
// Check if a version meets the constraint
-func (c *constraint) check(v *Version) (bool, error) {
- return constraintOps[c.origfunc](v, c)
+func (c *constraint) check(v *Version, includePre bool) (bool, error) {
+ return constraintOps[c.origfunc](v, c, includePre)
}
// String prints an individual constraint into a string
@@ -236,7 +252,7 @@ func (c *constraint) string() string {
return c.origfunc + c.orig
}
-type cfunc func(v *Version, c *constraint) (bool, error)
+type cfunc func(v *Version, c *constraint, includePre bool) (bool, error)
func parseConstraint(c string) (*constraint, error) {
if len(c) > 0 {
@@ -272,7 +288,7 @@ func parseConstraint(c string) (*constraint, error) {
// The constraintRegex should catch any regex parsing errors. So,
// we should never get here.
- return nil, errors.New("constraint Parser Error")
+ return nil, errors.New("constraint parser error")
}
cs.con = con
@@ -290,7 +306,7 @@ func parseConstraint(c string) (*constraint, error) {
// The constraintRegex should catch any regex parsing errors. So,
// we should never get here.
- return nil, errors.New("constraint Parser Error")
+ return nil, errors.New("constraint parser error")
}
cs := &constraint{
@@ -305,16 +321,14 @@ func parseConstraint(c string) (*constraint, error) {
}
// Constraint functions
-func constraintNotEqual(v *Version, c *constraint) (bool, error) {
- if c.dirty {
-
- // If there is a pre-release on the version but the constraint isn't looking
- // for them assume that pre-releases are not compatible. See issue 21 for
- // more details.
- if v.Prerelease() != "" && c.con.Prerelease() == "" {
- return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v)
- }
+func constraintNotEqual(v *Version, c *constraint, includePre bool) (bool, error) {
+ // The existence of prereleases is checked at the group level and passed in.
+ // Exit early if the version has a prerelease but those are to be ignored.
+ if v.Prerelease() != "" && !includePre {
+ return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v)
+ }
+ if c.dirty {
if c.con.Major() != v.Major() {
return true, nil
}
@@ -345,12 +359,11 @@ func constraintNotEqual(v *Version, c *constraint) (bool, error) {
return true, nil
}
-func constraintGreaterThan(v *Version, c *constraint) (bool, error) {
+func constraintGreaterThan(v *Version, c *constraint, includePre bool) (bool, error) {
- // If there is a pre-release on the version but the constraint isn't looking
- // for them assume that pre-releases are not compatible. See issue 21 for
- // more details.
- if v.Prerelease() != "" && c.con.Prerelease() == "" {
+ // The existence of prereleases is checked at the group level and passed in.
+ // Exit early if the version has a prerelease but those are to be ignored.
+ if v.Prerelease() != "" && !includePre {
return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v)
}
@@ -391,11 +404,10 @@ func constraintGreaterThan(v *Version, c *constraint) (bool, error) {
return false, fmt.Errorf("%s is less than or equal to %s", v, c.orig)
}
-func constraintLessThan(v *Version, c *constraint) (bool, error) {
- // If there is a pre-release on the version but the constraint isn't looking
- // for them assume that pre-releases are not compatible. See issue 21 for
- // more details.
- if v.Prerelease() != "" && c.con.Prerelease() == "" {
+func constraintLessThan(v *Version, c *constraint, includePre bool) (bool, error) {
+ // The existence of prereleases is checked at the group level and passed in.
+ // Exit early if the version has a prerelease but those are to be ignored.
+ if v.Prerelease() != "" && !includePre {
return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v)
}
@@ -406,12 +418,11 @@ func constraintLessThan(v *Version, c *constraint) (bool, error) {
return false, fmt.Errorf("%s is greater than or equal to %s", v, c.orig)
}
-func constraintGreaterThanEqual(v *Version, c *constraint) (bool, error) {
+func constraintGreaterThanEqual(v *Version, c *constraint, includePre bool) (bool, error) {
- // If there is a pre-release on the version but the constraint isn't looking
- // for them assume that pre-releases are not compatible. See issue 21 for
- // more details.
- if v.Prerelease() != "" && c.con.Prerelease() == "" {
+ // The existence of prereleases is checked at the group level and passed in.
+ // Exit early if the version has a prerelease but those are to be ignored.
+ if v.Prerelease() != "" && !includePre {
return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v)
}
@@ -422,11 +433,10 @@ func constraintGreaterThanEqual(v *Version, c *constraint) (bool, error) {
return false, fmt.Errorf("%s is less than %s", v, c.orig)
}
-func constraintLessThanEqual(v *Version, c *constraint) (bool, error) {
- // If there is a pre-release on the version but the constraint isn't looking
- // for them assume that pre-releases are not compatible. See issue 21 for
- // more details.
- if v.Prerelease() != "" && c.con.Prerelease() == "" {
+func constraintLessThanEqual(v *Version, c *constraint, includePre bool) (bool, error) {
+ // The existence of prereleases is checked at the group level and passed in.
+ // Exit early if the version has a prerelease but those are to be ignored.
+ if v.Prerelease() != "" && !includePre {
return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v)
}
@@ -455,11 +465,10 @@ func constraintLessThanEqual(v *Version, c *constraint) (bool, error) {
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0, <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3, <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0, <1.3.0
-func constraintTilde(v *Version, c *constraint) (bool, error) {
- // If there is a pre-release on the version but the constraint isn't looking
- // for them assume that pre-releases are not compatible. See issue 21 for
- // more details.
- if v.Prerelease() != "" && c.con.Prerelease() == "" {
+func constraintTilde(v *Version, c *constraint, includePre bool) (bool, error) {
+ // The existence of prereleases is checked at the group level and passed in.
+ // Exit early if the version has a prerelease but those are to be ignored.
+ if v.Prerelease() != "" && !includePre {
return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v)
}
@@ -487,16 +496,15 @@ func constraintTilde(v *Version, c *constraint) (bool, error) {
// When there is a .x (dirty) status it automatically opts in to ~. Otherwise
// it's a straight =
-func constraintTildeOrEqual(v *Version, c *constraint) (bool, error) {
- // If there is a pre-release on the version but the constraint isn't looking
- // for them assume that pre-releases are not compatible. See issue 21 for
- // more details.
- if v.Prerelease() != "" && c.con.Prerelease() == "" {
+func constraintTildeOrEqual(v *Version, c *constraint, includePre bool) (bool, error) {
+ // The existence of prereleases is checked at the group level and passed in.
+ // Exit early if the version has a prerelease but those are to be ignored.
+ if v.Prerelease() != "" && !includePre {
return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v)
}
if c.dirty {
- return constraintTilde(v, c)
+ return constraintTilde(v, c, includePre)
}
eq := v.Equal(c.con)
@@ -516,11 +524,10 @@ func constraintTildeOrEqual(v *Version, c *constraint) (bool, error) {
// ^0.0.3 --> >=0.0.3 <0.0.4
// ^0.0 --> >=0.0.0 <0.1.0
// ^0 --> >=0.0.0 <1.0.0
-func constraintCaret(v *Version, c *constraint) (bool, error) {
- // If there is a pre-release on the version but the constraint isn't looking
- // for them assume that pre-releases are not compatible. See issue 21 for
- // more details.
- if v.Prerelease() != "" && c.con.Prerelease() == "" {
+func constraintCaret(v *Version, c *constraint, includePre bool) (bool, error) {
+ // The existence of prereleases is checked at the group level and passed in.
+ // Exit early if the version has a prerelease but those are to be ignored.
+ if v.Prerelease() != "" && !includePre {
return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v)
}
diff --git a/hack/tools/vendor/github.com/Masterminds/semver/v3/version.go b/hack/tools/vendor/github.com/Masterminds/semver/v3/version.go
index 304edc3422..7a3ba73887 100644
--- a/hack/tools/vendor/github.com/Masterminds/semver/v3/version.go
+++ b/hack/tools/vendor/github.com/Masterminds/semver/v3/version.go
@@ -14,28 +14,40 @@ import (
// The compiled version of the regex created at init() is cached here so it
// only needs to be created once.
var versionRegex *regexp.Regexp
+var looseVersionRegex *regexp.Regexp
+
+// CoerceNewVersion sets if leading 0's are allowd in the version part. Leading 0's are
+// not allowed in a valid semantic version. When set to true, NewVersion will coerce
+// leading 0's into a valid version.
+var CoerceNewVersion = true
+
+// DetailedNewVersionErrors specifies if detailed errors are returned from the NewVersion
+// function. This is used when CoerceNewVersion is set to false. If set to false
+// ErrInvalidSemVer is returned for an invalid version. This does not apply to
+// StrictNewVersion. Setting this function to false returns errors more quickly.
+var DetailedNewVersionErrors = true
var (
// ErrInvalidSemVer is returned a version is found to be invalid when
// being parsed.
- ErrInvalidSemVer = errors.New("Invalid Semantic Version")
+ ErrInvalidSemVer = errors.New("invalid semantic version")
// ErrEmptyString is returned when an empty string is passed in for parsing.
- ErrEmptyString = errors.New("Version string empty")
+ ErrEmptyString = errors.New("version string empty")
// ErrInvalidCharacters is returned when invalid characters are found as
// part of a version
- ErrInvalidCharacters = errors.New("Invalid characters in version")
+ ErrInvalidCharacters = errors.New("invalid characters in version")
// ErrSegmentStartsZero is returned when a version segment starts with 0.
// This is invalid in SemVer.
- ErrSegmentStartsZero = errors.New("Version segment starts with 0")
+ ErrSegmentStartsZero = errors.New("version segment starts with 0")
// ErrInvalidMetadata is returned when the metadata is an invalid format
- ErrInvalidMetadata = errors.New("Invalid Metadata string")
+ ErrInvalidMetadata = errors.New("invalid metadata string")
// ErrInvalidPrerelease is returned when the pre-release is an invalid format
- ErrInvalidPrerelease = errors.New("Invalid Prerelease string")
+ ErrInvalidPrerelease = errors.New("invalid prerelease string")
)
// semVerRegex is the regular expression used to parse a semantic version.
@@ -45,6 +57,12 @@ const semVerRegex string = `v?(0|[1-9]\d*)(?:\.(0|[1-9]\d*))?(?:\.(0|[1-9]\d*))?
`(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?` +
`(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?`
+// looseSemVerRegex is a regular expression that lets invalid semver expressions through
+// with enough detail that certain errors can be checked for.
+const looseSemVerRegex string = `v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?` +
+ `(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` +
+ `(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?`
+
// Version represents a single semantic version.
type Version struct {
major, minor, patch uint64
@@ -55,6 +73,7 @@ type Version struct {
func init() {
versionRegex = regexp.MustCompile("^" + semVerRegex + "$")
+ looseVersionRegex = regexp.MustCompile("^" + looseSemVerRegex + "$")
}
const (
@@ -142,8 +161,27 @@ func StrictNewVersion(v string) (*Version, error) {
// attempts to convert it to SemVer. If you want to validate it was a strict
// semantic version at parse time see StrictNewVersion().
func NewVersion(v string) (*Version, error) {
+ if CoerceNewVersion {
+ return coerceNewVersion(v)
+ }
m := versionRegex.FindStringSubmatch(v)
if m == nil {
+
+ // Disabling detailed errors is first so that it is in the fast path.
+ if !DetailedNewVersionErrors {
+ return nil, ErrInvalidSemVer
+ }
+
+ // Check for specific errors with the semver string and return a more detailed
+ // error.
+ m = looseVersionRegex.FindStringSubmatch(v)
+ if m == nil {
+ return nil, ErrInvalidSemVer
+ }
+ err := validateVersion(m)
+ if err != nil {
+ return nil, err
+ }
return nil, ErrInvalidSemVer
}
@@ -156,13 +194,13 @@ func NewVersion(v string) (*Version, error) {
var err error
sv.major, err = strconv.ParseUint(m[1], 10, 64)
if err != nil {
- return nil, fmt.Errorf("Error parsing version segment: %s", err)
+ return nil, fmt.Errorf("error parsing version segment: %w", err)
}
if m[2] != "" {
sv.minor, err = strconv.ParseUint(m[2], 10, 64)
if err != nil {
- return nil, fmt.Errorf("Error parsing version segment: %s", err)
+ return nil, fmt.Errorf("error parsing version segment: %w", err)
}
} else {
sv.minor = 0
@@ -171,7 +209,61 @@ func NewVersion(v string) (*Version, error) {
if m[3] != "" {
sv.patch, err = strconv.ParseUint(m[3], 10, 64)
if err != nil {
- return nil, fmt.Errorf("Error parsing version segment: %s", err)
+ return nil, fmt.Errorf("error parsing version segment: %w", err)
+ }
+ } else {
+ sv.patch = 0
+ }
+
+ // Perform some basic due diligence on the extra parts to ensure they are
+ // valid.
+
+ if sv.pre != "" {
+ if err = validatePrerelease(sv.pre); err != nil {
+ return nil, err
+ }
+ }
+
+ if sv.metadata != "" {
+ if err = validateMetadata(sv.metadata); err != nil {
+ return nil, err
+ }
+ }
+
+ return sv, nil
+}
+
+func coerceNewVersion(v string) (*Version, error) {
+ m := looseVersionRegex.FindStringSubmatch(v)
+ if m == nil {
+ return nil, ErrInvalidSemVer
+ }
+
+ sv := &Version{
+ metadata: m[8],
+ pre: m[5],
+ original: v,
+ }
+
+ var err error
+ sv.major, err = strconv.ParseUint(m[1], 10, 64)
+ if err != nil {
+ return nil, fmt.Errorf("error parsing version segment: %w", err)
+ }
+
+ if m[2] != "" {
+ sv.minor, err = strconv.ParseUint(strings.TrimPrefix(m[2], "."), 10, 64)
+ if err != nil {
+ return nil, fmt.Errorf("error parsing version segment: %w", err)
+ }
+ } else {
+ sv.minor = 0
+ }
+
+ if m[3] != "" {
+ sv.patch, err = strconv.ParseUint(strings.TrimPrefix(m[3], "."), 10, 64)
+ if err != nil {
+ return nil, fmt.Errorf("error parsing version segment: %w", err)
}
} else {
sv.patch = 0
@@ -615,7 +707,7 @@ func validatePrerelease(p string) error {
eparts := strings.Split(p, ".")
for _, p := range eparts {
if p == "" {
- return ErrInvalidMetadata
+ return ErrInvalidPrerelease
} else if containsOnly(p, num) {
if len(p) > 1 && p[0] == '0' {
return ErrSegmentStartsZero
@@ -643,3 +735,54 @@ func validateMetadata(m string) error {
}
return nil
}
+
+// validateVersion checks for common validation issues but may not catch all errors
+func validateVersion(m []string) error {
+ var err error
+ var v string
+ if m[1] != "" {
+ if len(m[1]) > 1 && m[1][0] == '0' {
+ return ErrSegmentStartsZero
+ }
+ _, err = strconv.ParseUint(m[1], 10, 64)
+ if err != nil {
+ return fmt.Errorf("error parsing version segment: %w", err)
+ }
+ }
+
+ if m[2] != "" {
+ v = strings.TrimPrefix(m[2], ".")
+ if len(v) > 1 && v[0] == '0' {
+ return ErrSegmentStartsZero
+ }
+ _, err = strconv.ParseUint(v, 10, 64)
+ if err != nil {
+ return fmt.Errorf("error parsing version segment: %w", err)
+ }
+ }
+
+ if m[3] != "" {
+ v = strings.TrimPrefix(m[3], ".")
+ if len(v) > 1 && v[0] == '0' {
+ return ErrSegmentStartsZero
+ }
+ _, err = strconv.ParseUint(v, 10, 64)
+ if err != nil {
+ return fmt.Errorf("error parsing version segment: %w", err)
+ }
+ }
+
+ if m[5] != "" {
+ if err = validatePrerelease(m[5]); err != nil {
+ return err
+ }
+ }
+
+ if m[8] != "" {
+ if err = validateMetadata(m[8]); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
diff --git a/hack/tools/vendor/github.com/MirrexOne/unqueryvet/.gitignore b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/.gitignore
new file mode 100644
index 0000000000..bd2a78774c
--- /dev/null
+++ b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/.gitignore
@@ -0,0 +1,43 @@
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+/unqueryvet
+
+# Test binary, built with `go test -c`
+*.test
+
+# Output of the go coverage tool
+*.out
+coverage.html
+
+# Dependency directories
+vendor/
+
+# Go workspace file
+go.work
+go.work.sum
+
+# IDE files
+.idea/
+.vscode/
+*.swp
+*.swo
+*~
+
+# OS files
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+# Temporary files
+*.tmp
+*.log
+go.work
+.golangci.local.yml
diff --git a/hack/tools/vendor/github.com/MirrexOne/unqueryvet/.golangci.yml b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/.golangci.yml
new file mode 100644
index 0000000000..d604d323fd
--- /dev/null
+++ b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/.golangci.yml
@@ -0,0 +1,20 @@
+version: "2"
+
+formatters:
+ enable:
+ - gofumpt
+ - goimports
+ settings:
+ gofumpt:
+ extra-rules: true
+
+linters:
+ exclusions:
+ warn-unused: true
+ presets:
+ - comments
+ - std-error-handling
+
+issues:
+ max-issues-per-linter: 0
+ max-same-issues: 0
diff --git a/hack/tools/vendor/github.com/MirrexOne/unqueryvet/LICENSE b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/LICENSE
new file mode 100644
index 0000000000..278a61152a
--- /dev/null
+++ b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 MirrexOne
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/hack/tools/vendor/github.com/MirrexOne/unqueryvet/Makefile b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/Makefile
new file mode 100644
index 0000000000..d92d306811
--- /dev/null
+++ b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/Makefile
@@ -0,0 +1,93 @@
+.PHONY: all test build fmt fmt-check lint clean install help
+
+# Default target
+all: fmt test build
+
+# Run tests
+test:
+ @echo "Running tests..."
+ @go test -v -race -coverprofile=coverage.out ./...
+
+# Build the binary
+build:
+ @echo "Building unqueryvet..."
+ @go build -v ./cmd/unqueryvet
+
+# Format code with gofmt -s
+fmt:
+ @echo "Formatting code..."
+ @find . -name "*.go" -not -path "./vendor/*" -exec gofmt -s -w {} +
+ @go fmt ./...
+
+# Check if code is formatted
+fmt-check:
+ @echo "Checking code formatting..."
+ @if [ -n "$$(find . -name '*.go' -not -path './vendor/*' -exec gofmt -s -l {} +)" ]; then \
+ echo "The following files need formatting:"; \
+ find . -name '*.go' -not -path './vendor/*' -exec gofmt -s -l {} +; \
+ exit 1; \
+ else \
+ echo "All files are properly formatted"; \
+ fi
+
+# Run linter
+lint:
+ @echo "Running linter..."
+ @if command -v golangci-lint > /dev/null 2>&1; then \
+ ./lint-local.sh ./...; \
+ else \
+ echo "golangci-lint not installed. Install it from https://golangci-lint.run/usage/install/"; \
+ exit 1; \
+ fi
+
+# Clean build artifacts
+clean:
+ @echo "Cleaning..."
+ @rm -f unqueryvet
+ @rm -f coverage.out
+ @rm -f .golangci.local.yml
+ @go clean
+
+# Install the binary
+install:
+ @echo "Installing unqueryvet..."
+ @go install ./cmd/unqueryvet
+
+# Run unqueryvet on the project itself
+check:
+ @echo "Running unqueryvet on project..."
+ @go run ./cmd/unqueryvet ./...
+
+# Generate coverage report
+coverage: test
+ @echo "Generating coverage report..."
+ @go tool cover -html=coverage.out -o coverage.html
+ @echo "Coverage report generated: coverage.html"
+
+# Run benchmarks
+bench:
+ @echo "Running benchmarks..."
+ @go test -bench=. -benchmem ./internal/analyzer
+
+# Update dependencies
+deps:
+ @echo "Updating dependencies..."
+ @go mod tidy
+ @go mod verify
+
+# Help target
+help:
+ @echo "Available targets:"
+ @echo " make - Format, test, and build"
+ @echo " make test - Run tests with race detection"
+ @echo " make build - Build the unqueryvet binary"
+ @echo " make fmt - Format all Go files with gofmt -s"
+ @echo " make fmt-check - Check if files are formatted"
+ @echo " make lint - Run golangci-lint"
+ @echo " make clean - Remove build artifacts"
+ @echo " make install - Install unqueryvet binary"
+ @echo " make check - Run unqueryvet on the project"
+ @echo " make coverage - Generate coverage report"
+ @echo " make bench - Run benchmarks"
+ @echo " make deps - Update and verify dependencies"
+ @echo " make help - Show this help message"
diff --git a/hack/tools/vendor/github.com/MirrexOne/unqueryvet/README.md b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/README.md
new file mode 100644
index 0000000000..407f9d289a
--- /dev/null
+++ b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/README.md
@@ -0,0 +1,260 @@
+# unqueryvet
+
+[](https://goreportcard.com/report/github.com/MirrexOne/unqueryvet)
+[](https://godoc.org/github.com/MirrexOne/unqueryvet)
+[](LICENSE)
+
+unqueryvet is a Go static analysis tool (linter) that detects `SELECT *` usage in SQL queries and SQL builders, encouraging explicit column selection for better performance, maintainability, and API stability.
+
+## Features
+
+- **Detects `SELECT *` in string literals** - Finds problematic queries in your Go code
+- **Constants and variables support** - Detects `SELECT *` in const and var declarations
+- **SQL Builder support** - Works with popular SQL builders like Squirrel, GORM, etc.
+- **Highly configurable** - Extensive configuration options for different use cases
+- **Supports `//nolint:unqueryvet`** - Standard Go linting suppression
+- **golangci-lint integration** - Works seamlessly with golangci-lint
+- **Zero false positives** - Smart pattern recognition for acceptable `SELECT *` usage
+- **Fast and lightweight** - Built on golang.org/x/tools/go/analysis
+
+## Why avoid `SELECT *`?
+
+- **Performance**: Selecting unnecessary columns wastes network bandwidth and memory
+- **Maintainability**: Schema changes can break your application unexpectedly
+- **Security**: May expose sensitive data that shouldn't be returned
+- **API Stability**: Adding new columns can break clients that depend on column order
+
+## Informative Error Messages
+
+Unqueryvet provides context-specific messages that explain WHY you should avoid `SELECT *`:
+
+```go
+// Basic queries
+query := "SELECT * FROM users"
+// avoid SELECT * - explicitly specify needed columns for better performance, maintainability and stability
+
+// SQL Builders
+query := squirrel.Select("*").From("users")
+// avoid SELECT * in SQL builder - explicitly specify columns to prevent unnecessary data transfer and schema change issues
+
+// Empty Select()
+query := squirrel.Select()
+// SQL builder Select() without columns defaults to SELECT * - add specific columns with .Columns() method
+```
+
+## Quick Start
+
+### As a standalone tool
+
+```bash
+go install github.com/MirrexOne/unqueryvet/cmd/unqueryvet@latest
+unqueryvet ./...
+```
+
+### With golangci-lint (Recommended)
+
+Add to your `.golangci.yml`:
+
+```yaml
+version: "2"
+
+linters:
+ enable:
+ - unqueryvet
+
+ settings:
+ unqueryvet:
+ check-sql-builders: true
+ # By default, no functions are ignored - minimal configuration
+ # ignored-functions:
+ # - "fmt.Printf"
+ # - "log.Printf"
+ # allowed-patterns:
+ # - "SELECT \\* FROM information_schema\\..*"
+ # - "SELECT \\* FROM pg_catalog\\..*"
+```
+
+## Examples
+
+### Problematic code (will trigger warnings)
+
+```go
+// Constants with SELECT *
+const QueryUsers = "SELECT * FROM users"
+
+// Variables with SELECT *
+var QueryOrders = "SELECT * FROM orders"
+
+// String literals with SELECT *
+query := "SELECT * FROM users"
+rows, err := db.Query("SELECT * FROM orders WHERE status = ?", "active")
+
+// SQL builders with SELECT *
+query := squirrel.Select("*").From("products")
+query := builder.Select().Columns("*").From("inventory")
+```
+
+### Good code (recommended)
+
+```go
+// Constants with explicit columns
+const QueryUsers = "SELECT id, name, email FROM users"
+
+// Variables with explicit columns
+var QueryOrders = "SELECT id, status, total FROM orders"
+
+// String literals with explicit column selection
+query := "SELECT id, name, email FROM users"
+rows, err := db.Query("SELECT id, total FROM orders WHERE status = ?", "active")
+
+// SQL builders with explicit columns
+query := squirrel.Select("id", "name", "price").From("products")
+query := builder.Select().Columns("id", "quantity", "location").From("inventory")
+```
+
+### Acceptable SELECT * usage (won't trigger warnings)
+
+```go
+// System/meta queries
+"SELECT * FROM information_schema.tables"
+"SELECT * FROM pg_catalog.pg_tables"
+
+// Aggregate functions
+"SELECT COUNT(*) FROM users"
+"SELECT MAX(*) FROM scores"
+
+// With nolint suppression
+query := "SELECT * FROM debug_table" //nolint:unqueryvet
+```
+
+## Configuration
+
+Unqueryvet is highly configurable to fit your project's needs:
+
+```yaml
+version: "2"
+
+linters:
+ settings:
+ unqueryvet:
+ # Enable/disable SQL builder checking (default: true)
+ check-sql-builders: true
+
+ # Default allowed patterns (automatically included):
+ # - COUNT(*), MAX(*), MIN(*) functions
+ # - information_schema, pg_catalog, sys schema queries
+ # You can add more patterns if needed:
+ # allowed-patterns:
+ # - "SELECT \\* FROM temp_.*"
+```
+
+## Supported SQL Builders
+
+Unqueryvet supports popular SQL builders out of the box:
+
+- **Squirrel** - `squirrel.Select("*")`, `Select().Columns("*")`
+- **GORM** - Custom query methods
+- **SQLBoiler** - Generated query methods
+- **Custom builders** - Any builder using `Select()` patterns
+
+## Integration Examples
+
+### GitHub Actions
+
+```yaml
+name: Lint
+on: [push, pull_request]
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v5
+ - uses: actions/setup-go@v6
+ - name: golangci-lint
+ uses: golangci/golangci-lint-action@v8
+ with:
+ version: latest
+ args: --enable unqueryvet
+```
+
+## Command Line Options
+
+When used as a standalone tool:
+
+```bash
+# Check all packages
+unqueryvet ./...
+
+# Check specific packages
+unqueryvet ./cmd/... ./internal/...
+
+# With custom config file
+unqueryvet -config=.unqueryvet.yml ./...
+
+# Verbose output
+unqueryvet -v ./...
+```
+
+## Performance
+
+Unqueryvet is designed to be fast and lightweight:
+
+- **Parallel processing**: Analyzes multiple files concurrently
+- **Incremental analysis**: Only analyzes changed files when possible
+- **Minimal memory footprint**: Efficient AST traversal
+- **Smart caching**: Reuses analysis results when appropriate
+
+## Advanced Usage
+
+### Custom Patterns
+
+You can define custom regex patterns for acceptable `SELECT *` usage:
+
+```yaml
+allowed-patterns:
+ # Allow SELECT * from temporary tables
+ - "SELECT \\* FROM temp_\\w+"
+ # Allow SELECT * in migration scripts
+ - "SELECT \\* FROM.*-- migration"
+ # Allow SELECT * for specific schemas
+ - "SELECT \\* FROM audit\\..+"
+```
+
+### Integration with Custom SQL Builders
+
+For custom SQL builders, Unqueryvet looks for these patterns:
+
+```go
+// Method chaining
+builder.Select("*") // Direct SELECT *
+builder.Select().Columns("*") // Chained SELECT *
+
+// Variable tracking
+query := builder.Select() // Empty select
+// If no .Columns() call follows, triggers warning
+```
+
+### Running Tests
+
+```bash
+go test ./...
+go test -race ./...
+go test -bench=. ./...
+```
+
+### Development Setup
+
+```bash
+git clone https://github.com/MirrexOne/unqueryvet.git
+cd unqueryvet
+go mod tidy
+go test ./...
+```
+
+## License
+
+MIT License - see [LICENSE](LICENSE) file for details.
+
+## Support
+
+- **Bug Reports**: [GitHub Issues](https://github.com/MirrexOne/unqueryvet/issues)
diff --git a/hack/tools/vendor/github.com/MirrexOne/unqueryvet/analyzer.go b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/analyzer.go
new file mode 100644
index 0000000000..28c3ba6e84
--- /dev/null
+++ b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/analyzer.go
@@ -0,0 +1,27 @@
+// Package unqueryvet provides a Go static analysis tool that detects SELECT * usage
+package unqueryvet
+
+import (
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/MirrexOne/unqueryvet/internal/analyzer"
+ "github.com/MirrexOne/unqueryvet/pkg/config"
+)
+
+// Analyzer is the main unqueryvet analyzer instance
+// This is the primary export that golangci-lint will use
+var Analyzer = analyzer.NewAnalyzer()
+
+// New creates a new instance of the unqueryvet analyzer
+func New() *analysis.Analyzer {
+ return Analyzer
+}
+
+// NewWithConfig creates a new analyzer instance with custom configuration
+// This is the recommended way to use unqueryvet with custom settings
+func NewWithConfig(cfg *config.UnqueryvetSettings) *analysis.Analyzer {
+ if cfg == nil {
+ return Analyzer
+ }
+ return analyzer.NewAnalyzerWithSettings(*cfg)
+}
diff --git a/hack/tools/vendor/github.com/MirrexOne/unqueryvet/config.go b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/config.go
new file mode 100644
index 0000000000..03626ad38e
--- /dev/null
+++ b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/config.go
@@ -0,0 +1,11 @@
+package unqueryvet
+
+import "github.com/MirrexOne/unqueryvet/pkg/config"
+
+// Settings is a type alias for UnqueryvetSettings from the config package.
+type Settings = config.UnqueryvetSettings
+
+// DefaultSettings returns the default configuration for Unqueryvet.
+func DefaultSettings() Settings {
+ return config.DefaultSettings()
+}
diff --git a/hack/tools/vendor/github.com/MirrexOne/unqueryvet/internal/analyzer/analyzer.go b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/internal/analyzer/analyzer.go
new file mode 100644
index 0000000000..ce9b9874c5
--- /dev/null
+++ b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/internal/analyzer/analyzer.go
@@ -0,0 +1,465 @@
+// Package analyzer provides the SQL static analysis implementation for detecting SELECT * usage.
+package analyzer
+
+import (
+ "go/ast"
+ "go/token"
+ "regexp"
+ "strconv"
+ "strings"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/inspect"
+ "golang.org/x/tools/go/ast/inspector"
+
+ "github.com/MirrexOne/unqueryvet/pkg/config"
+)
+
+const (
+ // selectKeyword is the SQL SELECT method name in builders
+ selectKeyword = "Select"
+ // columnKeyword is the SQL Column method name in builders
+ columnKeyword = "Column"
+ // columnsKeyword is the SQL Columns method name in builders
+ columnsKeyword = "Columns"
+ // defaultWarningMessage is the standard warning for SELECT * usage
+ defaultWarningMessage = "avoid SELECT * - explicitly specify needed columns for better performance, maintainability and stability"
+)
+
+// NewAnalyzer creates the Unqueryvet analyzer with enhanced logic for production use
+func NewAnalyzer() *analysis.Analyzer {
+ return &analysis.Analyzer{
+ Name: "unqueryvet",
+ Doc: "detects SELECT * in SQL queries and SQL builders, preventing performance issues and encouraging explicit column selection",
+ Run: run,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ }
+}
+
+// NewAnalyzerWithSettings creates analyzer with provided settings for golangci-lint integration
+func NewAnalyzerWithSettings(s config.UnqueryvetSettings) *analysis.Analyzer {
+ return &analysis.Analyzer{
+ Name: "unqueryvet",
+ Doc: "detects SELECT * in SQL queries and SQL builders, preventing performance issues and encouraging explicit column selection",
+ Run: func(pass *analysis.Pass) (any, error) {
+ return RunWithConfig(pass, &s)
+ },
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ }
+}
+
+// RunWithConfig performs analysis with provided configuration
+// This is the main entry point for configured analysis
+func RunWithConfig(pass *analysis.Pass, cfg *config.UnqueryvetSettings) (any, error) {
+ insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+
+ // Use provided configuration or default if nil
+ if cfg == nil {
+ defaultSettings := config.DefaultSettings()
+ cfg = &defaultSettings
+ }
+
+ // Define AST node types we're interested in
+ nodeFilter := []ast.Node{
+ (*ast.CallExpr)(nil), // Function/method calls
+ (*ast.File)(nil), // Files (for SQL builder analysis)
+ (*ast.AssignStmt)(nil), // Assignment statements for standalone literals
+ (*ast.GenDecl)(nil), // General declarations (const, var, type)
+ }
+
+ // Walk through all AST nodes and analyze them
+ insp.Preorder(nodeFilter, func(n ast.Node) {
+ switch node := n.(type) {
+ case *ast.File:
+ // Analyze SQL builders only if enabled in configuration
+ if cfg.CheckSQLBuilders {
+ analyzeSQLBuilders(pass, node)
+ }
+ case *ast.AssignStmt:
+ // Check assignment statements for standalone SQL literals
+ checkAssignStmt(pass, node, cfg)
+ case *ast.GenDecl:
+ // Check constant and variable declarations
+ checkGenDecl(pass, node, cfg)
+ case *ast.CallExpr:
+ // Analyze function calls for SQL with SELECT * usage
+ checkCallExpr(pass, node, cfg)
+ }
+ })
+
+ return nil, nil
+}
+
+// run performs the main analysis of Go code files for SELECT * usage
+func run(pass *analysis.Pass) (any, error) {
+ insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+
+ // Define AST node types we're interested in
+ nodeFilter := []ast.Node{
+ (*ast.CallExpr)(nil), // Function/method calls
+ (*ast.File)(nil), // Files (for SQL builder analysis)
+ (*ast.AssignStmt)(nil), // Assignment statements for standalone literals
+ (*ast.GenDecl)(nil), // General declarations (const, var)
+ }
+
+ // Always use default settings since passing settings through ResultOf doesn't work reliably
+ defaultSettings := config.DefaultSettings()
+ cfg := &defaultSettings
+
+ // Walk through all AST nodes and analyze them
+ insp.Preorder(nodeFilter, func(n ast.Node) {
+ switch node := n.(type) {
+ case *ast.File:
+ // Analyze SQL builders only if enabled in configuration
+ if cfg.CheckSQLBuilders {
+ analyzeSQLBuilders(pass, node)
+ }
+ case *ast.AssignStmt:
+ // Check assignment statements for standalone SQL literals
+ checkAssignStmt(pass, node, cfg)
+ case *ast.GenDecl:
+ // Check constant and variable declarations
+ checkGenDecl(pass, node, cfg)
+ case *ast.CallExpr:
+ // Analyze function calls for SQL with SELECT * usage
+ checkCallExpr(pass, node, cfg)
+ }
+ })
+
+ return nil, nil
+}
+
+// checkAssignStmt checks assignment statements for standalone SQL literals
+func checkAssignStmt(pass *analysis.Pass, stmt *ast.AssignStmt, cfg *config.UnqueryvetSettings) {
+ // Check right-hand side expressions for string literals with SELECT *
+ for _, expr := range stmt.Rhs {
+ // Only check direct string literals, not function calls
+ if lit, ok := expr.(*ast.BasicLit); ok && lit.Kind == token.STRING {
+ content := normalizeSQLQuery(lit.Value)
+ if isSelectStarQuery(content, cfg) {
+ pass.Report(analysis.Diagnostic{
+ Pos: lit.Pos(),
+ Message: getWarningMessage(),
+ })
+ }
+ }
+ }
+}
+
+// checkGenDecl checks general declarations (const, var) for SELECT * in SQL queries
+func checkGenDecl(pass *analysis.Pass, decl *ast.GenDecl, cfg *config.UnqueryvetSettings) {
+ // Only check const and var declarations
+ if decl.Tok != token.CONST && decl.Tok != token.VAR {
+ return
+ }
+
+ // Iterate through all specifications in the declaration
+ for _, spec := range decl.Specs {
+ // Type assert to ValueSpec (const/var specifications)
+ valueSpec, ok := spec.(*ast.ValueSpec)
+ if !ok {
+ continue
+ }
+
+ // Check all values in the specification
+ for _, value := range valueSpec.Values {
+ // Only check direct string literals
+ if lit, ok := value.(*ast.BasicLit); ok && lit.Kind == token.STRING {
+ content := normalizeSQLQuery(lit.Value)
+ if isSelectStarQuery(content, cfg) {
+ pass.Report(analysis.Diagnostic{
+ Pos: lit.Pos(),
+ Message: getWarningMessage(),
+ })
+ }
+ }
+ }
+ }
+}
+
+// checkCallExpr analyzes function calls for SQL with SELECT * usage
+// Includes checking arguments and SQL builders
+func checkCallExpr(pass *analysis.Pass, call *ast.CallExpr, cfg *config.UnqueryvetSettings) {
+ // Check SQL builders for SELECT * in arguments
+ if cfg.CheckSQLBuilders && isSQLBuilderSelectStar(call) {
+ pass.Report(analysis.Diagnostic{
+ Pos: call.Pos(),
+ Message: getDetailedWarningMessage("sql_builder"),
+ })
+ return
+ }
+
+ // Check function call arguments for strings with SELECT *
+ for _, arg := range call.Args {
+ if lit, ok := arg.(*ast.BasicLit); ok && lit.Kind == token.STRING {
+ content := normalizeSQLQuery(lit.Value)
+ if isSelectStarQuery(content, cfg) {
+ pass.Report(analysis.Diagnostic{
+ Pos: lit.Pos(),
+ Message: getWarningMessage(),
+ })
+ }
+ }
+ }
+}
+
+// NormalizeSQLQuery normalizes SQL query for analysis with advanced escape sequence handling.
+// Exported for testing purposes.
+func NormalizeSQLQuery(query string) string {
+ return normalizeSQLQuery(query)
+}
+
+func normalizeSQLQuery(query string) string {
+ if len(query) < 2 {
+ return query
+ }
+
+ first, last := query[0], query[len(query)-1]
+
+ // 1. Handle different quote types with escape sequence processing
+ if first == '"' && last == '"' {
+ // For regular strings check for escape sequences
+ if !strings.Contains(query, "\\") {
+ query = trimQuotes(query)
+ } else if unquoted, err := strconv.Unquote(query); err == nil {
+ // Use standard Go unquoting for proper escape sequence handling
+ query = unquoted
+ } else {
+ // Fallback: simple quote removal
+ query = trimQuotes(query)
+ }
+ } else if first == '`' && last == '`' {
+ // Raw strings - simply remove backticks
+ query = trimQuotes(query)
+ }
+
+ // 2. Process comments line by line before normalization
+ lines := strings.Split(query, "\n")
+ var processedParts []string
+
+ for _, line := range lines {
+ // Remove comments from current line
+ if idx := strings.Index(line, "--"); idx != -1 {
+ line = line[:idx]
+ }
+
+ // Add non-empty lines
+ if trimmed := strings.TrimSpace(line); trimmed != "" {
+ processedParts = append(processedParts, trimmed)
+ }
+ }
+
+ // 3. Reassemble query and normalize
+ query = strings.Join(processedParts, " ")
+ query = strings.ToUpper(query)
+ query = strings.ReplaceAll(query, "\t", " ")
+ query = regexp.MustCompile(`\s+`).ReplaceAllString(query, " ")
+
+ return strings.TrimSpace(query)
+}
+
+// trimQuotes removes first and last character (quotes)
+func trimQuotes(query string) string {
+ return query[1 : len(query)-1]
+}
+
+// IsSelectStarQuery determines if query contains SELECT * with enhanced allowed patterns support.
+// Exported for testing purposes.
+func IsSelectStarQuery(query string, cfg *config.UnqueryvetSettings) bool {
+ return isSelectStarQuery(query, cfg)
+}
+
+func isSelectStarQuery(query string, cfg *config.UnqueryvetSettings) bool {
+ // Check allowed patterns first - if query matches an allowed pattern, ignore it
+ for _, pattern := range cfg.AllowedPatterns {
+ if matched, _ := regexp.MatchString(pattern, query); matched {
+ return false
+ }
+ }
+
+ // Check for SELECT * in query (case-insensitive)
+ upperQuery := strings.ToUpper(query)
+ if strings.Contains(upperQuery, "SELECT *") { //nolint:unqueryvet
+ // Ensure this is actually an SQL query by checking for SQL keywords
+ sqlKeywords := []string{"FROM", "WHERE", "JOIN", "GROUP", "ORDER", "HAVING", "UNION", "LIMIT"}
+ for _, keyword := range sqlKeywords {
+ if strings.Contains(upperQuery, keyword) {
+ return true
+ }
+ }
+
+ // Also check if it's just "SELECT *" without other keywords (still problematic)
+ trimmed := strings.TrimSpace(upperQuery)
+ if trimmed == "SELECT *" {
+ return true
+ }
+ }
+ return false
+}
+
+// getWarningMessage returns informative warning message
+func getWarningMessage() string {
+ return defaultWarningMessage
+}
+
+// getDetailedWarningMessage returns context-specific warning message
+func getDetailedWarningMessage(context string) string {
+ switch context {
+ case "sql_builder":
+ return "avoid SELECT * in SQL builder - explicitly specify columns to prevent unnecessary data transfer and schema change issues"
+ case "nested":
+ return "avoid SELECT * in subquery - can cause performance issues and unexpected results when schema changes"
+ case "empty_select":
+ return "SQL builder Select() without columns defaults to SELECT * - add specific columns with .Columns() method"
+ default:
+ return defaultWarningMessage
+ }
+}
+
+// isSQLBuilderSelectStar checks SQL builder method calls for SELECT * usage
+func isSQLBuilderSelectStar(call *ast.CallExpr) bool {
+ fun, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return false
+ }
+
+ // Check that this is a Select method call
+ if fun.Sel == nil || fun.Sel.Name != selectKeyword {
+ return false
+ }
+
+ if len(call.Args) == 0 {
+ return false
+ }
+
+ // Check Select method arguments for "*" or empty strings
+ for _, arg := range call.Args {
+ if lit, ok := arg.(*ast.BasicLit); ok && lit.Kind == token.STRING {
+ value := strings.Trim(lit.Value, "`\"")
+ // Consider both "*" and empty strings in Select() as problematic
+ if value == "*" || value == "" {
+ return true
+ }
+ }
+ }
+
+ return false
+}
+
+// analyzeSQLBuilders performs advanced SQL builder analysis
+// Key logic for handling edge-cases like Select().Columns("*")
+func analyzeSQLBuilders(pass *analysis.Pass, file *ast.File) {
+ // Track SQL builder variables and their state
+ builderVars := make(map[string]*ast.CallExpr) // Variables with empty Select() calls
+ hasColumns := make(map[string]bool) // Flag: were columns added for variable
+
+ // First pass: find variables created with empty Select() calls
+ ast.Inspect(file, func(n ast.Node) bool {
+ switch node := n.(type) {
+ case *ast.AssignStmt:
+ // Analyze assignments like: query := builder.Select()
+ for i, expr := range node.Rhs {
+ if call, ok := expr.(*ast.CallExpr); ok {
+ if isEmptySelectCall(call) {
+ // Found empty Select() call, remember the variable
+ if i < len(node.Lhs) {
+ if ident, ok := node.Lhs[i].(*ast.Ident); ok {
+ builderVars[ident.Name] = call
+ hasColumns[ident.Name] = false
+ }
+ }
+ }
+ }
+ }
+ }
+ return true
+ })
+
+ // Second pass: check usage of Columns/Column methods
+ ast.Inspect(file, func(n ast.Node) bool {
+ switch node := n.(type) {
+ case *ast.CallExpr:
+ if sel, ok := node.Fun.(*ast.SelectorExpr); ok {
+ // Check calls to Columns() or Column() methods
+ if sel.Sel != nil && (sel.Sel.Name == columnsKeyword || sel.Sel.Name == columnKeyword) {
+ // Check for "*" in arguments
+ if hasStarInColumns(node) {
+ pass.Report(analysis.Diagnostic{
+ Pos: node.Pos(),
+ Message: getDetailedWarningMessage("sql_builder"),
+ })
+ }
+
+ // Update variable state - columns were added
+ if ident, ok := sel.X.(*ast.Ident); ok {
+ if _, exists := builderVars[ident.Name]; exists {
+ if !hasStarInColumns(node) {
+ hasColumns[ident.Name] = true
+ }
+ }
+ }
+ }
+ }
+
+ // Check call chains like builder.Select().Columns("*")
+ if isSelectWithColumns(node) {
+ if hasStarInColumns(node) {
+ if sel, ok := node.Fun.(*ast.SelectorExpr); ok && sel.Sel != nil {
+ pass.Report(analysis.Diagnostic{
+ Pos: node.Pos(),
+ Message: getDetailedWarningMessage("sql_builder"),
+ })
+ }
+ }
+ return true
+ }
+ }
+ return true
+ })
+
+ // Final check: warn about builders with empty Select() without subsequent columns
+ for varName, call := range builderVars {
+ if !hasColumns[varName] {
+ pass.Report(analysis.Diagnostic{
+ Pos: call.Pos(),
+ Message: getDetailedWarningMessage("empty_select"),
+ })
+ }
+ }
+}
+
+// isEmptySelectCall checks if call is an empty Select()
+func isEmptySelectCall(call *ast.CallExpr) bool {
+ if sel, ok := call.Fun.(*ast.SelectorExpr); ok {
+ if sel.Sel != nil && sel.Sel.Name == selectKeyword && len(call.Args) == 0 {
+ return true
+ }
+ }
+ return false
+}
+
+// isSelectWithColumns checks call chains like Select().Columns()
+func isSelectWithColumns(call *ast.CallExpr) bool {
+ if sel, ok := call.Fun.(*ast.SelectorExpr); ok {
+ if sel.Sel != nil && (sel.Sel.Name == columnsKeyword || sel.Sel.Name == columnKeyword) {
+ // Check that previous call in chain is Select()
+ if innerCall, ok := sel.X.(*ast.CallExpr); ok {
+ return isEmptySelectCall(innerCall)
+ }
+ }
+ }
+ return false
+}
+
+// hasStarInColumns checks if call arguments contain "*" symbol
+func hasStarInColumns(call *ast.CallExpr) bool {
+ for _, arg := range call.Args {
+ if lit, ok := arg.(*ast.BasicLit); ok && lit.Kind == token.STRING {
+ value := strings.Trim(lit.Value, "`\"")
+ if value == "*" {
+ return true
+ }
+ }
+ }
+ return false
+}
diff --git a/hack/tools/vendor/github.com/MirrexOne/unqueryvet/pkg/config/config.go b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/pkg/config/config.go
new file mode 100644
index 0000000000..034c324d1d
--- /dev/null
+++ b/hack/tools/vendor/github.com/MirrexOne/unqueryvet/pkg/config/config.go
@@ -0,0 +1,27 @@
+// Package config provides configuration structures for Unqueryvet analyzer.
+package config
+
+// UnqueryvetSettings holds the configuration for the Unqueryvet analyzer.
+type UnqueryvetSettings struct {
+ // CheckSQLBuilders enables checking SQL builders like Squirrel for SELECT * usage
+ CheckSQLBuilders bool `mapstructure:"check-sql-builders" json:"check-sql-builders" yaml:"check-sql-builders"`
+
+ // AllowedPatterns is a list of regex patterns that are allowed to use SELECT *
+ // Example: ["SELECT \\* FROM temp_.*", "SELECT \\* FROM .*_backup"]
+ AllowedPatterns []string `mapstructure:"allowed-patterns" json:"allowed-patterns" yaml:"allowed-patterns"`
+}
+
+// DefaultSettings returns the default configuration for unqueryvet
+func DefaultSettings() UnqueryvetSettings {
+ return UnqueryvetSettings{
+ CheckSQLBuilders: true,
+ AllowedPatterns: []string{
+ `(?i)COUNT\(\s*\*\s*\)`,
+ `(?i)MAX\(\s*\*\s*\)`,
+ `(?i)MIN\(\s*\*\s*\)`,
+ `(?i)SELECT \* FROM information_schema\..*`,
+ `(?i)SELECT \* FROM pg_catalog\..*`,
+ `(?i)SELECT \* FROM sys\..*`,
+ },
+ }
+}
diff --git a/hack/tools/vendor/github.com/ashanbrown/forbidigo/v2/forbidigo/forbidigo.go b/hack/tools/vendor/github.com/ashanbrown/forbidigo/v2/forbidigo/forbidigo.go
index 6f4e78cc6b..913b45e957 100644
--- a/hack/tools/vendor/github.com/ashanbrown/forbidigo/v2/forbidigo/forbidigo.go
+++ b/hack/tools/vendor/github.com/ashanbrown/forbidigo/v2/forbidigo/forbidigo.go
@@ -374,6 +374,8 @@ func typeNameWithPackage(t types.Type) (typeName, packagePath string, ok bool) {
}
switch t := t.(type) {
+ case *types.Alias:
+ return typeNameWithPackage(t.Rhs())
case *types.Named:
obj := t.Obj()
pkg := obj.Pkg()
diff --git a/hack/tools/vendor/github.com/bombsimon/wsl/v5/analyzer.go b/hack/tools/vendor/github.com/bombsimon/wsl/v5/analyzer.go
index ffd8fbe003..38a84973f4 100644
--- a/hack/tools/vendor/github.com/bombsimon/wsl/v5/analyzer.go
+++ b/hack/tools/vendor/github.com/bombsimon/wsl/v5/analyzer.go
@@ -12,7 +12,7 @@ import (
"golang.org/x/tools/go/analysis"
)
-const version = "wsl version v5.1.1"
+const version = "wsl version v5.3.0"
func NewAnalyzer(config *Configuration) *analysis.Analyzer {
wa := &wslAnalyzer{config: config}
diff --git a/hack/tools/vendor/github.com/bombsimon/wsl/v5/wsl.go b/hack/tools/vendor/github.com/bombsimon/wsl/v5/wsl.go
index 3279c775cc..9bf62c2aec 100644
--- a/hack/tools/vendor/github.com/bombsimon/wsl/v5/wsl.go
+++ b/hack/tools/vendor/github.com/bombsimon/wsl/v5/wsl.go
@@ -128,11 +128,12 @@ func (w *WSL) checkStmt(stmt ast.Stmt, cursor *Cursor) {
//nolint:unparam // False positive on `cursor`
func (w *WSL) checkExpr(expr ast.Expr, cursor *Cursor) {
+ // This switch traverses all possible subexpressions in search
+ // of anonymous functions, no matter how unlikely or perhaps even
+ // semantically impossible it is.
switch s := expr.(type) {
- // func() {}
case *ast.FuncLit:
w.checkBlock(s.Body)
- // Call(args...)
case *ast.CallExpr:
w.checkExpr(s.Fun, cursor)
@@ -142,25 +143,79 @@ func (w *WSL) checkExpr(expr ast.Expr, cursor *Cursor) {
case *ast.StarExpr:
w.checkExpr(s.X, cursor)
case *ast.CompositeLit:
+ w.checkExpr(s.Type, cursor)
+
for _, e := range s.Elts {
w.checkExpr(e, cursor)
}
- case *ast.ArrayType,
- *ast.BasicLit,
- *ast.BinaryExpr,
- *ast.ChanType,
- *ast.Ellipsis,
- *ast.Ident,
- *ast.IndexExpr,
- *ast.IndexListExpr,
- *ast.KeyValueExpr,
- *ast.MapType,
- *ast.ParenExpr,
- *ast.SelectorExpr,
- *ast.SliceExpr,
- *ast.TypeAssertExpr,
- *ast.UnaryExpr,
- nil:
+ case *ast.KeyValueExpr:
+ w.checkExpr(s.Key, cursor)
+ w.checkExpr(s.Value, cursor)
+ case *ast.ArrayType:
+ w.checkExpr(s.Elt, cursor)
+ w.checkExpr(s.Len, cursor)
+ case *ast.BasicLit:
+ case *ast.BinaryExpr:
+ w.checkExpr(s.X, cursor)
+ w.checkExpr(s.Y, cursor)
+ case *ast.ChanType:
+ w.checkExpr(s.Value, cursor)
+ case *ast.Ellipsis:
+ w.checkExpr(s.Elt, cursor)
+ case *ast.FuncType:
+ if params := s.TypeParams; params != nil {
+ for _, f := range params.List {
+ w.checkExpr(f.Type, cursor)
+ }
+ }
+
+ if params := s.Params; params != nil {
+ for _, f := range params.List {
+ w.checkExpr(f.Type, cursor)
+ }
+ }
+
+ if results := s.Results; results != nil {
+ for _, f := range results.List {
+ w.checkExpr(f.Type, cursor)
+ }
+ }
+ case *ast.Ident:
+ case *ast.IndexExpr:
+ w.checkExpr(s.Index, cursor)
+ w.checkExpr(s.X, cursor)
+ case *ast.IndexListExpr:
+ w.checkExpr(s.X, cursor)
+
+ for _, e := range s.Indices {
+ w.checkExpr(e, cursor)
+ }
+ case *ast.InterfaceType:
+ for _, f := range s.Methods.List {
+ w.checkExpr(f.Type, cursor)
+ }
+ case *ast.MapType:
+ w.checkExpr(s.Key, cursor)
+ w.checkExpr(s.Value, cursor)
+ case *ast.ParenExpr:
+ w.checkExpr(s.X, cursor)
+ case *ast.SelectorExpr:
+ w.checkExpr(s.X, cursor)
+ case *ast.SliceExpr:
+ w.checkExpr(s.X, cursor)
+ w.checkExpr(s.Low, cursor)
+ w.checkExpr(s.High, cursor)
+ w.checkExpr(s.Max, cursor)
+ case *ast.StructType:
+ for _, f := range s.Fields.List {
+ w.checkExpr(f.Type, cursor)
+ }
+ case *ast.TypeAssertExpr:
+ w.checkExpr(s.X, cursor)
+ w.checkExpr(s.Type, cursor)
+ case *ast.UnaryExpr:
+ w.checkExpr(s.X, cursor)
+ case nil:
default:
}
}
@@ -223,6 +278,10 @@ func (w *WSL) checkCuddlingMaxAllowed(
cursor *Cursor,
maxAllowedStatements int,
) {
+ if _, ok := cursor.Stmt().(*ast.LabeledStmt); ok {
+ return
+ }
+
previousNode := cursor.PreviousNode()
if previousNode != nil {
@@ -233,12 +292,12 @@ func (w *WSL) checkCuddlingMaxAllowed(
}
numStmtsAbove := w.numberOfStatementsAbove(cursor)
- previousIdents := identsFromNode(previousNode, true)
+ previousIdents := w.identsFromNode(previousNode, true)
// If we don't have any statements above, we only care about potential error
// cuddling (for if statements) so check that.
if numStmtsAbove == 0 {
- w.checkError(numStmtsAbove, stmt, previousNode, previousIdents, cursor)
+ w.checkError(numStmtsAbove, stmt, previousNode, cursor)
return
}
@@ -276,7 +335,7 @@ func (w *WSL) checkCuddlingMaxAllowed(
// FEATURE(AllowWholeBlock): Allow identifier used anywhere in block
// (including recursive blocks).
if w.config.AllowWholeBlock {
- allIdentsInBlock := identsFromNode(stmt, false)
+ allIdentsInBlock := w.identsFromNode(stmt, false)
if checkIntersection(allIdentsInBlock) {
return
}
@@ -284,13 +343,13 @@ func (w *WSL) checkCuddlingMaxAllowed(
// FEATURE(AllowFirstInBlock): Allow identifiers used first in block.
if !w.config.AllowWholeBlock && w.config.AllowFirstInBlock {
- firstStmtIdents := identsFromNode(firstBlockStmt, true)
+ firstStmtIdents := w.identsFromNode(firstBlockStmt, true)
if checkIntersection(firstStmtIdents) {
return
}
}
- currentIdents := identsFromNode(stmt, true)
+ currentIdents := w.identsFromNode(stmt, true)
if checkIntersection(currentIdents) {
return
}
@@ -314,6 +373,10 @@ func (w *WSL) checkCuddlingWithoutIntersection(stmt ast.Node, cursor *Cursor) {
return
}
+ if _, ok := cursor.Stmt().(*ast.LabeledStmt); ok {
+ return
+ }
+
previousNode := cursor.PreviousNode()
currAssign, currIsAssign := stmt.(*ast.AssignStmt)
@@ -349,7 +412,7 @@ func (w *WSL) checkCuddlingWithoutIntersection(stmt ast.Node, cursor *Cursor) {
prevIsValidType := previousNode == nil || prevIsAssign || prevIsDecl || prevIsIncDec
if _, ok := w.config.Checks[CheckAssignExpr]; !ok {
- if _, ok := previousNode.(*ast.ExprStmt); ok && hasIntersection(stmt, previousNode) {
+ if _, ok := previousNode.(*ast.ExprStmt); ok && w.hasIntersection(stmt, previousNode) {
prevIsValidType = prevIsValidType || ok
}
}
@@ -443,7 +506,7 @@ func (w *WSL) checkAppend(stmt *ast.AssignStmt, cursor *Cursor) {
return
}
- if !hasIntersection(appendNode, previousNode) {
+ if !w.hasIntersection(appendNode, previousNode) {
w.addErrorNoIntersection(stmt.Pos(), CheckAppend)
}
}
@@ -514,7 +577,7 @@ func (w *WSL) checkDefer(stmt *ast.DeferStmt, cursor *Cursor) {
cursor.Previous()
cursor.Previous()
- if hasIntersection(cursor.Stmt(), stmt) {
+ if w.hasIntersection(cursor.Stmt(), stmt) {
return 1, false
}
}
@@ -530,13 +593,16 @@ func (w *WSL) checkError(
stmtsAbove int,
ifStmt ast.Node,
previousNode ast.Node,
- previousIdents []*ast.Ident,
cursor *Cursor,
) {
if _, ok := w.config.Checks[CheckErr]; !ok {
return
}
+ if _, ok := cursor.Stmt().(*ast.LabeledStmt); ok {
+ return
+ }
+
defer cursor.Save()()
// It must be an if statement
@@ -545,6 +611,18 @@ func (w *WSL) checkError(
return
}
+ // If we actually have statements above we can't possibly need to remove any
+ // empty lines.
+ if stmtsAbove > 0 {
+ return
+ }
+
+ // If the error checking has an init condition (e.g. if err := f();) we
+ // don't want to check cuddling since the error is now assigned on this row.
+ if stmt.Init != nil {
+ return
+ }
+
// The condition must be a binary expression (X OP Y)
binaryExpr, ok := stmt.Cond.(*ast.BinaryExpr)
if !ok {
@@ -576,22 +654,26 @@ func (w *WSL) checkError(
return
}
- // Previous node must be assign or decl where the error was actually
- // defined.
- _, isAssign := previousNode.(*ast.AssignStmt)
- _, isDecl := previousNode.(*ast.DeclStmt)
+ previousIdents := []*ast.Ident{}
- if !isAssign && !isDecl {
- return
+ if assign, ok := previousNode.(*ast.AssignStmt); ok {
+ for _, lhs := range assign.Lhs {
+ previousIdents = append(previousIdents, w.identsFromNode(lhs, true)...)
+ }
}
- // If there are no statements above or the statement above doesn't contain
- // any idents there can't be any error to cuddle.
- if stmtsAbove > 0 || len(previousIdents) == 0 {
- return
+ if decl, ok := previousNode.(*ast.DeclStmt); ok {
+ if genDecl, ok := decl.Decl.(*ast.GenDecl); ok {
+ for _, spec := range genDecl.Specs {
+ if vs, ok := spec.(*ast.ValueSpec); ok {
+ previousIdents = append(previousIdents, vs.Names...)
+ }
+ }
+ }
}
- // Ensure that the error was defined on the line above.
+ // Ensure that the error checked on this line was assigned or declared in
+ // the previous statement.
if len(identIntersection([]*ast.Ident{xIdent}, previousIdents)) == 0 {
return
}
@@ -713,7 +795,6 @@ func (w *WSL) checkIf(stmt *ast.IfStmt, cursor *Cursor, isElse bool) {
w.numberOfStatementsAbove(cursor),
stmt,
previousNode,
- identsFromNode(previousNode, true),
cursor,
)
}
@@ -1074,7 +1155,7 @@ func (w *WSL) maybeCheckBlock(
if check != CheckSwitch && check != CheckTypeSwitch && check != CheckSelect {
blockList = blockStmt.List
} else {
- allowedIdents = identsFromCaseArms(node)
+ allowedIdents = w.identsFromCaseArms(node)
}
w.checkCuddlingBlock(node, blockList, allowedIdents, cursor, 1)
@@ -1222,13 +1303,13 @@ func asGenDeclWithValueSpecs(n ast.Node) *ast.GenDecl {
return genDecl
}
-func hasIntersection(a, b ast.Node) bool {
- return len(nodeIdentIntersection(a, b)) > 0
+func (w *WSL) hasIntersection(a, b ast.Node) bool {
+ return len(w.nodeIdentIntersection(a, b)) > 0
}
-func nodeIdentIntersection(a, b ast.Node) []*ast.Ident {
- aI := identsFromNode(a, true)
- bI := identsFromNode(b, true)
+func (w *WSL) nodeIdentIntersection(a, b ast.Node) []*ast.Ident {
+ aI := w.identsFromNode(a, true)
+ bI := w.identsFromNode(b, true)
return identIntersection(aI, bI)
}
@@ -1247,7 +1328,31 @@ func identIntersection(a, b []*ast.Ident) []*ast.Ident {
return intersects
}
-func identsFromNode(node ast.Node, skipBlock bool) []*ast.Ident {
+func isTypeOrPredeclConst(obj types.Object) bool {
+ switch o := obj.(type) {
+ case *types.TypeName:
+ // Covers predeclared types ("string", "int", ...) and user types.
+ return true
+ case *types.Const:
+ // true/false/iota are universe consts.
+ return o.Parent() == types.Universe
+ case *types.Nil:
+ return true
+ case *types.PkgName:
+ // Skip package qualifiers like "fmt" in fmt.Println
+ return true
+ default:
+ return false
+ }
+}
+
+// identsFromNode returns all *ast.Ident in a node except:
+// - type names (types.TypeName)
+// - builtin constants from the universe (true, false, iota)
+// - nil (*types.Nil)
+// - package names (types.PkgName)
+// - the blank identifier "_"
+func (w *WSL) identsFromNode(node ast.Node, skipBlock bool) []*ast.Ident {
var (
idents []*ast.Ident
seen = map[string]struct{}{}
@@ -1257,6 +1362,24 @@ func identsFromNode(node ast.Node, skipBlock bool) []*ast.Ident {
return idents
}
+ addIdent := func(ident *ast.Ident) {
+ if ident == nil {
+ return
+ }
+
+ name := ident.Name
+ if name == "" || name == "_" {
+ return
+ }
+
+ if _, ok := seen[name]; ok {
+ return
+ }
+
+ idents = append(idents, ident)
+ seen[name] = struct{}{}
+ }
+
ast.Inspect(node, func(n ast.Node) bool {
if skipBlock {
if _, ok := n.(*ast.BlockStmt); ok {
@@ -1264,27 +1387,45 @@ func identsFromNode(node ast.Node, skipBlock bool) []*ast.Ident {
}
}
- if ident, ok := n.(*ast.Ident); ok {
- if _, exists := seen[ident.Name]; !exists {
- idents = append(idents, ident)
- seen[ident.Name] = struct{}{}
- }
+ ident, ok := n.(*ast.Ident)
+ if !ok {
+ return true
}
+ // Prefer Uses over Defs; fall back to Defs if not a use site.
+ var typesObject types.Object
+ if obj := w.typeInfo.Uses[ident]; obj != nil {
+ typesObject = obj
+ } else if obj := w.typeInfo.Defs[ident]; obj != nil {
+ typesObject = obj
+ }
+
+ // Unresolved (could be a build-tag or syntax artifact). Keep it.
+ if typesObject == nil {
+ addIdent(ident)
+ return true
+ }
+
+ if isTypeOrPredeclConst(typesObject) {
+ return true
+ }
+
+ addIdent(ident)
+
return true
})
return idents
}
-func identsFromCaseArms(node ast.Node) []*ast.Ident {
+func (w *WSL) identsFromCaseArms(node ast.Node) []*ast.Ident {
var (
idents []*ast.Ident
nodes []ast.Stmt
seen = map[string]struct{}{}
addUnseen = func(node ast.Node) {
- for _, ident := range identsFromNode(node, true) {
+ for _, ident := range w.identsFromNode(node, true) {
if _, ok := seen[ident.Name]; ok {
continue
}
diff --git a/hack/tools/vendor/github.com/catenacyber/perfsprint/analyzer/analyzer.go b/hack/tools/vendor/github.com/catenacyber/perfsprint/analyzer/analyzer.go
index c40e84d41c..c44104f5f9 100644
--- a/hack/tools/vendor/github.com/catenacyber/perfsprint/analyzer/analyzer.go
+++ b/hack/tools/vendor/github.com/catenacyber/perfsprint/analyzer/analyzer.go
@@ -1,7 +1,9 @@
+// Package analyzer provides a static analysis tool that checks that fmt.Sprintf can be replaced with a faster alternative.
package analyzer
import (
"bytes"
+ "fmt"
"go/ast"
"go/format"
"go/token"
@@ -33,13 +35,20 @@ type optionStr struct {
strconcat bool
}
+type optionConcatLoop struct {
+ enabled bool
+ otherOps bool
+}
+
type perfSprint struct {
- intFormat optionInt
- errFormat optionErr
- strFormat optionStr
+ intFormat optionInt
+ errFormat optionErr
+ strFormat optionStr
+ concatLoop optionConcatLoop
boolFormat bool
hexFormat bool
+
fiximports bool
}
@@ -48,6 +57,7 @@ func newPerfSprint() *perfSprint {
intFormat: optionInt{enabled: true, intConv: true},
errFormat: optionErr{enabled: true, errError: false, errorf: true},
strFormat: optionStr{enabled: true, sprintf1: true, strconcat: true},
+ concatLoop: optionConcatLoop{enabled: true, otherOps: false},
boolFormat: true,
hexFormat: true,
fiximports: true,
@@ -65,6 +75,8 @@ const (
checkerBoolFormat = "bool-format"
// checkerHexFormat checks for hexadecimal formatting.
checkerHexFormat = "hex-format"
+ // checkerConcatLoop checks for concatenation in loop.
+ checkerConcatLoop = "concat-loop"
// checkerFixImports fix needed imports from other fixes.
checkerFixImports = "fiximports"
)
@@ -87,6 +99,8 @@ func New() *analysis.Analyzer {
r.Flags.BoolVar(&n.boolFormat, checkerBoolFormat, n.boolFormat, "enable/disable optimization of bool formatting")
r.Flags.BoolVar(&n.hexFormat, checkerHexFormat, n.hexFormat, "enable/disable optimization of hex formatting")
+ r.Flags.BoolVar(&n.concatLoop.enabled, checkerConcatLoop, n.concatLoop.enabled, "enable/disable optimization of concat loop")
+ r.Flags.BoolVar(&n.concatLoop.otherOps, "loop-other-ops", n.concatLoop.otherOps, "optimization of concat loop even with other operations")
r.Flags.BoolVar(&n.strFormat.enabled, checkerStringFormat, n.strFormat.enabled, "enable/disable optimization of string formatting")
r.Flags.BoolVar(&n.strFormat.sprintf1, "sprintf1", n.strFormat.sprintf1, "optimizes fmt.Sprintf with only one argument")
r.Flags.BoolVar(&n.strFormat.strconcat, "strconcat", n.strFormat.strconcat, "optimizes into strings concatenation")
@@ -105,7 +119,347 @@ func isConcatable(verb string) bool {
if strings.Count(verb, "%[1]s") > 1 {
return false
}
- return (hasPrefix || hasSuffix) && !(hasPrefix && hasSuffix)
+ // TODO handle case hasPrefix and hasSuffix
+ return (hasPrefix || hasSuffix) && !(hasPrefix && hasSuffix) //nolint:staticcheck
+}
+
+func isStringAdd(st *ast.AssignStmt, idname string) ast.Expr {
+ // right is one
+ if len(st.Rhs) == 1 {
+ // right is addition
+ add, ok := st.Rhs[0].(*ast.BinaryExpr)
+ if ok && add.Op == token.ADD {
+ // right is addition to same ident name
+ x, ok := add.X.(*ast.Ident)
+ if ok && x.Name == idname {
+ return add.Y
+ }
+ }
+ }
+ return nil
+}
+
+func (n *perfSprint) reportConcatLoop(pass *analysis.Pass, neededPackages map[string]map[string]struct{}, node ast.Node, adds map[string][]*ast.AssignStmt) *analysis.Diagnostic {
+ fname := pass.Fset.File(node.Pos()).Name()
+ if _, ok := neededPackages[fname]; !ok {
+ neededPackages[fname] = make(map[string]struct{})
+ }
+ // note that we will need strings package
+ neededPackages[fname]["strings"] = struct{}{}
+
+ // sort for reproducibility
+ keys := make([]string, 0, len(adds))
+ for k := range adds {
+ keys = append(keys, k)
+ }
+ sort.Strings(keys)
+
+ // use line number to define a unique variable name for the strings Builder
+ loopStartLine := pass.Fset.Position(node.Pos()).Line
+
+ // If the loop does more with the string than concatenations
+ // add a TODO/FIXME comment that the fix is likely incomplete/incorrect
+ addTODO := ""
+ ast.Inspect(node, func(n ast.Node) bool {
+ if len(addTODO) > 0 {
+ // already found one, stop recursing
+ return false
+ }
+ switch x := n.(type) {
+ case *ast.AssignStmt:
+ // skip if this is one string concatenation that we are fixing
+ if (x.Tok == token.ASSIGN || x.Tok == token.ADD_ASSIGN) && len(x.Lhs) == 1 {
+ id, ok := x.Lhs[0].(*ast.Ident)
+ if ok {
+ _, ok = adds[id.Name]
+ if ok {
+ if x.Tok == token.ASSIGN && isStringAdd(x, id.Name) == nil {
+ addTODO = id.Name
+ }
+ return false
+ }
+ }
+ }
+ case *ast.Ident:
+ _, ok := adds[x.Name]
+ if ok {
+ // The variable name is used in some place else
+ addTODO = x.Name
+ return false
+ }
+ }
+ return true
+ })
+
+ prefix := ""
+ suffix := ""
+ if len(addTODO) > 0 {
+ if !n.concatLoop.otherOps {
+ return nil
+ }
+ prefix = fmt.Sprintf("// FIXME check usages of string identifier %s (and mayber others) in loop\n", addTODO)
+ }
+ // The fix contains 3 parts
+ // before the loop: declare the strings Builders
+ // during the loop: replace concatenation with Builder.WriteString
+ // after the loop: use the Builder.String to append to the pre-existing string
+ var prefixSb203 strings.Builder
+ var suffixSb203 strings.Builder
+ for _, k := range keys {
+ // lol
+ prefixSb203.WriteString(fmt.Sprintf("var %sSb%d strings.Builder\n", k, loopStartLine))
+ suffixSb203.WriteString(fmt.Sprintf("\n%s += %sSb%d.String()", k, k, loopStartLine))
+ }
+ prefix += prefixSb203.String()
+ suffix += suffixSb203.String()
+ te := []analysis.TextEdit{
+ {
+ Pos: node.Pos(),
+ End: node.Pos(),
+ NewText: []byte(prefix),
+ },
+ }
+ for _, k := range keys {
+ v := adds[k]
+ for _, st := range v {
+ // s += "x" -> use "x"
+ added := st.Rhs[0]
+ if st.Tok == token.ASSIGN {
+ // s = s + "x" -> use just "x", not `s + "x"`
+ added = isStringAdd(st, k)
+ }
+ te = append(te, analysis.TextEdit{
+ Pos: st.Pos(),
+ End: added.Pos(),
+ NewText: []byte(fmt.Sprintf("%sSb%d.WriteString(", k, loopStartLine)),
+ })
+ te = append(te, analysis.TextEdit{
+ Pos: added.End(),
+ End: added.End(),
+ NewText: []byte(")"),
+ })
+ }
+ }
+ te = append(te, analysis.TextEdit{
+ Pos: node.End(),
+ End: node.End(),
+ NewText: []byte(suffix),
+ })
+
+ return newAnalysisDiagnostic(
+ checkerConcatLoop,
+ adds[keys[0]][0],
+ "string concatenation in a loop",
+ []analysis.SuggestedFix{
+ {
+ Message: "Use a strings.Builder",
+ TextEdits: te,
+ },
+ },
+ )
+}
+
+func (n *perfSprint) runConcatLoop(pass *analysis.Pass, neededPackages map[string]map[string]struct{}) {
+ insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+ // 2 different kinds of loops in go
+ nodeFilter := []ast.Node{
+ (*ast.RangeStmt)(nil),
+ (*ast.ForStmt)(nil),
+ }
+ insp.Preorder(nodeFilter, func(node ast.Node) {
+ // set of variable names declared insied the loop
+ declInLoop := make(map[string]bool)
+ var bl []ast.Stmt
+ // just take the list of instruction of the loop
+ switch ra := node.(type) {
+ case *ast.RangeStmt:
+ bl = ra.Body.List
+ case *ast.ForStmt:
+ bl = ra.Body.List
+ }
+ // set of results : mapping a variable name to a list of statements like `s +=`
+ // one loop may be bad for multiple string variables,
+ // each being concatenated in multiple statements
+ adds := make(map[string][]*ast.AssignStmt)
+ for bs := 0; bs < len(bl); bs++ {
+ switch st := bl[bs].(type) {
+ case *ast.IfStmt:
+ // explore breadth first, but go inside the if/else blocks
+ if st.Body != nil {
+ bl = append(bl, st.Body.List...)
+ }
+ el, ok := st.Else.(*ast.BlockStmt)
+ if ok && el != nil {
+ bl = append(bl, el.List...)
+ }
+ case *ast.DeclStmt:
+ // identifiers defined within loop do not count
+ de, ok := st.Decl.(*ast.GenDecl)
+ if !ok {
+ break
+ }
+ if len(de.Specs) != 1 {
+ break
+ }
+ // is it possible to have len(de.Specs) > 1 for ValueSpec ?
+ vs, ok := de.Specs[0].(*ast.ValueSpec)
+ if !ok {
+ break
+ }
+ for n := range vs.Names {
+ declInLoop[vs.Names[n].Name] = true
+ }
+ case *ast.AssignStmt:
+ for n := range st.Lhs {
+ id, ok := st.Lhs[n].(*ast.Ident)
+ if !ok {
+ break
+ }
+ switch st.Tok {
+ case token.DEFINE:
+ declInLoop[id.Name] = true
+ case token.ASSIGN, token.ADD_ASSIGN:
+ if n > 0 {
+ // do not search bugs for multi-assign
+ break
+ }
+ _, local := declInLoop[id.Name]
+ if local {
+ break
+ }
+ ti, ok := pass.TypesInfo.Types[id]
+ if !ok || ti.Type.String() != "string" {
+ break
+ }
+ if st.Tok == token.ASSIGN {
+ if isStringAdd(st, id.Name) == nil {
+ break
+ }
+ }
+ // found a bad string concat in the loop
+ adds[id.Name] = append(adds[id.Name], st)
+ }
+ }
+ }
+ }
+ if len(adds) > 0 {
+ d := n.reportConcatLoop(pass, neededPackages, node, adds)
+ if d != nil {
+ pass.Report(*d)
+ }
+ }
+ })
+}
+
+func (n *perfSprint) fixImports(pass *analysis.Pass, neededPackages map[string]map[string]struct{}, removedFmtUsages map[string]int) {
+ if !n.fiximports {
+ return
+ }
+ for _, pkg := range pass.Pkg.Imports() {
+ if pkg.Path() == "fmt" {
+ insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+ nodeFilter := []ast.Node{
+ (*ast.SelectorExpr)(nil),
+ }
+ insp.Preorder(nodeFilter, func(node ast.Node) {
+ selec := node.(*ast.SelectorExpr)
+ selecok, ok := selec.X.(*ast.Ident)
+ if ok {
+ pkgname, ok := pass.TypesInfo.ObjectOf(selecok).(*types.PkgName)
+ if ok && pkgname.Name() == pkg.Name() {
+ fname := pass.Fset.File(pkgname.Pos()).Name()
+ removedFmtUsages[fname]--
+ }
+ }
+ })
+ } else if pkg.Path() == "errors" || pkg.Path() == "strconv" || pkg.Path() == "encoding/hex" || pkg.Path() == "strings" {
+ insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+ nodeFilter := []ast.Node{
+ (*ast.ImportSpec)(nil),
+ }
+ insp.Preorder(nodeFilter, func(node ast.Node) {
+ gd := node.(*ast.ImportSpec)
+ if gd.Path.Value == strconv.Quote(pkg.Path()) {
+ fname := pass.Fset.File(gd.Pos()).Name()
+ if _, ok := neededPackages[fname]; ok {
+ delete(neededPackages[fname], pkg.Path())
+ }
+ }
+ })
+ }
+ }
+ insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+ nodeFilter := []ast.Node{
+ (*ast.File)(nil),
+ }
+ insp.Preorder(nodeFilter, func(node ast.Node) {
+ gd := node.(*ast.File)
+ fname := pass.Fset.File(gd.Pos()).Name()
+ removed, hasFmt := removedFmtUsages[fname]
+ if (!hasFmt || removed < 0) && len(neededPackages[fname]) == 0 {
+ return
+ }
+ fix := ""
+ var ar analysis.Range
+ ar = gd.Decls[0]
+ start := gd.Decls[0].Pos()
+ end := gd.Decls[0].Pos()
+ if len(gd.Imports) == 0 {
+ fix += "import (\n"
+ } else {
+ id := gd.Decls[0].(*ast.GenDecl)
+ start = id.Specs[0].Pos()
+ end = id.Specs[0].Pos()
+ if removedFmtUsages[fname] >= 0 {
+ for sp := range id.Specs {
+ is := id.Specs[sp].(*ast.ImportSpec)
+ if is.Path.Value == strconv.Quote("fmt") {
+ ar = is
+ start = is.Pos()
+ end = is.End()
+ break
+ }
+ }
+ }
+ }
+ keys := make([]string, 0, len(neededPackages[fname]))
+ for k := range neededPackages[fname] {
+ keys = append(keys, k)
+ }
+ sort.Strings(keys)
+ for _, k := range keys {
+ already := false
+ knames := strings.Split(k, "/")
+ kname := knames[len(knames)-1]
+ for i := range gd.Imports { // quadratic
+ if (gd.Imports[i].Name != nil && gd.Imports[i].Name.Name == kname) || (gd.Imports[i].Name == nil && strings.HasSuffix(gd.Imports[i].Path.Value, "/"+kname+`"`)) {
+ already = true
+ }
+ }
+ if already {
+ fix = fix + "\t\"" + k + "\" //TODO FIXME\n"
+ } else {
+ fix = fix + "\t\"" + k + "\"\n"
+ }
+ }
+ if len(gd.Imports) == 0 {
+ fix += ")\n"
+ }
+ pass.Report(*newAnalysisDiagnostic(
+ checkerFixImports,
+ ar,
+ "Fix imports",
+ []analysis.SuggestedFix{
+ {
+ Message: "Fix imports",
+ TextEdits: []analysis.TextEdit{{
+ Pos: start,
+ End: end,
+ NewText: []byte(fix),
+ }},
+ },
+ }))
+ })
}
func (n *perfSprint) run(pass *analysis.Pass) (interface{}, error) {
@@ -121,6 +475,11 @@ func (n *perfSprint) run(pass *analysis.Pass) (interface{}, error) {
n.strFormat.strconcat = false
}
+ neededPackages := make(map[string]map[string]struct{})
+ if n.concatLoop.enabled {
+ n.runConcatLoop(pass, neededPackages)
+ }
+ removedFmtUsages := make(map[string]int)
var fmtSprintObj, fmtSprintfObj, fmtErrorfObj types.Object
for _, pkg := range pass.Pkg.Imports() {
if pkg.Path() == "fmt" {
@@ -130,10 +489,11 @@ func (n *perfSprint) run(pass *analysis.Pass) (interface{}, error) {
}
}
if fmtSprintfObj == nil && fmtSprintObj == nil && fmtErrorfObj == nil {
+ if len(neededPackages) > 0 {
+ n.fixImports(pass, neededPackages, removedFmtUsages)
+ }
return nil, nil
}
- removedFmtUsages := make(map[string]int)
- neededPackages := make(map[string]map[string]struct{})
insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
nodeFilter := []ast.Node{
@@ -530,79 +890,8 @@ func (n *perfSprint) run(pass *analysis.Pass) (interface{}, error) {
}
})
- if len(removedFmtUsages) > 0 && n.fiximports {
- for _, pkg := range pass.Pkg.Imports() {
- if pkg.Path() == "fmt" {
- insp = pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
- nodeFilter = []ast.Node{
- (*ast.SelectorExpr)(nil),
- }
- insp.Preorder(nodeFilter, func(node ast.Node) {
- selec := node.(*ast.SelectorExpr)
- selecok, ok := selec.X.(*ast.Ident)
- if ok {
- pkgname, ok := pass.TypesInfo.ObjectOf(selecok).(*types.PkgName)
- if ok && pkgname.Name() == pkg.Name() {
- fname := pass.Fset.File(pkgname.Pos()).Name()
- removedFmtUsages[fname]--
- }
- }
- })
- } else if pkg.Path() == "errors" || pkg.Path() == "strconv" || pkg.Path() == "encoding/hex" {
- insp = pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
- nodeFilter = []ast.Node{
- (*ast.ImportSpec)(nil),
- }
- insp.Preorder(nodeFilter, func(node ast.Node) {
- gd := node.(*ast.ImportSpec)
- if gd.Path.Value == strconv.Quote(pkg.Path()) {
- fname := pass.Fset.File(gd.Pos()).Name()
- if _, ok := neededPackages[fname]; ok {
- delete(neededPackages[fname], pkg.Path())
- }
- }
- })
- }
- }
- insp = pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
- nodeFilter = []ast.Node{
- (*ast.ImportSpec)(nil),
- }
- insp.Preorder(nodeFilter, func(node ast.Node) {
- gd := node.(*ast.ImportSpec)
- if gd.Path.Value == `"fmt"` {
- fix := ""
- fname := pass.Fset.File(gd.Pos()).Name()
- if removedFmtUsages[fname] < 0 {
- fix += `"fmt"`
- if len(neededPackages[fname]) == 0 {
- return
- }
- }
- keys := make([]string, 0, len(neededPackages[fname]))
- for k := range neededPackages[fname] {
- keys = append(keys, k)
- }
- sort.Strings(keys)
- for _, k := range keys {
- fix = fix + "\n\t\"" + k + `"`
- }
- pass.Report(*newAnalysisDiagnostic(
- checkerFixImports,
- gd,
- "Fix imports",
- []analysis.SuggestedFix{
- {
- Message: "Fix imports",
- TextEdits: []analysis.TextEdit{{
- Pos: gd.Pos(),
- End: gd.End(),
- NewText: []byte(fix),
- }},
- },
- }))
- }
- })
+ if len(removedFmtUsages) > 0 || len(neededPackages) > 0 {
+ n.fixImports(pass, neededPackages, removedFmtUsages)
}
return nil, nil
diff --git a/hack/tools/vendor/github.com/charithe/durationcheck/README.md b/hack/tools/vendor/github.com/charithe/durationcheck/README.md
index 6f4279bd38..4aa9558f2b 100644
--- a/hack/tools/vendor/github.com/charithe/durationcheck/README.md
+++ b/hack/tools/vendor/github.com/charithe/durationcheck/README.md
@@ -33,7 +33,7 @@ See the [test cases](testdata/src/a/a.go) for more examples of the types of erro
Installation
-------------
-Requires Go 1.11 or above.
+Requires Go 1.14 or above.
```
go get -u github.com/charithe/durationcheck/cmd/durationcheck
diff --git a/hack/tools/vendor/github.com/charithe/durationcheck/durationcheck.go b/hack/tools/vendor/github.com/charithe/durationcheck/durationcheck.go
index c47b3a7613..5fcb98a890 100644
--- a/hack/tools/vendor/github.com/charithe/durationcheck/durationcheck.go
+++ b/hack/tools/vendor/github.com/charithe/durationcheck/durationcheck.go
@@ -32,6 +32,7 @@ func run(pass *analysis.Pass) (interface{}, error) {
nodeTypes := []ast.Node{
(*ast.BinaryExpr)(nil),
+ (*ast.AssignStmt)(nil),
}
inspect.Preorder(nodeTypes, check(pass))
@@ -52,25 +53,45 @@ func hasImport(pkg *types.Package, importPath string) bool {
// check contains the logic for checking that time.Duration is used correctly in the code being analysed
func check(pass *analysis.Pass) func(ast.Node) {
return func(node ast.Node) {
- expr := node.(*ast.BinaryExpr)
- // we are only interested in multiplication
- if expr.Op != token.MUL {
- return
+ switch expr := node.(type) {
+ case *ast.BinaryExpr:
+ checkBinaryExpr(pass, expr)
+ case *ast.AssignStmt:
+ if expr.Tok != token.MUL_ASSIGN {
+ return
+ }
+ // '*=' assignment requires single-valued expressions
+ if len(expr.Lhs) != 1 || len(expr.Rhs) != 1 {
+ return
+ }
+ checkBinaryExpr(pass, &ast.BinaryExpr{
+ X: expr.Lhs[0],
+ OpPos: expr.TokPos,
+ Op: expr.Tok,
+ Y: expr.Rhs[0],
+ })
}
+ }
+}
- // get the types of the two operands
- x, xOK := pass.TypesInfo.Types[expr.X]
- y, yOK := pass.TypesInfo.Types[expr.Y]
+func checkBinaryExpr(pass *analysis.Pass, expr *ast.BinaryExpr) {
+ // we are only interested in multiplication
+ if expr.Op != token.MUL && expr.Op != token.MUL_ASSIGN {
+ return
+ }
- if !xOK || !yOK {
- return
- }
+ // get the types of the two operands
+ x, xOK := pass.TypesInfo.Types[expr.X]
+ y, yOK := pass.TypesInfo.Types[expr.Y]
- if isDuration(x.Type) && isDuration(y.Type) {
- // check that both sides are acceptable expressions
- if isUnacceptableExpr(pass, expr.X) && isUnacceptableExpr(pass, expr.Y) {
- pass.Reportf(expr.Pos(), "Multiplication of durations: `%s`", formatNode(expr))
- }
+ if !xOK || !yOK {
+ return
+ }
+
+ if isDuration(x.Type) && isDuration(y.Type) {
+ // check that both sides are acceptable expressions
+ if isUnacceptableExpr(pass, expr.X) && isUnacceptableExpr(pass, expr.Y) {
+ pass.Reportf(expr.Pos(), "Multiplication of durations: `%s`", formatNode(expr))
}
}
}
diff --git a/hack/tools/vendor/github.com/clipperhouse/stringish/.gitignore b/hack/tools/vendor/github.com/clipperhouse/stringish/.gitignore
new file mode 100644
index 0000000000..12fbfb739b
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/stringish/.gitignore
@@ -0,0 +1,2 @@
+.DS_Store
+*.test
diff --git a/hack/tools/vendor/github.com/clipperhouse/stringish/LICENSE b/hack/tools/vendor/github.com/clipperhouse/stringish/LICENSE
new file mode 100644
index 0000000000..4b8064eb37
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/stringish/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Matt Sherman
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/hack/tools/vendor/github.com/clipperhouse/stringish/README.md b/hack/tools/vendor/github.com/clipperhouse/stringish/README.md
new file mode 100644
index 0000000000..fa1f7cc672
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/stringish/README.md
@@ -0,0 +1,64 @@
+# stringish
+
+A small Go module that provides a generic type constraint for “string-like”
+data, and a utf8 package that works with both strings and byte slices
+without conversions.
+
+```go
+type Interface interface {
+ ~[]byte | ~string
+}
+```
+
+[](https://pkg.go.dev/github.com/clipperhouse/stringish/utf8)
+[](https://github.com/clipperhouse/stringish/actions/workflows/gotest.yml)
+
+## Install
+
+```
+go get github.com/clipperhouse/stringish
+```
+
+## Examples
+
+```go
+import (
+ "github.com/clipperhouse/stringish"
+ "github.com/clipperhouse/stringish/utf8"
+)
+
+s := "Hello, 世界"
+r, size := utf8.DecodeRune(s) // not DecodeRuneInString 🎉
+
+b := []byte("Hello, 世界")
+r, size = utf8.DecodeRune(b) // same API!
+
+func MyFoo[T stringish.Interface](s T) T {
+ // pass a string or a []byte
+ // iterate, slice, transform, whatever
+}
+```
+
+## Motivation
+
+Sometimes we want APIs to accept `string` or `[]byte` without having to convert
+between those types. That conversion usually allocates!
+
+By implementing with `stringish.Interface`, we can have a single API, and
+single implementation for both types: one `Foo` instead of `Foo` and
+`FooString`.
+
+We have converted the
+[`unicode/utf8` package](https://github.com/clipperhouse/stringish/blob/main/utf8/utf8.go)
+as an example -- note the absence of`*InString` funcs. We might look at `x/text`
+next.
+
+## Used by
+
+- clipperhouse/uax29: [stringish trie](https://github.com/clipperhouse/uax29/blob/master/graphemes/trie.go#L27), [stringish iterator](https://github.com/clipperhouse/uax29/blob/master/internal/iterators/iterator.go#L9), [stringish SplitFunc](https://github.com/clipperhouse/uax29/blob/master/graphemes/splitfunc.go#L21)
+
+- [clipperhouse/displaywidth](https://github.com/clipperhouse/displaywidth)
+
+## Prior discussion
+
+- [Consideration of similar by the Go team](https://github.com/golang/go/issues/48643)
diff --git a/hack/tools/vendor/github.com/clipperhouse/stringish/interface.go b/hack/tools/vendor/github.com/clipperhouse/stringish/interface.go
new file mode 100644
index 0000000000..adfeab61eb
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/stringish/interface.go
@@ -0,0 +1,5 @@
+package stringish
+
+type Interface interface {
+ ~[]byte | ~string
+}
diff --git a/hack/tools/vendor/github.com/clipperhouse/uax29/v2/LICENSE b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/LICENSE
new file mode 100644
index 0000000000..6ae86a9a19
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Matt Sherman
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/README.md b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/README.md
new file mode 100644
index 0000000000..dc14d11e2f
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/README.md
@@ -0,0 +1,94 @@
+An implementation of grapheme cluster boundaries from [Unicode text segmentation](https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries) (UAX 29), for Unicode version 15.0.0.
+
+[](https://pkg.go.dev/github.com/clipperhouse/uax29/v2/graphemes)
+
+
+
+## Quick start
+
+```
+go get "github.com/clipperhouse/uax29/v2/graphemes"
+```
+
+```go
+import "github.com/clipperhouse/uax29/v2/graphemes"
+
+text := "Hello, 世界. Nice dog! 👍🐶"
+
+tokens := graphemes.FromString(text)
+
+for tokens.Next() { // Next() returns true until end of data
+ fmt.Println(tokens.Value()) // Do something with the current grapheme
+}
+```
+
+_A grapheme is a “single visible character”, which might be a simple as a single letter, or a complex emoji that consists of several Unicode code points._
+
+## Conformance
+
+We use the Unicode [test suite](https://unicode.org/reports/tr41/tr41-26.html#Tests29).
+
+
+
+
+## APIs
+
+### If you have a `string`
+
+```go
+text := "Hello, 世界. Nice dog! 👍🐶"
+
+tokens := graphemes.FromString(text)
+
+for tokens.Next() { // Next() returns true until end of data
+ fmt.Println(tokens.Value()) // Do something with the current grapheme
+}
+```
+
+### If you have an `io.Reader`
+
+`FromReader` embeds a [`bufio.Scanner`](https://pkg.go.dev/bufio#Scanner), so just use those methods.
+
+```go
+r := getYourReader() // from a file or network maybe
+tokens := graphemes.FromReader(r)
+
+for tokens.Scan() { // Scan() returns true until error or EOF
+ fmt.Println(tokens.Text()) // Do something with the current grapheme
+}
+
+if tokens.Err() != nil { // Check the error
+ log.Fatal(tokens.Err())
+}
+```
+
+### If you have a `[]byte`
+
+```go
+b := []byte("Hello, 世界. Nice dog! 👍🐶")
+
+tokens := graphemes.FromBytes(b)
+
+for tokens.Next() { // Next() returns true until end of data
+ fmt.Println(tokens.Value()) // Do something with the current grapheme
+}
+```
+
+### Benchmarks
+
+On a Mac M2 laptop, we see around 200MB/s, or around 100 million graphemes per second, and no allocations.
+
+```
+goos: darwin
+goarch: arm64
+pkg: github.com/clipperhouse/uax29/graphemes/comparative
+cpu: Apple M2
+BenchmarkGraphemes/clipperhouse/uax29-8 173805 ns/op 201.16 MB/s 0 B/op 0 allocs/op
+BenchmarkGraphemes/rivo/uniseg-8 2045128 ns/op 17.10 MB/s 0 B/op 0 allocs/op
+```
+
+### Invalid inputs
+
+Invalid UTF-8 input is considered undefined behavior. We test to ensure that bad inputs will not cause pathological outcomes, such as a panic or infinite loop. Callers should expect “garbage-in, garbage-out”.
+
+Your pipeline should probably include a call to [`utf8.Valid()`](https://pkg.go.dev/unicode/utf8#Valid).
diff --git a/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/iterator.go b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/iterator.go
new file mode 100644
index 0000000000..1eaaa534ce
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/iterator.go
@@ -0,0 +1,31 @@
+package graphemes
+
+import (
+ "github.com/clipperhouse/stringish"
+ "github.com/clipperhouse/uax29/v2/internal/iterators"
+)
+
+type Iterator[T stringish.Interface] struct {
+ *iterators.Iterator[T]
+}
+
+var (
+ splitFuncString = splitFunc[string]
+ splitFuncBytes = splitFunc[[]byte]
+)
+
+// FromString returns an iterator for the grapheme clusters in the input string.
+// Iterate while Next() is true, and access the grapheme via Value().
+func FromString(s string) Iterator[string] {
+ return Iterator[string]{
+ iterators.New(splitFuncString, s),
+ }
+}
+
+// FromBytes returns an iterator for the grapheme clusters in the input bytes.
+// Iterate while Next() is true, and access the grapheme via Value().
+func FromBytes(b []byte) Iterator[[]byte] {
+ return Iterator[[]byte]{
+ iterators.New(splitFuncBytes, b),
+ }
+}
diff --git a/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/reader.go b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/reader.go
new file mode 100644
index 0000000000..9aa0066183
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/reader.go
@@ -0,0 +1,25 @@
+// Package graphemes implements Unicode grapheme cluster boundaries: https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries
+package graphemes
+
+import (
+ "bufio"
+ "io"
+)
+
+type Scanner struct {
+ *bufio.Scanner
+}
+
+// FromReader returns a Scanner, to split graphemes per
+// https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries.
+//
+// It embeds a [bufio.Scanner], so you can use its methods.
+//
+// Iterate through graphemes by calling Scan() until false, then check Err().
+func FromReader(r io.Reader) *Scanner {
+ sc := bufio.NewScanner(r)
+ sc.Split(SplitFunc)
+ return &Scanner{
+ Scanner: sc,
+ }
+}
diff --git a/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/splitfunc.go b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/splitfunc.go
new file mode 100644
index 0000000000..cbe1ec9ef1
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/splitfunc.go
@@ -0,0 +1,174 @@
+package graphemes
+
+import (
+ "bufio"
+
+ "github.com/clipperhouse/stringish"
+)
+
+// is determines if lookup intersects propert(ies)
+func (lookup property) is(properties property) bool {
+ return (lookup & properties) != 0
+}
+
+const _Ignore = _Extend
+
+// SplitFunc is a bufio.SplitFunc implementation of Unicode grapheme cluster segmentation, for use with bufio.Scanner.
+//
+// See https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries.
+var SplitFunc bufio.SplitFunc = splitFunc[[]byte]
+
+func splitFunc[T stringish.Interface](data T, atEOF bool) (advance int, token T, err error) {
+ var empty T
+ if len(data) == 0 {
+ return 0, empty, nil
+ }
+
+ // These vars are stateful across loop iterations
+ var pos int
+ var lastExIgnore property = 0 // "last excluding ignored categories"
+ var lastLastExIgnore property = 0 // "last one before that"
+ var regionalIndicatorCount int
+
+ // Rules are usually of the form Cat1 × Cat2; "current" refers to the first property
+ // to the right of the ×, from which we look back or forward
+
+ current, w := lookup(data[pos:])
+ if w == 0 {
+ if !atEOF {
+ // Rune extends past current data, request more
+ return 0, empty, nil
+ }
+ pos = len(data)
+ return pos, data[:pos], nil
+ }
+
+ // https://unicode.org/reports/tr29/#GB1
+ // Start of text always advances
+ pos += w
+
+ for {
+ eot := pos == len(data) // "end of text"
+
+ if eot {
+ if !atEOF {
+ // Token extends past current data, request more
+ return 0, empty, nil
+ }
+
+ // https://unicode.org/reports/tr29/#GB2
+ break
+ }
+
+ /*
+ We've switched the evaluation order of GB1↓ and GB2↑. It's ok:
+ because we've checked for len(data) at the top of this function,
+ sot and eot are mutually exclusive, order doesn't matter.
+ */
+
+ // Rules are usually of the form Cat1 × Cat2; "current" refers to the first property
+ // to the right of the ×, from which we look back or forward
+
+ // Remember previous properties to avoid lookups/lookbacks
+ last := current
+ if !last.is(_Ignore) {
+ lastLastExIgnore = lastExIgnore
+ lastExIgnore = last
+ }
+
+ current, w = lookup(data[pos:])
+ if w == 0 {
+ if atEOF {
+ // Just return the bytes, we can't do anything with them
+ pos = len(data)
+ break
+ }
+ // Rune extends past current data, request more
+ return 0, empty, nil
+ }
+
+ // Optimization: no rule can possibly apply
+ if current|last == 0 { // i.e. both are zero
+ break
+ }
+
+ // https://unicode.org/reports/tr29/#GB3
+ if current.is(_LF) && last.is(_CR) {
+ pos += w
+ continue
+ }
+
+ // https://unicode.org/reports/tr29/#GB4
+ // https://unicode.org/reports/tr29/#GB5
+ if (current | last).is(_Control | _CR | _LF) {
+ break
+ }
+
+ // https://unicode.org/reports/tr29/#GB6
+ if current.is(_L|_V|_LV|_LVT) && last.is(_L) {
+ pos += w
+ continue
+ }
+
+ // https://unicode.org/reports/tr29/#GB7
+ if current.is(_V|_T) && last.is(_LV|_V) {
+ pos += w
+ continue
+ }
+
+ // https://unicode.org/reports/tr29/#GB8
+ if current.is(_T) && last.is(_LVT|_T) {
+ pos += w
+ continue
+ }
+
+ // https://unicode.org/reports/tr29/#GB9
+ if current.is(_Extend | _ZWJ) {
+ pos += w
+ continue
+ }
+
+ // https://unicode.org/reports/tr29/#GB9a
+ if current.is(_SpacingMark) {
+ pos += w
+ continue
+ }
+
+ // https://unicode.org/reports/tr29/#GB9b
+ if last.is(_Prepend) {
+ pos += w
+ continue
+ }
+
+ // https://unicode.org/reports/tr29/#GB9c
+ // TODO(clipperhouse):
+ // It appears to be added in Unicode 15.1.0:
+ // https://unicode.org/versions/Unicode15.1.0/#Migration
+ // This package currently supports Unicode 15.0.0, so
+ // out of scope for now
+
+ // https://unicode.org/reports/tr29/#GB11
+ if current.is(_ExtendedPictographic) && last.is(_ZWJ) && lastLastExIgnore.is(_ExtendedPictographic) {
+ pos += w
+ continue
+ }
+
+ // https://unicode.org/reports/tr29/#GB12
+ // https://unicode.org/reports/tr29/#GB13
+ if (current & last).is(_RegionalIndicator) {
+ regionalIndicatorCount++
+
+ odd := regionalIndicatorCount%2 == 1
+ if odd {
+ pos += w
+ continue
+ }
+ }
+
+ // If we fall through all the above rules, it's a grapheme cluster break
+ break
+ }
+
+ // Return token
+ return pos, data[:pos], nil
+}
diff --git a/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/trie.go b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/trie.go
new file mode 100644
index 0000000000..8aaabfacf0
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/graphemes/trie.go
@@ -0,0 +1,1409 @@
+package graphemes
+
+import "github.com/clipperhouse/stringish"
+
+// generated by github.com/clipperhouse/uax29/v2
+// from https://www.unicode.org/Public/15.0.0/ucd/auxiliary/GraphemeBreakProperty.txt
+
+type property uint16
+
+const (
+ _CR property = 1 << iota
+ _Control
+ _Extend
+ _ExtendedPictographic
+ _L
+ _LF
+ _LV
+ _LVT
+ _Prepend
+ _RegionalIndicator
+ _SpacingMark
+ _T
+ _V
+ _ZWJ
+)
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func lookup[T stringish.Interface](s T) (v property, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return graphemesValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := graphemesIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := graphemesIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = graphemesIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := graphemesIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = graphemesIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = graphemesIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// graphemesTrie. Total size: 29120 bytes (28.44 KiB). Checksum: 80ad0c5ab9375f7.
+// type graphemesTrie struct { }
+
+// func newGraphemesTrie(i int) *graphemesTrie {
+// return &graphemesTrie{}
+// }
+
+// lookupValue determines the type of block n and looks up the value for b.
+func lookupValue(n uint32, b byte) property {
+ switch {
+ default:
+ return property(graphemesValues[n<<6+uint32(b)])
+ }
+}
+
+// graphemesValues: 215 blocks, 13760 entries, 27520 bytes
+// The third block is the zero block.
+var graphemesValues = [13760]property{
+ // Block 0x0, offset 0x0
+ 0x00: 0x0002, 0x01: 0x0002, 0x02: 0x0002, 0x03: 0x0002, 0x04: 0x0002, 0x05: 0x0002,
+ 0x06: 0x0002, 0x07: 0x0002, 0x08: 0x0002, 0x09: 0x0002, 0x0a: 0x0020, 0x0b: 0x0002,
+ 0x0c: 0x0002, 0x0d: 0x0001, 0x0e: 0x0002, 0x0f: 0x0002, 0x10: 0x0002, 0x11: 0x0002,
+ 0x12: 0x0002, 0x13: 0x0002, 0x14: 0x0002, 0x15: 0x0002, 0x16: 0x0002, 0x17: 0x0002,
+ 0x18: 0x0002, 0x19: 0x0002, 0x1a: 0x0002, 0x1b: 0x0002, 0x1c: 0x0002, 0x1d: 0x0002,
+ 0x1e: 0x0002, 0x1f: 0x0002,
+ // Block 0x1, offset 0x40
+ 0x7f: 0x0002,
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc0: 0x0002, 0xc1: 0x0002, 0xc2: 0x0002, 0xc3: 0x0002, 0xc4: 0x0002, 0xc5: 0x0002,
+ 0xc6: 0x0002, 0xc7: 0x0002, 0xc8: 0x0002, 0xc9: 0x0002, 0xca: 0x0002, 0xcb: 0x0002,
+ 0xcc: 0x0002, 0xcd: 0x0002, 0xce: 0x0002, 0xcf: 0x0002, 0xd0: 0x0002, 0xd1: 0x0002,
+ 0xd2: 0x0002, 0xd3: 0x0002, 0xd4: 0x0002, 0xd5: 0x0002, 0xd6: 0x0002, 0xd7: 0x0002,
+ 0xd8: 0x0002, 0xd9: 0x0002, 0xda: 0x0002, 0xdb: 0x0002, 0xdc: 0x0002, 0xdd: 0x0002,
+ 0xde: 0x0002, 0xdf: 0x0002,
+ 0xe9: 0x0008,
+ 0xed: 0x0002, 0xee: 0x0008,
+ // Block 0x4, offset 0x100
+ 0x100: 0x0004, 0x101: 0x0004, 0x102: 0x0004, 0x103: 0x0004, 0x104: 0x0004, 0x105: 0x0004,
+ 0x106: 0x0004, 0x107: 0x0004, 0x108: 0x0004, 0x109: 0x0004, 0x10a: 0x0004, 0x10b: 0x0004,
+ 0x10c: 0x0004, 0x10d: 0x0004, 0x10e: 0x0004, 0x10f: 0x0004, 0x110: 0x0004, 0x111: 0x0004,
+ 0x112: 0x0004, 0x113: 0x0004, 0x114: 0x0004, 0x115: 0x0004, 0x116: 0x0004, 0x117: 0x0004,
+ 0x118: 0x0004, 0x119: 0x0004, 0x11a: 0x0004, 0x11b: 0x0004, 0x11c: 0x0004, 0x11d: 0x0004,
+ 0x11e: 0x0004, 0x11f: 0x0004, 0x120: 0x0004, 0x121: 0x0004, 0x122: 0x0004, 0x123: 0x0004,
+ 0x124: 0x0004, 0x125: 0x0004, 0x126: 0x0004, 0x127: 0x0004, 0x128: 0x0004, 0x129: 0x0004,
+ 0x12a: 0x0004, 0x12b: 0x0004, 0x12c: 0x0004, 0x12d: 0x0004, 0x12e: 0x0004, 0x12f: 0x0004,
+ 0x130: 0x0004, 0x131: 0x0004, 0x132: 0x0004, 0x133: 0x0004, 0x134: 0x0004, 0x135: 0x0004,
+ 0x136: 0x0004, 0x137: 0x0004, 0x138: 0x0004, 0x139: 0x0004, 0x13a: 0x0004, 0x13b: 0x0004,
+ 0x13c: 0x0004, 0x13d: 0x0004, 0x13e: 0x0004, 0x13f: 0x0004,
+ // Block 0x5, offset 0x140
+ 0x140: 0x0004, 0x141: 0x0004, 0x142: 0x0004, 0x143: 0x0004, 0x144: 0x0004, 0x145: 0x0004,
+ 0x146: 0x0004, 0x147: 0x0004, 0x148: 0x0004, 0x149: 0x0004, 0x14a: 0x0004, 0x14b: 0x0004,
+ 0x14c: 0x0004, 0x14d: 0x0004, 0x14e: 0x0004, 0x14f: 0x0004, 0x150: 0x0004, 0x151: 0x0004,
+ 0x152: 0x0004, 0x153: 0x0004, 0x154: 0x0004, 0x155: 0x0004, 0x156: 0x0004, 0x157: 0x0004,
+ 0x158: 0x0004, 0x159: 0x0004, 0x15a: 0x0004, 0x15b: 0x0004, 0x15c: 0x0004, 0x15d: 0x0004,
+ 0x15e: 0x0004, 0x15f: 0x0004, 0x160: 0x0004, 0x161: 0x0004, 0x162: 0x0004, 0x163: 0x0004,
+ 0x164: 0x0004, 0x165: 0x0004, 0x166: 0x0004, 0x167: 0x0004, 0x168: 0x0004, 0x169: 0x0004,
+ 0x16a: 0x0004, 0x16b: 0x0004, 0x16c: 0x0004, 0x16d: 0x0004, 0x16e: 0x0004, 0x16f: 0x0004,
+ // Block 0x6, offset 0x180
+ 0x183: 0x0004, 0x184: 0x0004, 0x185: 0x0004,
+ 0x186: 0x0004, 0x187: 0x0004, 0x188: 0x0004, 0x189: 0x0004,
+ // Block 0x7, offset 0x1c0
+ 0x1d1: 0x0004,
+ 0x1d2: 0x0004, 0x1d3: 0x0004, 0x1d4: 0x0004, 0x1d5: 0x0004, 0x1d6: 0x0004, 0x1d7: 0x0004,
+ 0x1d8: 0x0004, 0x1d9: 0x0004, 0x1da: 0x0004, 0x1db: 0x0004, 0x1dc: 0x0004, 0x1dd: 0x0004,
+ 0x1de: 0x0004, 0x1df: 0x0004, 0x1e0: 0x0004, 0x1e1: 0x0004, 0x1e2: 0x0004, 0x1e3: 0x0004,
+ 0x1e4: 0x0004, 0x1e5: 0x0004, 0x1e6: 0x0004, 0x1e7: 0x0004, 0x1e8: 0x0004, 0x1e9: 0x0004,
+ 0x1ea: 0x0004, 0x1eb: 0x0004, 0x1ec: 0x0004, 0x1ed: 0x0004, 0x1ee: 0x0004, 0x1ef: 0x0004,
+ 0x1f0: 0x0004, 0x1f1: 0x0004, 0x1f2: 0x0004, 0x1f3: 0x0004, 0x1f4: 0x0004, 0x1f5: 0x0004,
+ 0x1f6: 0x0004, 0x1f7: 0x0004, 0x1f8: 0x0004, 0x1f9: 0x0004, 0x1fa: 0x0004, 0x1fb: 0x0004,
+ 0x1fc: 0x0004, 0x1fd: 0x0004, 0x1ff: 0x0004,
+ // Block 0x8, offset 0x200
+ 0x201: 0x0004, 0x202: 0x0004, 0x204: 0x0004, 0x205: 0x0004,
+ 0x207: 0x0004,
+ // Block 0x9, offset 0x240
+ 0x240: 0x0100, 0x241: 0x0100, 0x242: 0x0100, 0x243: 0x0100, 0x244: 0x0100, 0x245: 0x0100,
+ 0x250: 0x0004, 0x251: 0x0004,
+ 0x252: 0x0004, 0x253: 0x0004, 0x254: 0x0004, 0x255: 0x0004, 0x256: 0x0004, 0x257: 0x0004,
+ 0x258: 0x0004, 0x259: 0x0004, 0x25a: 0x0004, 0x25c: 0x0002,
+ // Block 0xa, offset 0x280
+ 0x28b: 0x0004,
+ 0x28c: 0x0004, 0x28d: 0x0004, 0x28e: 0x0004, 0x28f: 0x0004, 0x290: 0x0004, 0x291: 0x0004,
+ 0x292: 0x0004, 0x293: 0x0004, 0x294: 0x0004, 0x295: 0x0004, 0x296: 0x0004, 0x297: 0x0004,
+ 0x298: 0x0004, 0x299: 0x0004, 0x29a: 0x0004, 0x29b: 0x0004, 0x29c: 0x0004, 0x29d: 0x0004,
+ 0x29e: 0x0004, 0x29f: 0x0004,
+ 0x2b0: 0x0004,
+ // Block 0xb, offset 0x2c0
+ 0x2d6: 0x0004, 0x2d7: 0x0004,
+ 0x2d8: 0x0004, 0x2d9: 0x0004, 0x2da: 0x0004, 0x2db: 0x0004, 0x2dc: 0x0004, 0x2dd: 0x0100,
+ 0x2df: 0x0004, 0x2e0: 0x0004, 0x2e1: 0x0004, 0x2e2: 0x0004, 0x2e3: 0x0004,
+ 0x2e4: 0x0004, 0x2e7: 0x0004, 0x2e8: 0x0004,
+ 0x2ea: 0x0004, 0x2eb: 0x0004, 0x2ec: 0x0004, 0x2ed: 0x0004,
+ // Block 0xc, offset 0x300
+ 0x30f: 0x0100, 0x311: 0x0004,
+ 0x330: 0x0004, 0x331: 0x0004, 0x332: 0x0004, 0x333: 0x0004, 0x334: 0x0004, 0x335: 0x0004,
+ 0x336: 0x0004, 0x337: 0x0004, 0x338: 0x0004, 0x339: 0x0004, 0x33a: 0x0004, 0x33b: 0x0004,
+ 0x33c: 0x0004, 0x33d: 0x0004, 0x33e: 0x0004, 0x33f: 0x0004,
+ // Block 0xd, offset 0x340
+ 0x340: 0x0004, 0x341: 0x0004, 0x342: 0x0004, 0x343: 0x0004, 0x344: 0x0004, 0x345: 0x0004,
+ 0x346: 0x0004, 0x347: 0x0004, 0x348: 0x0004, 0x349: 0x0004, 0x34a: 0x0004,
+ // Block 0xe, offset 0x380
+ 0x3a6: 0x0004, 0x3a7: 0x0004, 0x3a8: 0x0004, 0x3a9: 0x0004,
+ 0x3aa: 0x0004, 0x3ab: 0x0004, 0x3ac: 0x0004, 0x3ad: 0x0004, 0x3ae: 0x0004, 0x3af: 0x0004,
+ 0x3b0: 0x0004,
+ // Block 0xf, offset 0x3c0
+ 0x3eb: 0x0004, 0x3ec: 0x0004, 0x3ed: 0x0004, 0x3ee: 0x0004, 0x3ef: 0x0004,
+ 0x3f0: 0x0004, 0x3f1: 0x0004, 0x3f2: 0x0004, 0x3f3: 0x0004,
+ 0x3fd: 0x0004,
+ // Block 0x10, offset 0x400
+ 0x416: 0x0004, 0x417: 0x0004,
+ 0x418: 0x0004, 0x419: 0x0004, 0x41b: 0x0004, 0x41c: 0x0004, 0x41d: 0x0004,
+ 0x41e: 0x0004, 0x41f: 0x0004, 0x420: 0x0004, 0x421: 0x0004, 0x422: 0x0004, 0x423: 0x0004,
+ 0x425: 0x0004, 0x426: 0x0004, 0x427: 0x0004, 0x429: 0x0004,
+ 0x42a: 0x0004, 0x42b: 0x0004, 0x42c: 0x0004, 0x42d: 0x0004,
+ // Block 0x11, offset 0x440
+ 0x459: 0x0004, 0x45a: 0x0004, 0x45b: 0x0004,
+ // Block 0x12, offset 0x480
+ 0x490: 0x0100, 0x491: 0x0100,
+ 0x498: 0x0004, 0x499: 0x0004, 0x49a: 0x0004, 0x49b: 0x0004, 0x49c: 0x0004, 0x49d: 0x0004,
+ 0x49e: 0x0004, 0x49f: 0x0004,
+ // Block 0x13, offset 0x4c0
+ 0x4ca: 0x0004, 0x4cb: 0x0004,
+ 0x4cc: 0x0004, 0x4cd: 0x0004, 0x4ce: 0x0004, 0x4cf: 0x0004, 0x4d0: 0x0004, 0x4d1: 0x0004,
+ 0x4d2: 0x0004, 0x4d3: 0x0004, 0x4d4: 0x0004, 0x4d5: 0x0004, 0x4d6: 0x0004, 0x4d7: 0x0004,
+ 0x4d8: 0x0004, 0x4d9: 0x0004, 0x4da: 0x0004, 0x4db: 0x0004, 0x4dc: 0x0004, 0x4dd: 0x0004,
+ 0x4de: 0x0004, 0x4df: 0x0004, 0x4e0: 0x0004, 0x4e1: 0x0004, 0x4e2: 0x0100, 0x4e3: 0x0004,
+ 0x4e4: 0x0004, 0x4e5: 0x0004, 0x4e6: 0x0004, 0x4e7: 0x0004, 0x4e8: 0x0004, 0x4e9: 0x0004,
+ 0x4ea: 0x0004, 0x4eb: 0x0004, 0x4ec: 0x0004, 0x4ed: 0x0004, 0x4ee: 0x0004, 0x4ef: 0x0004,
+ 0x4f0: 0x0004, 0x4f1: 0x0004, 0x4f2: 0x0004, 0x4f3: 0x0004, 0x4f4: 0x0004, 0x4f5: 0x0004,
+ 0x4f6: 0x0004, 0x4f7: 0x0004, 0x4f8: 0x0004, 0x4f9: 0x0004, 0x4fa: 0x0004, 0x4fb: 0x0004,
+ 0x4fc: 0x0004, 0x4fd: 0x0004, 0x4fe: 0x0004, 0x4ff: 0x0004,
+ // Block 0x14, offset 0x500
+ 0x500: 0x0004, 0x501: 0x0004, 0x502: 0x0004, 0x503: 0x0400,
+ 0x53a: 0x0004, 0x53b: 0x0400,
+ 0x53c: 0x0004, 0x53e: 0x0400, 0x53f: 0x0400,
+ // Block 0x15, offset 0x540
+ 0x540: 0x0400, 0x541: 0x0004, 0x542: 0x0004, 0x543: 0x0004, 0x544: 0x0004, 0x545: 0x0004,
+ 0x546: 0x0004, 0x547: 0x0004, 0x548: 0x0004, 0x549: 0x0400, 0x54a: 0x0400, 0x54b: 0x0400,
+ 0x54c: 0x0400, 0x54d: 0x0004, 0x54e: 0x0400, 0x54f: 0x0400, 0x551: 0x0004,
+ 0x552: 0x0004, 0x553: 0x0004, 0x554: 0x0004, 0x555: 0x0004, 0x556: 0x0004, 0x557: 0x0004,
+ 0x562: 0x0004, 0x563: 0x0004,
+ // Block 0x16, offset 0x580
+ 0x581: 0x0004, 0x582: 0x0400, 0x583: 0x0400,
+ 0x5bc: 0x0004, 0x5be: 0x0004, 0x5bf: 0x0400,
+ // Block 0x17, offset 0x5c0
+ 0x5c0: 0x0400, 0x5c1: 0x0004, 0x5c2: 0x0004, 0x5c3: 0x0004, 0x5c4: 0x0004,
+ 0x5c7: 0x0400, 0x5c8: 0x0400, 0x5cb: 0x0400,
+ 0x5cc: 0x0400, 0x5cd: 0x0004,
+ 0x5d7: 0x0004,
+ 0x5e2: 0x0004, 0x5e3: 0x0004,
+ 0x5fe: 0x0004,
+ // Block 0x18, offset 0x600
+ 0x601: 0x0004, 0x602: 0x0004, 0x603: 0x0400,
+ 0x63c: 0x0004, 0x63e: 0x0400, 0x63f: 0x0400,
+ // Block 0x19, offset 0x640
+ 0x640: 0x0400, 0x641: 0x0004, 0x642: 0x0004,
+ 0x647: 0x0004, 0x648: 0x0004, 0x64b: 0x0004,
+ 0x64c: 0x0004, 0x64d: 0x0004, 0x651: 0x0004,
+ 0x670: 0x0004, 0x671: 0x0004, 0x675: 0x0004,
+ // Block 0x1a, offset 0x680
+ 0x680: 0x0400, 0x681: 0x0004, 0x682: 0x0004, 0x683: 0x0004, 0x684: 0x0004, 0x685: 0x0004,
+ 0x687: 0x0004, 0x688: 0x0004, 0x689: 0x0400, 0x68b: 0x0400,
+ 0x68c: 0x0400, 0x68d: 0x0004,
+ 0x6a2: 0x0004, 0x6a3: 0x0004,
+ 0x6ba: 0x0004, 0x6bb: 0x0004,
+ 0x6bc: 0x0004, 0x6bd: 0x0004, 0x6be: 0x0004, 0x6bf: 0x0004,
+ // Block 0x1b, offset 0x6c0
+ 0x6c1: 0x0004, 0x6c2: 0x0400, 0x6c3: 0x0400,
+ 0x6fc: 0x0004, 0x6fe: 0x0004, 0x6ff: 0x0004,
+ // Block 0x1c, offset 0x700
+ 0x700: 0x0400, 0x701: 0x0004, 0x702: 0x0004, 0x703: 0x0004, 0x704: 0x0004,
+ 0x707: 0x0400, 0x708: 0x0400, 0x70b: 0x0400,
+ 0x70c: 0x0400, 0x70d: 0x0004,
+ 0x715: 0x0004, 0x716: 0x0004, 0x717: 0x0004,
+ 0x722: 0x0004, 0x723: 0x0004,
+ // Block 0x1d, offset 0x740
+ 0x742: 0x0004,
+ 0x77e: 0x0004, 0x77f: 0x0400,
+ // Block 0x1e, offset 0x780
+ 0x780: 0x0004, 0x781: 0x0400, 0x782: 0x0400,
+ 0x786: 0x0400, 0x787: 0x0400, 0x788: 0x0400, 0x78a: 0x0400, 0x78b: 0x0400,
+ 0x78c: 0x0400, 0x78d: 0x0004,
+ 0x797: 0x0004,
+ // Block 0x1f, offset 0x7c0
+ 0x7c0: 0x0004, 0x7c1: 0x0400, 0x7c2: 0x0400, 0x7c3: 0x0400, 0x7c4: 0x0004,
+ 0x7fc: 0x0004, 0x7fe: 0x0004, 0x7ff: 0x0004,
+ // Block 0x20, offset 0x800
+ 0x800: 0x0004, 0x801: 0x0400, 0x802: 0x0400, 0x803: 0x0400, 0x804: 0x0400,
+ 0x806: 0x0004, 0x807: 0x0004, 0x808: 0x0004, 0x80a: 0x0004, 0x80b: 0x0004,
+ 0x80c: 0x0004, 0x80d: 0x0004,
+ 0x815: 0x0004, 0x816: 0x0004,
+ 0x822: 0x0004, 0x823: 0x0004,
+ // Block 0x21, offset 0x840
+ 0x841: 0x0004, 0x842: 0x0400, 0x843: 0x0400,
+ 0x87c: 0x0004, 0x87e: 0x0400, 0x87f: 0x0004,
+ // Block 0x22, offset 0x880
+ 0x880: 0x0400, 0x881: 0x0400, 0x882: 0x0004, 0x883: 0x0400, 0x884: 0x0400,
+ 0x886: 0x0004, 0x887: 0x0400, 0x888: 0x0400, 0x88a: 0x0400, 0x88b: 0x0400,
+ 0x88c: 0x0004, 0x88d: 0x0004,
+ 0x895: 0x0004, 0x896: 0x0004,
+ 0x8a2: 0x0004, 0x8a3: 0x0004,
+ 0x8b3: 0x0400,
+ // Block 0x23, offset 0x8c0
+ 0x8c0: 0x0004, 0x8c1: 0x0004, 0x8c2: 0x0400, 0x8c3: 0x0400,
+ 0x8fb: 0x0004,
+ 0x8fc: 0x0004, 0x8fe: 0x0004, 0x8ff: 0x0400,
+ // Block 0x24, offset 0x900
+ 0x900: 0x0400, 0x901: 0x0004, 0x902: 0x0004, 0x903: 0x0004, 0x904: 0x0004,
+ 0x906: 0x0400, 0x907: 0x0400, 0x908: 0x0400, 0x90a: 0x0400, 0x90b: 0x0400,
+ 0x90c: 0x0400, 0x90d: 0x0004, 0x90e: 0x0100,
+ 0x917: 0x0004,
+ 0x922: 0x0004, 0x923: 0x0004,
+ // Block 0x25, offset 0x940
+ 0x941: 0x0004, 0x942: 0x0400, 0x943: 0x0400,
+ // Block 0x26, offset 0x980
+ 0x98a: 0x0004,
+ 0x98f: 0x0004, 0x990: 0x0400, 0x991: 0x0400,
+ 0x992: 0x0004, 0x993: 0x0004, 0x994: 0x0004, 0x996: 0x0004,
+ 0x998: 0x0400, 0x999: 0x0400, 0x99a: 0x0400, 0x99b: 0x0400, 0x99c: 0x0400, 0x99d: 0x0400,
+ 0x99e: 0x0400, 0x99f: 0x0004,
+ 0x9b2: 0x0400, 0x9b3: 0x0400,
+ // Block 0x27, offset 0x9c0
+ 0x9f1: 0x0004, 0x9f3: 0x0400, 0x9f4: 0x0004, 0x9f5: 0x0004,
+ 0x9f6: 0x0004, 0x9f7: 0x0004, 0x9f8: 0x0004, 0x9f9: 0x0004, 0x9fa: 0x0004,
+ // Block 0x28, offset 0xa00
+ 0xa07: 0x0004, 0xa08: 0x0004, 0xa09: 0x0004, 0xa0a: 0x0004, 0xa0b: 0x0004,
+ 0xa0c: 0x0004, 0xa0d: 0x0004, 0xa0e: 0x0004,
+ // Block 0x29, offset 0xa40
+ 0xa71: 0x0004, 0xa73: 0x0400, 0xa74: 0x0004, 0xa75: 0x0004,
+ 0xa76: 0x0004, 0xa77: 0x0004, 0xa78: 0x0004, 0xa79: 0x0004, 0xa7a: 0x0004, 0xa7b: 0x0004,
+ 0xa7c: 0x0004,
+ // Block 0x2a, offset 0xa80
+ 0xa88: 0x0004, 0xa89: 0x0004, 0xa8a: 0x0004, 0xa8b: 0x0004,
+ 0xa8c: 0x0004, 0xa8d: 0x0004, 0xa8e: 0x0004,
+ // Block 0x2b, offset 0xac0
+ 0xad8: 0x0004, 0xad9: 0x0004,
+ 0xaf5: 0x0004,
+ 0xaf7: 0x0004, 0xaf9: 0x0004,
+ 0xafe: 0x0400, 0xaff: 0x0400,
+ // Block 0x2c, offset 0xb00
+ 0xb31: 0x0004, 0xb32: 0x0004, 0xb33: 0x0004, 0xb34: 0x0004, 0xb35: 0x0004,
+ 0xb36: 0x0004, 0xb37: 0x0004, 0xb38: 0x0004, 0xb39: 0x0004, 0xb3a: 0x0004, 0xb3b: 0x0004,
+ 0xb3c: 0x0004, 0xb3d: 0x0004, 0xb3e: 0x0004, 0xb3f: 0x0400,
+ // Block 0x2d, offset 0xb40
+ 0xb40: 0x0004, 0xb41: 0x0004, 0xb42: 0x0004, 0xb43: 0x0004, 0xb44: 0x0004,
+ 0xb46: 0x0004, 0xb47: 0x0004,
+ 0xb4d: 0x0004, 0xb4e: 0x0004, 0xb4f: 0x0004, 0xb50: 0x0004, 0xb51: 0x0004,
+ 0xb52: 0x0004, 0xb53: 0x0004, 0xb54: 0x0004, 0xb55: 0x0004, 0xb56: 0x0004, 0xb57: 0x0004,
+ 0xb59: 0x0004, 0xb5a: 0x0004, 0xb5b: 0x0004, 0xb5c: 0x0004, 0xb5d: 0x0004,
+ 0xb5e: 0x0004, 0xb5f: 0x0004, 0xb60: 0x0004, 0xb61: 0x0004, 0xb62: 0x0004, 0xb63: 0x0004,
+ 0xb64: 0x0004, 0xb65: 0x0004, 0xb66: 0x0004, 0xb67: 0x0004, 0xb68: 0x0004, 0xb69: 0x0004,
+ 0xb6a: 0x0004, 0xb6b: 0x0004, 0xb6c: 0x0004, 0xb6d: 0x0004, 0xb6e: 0x0004, 0xb6f: 0x0004,
+ 0xb70: 0x0004, 0xb71: 0x0004, 0xb72: 0x0004, 0xb73: 0x0004, 0xb74: 0x0004, 0xb75: 0x0004,
+ 0xb76: 0x0004, 0xb77: 0x0004, 0xb78: 0x0004, 0xb79: 0x0004, 0xb7a: 0x0004, 0xb7b: 0x0004,
+ 0xb7c: 0x0004,
+ // Block 0x2e, offset 0xb80
+ 0xb86: 0x0004,
+ // Block 0x2f, offset 0xbc0
+ 0xbed: 0x0004, 0xbee: 0x0004, 0xbef: 0x0004,
+ 0xbf0: 0x0004, 0xbf1: 0x0400, 0xbf2: 0x0004, 0xbf3: 0x0004, 0xbf4: 0x0004, 0xbf5: 0x0004,
+ 0xbf6: 0x0004, 0xbf7: 0x0004, 0xbf9: 0x0004, 0xbfa: 0x0004, 0xbfb: 0x0400,
+ 0xbfc: 0x0400, 0xbfd: 0x0004, 0xbfe: 0x0004,
+ // Block 0x30, offset 0xc00
+ 0xc16: 0x0400, 0xc17: 0x0400,
+ 0xc18: 0x0004, 0xc19: 0x0004,
+ 0xc1e: 0x0004, 0xc1f: 0x0004, 0xc20: 0x0004,
+ 0xc31: 0x0004, 0xc32: 0x0004, 0xc33: 0x0004, 0xc34: 0x0004,
+ // Block 0x31, offset 0xc40
+ 0xc42: 0x0004, 0xc44: 0x0400, 0xc45: 0x0004,
+ 0xc46: 0x0004,
+ 0xc4d: 0x0004,
+ 0xc5d: 0x0004,
+ // Block 0x32, offset 0xc80
+ 0xc80: 0x0010, 0xc81: 0x0010, 0xc82: 0x0010, 0xc83: 0x0010, 0xc84: 0x0010, 0xc85: 0x0010,
+ 0xc86: 0x0010, 0xc87: 0x0010, 0xc88: 0x0010, 0xc89: 0x0010, 0xc8a: 0x0010, 0xc8b: 0x0010,
+ 0xc8c: 0x0010, 0xc8d: 0x0010, 0xc8e: 0x0010, 0xc8f: 0x0010, 0xc90: 0x0010, 0xc91: 0x0010,
+ 0xc92: 0x0010, 0xc93: 0x0010, 0xc94: 0x0010, 0xc95: 0x0010, 0xc96: 0x0010, 0xc97: 0x0010,
+ 0xc98: 0x0010, 0xc99: 0x0010, 0xc9a: 0x0010, 0xc9b: 0x0010, 0xc9c: 0x0010, 0xc9d: 0x0010,
+ 0xc9e: 0x0010, 0xc9f: 0x0010, 0xca0: 0x0010, 0xca1: 0x0010, 0xca2: 0x0010, 0xca3: 0x0010,
+ 0xca4: 0x0010, 0xca5: 0x0010, 0xca6: 0x0010, 0xca7: 0x0010, 0xca8: 0x0010, 0xca9: 0x0010,
+ 0xcaa: 0x0010, 0xcab: 0x0010, 0xcac: 0x0010, 0xcad: 0x0010, 0xcae: 0x0010, 0xcaf: 0x0010,
+ 0xcb0: 0x0010, 0xcb1: 0x0010, 0xcb2: 0x0010, 0xcb3: 0x0010, 0xcb4: 0x0010, 0xcb5: 0x0010,
+ 0xcb6: 0x0010, 0xcb7: 0x0010, 0xcb8: 0x0010, 0xcb9: 0x0010, 0xcba: 0x0010, 0xcbb: 0x0010,
+ 0xcbc: 0x0010, 0xcbd: 0x0010, 0xcbe: 0x0010, 0xcbf: 0x0010,
+ // Block 0x33, offset 0xcc0
+ 0xcc0: 0x0010, 0xcc1: 0x0010, 0xcc2: 0x0010, 0xcc3: 0x0010, 0xcc4: 0x0010, 0xcc5: 0x0010,
+ 0xcc6: 0x0010, 0xcc7: 0x0010, 0xcc8: 0x0010, 0xcc9: 0x0010, 0xcca: 0x0010, 0xccb: 0x0010,
+ 0xccc: 0x0010, 0xccd: 0x0010, 0xcce: 0x0010, 0xccf: 0x0010, 0xcd0: 0x0010, 0xcd1: 0x0010,
+ 0xcd2: 0x0010, 0xcd3: 0x0010, 0xcd4: 0x0010, 0xcd5: 0x0010, 0xcd6: 0x0010, 0xcd7: 0x0010,
+ 0xcd8: 0x0010, 0xcd9: 0x0010, 0xcda: 0x0010, 0xcdb: 0x0010, 0xcdc: 0x0010, 0xcdd: 0x0010,
+ 0xcde: 0x0010, 0xcdf: 0x0010, 0xce0: 0x1000, 0xce1: 0x1000, 0xce2: 0x1000, 0xce3: 0x1000,
+ 0xce4: 0x1000, 0xce5: 0x1000, 0xce6: 0x1000, 0xce7: 0x1000, 0xce8: 0x1000, 0xce9: 0x1000,
+ 0xcea: 0x1000, 0xceb: 0x1000, 0xcec: 0x1000, 0xced: 0x1000, 0xcee: 0x1000, 0xcef: 0x1000,
+ 0xcf0: 0x1000, 0xcf1: 0x1000, 0xcf2: 0x1000, 0xcf3: 0x1000, 0xcf4: 0x1000, 0xcf5: 0x1000,
+ 0xcf6: 0x1000, 0xcf7: 0x1000, 0xcf8: 0x1000, 0xcf9: 0x1000, 0xcfa: 0x1000, 0xcfb: 0x1000,
+ 0xcfc: 0x1000, 0xcfd: 0x1000, 0xcfe: 0x1000, 0xcff: 0x1000,
+ // Block 0x34, offset 0xd00
+ 0xd00: 0x1000, 0xd01: 0x1000, 0xd02: 0x1000, 0xd03: 0x1000, 0xd04: 0x1000, 0xd05: 0x1000,
+ 0xd06: 0x1000, 0xd07: 0x1000, 0xd08: 0x1000, 0xd09: 0x1000, 0xd0a: 0x1000, 0xd0b: 0x1000,
+ 0xd0c: 0x1000, 0xd0d: 0x1000, 0xd0e: 0x1000, 0xd0f: 0x1000, 0xd10: 0x1000, 0xd11: 0x1000,
+ 0xd12: 0x1000, 0xd13: 0x1000, 0xd14: 0x1000, 0xd15: 0x1000, 0xd16: 0x1000, 0xd17: 0x1000,
+ 0xd18: 0x1000, 0xd19: 0x1000, 0xd1a: 0x1000, 0xd1b: 0x1000, 0xd1c: 0x1000, 0xd1d: 0x1000,
+ 0xd1e: 0x1000, 0xd1f: 0x1000, 0xd20: 0x1000, 0xd21: 0x1000, 0xd22: 0x1000, 0xd23: 0x1000,
+ 0xd24: 0x1000, 0xd25: 0x1000, 0xd26: 0x1000, 0xd27: 0x1000, 0xd28: 0x0800, 0xd29: 0x0800,
+ 0xd2a: 0x0800, 0xd2b: 0x0800, 0xd2c: 0x0800, 0xd2d: 0x0800, 0xd2e: 0x0800, 0xd2f: 0x0800,
+ 0xd30: 0x0800, 0xd31: 0x0800, 0xd32: 0x0800, 0xd33: 0x0800, 0xd34: 0x0800, 0xd35: 0x0800,
+ 0xd36: 0x0800, 0xd37: 0x0800, 0xd38: 0x0800, 0xd39: 0x0800, 0xd3a: 0x0800, 0xd3b: 0x0800,
+ 0xd3c: 0x0800, 0xd3d: 0x0800, 0xd3e: 0x0800, 0xd3f: 0x0800,
+ // Block 0x35, offset 0xd40
+ 0xd40: 0x0800, 0xd41: 0x0800, 0xd42: 0x0800, 0xd43: 0x0800, 0xd44: 0x0800, 0xd45: 0x0800,
+ 0xd46: 0x0800, 0xd47: 0x0800, 0xd48: 0x0800, 0xd49: 0x0800, 0xd4a: 0x0800, 0xd4b: 0x0800,
+ 0xd4c: 0x0800, 0xd4d: 0x0800, 0xd4e: 0x0800, 0xd4f: 0x0800, 0xd50: 0x0800, 0xd51: 0x0800,
+ 0xd52: 0x0800, 0xd53: 0x0800, 0xd54: 0x0800, 0xd55: 0x0800, 0xd56: 0x0800, 0xd57: 0x0800,
+ 0xd58: 0x0800, 0xd59: 0x0800, 0xd5a: 0x0800, 0xd5b: 0x0800, 0xd5c: 0x0800, 0xd5d: 0x0800,
+ 0xd5e: 0x0800, 0xd5f: 0x0800, 0xd60: 0x0800, 0xd61: 0x0800, 0xd62: 0x0800, 0xd63: 0x0800,
+ 0xd64: 0x0800, 0xd65: 0x0800, 0xd66: 0x0800, 0xd67: 0x0800, 0xd68: 0x0800, 0xd69: 0x0800,
+ 0xd6a: 0x0800, 0xd6b: 0x0800, 0xd6c: 0x0800, 0xd6d: 0x0800, 0xd6e: 0x0800, 0xd6f: 0x0800,
+ 0xd70: 0x0800, 0xd71: 0x0800, 0xd72: 0x0800, 0xd73: 0x0800, 0xd74: 0x0800, 0xd75: 0x0800,
+ 0xd76: 0x0800, 0xd77: 0x0800, 0xd78: 0x0800, 0xd79: 0x0800, 0xd7a: 0x0800, 0xd7b: 0x0800,
+ 0xd7c: 0x0800, 0xd7d: 0x0800, 0xd7e: 0x0800, 0xd7f: 0x0800,
+ // Block 0x36, offset 0xd80
+ 0xd9d: 0x0004,
+ 0xd9e: 0x0004, 0xd9f: 0x0004,
+ // Block 0x37, offset 0xdc0
+ 0xdd2: 0x0004, 0xdd3: 0x0004, 0xdd4: 0x0004, 0xdd5: 0x0400,
+ 0xdf2: 0x0004, 0xdf3: 0x0004, 0xdf4: 0x0400,
+ // Block 0x38, offset 0xe00
+ 0xe12: 0x0004, 0xe13: 0x0004,
+ 0xe32: 0x0004, 0xe33: 0x0004,
+ // Block 0x39, offset 0xe40
+ 0xe74: 0x0004, 0xe75: 0x0004,
+ 0xe76: 0x0400, 0xe77: 0x0004, 0xe78: 0x0004, 0xe79: 0x0004, 0xe7a: 0x0004, 0xe7b: 0x0004,
+ 0xe7c: 0x0004, 0xe7d: 0x0004, 0xe7e: 0x0400, 0xe7f: 0x0400,
+ // Block 0x3a, offset 0xe80
+ 0xe80: 0x0400, 0xe81: 0x0400, 0xe82: 0x0400, 0xe83: 0x0400, 0xe84: 0x0400, 0xe85: 0x0400,
+ 0xe86: 0x0004, 0xe87: 0x0400, 0xe88: 0x0400, 0xe89: 0x0004, 0xe8a: 0x0004, 0xe8b: 0x0004,
+ 0xe8c: 0x0004, 0xe8d: 0x0004, 0xe8e: 0x0004, 0xe8f: 0x0004, 0xe90: 0x0004, 0xe91: 0x0004,
+ 0xe92: 0x0004, 0xe93: 0x0004,
+ 0xe9d: 0x0004,
+ // Block 0x3b, offset 0xec0
+ 0xecb: 0x0004,
+ 0xecc: 0x0004, 0xecd: 0x0004, 0xece: 0x0002, 0xecf: 0x0004,
+ // Block 0x3c, offset 0xf00
+ 0xf05: 0x0004,
+ 0xf06: 0x0004,
+ 0xf29: 0x0004,
+ // Block 0x3d, offset 0xf40
+ 0xf60: 0x0004, 0xf61: 0x0004, 0xf62: 0x0004, 0xf63: 0x0400,
+ 0xf64: 0x0400, 0xf65: 0x0400, 0xf66: 0x0400, 0xf67: 0x0004, 0xf68: 0x0004, 0xf69: 0x0400,
+ 0xf6a: 0x0400, 0xf6b: 0x0400,
+ 0xf70: 0x0400, 0xf71: 0x0400, 0xf72: 0x0004, 0xf73: 0x0400, 0xf74: 0x0400, 0xf75: 0x0400,
+ 0xf76: 0x0400, 0xf77: 0x0400, 0xf78: 0x0400, 0xf79: 0x0004, 0xf7a: 0x0004, 0xf7b: 0x0004,
+ // Block 0x3e, offset 0xf80
+ 0xf97: 0x0004,
+ 0xf98: 0x0004, 0xf99: 0x0400, 0xf9a: 0x0400, 0xf9b: 0x0004,
+ // Block 0x3f, offset 0xfc0
+ 0xfd5: 0x0400, 0xfd6: 0x0004, 0xfd7: 0x0400,
+ 0xfd8: 0x0004, 0xfd9: 0x0004, 0xfda: 0x0004, 0xfdb: 0x0004, 0xfdc: 0x0004, 0xfdd: 0x0004,
+ 0xfde: 0x0004, 0xfe0: 0x0004, 0xfe2: 0x0004,
+ 0xfe5: 0x0004, 0xfe6: 0x0004, 0xfe7: 0x0004, 0xfe8: 0x0004, 0xfe9: 0x0004,
+ 0xfea: 0x0004, 0xfeb: 0x0004, 0xfec: 0x0004, 0xfed: 0x0400, 0xfee: 0x0400, 0xfef: 0x0400,
+ 0xff0: 0x0400, 0xff1: 0x0400, 0xff2: 0x0400, 0xff3: 0x0004, 0xff4: 0x0004, 0xff5: 0x0004,
+ 0xff6: 0x0004, 0xff7: 0x0004, 0xff8: 0x0004, 0xff9: 0x0004, 0xffa: 0x0004, 0xffb: 0x0004,
+ 0xffc: 0x0004, 0xfff: 0x0004,
+ // Block 0x40, offset 0x1000
+ 0x1030: 0x0004, 0x1031: 0x0004, 0x1032: 0x0004, 0x1033: 0x0004, 0x1034: 0x0004, 0x1035: 0x0004,
+ 0x1036: 0x0004, 0x1037: 0x0004, 0x1038: 0x0004, 0x1039: 0x0004, 0x103a: 0x0004, 0x103b: 0x0004,
+ 0x103c: 0x0004, 0x103d: 0x0004, 0x103e: 0x0004, 0x103f: 0x0004,
+ // Block 0x41, offset 0x1040
+ 0x1040: 0x0004, 0x1041: 0x0004, 0x1042: 0x0004, 0x1043: 0x0004, 0x1044: 0x0004, 0x1045: 0x0004,
+ 0x1046: 0x0004, 0x1047: 0x0004, 0x1048: 0x0004, 0x1049: 0x0004, 0x104a: 0x0004, 0x104b: 0x0004,
+ 0x104c: 0x0004, 0x104d: 0x0004, 0x104e: 0x0004,
+ // Block 0x42, offset 0x1080
+ 0x1080: 0x0004, 0x1081: 0x0004, 0x1082: 0x0004, 0x1083: 0x0004, 0x1084: 0x0400,
+ 0x10b4: 0x0004, 0x10b5: 0x0004,
+ 0x10b6: 0x0004, 0x10b7: 0x0004, 0x10b8: 0x0004, 0x10b9: 0x0004, 0x10ba: 0x0004, 0x10bb: 0x0400,
+ 0x10bc: 0x0004, 0x10bd: 0x0400, 0x10be: 0x0400, 0x10bf: 0x0400,
+ // Block 0x43, offset 0x10c0
+ 0x10c0: 0x0400, 0x10c1: 0x0400, 0x10c2: 0x0004, 0x10c3: 0x0400, 0x10c4: 0x0400,
+ 0x10eb: 0x0004, 0x10ec: 0x0004, 0x10ed: 0x0004, 0x10ee: 0x0004, 0x10ef: 0x0004,
+ 0x10f0: 0x0004, 0x10f1: 0x0004, 0x10f2: 0x0004, 0x10f3: 0x0004,
+ // Block 0x44, offset 0x1100
+ 0x1100: 0x0004, 0x1101: 0x0004, 0x1102: 0x0400,
+ 0x1121: 0x0400, 0x1122: 0x0004, 0x1123: 0x0004,
+ 0x1124: 0x0004, 0x1125: 0x0004, 0x1126: 0x0400, 0x1127: 0x0400, 0x1128: 0x0004, 0x1129: 0x0004,
+ 0x112a: 0x0400, 0x112b: 0x0004, 0x112c: 0x0004, 0x112d: 0x0004,
+ // Block 0x45, offset 0x1140
+ 0x1166: 0x0004, 0x1167: 0x0400, 0x1168: 0x0004, 0x1169: 0x0004,
+ 0x116a: 0x0400, 0x116b: 0x0400, 0x116c: 0x0400, 0x116d: 0x0004, 0x116e: 0x0400, 0x116f: 0x0004,
+ 0x1170: 0x0004, 0x1171: 0x0004, 0x1172: 0x0400, 0x1173: 0x0400,
+ // Block 0x46, offset 0x1180
+ 0x11a4: 0x0400, 0x11a5: 0x0400, 0x11a6: 0x0400, 0x11a7: 0x0400, 0x11a8: 0x0400, 0x11a9: 0x0400,
+ 0x11aa: 0x0400, 0x11ab: 0x0400, 0x11ac: 0x0004, 0x11ad: 0x0004, 0x11ae: 0x0004, 0x11af: 0x0004,
+ 0x11b0: 0x0004, 0x11b1: 0x0004, 0x11b2: 0x0004, 0x11b3: 0x0004, 0x11b4: 0x0400, 0x11b5: 0x0400,
+ 0x11b6: 0x0004, 0x11b7: 0x0004,
+ // Block 0x47, offset 0x11c0
+ 0x11d0: 0x0004, 0x11d1: 0x0004,
+ 0x11d2: 0x0004, 0x11d4: 0x0004, 0x11d5: 0x0004, 0x11d6: 0x0004, 0x11d7: 0x0004,
+ 0x11d8: 0x0004, 0x11d9: 0x0004, 0x11da: 0x0004, 0x11db: 0x0004, 0x11dc: 0x0004, 0x11dd: 0x0004,
+ 0x11de: 0x0004, 0x11df: 0x0004, 0x11e0: 0x0004, 0x11e1: 0x0400, 0x11e2: 0x0004, 0x11e3: 0x0004,
+ 0x11e4: 0x0004, 0x11e5: 0x0004, 0x11e6: 0x0004, 0x11e7: 0x0004, 0x11e8: 0x0004,
+ 0x11ed: 0x0004,
+ 0x11f4: 0x0004,
+ 0x11f7: 0x0400, 0x11f8: 0x0004, 0x11f9: 0x0004,
+ // Block 0x48, offset 0x1200
+ 0x120b: 0x0002,
+ 0x120c: 0x0004, 0x120d: 0x2000, 0x120e: 0x0002, 0x120f: 0x0002,
+ 0x1228: 0x0002, 0x1229: 0x0002,
+ 0x122a: 0x0002, 0x122b: 0x0002, 0x122c: 0x0002, 0x122d: 0x0002, 0x122e: 0x0002,
+ 0x123c: 0x0008,
+ // Block 0x49, offset 0x1240
+ 0x1249: 0x0008,
+ 0x1260: 0x0002, 0x1261: 0x0002, 0x1262: 0x0002, 0x1263: 0x0002,
+ 0x1264: 0x0002, 0x1265: 0x0002, 0x1266: 0x0002, 0x1267: 0x0002, 0x1268: 0x0002, 0x1269: 0x0002,
+ 0x126a: 0x0002, 0x126b: 0x0002, 0x126c: 0x0002, 0x126d: 0x0002, 0x126e: 0x0002, 0x126f: 0x0002,
+ // Block 0x4a, offset 0x1280
+ 0x1290: 0x0004, 0x1291: 0x0004,
+ 0x1292: 0x0004, 0x1293: 0x0004, 0x1294: 0x0004, 0x1295: 0x0004, 0x1296: 0x0004, 0x1297: 0x0004,
+ 0x1298: 0x0004, 0x1299: 0x0004, 0x129a: 0x0004, 0x129b: 0x0004, 0x129c: 0x0004, 0x129d: 0x0004,
+ 0x129e: 0x0004, 0x129f: 0x0004, 0x12a0: 0x0004, 0x12a1: 0x0004, 0x12a2: 0x0004, 0x12a3: 0x0004,
+ 0x12a4: 0x0004, 0x12a5: 0x0004, 0x12a6: 0x0004, 0x12a7: 0x0004, 0x12a8: 0x0004, 0x12a9: 0x0004,
+ 0x12aa: 0x0004, 0x12ab: 0x0004, 0x12ac: 0x0004, 0x12ad: 0x0004, 0x12ae: 0x0004, 0x12af: 0x0004,
+ 0x12b0: 0x0004,
+ // Block 0x4b, offset 0x12c0
+ 0x12e2: 0x0008,
+ 0x12f9: 0x0008,
+ // Block 0x4c, offset 0x1300
+ 0x1314: 0x0008, 0x1315: 0x0008, 0x1316: 0x0008, 0x1317: 0x0008,
+ 0x1318: 0x0008, 0x1319: 0x0008,
+ 0x1329: 0x0008,
+ 0x132a: 0x0008,
+ // Block 0x4d, offset 0x1340
+ 0x135a: 0x0008, 0x135b: 0x0008,
+ 0x1368: 0x0008,
+ // Block 0x4e, offset 0x1380
+ 0x1388: 0x0008,
+ // Block 0x4f, offset 0x13c0
+ 0x13cf: 0x0008,
+ 0x13e9: 0x0008,
+ 0x13ea: 0x0008, 0x13eb: 0x0008, 0x13ec: 0x0008, 0x13ed: 0x0008, 0x13ee: 0x0008, 0x13ef: 0x0008,
+ 0x13f0: 0x0008, 0x13f1: 0x0008, 0x13f2: 0x0008, 0x13f3: 0x0008,
+ 0x13f8: 0x0008, 0x13f9: 0x0008, 0x13fa: 0x0008,
+ // Block 0x50, offset 0x1400
+ 0x1402: 0x0008,
+ // Block 0x51, offset 0x1440
+ 0x146a: 0x0008, 0x146b: 0x0008,
+ 0x1476: 0x0008,
+ // Block 0x52, offset 0x1480
+ 0x1480: 0x0008,
+ 0x14bb: 0x0008,
+ 0x14bc: 0x0008, 0x14bd: 0x0008, 0x14be: 0x0008,
+ // Block 0x53, offset 0x14c0
+ 0x14c0: 0x0008, 0x14c1: 0x0008, 0x14c2: 0x0008, 0x14c3: 0x0008, 0x14c4: 0x0008, 0x14c5: 0x0008,
+ 0x14c7: 0x0008, 0x14c8: 0x0008, 0x14c9: 0x0008, 0x14ca: 0x0008, 0x14cb: 0x0008,
+ 0x14cc: 0x0008, 0x14cd: 0x0008, 0x14ce: 0x0008, 0x14cf: 0x0008, 0x14d0: 0x0008, 0x14d1: 0x0008,
+ 0x14d2: 0x0008, 0x14d4: 0x0008, 0x14d5: 0x0008, 0x14d6: 0x0008, 0x14d7: 0x0008,
+ 0x14d8: 0x0008, 0x14d9: 0x0008, 0x14da: 0x0008, 0x14db: 0x0008, 0x14dc: 0x0008, 0x14dd: 0x0008,
+ 0x14de: 0x0008, 0x14df: 0x0008, 0x14e0: 0x0008, 0x14e1: 0x0008, 0x14e2: 0x0008, 0x14e3: 0x0008,
+ 0x14e4: 0x0008, 0x14e5: 0x0008, 0x14e6: 0x0008, 0x14e7: 0x0008, 0x14e8: 0x0008, 0x14e9: 0x0008,
+ 0x14ea: 0x0008, 0x14eb: 0x0008, 0x14ec: 0x0008, 0x14ed: 0x0008, 0x14ee: 0x0008, 0x14ef: 0x0008,
+ 0x14f0: 0x0008, 0x14f1: 0x0008, 0x14f2: 0x0008, 0x14f3: 0x0008, 0x14f4: 0x0008, 0x14f5: 0x0008,
+ 0x14f6: 0x0008, 0x14f7: 0x0008, 0x14f8: 0x0008, 0x14f9: 0x0008, 0x14fa: 0x0008, 0x14fb: 0x0008,
+ 0x14fc: 0x0008, 0x14fd: 0x0008, 0x14fe: 0x0008, 0x14ff: 0x0008,
+ // Block 0x54, offset 0x1500
+ 0x1500: 0x0008, 0x1501: 0x0008, 0x1502: 0x0008, 0x1503: 0x0008, 0x1504: 0x0008, 0x1505: 0x0008,
+ 0x1506: 0x0008, 0x1507: 0x0008, 0x1508: 0x0008, 0x1509: 0x0008, 0x150a: 0x0008, 0x150b: 0x0008,
+ 0x150c: 0x0008, 0x150d: 0x0008, 0x150e: 0x0008, 0x150f: 0x0008, 0x1510: 0x0008, 0x1511: 0x0008,
+ 0x1512: 0x0008, 0x1513: 0x0008, 0x1514: 0x0008, 0x1515: 0x0008, 0x1516: 0x0008, 0x1517: 0x0008,
+ 0x1518: 0x0008, 0x1519: 0x0008, 0x151a: 0x0008, 0x151b: 0x0008, 0x151c: 0x0008, 0x151d: 0x0008,
+ 0x151e: 0x0008, 0x151f: 0x0008, 0x1520: 0x0008, 0x1521: 0x0008, 0x1522: 0x0008, 0x1523: 0x0008,
+ 0x1524: 0x0008, 0x1525: 0x0008, 0x1526: 0x0008, 0x1527: 0x0008, 0x1528: 0x0008, 0x1529: 0x0008,
+ 0x152a: 0x0008, 0x152b: 0x0008, 0x152c: 0x0008, 0x152d: 0x0008, 0x152e: 0x0008, 0x152f: 0x0008,
+ 0x1530: 0x0008, 0x1531: 0x0008, 0x1532: 0x0008, 0x1533: 0x0008, 0x1534: 0x0008, 0x1535: 0x0008,
+ 0x1536: 0x0008, 0x1537: 0x0008, 0x1538: 0x0008, 0x1539: 0x0008, 0x153a: 0x0008, 0x153b: 0x0008,
+ 0x153c: 0x0008, 0x153d: 0x0008, 0x153e: 0x0008, 0x153f: 0x0008,
+ // Block 0x55, offset 0x1540
+ 0x1540: 0x0008, 0x1541: 0x0008, 0x1542: 0x0008, 0x1543: 0x0008, 0x1544: 0x0008, 0x1545: 0x0008,
+ 0x1550: 0x0008, 0x1551: 0x0008,
+ 0x1552: 0x0008, 0x1553: 0x0008, 0x1554: 0x0008, 0x1555: 0x0008, 0x1556: 0x0008, 0x1557: 0x0008,
+ 0x1558: 0x0008, 0x1559: 0x0008, 0x155a: 0x0008, 0x155b: 0x0008, 0x155c: 0x0008, 0x155d: 0x0008,
+ 0x155e: 0x0008, 0x155f: 0x0008, 0x1560: 0x0008, 0x1561: 0x0008, 0x1562: 0x0008, 0x1563: 0x0008,
+ 0x1564: 0x0008, 0x1565: 0x0008, 0x1566: 0x0008, 0x1567: 0x0008, 0x1568: 0x0008, 0x1569: 0x0008,
+ 0x156a: 0x0008, 0x156b: 0x0008, 0x156c: 0x0008, 0x156d: 0x0008, 0x156e: 0x0008, 0x156f: 0x0008,
+ 0x1570: 0x0008, 0x1571: 0x0008, 0x1572: 0x0008, 0x1573: 0x0008, 0x1574: 0x0008, 0x1575: 0x0008,
+ 0x1576: 0x0008, 0x1577: 0x0008, 0x1578: 0x0008, 0x1579: 0x0008, 0x157a: 0x0008, 0x157b: 0x0008,
+ 0x157c: 0x0008, 0x157d: 0x0008, 0x157e: 0x0008, 0x157f: 0x0008,
+ // Block 0x56, offset 0x1580
+ 0x1580: 0x0008, 0x1581: 0x0008, 0x1582: 0x0008, 0x1583: 0x0008, 0x1584: 0x0008, 0x1585: 0x0008,
+ 0x1588: 0x0008, 0x1589: 0x0008, 0x158a: 0x0008, 0x158b: 0x0008,
+ 0x158c: 0x0008, 0x158d: 0x0008, 0x158e: 0x0008, 0x158f: 0x0008, 0x1590: 0x0008, 0x1591: 0x0008,
+ 0x1592: 0x0008, 0x1594: 0x0008, 0x1596: 0x0008,
+ 0x159d: 0x0008,
+ 0x15a1: 0x0008,
+ 0x15a8: 0x0008,
+ 0x15b3: 0x0008, 0x15b4: 0x0008,
+ // Block 0x57, offset 0x15c0
+ 0x15c4: 0x0008,
+ 0x15c7: 0x0008,
+ 0x15cc: 0x0008, 0x15ce: 0x0008,
+ 0x15d3: 0x0008, 0x15d4: 0x0008, 0x15d5: 0x0008, 0x15d7: 0x0008,
+ 0x15e3: 0x0008,
+ 0x15e4: 0x0008, 0x15e5: 0x0008, 0x15e6: 0x0008, 0x15e7: 0x0008,
+ // Block 0x58, offset 0x1600
+ 0x1615: 0x0008, 0x1616: 0x0008, 0x1617: 0x0008,
+ 0x1621: 0x0008,
+ 0x1630: 0x0008,
+ 0x163f: 0x0008,
+ // Block 0x59, offset 0x1640
+ 0x1674: 0x0008, 0x1675: 0x0008,
+ // Block 0x5a, offset 0x1680
+ 0x1685: 0x0008,
+ 0x1686: 0x0008, 0x1687: 0x0008,
+ 0x169b: 0x0008, 0x169c: 0x0008,
+ // Block 0x5b, offset 0x16c0
+ 0x16d0: 0x0008,
+ 0x16d5: 0x0008,
+ // Block 0x5c, offset 0x1700
+ 0x172f: 0x0004,
+ 0x1730: 0x0004, 0x1731: 0x0004,
+ // Block 0x5d, offset 0x1740
+ 0x177f: 0x0004,
+ // Block 0x5e, offset 0x1780
+ 0x17a0: 0x0004, 0x17a1: 0x0004, 0x17a2: 0x0004, 0x17a3: 0x0004,
+ 0x17a4: 0x0004, 0x17a5: 0x0004, 0x17a6: 0x0004, 0x17a7: 0x0004, 0x17a8: 0x0004, 0x17a9: 0x0004,
+ 0x17aa: 0x0004, 0x17ab: 0x0004, 0x17ac: 0x0004, 0x17ad: 0x0004, 0x17ae: 0x0004, 0x17af: 0x0004,
+ 0x17b0: 0x0004, 0x17b1: 0x0004, 0x17b2: 0x0004, 0x17b3: 0x0004, 0x17b4: 0x0004, 0x17b5: 0x0004,
+ 0x17b6: 0x0004, 0x17b7: 0x0004, 0x17b8: 0x0004, 0x17b9: 0x0004, 0x17ba: 0x0004, 0x17bb: 0x0004,
+ 0x17bc: 0x0004, 0x17bd: 0x0004, 0x17be: 0x0004, 0x17bf: 0x0004,
+ // Block 0x5f, offset 0x17c0
+ 0x17ea: 0x0004, 0x17eb: 0x0004, 0x17ec: 0x0004, 0x17ed: 0x0004, 0x17ee: 0x0004, 0x17ef: 0x0004,
+ 0x17f0: 0x0008,
+ 0x17fd: 0x0008,
+ // Block 0x60, offset 0x1800
+ 0x1819: 0x0004, 0x181a: 0x0004,
+ // Block 0x61, offset 0x1840
+ 0x1857: 0x0008,
+ 0x1859: 0x0008,
+ // Block 0x62, offset 0x1880
+ 0x18af: 0x0004,
+ 0x18b0: 0x0004, 0x18b1: 0x0004, 0x18b2: 0x0004, 0x18b4: 0x0004, 0x18b5: 0x0004,
+ 0x18b6: 0x0004, 0x18b7: 0x0004, 0x18b8: 0x0004, 0x18b9: 0x0004, 0x18ba: 0x0004, 0x18bb: 0x0004,
+ 0x18bc: 0x0004, 0x18bd: 0x0004,
+ // Block 0x63, offset 0x18c0
+ 0x18de: 0x0004, 0x18df: 0x0004,
+ // Block 0x64, offset 0x1900
+ 0x1930: 0x0004, 0x1931: 0x0004,
+ // Block 0x65, offset 0x1940
+ 0x1942: 0x0004,
+ 0x1946: 0x0004, 0x194b: 0x0004,
+ 0x1963: 0x0400,
+ 0x1964: 0x0400, 0x1965: 0x0004, 0x1966: 0x0004, 0x1967: 0x0400,
+ 0x196c: 0x0004,
+ // Block 0x66, offset 0x1980
+ 0x1980: 0x0400, 0x1981: 0x0400,
+ 0x19b4: 0x0400, 0x19b5: 0x0400,
+ 0x19b6: 0x0400, 0x19b7: 0x0400, 0x19b8: 0x0400, 0x19b9: 0x0400, 0x19ba: 0x0400, 0x19bb: 0x0400,
+ 0x19bc: 0x0400, 0x19bd: 0x0400, 0x19be: 0x0400, 0x19bf: 0x0400,
+ // Block 0x67, offset 0x19c0
+ 0x19c0: 0x0400, 0x19c1: 0x0400, 0x19c2: 0x0400, 0x19c3: 0x0400, 0x19c4: 0x0004, 0x19c5: 0x0004,
+ 0x19e0: 0x0004, 0x19e1: 0x0004, 0x19e2: 0x0004, 0x19e3: 0x0004,
+ 0x19e4: 0x0004, 0x19e5: 0x0004, 0x19e6: 0x0004, 0x19e7: 0x0004, 0x19e8: 0x0004, 0x19e9: 0x0004,
+ 0x19ea: 0x0004, 0x19eb: 0x0004, 0x19ec: 0x0004, 0x19ed: 0x0004, 0x19ee: 0x0004, 0x19ef: 0x0004,
+ 0x19f0: 0x0004, 0x19f1: 0x0004,
+ 0x19ff: 0x0004,
+ // Block 0x68, offset 0x1a00
+ 0x1a26: 0x0004, 0x1a27: 0x0004, 0x1a28: 0x0004, 0x1a29: 0x0004,
+ 0x1a2a: 0x0004, 0x1a2b: 0x0004, 0x1a2c: 0x0004, 0x1a2d: 0x0004,
+ // Block 0x69, offset 0x1a40
+ 0x1a47: 0x0004, 0x1a48: 0x0004, 0x1a49: 0x0004, 0x1a4a: 0x0004, 0x1a4b: 0x0004,
+ 0x1a4c: 0x0004, 0x1a4d: 0x0004, 0x1a4e: 0x0004, 0x1a4f: 0x0004, 0x1a50: 0x0004, 0x1a51: 0x0004,
+ 0x1a52: 0x0400, 0x1a53: 0x0400,
+ 0x1a60: 0x0010, 0x1a61: 0x0010, 0x1a62: 0x0010, 0x1a63: 0x0010,
+ 0x1a64: 0x0010, 0x1a65: 0x0010, 0x1a66: 0x0010, 0x1a67: 0x0010, 0x1a68: 0x0010, 0x1a69: 0x0010,
+ 0x1a6a: 0x0010, 0x1a6b: 0x0010, 0x1a6c: 0x0010, 0x1a6d: 0x0010, 0x1a6e: 0x0010, 0x1a6f: 0x0010,
+ 0x1a70: 0x0010, 0x1a71: 0x0010, 0x1a72: 0x0010, 0x1a73: 0x0010, 0x1a74: 0x0010, 0x1a75: 0x0010,
+ 0x1a76: 0x0010, 0x1a77: 0x0010, 0x1a78: 0x0010, 0x1a79: 0x0010, 0x1a7a: 0x0010, 0x1a7b: 0x0010,
+ 0x1a7c: 0x0010,
+ // Block 0x6a, offset 0x1a80
+ 0x1a80: 0x0004, 0x1a81: 0x0004, 0x1a82: 0x0004, 0x1a83: 0x0400,
+ 0x1ab3: 0x0004, 0x1ab4: 0x0400, 0x1ab5: 0x0400,
+ 0x1ab6: 0x0004, 0x1ab7: 0x0004, 0x1ab8: 0x0004, 0x1ab9: 0x0004, 0x1aba: 0x0400, 0x1abb: 0x0400,
+ 0x1abc: 0x0004, 0x1abd: 0x0004, 0x1abe: 0x0400, 0x1abf: 0x0400,
+ // Block 0x6b, offset 0x1ac0
+ 0x1ac0: 0x0400,
+ 0x1ae5: 0x0004,
+ // Block 0x6c, offset 0x1b00
+ 0x1b29: 0x0004,
+ 0x1b2a: 0x0004, 0x1b2b: 0x0004, 0x1b2c: 0x0004, 0x1b2d: 0x0004, 0x1b2e: 0x0004, 0x1b2f: 0x0400,
+ 0x1b30: 0x0400, 0x1b31: 0x0004, 0x1b32: 0x0004, 0x1b33: 0x0400, 0x1b34: 0x0400, 0x1b35: 0x0004,
+ 0x1b36: 0x0004,
+ // Block 0x6d, offset 0x1b40
+ 0x1b43: 0x0004,
+ 0x1b4c: 0x0004, 0x1b4d: 0x0400,
+ 0x1b7c: 0x0004,
+ // Block 0x6e, offset 0x1b80
+ 0x1bb0: 0x0004, 0x1bb2: 0x0004, 0x1bb3: 0x0004, 0x1bb4: 0x0004,
+ 0x1bb7: 0x0004, 0x1bb8: 0x0004,
+ 0x1bbe: 0x0004, 0x1bbf: 0x0004,
+ // Block 0x6f, offset 0x1bc0
+ 0x1bc1: 0x0004,
+ 0x1beb: 0x0400, 0x1bec: 0x0004, 0x1bed: 0x0004, 0x1bee: 0x0400, 0x1bef: 0x0400,
+ 0x1bf5: 0x0400,
+ 0x1bf6: 0x0004,
+ // Block 0x70, offset 0x1c00
+ 0x1c23: 0x0400,
+ 0x1c24: 0x0400, 0x1c25: 0x0004, 0x1c26: 0x0400, 0x1c27: 0x0400, 0x1c28: 0x0004, 0x1c29: 0x0400,
+ 0x1c2a: 0x0400, 0x1c2c: 0x0400, 0x1c2d: 0x0004,
+ // Block 0x71, offset 0x1c40
+ 0x1c40: 0x0040, 0x1c41: 0x0080, 0x1c42: 0x0080, 0x1c43: 0x0080, 0x1c44: 0x0080, 0x1c45: 0x0080,
+ 0x1c46: 0x0080, 0x1c47: 0x0080, 0x1c48: 0x0080, 0x1c49: 0x0080, 0x1c4a: 0x0080, 0x1c4b: 0x0080,
+ 0x1c4c: 0x0080, 0x1c4d: 0x0080, 0x1c4e: 0x0080, 0x1c4f: 0x0080, 0x1c50: 0x0080, 0x1c51: 0x0080,
+ 0x1c52: 0x0080, 0x1c53: 0x0080, 0x1c54: 0x0080, 0x1c55: 0x0080, 0x1c56: 0x0080, 0x1c57: 0x0080,
+ 0x1c58: 0x0080, 0x1c59: 0x0080, 0x1c5a: 0x0080, 0x1c5b: 0x0080, 0x1c5c: 0x0040, 0x1c5d: 0x0080,
+ 0x1c5e: 0x0080, 0x1c5f: 0x0080, 0x1c60: 0x0080, 0x1c61: 0x0080, 0x1c62: 0x0080, 0x1c63: 0x0080,
+ 0x1c64: 0x0080, 0x1c65: 0x0080, 0x1c66: 0x0080, 0x1c67: 0x0080, 0x1c68: 0x0080, 0x1c69: 0x0080,
+ 0x1c6a: 0x0080, 0x1c6b: 0x0080, 0x1c6c: 0x0080, 0x1c6d: 0x0080, 0x1c6e: 0x0080, 0x1c6f: 0x0080,
+ 0x1c70: 0x0080, 0x1c71: 0x0080, 0x1c72: 0x0080, 0x1c73: 0x0080, 0x1c74: 0x0080, 0x1c75: 0x0080,
+ 0x1c76: 0x0080, 0x1c77: 0x0080, 0x1c78: 0x0040, 0x1c79: 0x0080, 0x1c7a: 0x0080, 0x1c7b: 0x0080,
+ 0x1c7c: 0x0080, 0x1c7d: 0x0080, 0x1c7e: 0x0080, 0x1c7f: 0x0080,
+ // Block 0x72, offset 0x1c80
+ 0x1c80: 0x0080, 0x1c81: 0x0080, 0x1c82: 0x0080, 0x1c83: 0x0080, 0x1c84: 0x0080, 0x1c85: 0x0080,
+ 0x1c86: 0x0080, 0x1c87: 0x0080, 0x1c88: 0x0080, 0x1c89: 0x0080, 0x1c8a: 0x0080, 0x1c8b: 0x0080,
+ 0x1c8c: 0x0080, 0x1c8d: 0x0080, 0x1c8e: 0x0080, 0x1c8f: 0x0080, 0x1c90: 0x0080, 0x1c91: 0x0080,
+ 0x1c92: 0x0080, 0x1c93: 0x0080, 0x1c94: 0x0040, 0x1c95: 0x0080, 0x1c96: 0x0080, 0x1c97: 0x0080,
+ 0x1c98: 0x0080, 0x1c99: 0x0080, 0x1c9a: 0x0080, 0x1c9b: 0x0080, 0x1c9c: 0x0080, 0x1c9d: 0x0080,
+ 0x1c9e: 0x0080, 0x1c9f: 0x0080, 0x1ca0: 0x0080, 0x1ca1: 0x0080, 0x1ca2: 0x0080, 0x1ca3: 0x0080,
+ 0x1ca4: 0x0080, 0x1ca5: 0x0080, 0x1ca6: 0x0080, 0x1ca7: 0x0080, 0x1ca8: 0x0080, 0x1ca9: 0x0080,
+ 0x1caa: 0x0080, 0x1cab: 0x0080, 0x1cac: 0x0080, 0x1cad: 0x0080, 0x1cae: 0x0080, 0x1caf: 0x0080,
+ 0x1cb0: 0x0040, 0x1cb1: 0x0080, 0x1cb2: 0x0080, 0x1cb3: 0x0080, 0x1cb4: 0x0080, 0x1cb5: 0x0080,
+ 0x1cb6: 0x0080, 0x1cb7: 0x0080, 0x1cb8: 0x0080, 0x1cb9: 0x0080, 0x1cba: 0x0080, 0x1cbb: 0x0080,
+ 0x1cbc: 0x0080, 0x1cbd: 0x0080, 0x1cbe: 0x0080, 0x1cbf: 0x0080,
+ // Block 0x73, offset 0x1cc0
+ 0x1cc0: 0x0080, 0x1cc1: 0x0080, 0x1cc2: 0x0080, 0x1cc3: 0x0080, 0x1cc4: 0x0080, 0x1cc5: 0x0080,
+ 0x1cc6: 0x0080, 0x1cc7: 0x0080, 0x1cc8: 0x0080, 0x1cc9: 0x0080, 0x1cca: 0x0080, 0x1ccb: 0x0080,
+ 0x1ccc: 0x0040, 0x1ccd: 0x0080, 0x1cce: 0x0080, 0x1ccf: 0x0080, 0x1cd0: 0x0080, 0x1cd1: 0x0080,
+ 0x1cd2: 0x0080, 0x1cd3: 0x0080, 0x1cd4: 0x0080, 0x1cd5: 0x0080, 0x1cd6: 0x0080, 0x1cd7: 0x0080,
+ 0x1cd8: 0x0080, 0x1cd9: 0x0080, 0x1cda: 0x0080, 0x1cdb: 0x0080, 0x1cdc: 0x0080, 0x1cdd: 0x0080,
+ 0x1cde: 0x0080, 0x1cdf: 0x0080, 0x1ce0: 0x0080, 0x1ce1: 0x0080, 0x1ce2: 0x0080, 0x1ce3: 0x0080,
+ 0x1ce4: 0x0080, 0x1ce5: 0x0080, 0x1ce6: 0x0080, 0x1ce7: 0x0080, 0x1ce8: 0x0040, 0x1ce9: 0x0080,
+ 0x1cea: 0x0080, 0x1ceb: 0x0080, 0x1cec: 0x0080, 0x1ced: 0x0080, 0x1cee: 0x0080, 0x1cef: 0x0080,
+ 0x1cf0: 0x0080, 0x1cf1: 0x0080, 0x1cf2: 0x0080, 0x1cf3: 0x0080, 0x1cf4: 0x0080, 0x1cf5: 0x0080,
+ 0x1cf6: 0x0080, 0x1cf7: 0x0080, 0x1cf8: 0x0080, 0x1cf9: 0x0080, 0x1cfa: 0x0080, 0x1cfb: 0x0080,
+ 0x1cfc: 0x0080, 0x1cfd: 0x0080, 0x1cfe: 0x0080, 0x1cff: 0x0080,
+ // Block 0x74, offset 0x1d00
+ 0x1d00: 0x0080, 0x1d01: 0x0080, 0x1d02: 0x0080, 0x1d03: 0x0080, 0x1d04: 0x0040, 0x1d05: 0x0080,
+ 0x1d06: 0x0080, 0x1d07: 0x0080, 0x1d08: 0x0080, 0x1d09: 0x0080, 0x1d0a: 0x0080, 0x1d0b: 0x0080,
+ 0x1d0c: 0x0080, 0x1d0d: 0x0080, 0x1d0e: 0x0080, 0x1d0f: 0x0080, 0x1d10: 0x0080, 0x1d11: 0x0080,
+ 0x1d12: 0x0080, 0x1d13: 0x0080, 0x1d14: 0x0080, 0x1d15: 0x0080, 0x1d16: 0x0080, 0x1d17: 0x0080,
+ 0x1d18: 0x0080, 0x1d19: 0x0080, 0x1d1a: 0x0080, 0x1d1b: 0x0080, 0x1d1c: 0x0080, 0x1d1d: 0x0080,
+ 0x1d1e: 0x0080, 0x1d1f: 0x0080, 0x1d20: 0x0040, 0x1d21: 0x0080, 0x1d22: 0x0080, 0x1d23: 0x0080,
+ 0x1d24: 0x0080, 0x1d25: 0x0080, 0x1d26: 0x0080, 0x1d27: 0x0080, 0x1d28: 0x0080, 0x1d29: 0x0080,
+ 0x1d2a: 0x0080, 0x1d2b: 0x0080, 0x1d2c: 0x0080, 0x1d2d: 0x0080, 0x1d2e: 0x0080, 0x1d2f: 0x0080,
+ 0x1d30: 0x0080, 0x1d31: 0x0080, 0x1d32: 0x0080, 0x1d33: 0x0080, 0x1d34: 0x0080, 0x1d35: 0x0080,
+ 0x1d36: 0x0080, 0x1d37: 0x0080, 0x1d38: 0x0080, 0x1d39: 0x0080, 0x1d3a: 0x0080, 0x1d3b: 0x0080,
+ 0x1d3c: 0x0040, 0x1d3d: 0x0080, 0x1d3e: 0x0080, 0x1d3f: 0x0080,
+ // Block 0x75, offset 0x1d40
+ 0x1d40: 0x0080, 0x1d41: 0x0080, 0x1d42: 0x0080, 0x1d43: 0x0080, 0x1d44: 0x0080, 0x1d45: 0x0080,
+ 0x1d46: 0x0080, 0x1d47: 0x0080, 0x1d48: 0x0080, 0x1d49: 0x0080, 0x1d4a: 0x0080, 0x1d4b: 0x0080,
+ 0x1d4c: 0x0080, 0x1d4d: 0x0080, 0x1d4e: 0x0080, 0x1d4f: 0x0080, 0x1d50: 0x0080, 0x1d51: 0x0080,
+ 0x1d52: 0x0080, 0x1d53: 0x0080, 0x1d54: 0x0080, 0x1d55: 0x0080, 0x1d56: 0x0080, 0x1d57: 0x0080,
+ 0x1d58: 0x0040, 0x1d59: 0x0080, 0x1d5a: 0x0080, 0x1d5b: 0x0080, 0x1d5c: 0x0080, 0x1d5d: 0x0080,
+ 0x1d5e: 0x0080, 0x1d5f: 0x0080, 0x1d60: 0x0080, 0x1d61: 0x0080, 0x1d62: 0x0080, 0x1d63: 0x0080,
+ 0x1d64: 0x0080, 0x1d65: 0x0080, 0x1d66: 0x0080, 0x1d67: 0x0080, 0x1d68: 0x0080, 0x1d69: 0x0080,
+ 0x1d6a: 0x0080, 0x1d6b: 0x0080, 0x1d6c: 0x0080, 0x1d6d: 0x0080, 0x1d6e: 0x0080, 0x1d6f: 0x0080,
+ 0x1d70: 0x0080, 0x1d71: 0x0080, 0x1d72: 0x0080, 0x1d73: 0x0080, 0x1d74: 0x0040, 0x1d75: 0x0080,
+ 0x1d76: 0x0080, 0x1d77: 0x0080, 0x1d78: 0x0080, 0x1d79: 0x0080, 0x1d7a: 0x0080, 0x1d7b: 0x0080,
+ 0x1d7c: 0x0080, 0x1d7d: 0x0080, 0x1d7e: 0x0080, 0x1d7f: 0x0080,
+ // Block 0x76, offset 0x1d80
+ 0x1d80: 0x0080, 0x1d81: 0x0080, 0x1d82: 0x0080, 0x1d83: 0x0080, 0x1d84: 0x0080, 0x1d85: 0x0080,
+ 0x1d86: 0x0080, 0x1d87: 0x0080, 0x1d88: 0x0080, 0x1d89: 0x0080, 0x1d8a: 0x0080, 0x1d8b: 0x0080,
+ 0x1d8c: 0x0080, 0x1d8d: 0x0080, 0x1d8e: 0x0080, 0x1d8f: 0x0080, 0x1d90: 0x0040, 0x1d91: 0x0080,
+ 0x1d92: 0x0080, 0x1d93: 0x0080, 0x1d94: 0x0080, 0x1d95: 0x0080, 0x1d96: 0x0080, 0x1d97: 0x0080,
+ 0x1d98: 0x0080, 0x1d99: 0x0080, 0x1d9a: 0x0080, 0x1d9b: 0x0080, 0x1d9c: 0x0080, 0x1d9d: 0x0080,
+ 0x1d9e: 0x0080, 0x1d9f: 0x0080, 0x1da0: 0x0080, 0x1da1: 0x0080, 0x1da2: 0x0080, 0x1da3: 0x0080,
+ 0x1da4: 0x0080, 0x1da5: 0x0080, 0x1da6: 0x0080, 0x1da7: 0x0080, 0x1da8: 0x0080, 0x1da9: 0x0080,
+ 0x1daa: 0x0080, 0x1dab: 0x0080, 0x1dac: 0x0040, 0x1dad: 0x0080, 0x1dae: 0x0080, 0x1daf: 0x0080,
+ 0x1db0: 0x0080, 0x1db1: 0x0080, 0x1db2: 0x0080, 0x1db3: 0x0080, 0x1db4: 0x0080, 0x1db5: 0x0080,
+ 0x1db6: 0x0080, 0x1db7: 0x0080, 0x1db8: 0x0080, 0x1db9: 0x0080, 0x1dba: 0x0080, 0x1dbb: 0x0080,
+ 0x1dbc: 0x0080, 0x1dbd: 0x0080, 0x1dbe: 0x0080, 0x1dbf: 0x0080,
+ // Block 0x77, offset 0x1dc0
+ 0x1dc0: 0x0080, 0x1dc1: 0x0080, 0x1dc2: 0x0080, 0x1dc3: 0x0080, 0x1dc4: 0x0080, 0x1dc5: 0x0080,
+ 0x1dc6: 0x0080, 0x1dc7: 0x0080, 0x1dc8: 0x0040, 0x1dc9: 0x0080, 0x1dca: 0x0080, 0x1dcb: 0x0080,
+ 0x1dcc: 0x0080, 0x1dcd: 0x0080, 0x1dce: 0x0080, 0x1dcf: 0x0080, 0x1dd0: 0x0080, 0x1dd1: 0x0080,
+ 0x1dd2: 0x0080, 0x1dd3: 0x0080, 0x1dd4: 0x0080, 0x1dd5: 0x0080, 0x1dd6: 0x0080, 0x1dd7: 0x0080,
+ 0x1dd8: 0x0080, 0x1dd9: 0x0080, 0x1dda: 0x0080, 0x1ddb: 0x0080, 0x1ddc: 0x0080, 0x1ddd: 0x0080,
+ 0x1dde: 0x0080, 0x1ddf: 0x0080, 0x1de0: 0x0080, 0x1de1: 0x0080, 0x1de2: 0x0080, 0x1de3: 0x0080,
+ 0x1de4: 0x0040, 0x1de5: 0x0080, 0x1de6: 0x0080, 0x1de7: 0x0080, 0x1de8: 0x0080, 0x1de9: 0x0080,
+ 0x1dea: 0x0080, 0x1deb: 0x0080, 0x1dec: 0x0080, 0x1ded: 0x0080, 0x1dee: 0x0080, 0x1def: 0x0080,
+ 0x1df0: 0x0080, 0x1df1: 0x0080, 0x1df2: 0x0080, 0x1df3: 0x0080, 0x1df4: 0x0080, 0x1df5: 0x0080,
+ 0x1df6: 0x0080, 0x1df7: 0x0080, 0x1df8: 0x0080, 0x1df9: 0x0080, 0x1dfa: 0x0080, 0x1dfb: 0x0080,
+ 0x1dfc: 0x0080, 0x1dfd: 0x0080, 0x1dfe: 0x0080, 0x1dff: 0x0080,
+ // Block 0x78, offset 0x1e00
+ 0x1e00: 0x0080, 0x1e01: 0x0080, 0x1e02: 0x0080, 0x1e03: 0x0080, 0x1e04: 0x0080, 0x1e05: 0x0080,
+ 0x1e06: 0x0080, 0x1e07: 0x0080, 0x1e08: 0x0040, 0x1e09: 0x0080, 0x1e0a: 0x0080, 0x1e0b: 0x0080,
+ 0x1e0c: 0x0080, 0x1e0d: 0x0080, 0x1e0e: 0x0080, 0x1e0f: 0x0080, 0x1e10: 0x0080, 0x1e11: 0x0080,
+ 0x1e12: 0x0080, 0x1e13: 0x0080, 0x1e14: 0x0080, 0x1e15: 0x0080, 0x1e16: 0x0080, 0x1e17: 0x0080,
+ 0x1e18: 0x0080, 0x1e19: 0x0080, 0x1e1a: 0x0080, 0x1e1b: 0x0080, 0x1e1c: 0x0080, 0x1e1d: 0x0080,
+ 0x1e1e: 0x0080, 0x1e1f: 0x0080, 0x1e20: 0x0080, 0x1e21: 0x0080, 0x1e22: 0x0080, 0x1e23: 0x0080,
+ 0x1e30: 0x1000, 0x1e31: 0x1000, 0x1e32: 0x1000, 0x1e33: 0x1000, 0x1e34: 0x1000, 0x1e35: 0x1000,
+ 0x1e36: 0x1000, 0x1e37: 0x1000, 0x1e38: 0x1000, 0x1e39: 0x1000, 0x1e3a: 0x1000, 0x1e3b: 0x1000,
+ 0x1e3c: 0x1000, 0x1e3d: 0x1000, 0x1e3e: 0x1000, 0x1e3f: 0x1000,
+ // Block 0x79, offset 0x1e40
+ 0x1e40: 0x1000, 0x1e41: 0x1000, 0x1e42: 0x1000, 0x1e43: 0x1000, 0x1e44: 0x1000, 0x1e45: 0x1000,
+ 0x1e46: 0x1000, 0x1e4b: 0x0800,
+ 0x1e4c: 0x0800, 0x1e4d: 0x0800, 0x1e4e: 0x0800, 0x1e4f: 0x0800, 0x1e50: 0x0800, 0x1e51: 0x0800,
+ 0x1e52: 0x0800, 0x1e53: 0x0800, 0x1e54: 0x0800, 0x1e55: 0x0800, 0x1e56: 0x0800, 0x1e57: 0x0800,
+ 0x1e58: 0x0800, 0x1e59: 0x0800, 0x1e5a: 0x0800, 0x1e5b: 0x0800, 0x1e5c: 0x0800, 0x1e5d: 0x0800,
+ 0x1e5e: 0x0800, 0x1e5f: 0x0800, 0x1e60: 0x0800, 0x1e61: 0x0800, 0x1e62: 0x0800, 0x1e63: 0x0800,
+ 0x1e64: 0x0800, 0x1e65: 0x0800, 0x1e66: 0x0800, 0x1e67: 0x0800, 0x1e68: 0x0800, 0x1e69: 0x0800,
+ 0x1e6a: 0x0800, 0x1e6b: 0x0800, 0x1e6c: 0x0800, 0x1e6d: 0x0800, 0x1e6e: 0x0800, 0x1e6f: 0x0800,
+ 0x1e70: 0x0800, 0x1e71: 0x0800, 0x1e72: 0x0800, 0x1e73: 0x0800, 0x1e74: 0x0800, 0x1e75: 0x0800,
+ 0x1e76: 0x0800, 0x1e77: 0x0800, 0x1e78: 0x0800, 0x1e79: 0x0800, 0x1e7a: 0x0800, 0x1e7b: 0x0800,
+ // Block 0x7a, offset 0x1e80
+ 0x1e9e: 0x0004,
+ // Block 0x7b, offset 0x1ec0
+ 0x1ec0: 0x0004, 0x1ec1: 0x0004, 0x1ec2: 0x0004, 0x1ec3: 0x0004, 0x1ec4: 0x0004, 0x1ec5: 0x0004,
+ 0x1ec6: 0x0004, 0x1ec7: 0x0004, 0x1ec8: 0x0004, 0x1ec9: 0x0004, 0x1eca: 0x0004, 0x1ecb: 0x0004,
+ 0x1ecc: 0x0004, 0x1ecd: 0x0004, 0x1ece: 0x0004, 0x1ecf: 0x0004,
+ 0x1ee0: 0x0004, 0x1ee1: 0x0004, 0x1ee2: 0x0004, 0x1ee3: 0x0004,
+ 0x1ee4: 0x0004, 0x1ee5: 0x0004, 0x1ee6: 0x0004, 0x1ee7: 0x0004, 0x1ee8: 0x0004, 0x1ee9: 0x0004,
+ 0x1eea: 0x0004, 0x1eeb: 0x0004, 0x1eec: 0x0004, 0x1eed: 0x0004, 0x1eee: 0x0004, 0x1eef: 0x0004,
+ // Block 0x7c, offset 0x1f00
+ 0x1f3f: 0x0002,
+ // Block 0x7d, offset 0x1f40
+ 0x1f70: 0x0002, 0x1f71: 0x0002, 0x1f72: 0x0002, 0x1f73: 0x0002, 0x1f74: 0x0002, 0x1f75: 0x0002,
+ 0x1f76: 0x0002, 0x1f77: 0x0002, 0x1f78: 0x0002, 0x1f79: 0x0002, 0x1f7a: 0x0002, 0x1f7b: 0x0002,
+ // Block 0x7e, offset 0x1f80
+ 0x1fbd: 0x0004,
+ // Block 0x7f, offset 0x1fc0
+ 0x1fe0: 0x0004,
+ // Block 0x80, offset 0x2000
+ 0x2036: 0x0004, 0x2037: 0x0004, 0x2038: 0x0004, 0x2039: 0x0004, 0x203a: 0x0004,
+ // Block 0x81, offset 0x2040
+ 0x2041: 0x0004, 0x2042: 0x0004, 0x2043: 0x0004, 0x2045: 0x0004,
+ 0x2046: 0x0004,
+ 0x204c: 0x0004, 0x204d: 0x0004, 0x204e: 0x0004, 0x204f: 0x0004,
+ 0x2078: 0x0004, 0x2079: 0x0004, 0x207a: 0x0004,
+ 0x207f: 0x0004,
+ // Block 0x82, offset 0x2080
+ 0x20a5: 0x0004, 0x20a6: 0x0004,
+ // Block 0x83, offset 0x20c0
+ 0x20e4: 0x0004, 0x20e5: 0x0004, 0x20e6: 0x0004, 0x20e7: 0x0004,
+ // Block 0x84, offset 0x2100
+ 0x212b: 0x0004, 0x212c: 0x0004,
+ // Block 0x85, offset 0x2140
+ 0x217d: 0x0004, 0x217e: 0x0004, 0x217f: 0x0004,
+ // Block 0x86, offset 0x2180
+ 0x2186: 0x0004, 0x2187: 0x0004, 0x2188: 0x0004, 0x2189: 0x0004, 0x218a: 0x0004, 0x218b: 0x0004,
+ 0x218c: 0x0004, 0x218d: 0x0004, 0x218e: 0x0004, 0x218f: 0x0004, 0x2190: 0x0004,
+ // Block 0x87, offset 0x21c0
+ 0x21c2: 0x0004, 0x21c3: 0x0004, 0x21c4: 0x0004, 0x21c5: 0x0004,
+ // Block 0x88, offset 0x2200
+ 0x2200: 0x0400, 0x2201: 0x0004, 0x2202: 0x0400,
+ 0x2238: 0x0004, 0x2239: 0x0004, 0x223a: 0x0004, 0x223b: 0x0004,
+ 0x223c: 0x0004, 0x223d: 0x0004, 0x223e: 0x0004, 0x223f: 0x0004,
+ // Block 0x89, offset 0x2240
+ 0x2240: 0x0004, 0x2241: 0x0004, 0x2242: 0x0004, 0x2243: 0x0004, 0x2244: 0x0004, 0x2245: 0x0004,
+ 0x2246: 0x0004,
+ 0x2270: 0x0004, 0x2273: 0x0004, 0x2274: 0x0004,
+ 0x227f: 0x0004,
+ // Block 0x8a, offset 0x2280
+ 0x2280: 0x0004, 0x2281: 0x0004, 0x2282: 0x0400,
+ 0x22b0: 0x0400, 0x22b1: 0x0400, 0x22b2: 0x0400, 0x22b3: 0x0004, 0x22b4: 0x0004, 0x22b5: 0x0004,
+ 0x22b6: 0x0004, 0x22b7: 0x0400, 0x22b8: 0x0400, 0x22b9: 0x0004, 0x22ba: 0x0004,
+ 0x22bd: 0x0100,
+ // Block 0x8b, offset 0x22c0
+ 0x22c2: 0x0004,
+ 0x22cd: 0x0100,
+ // Block 0x8c, offset 0x2300
+ 0x2300: 0x0004, 0x2301: 0x0004, 0x2302: 0x0004,
+ 0x2327: 0x0004, 0x2328: 0x0004, 0x2329: 0x0004,
+ 0x232a: 0x0004, 0x232b: 0x0004, 0x232c: 0x0400, 0x232d: 0x0004, 0x232e: 0x0004, 0x232f: 0x0004,
+ 0x2330: 0x0004, 0x2331: 0x0004, 0x2332: 0x0004, 0x2333: 0x0004, 0x2334: 0x0004,
+ // Block 0x8d, offset 0x2340
+ 0x2345: 0x0400,
+ 0x2346: 0x0400,
+ 0x2373: 0x0004,
+ // Block 0x8e, offset 0x2380
+ 0x2380: 0x0004, 0x2381: 0x0004, 0x2382: 0x0400,
+ 0x23b3: 0x0400, 0x23b4: 0x0400, 0x23b5: 0x0400,
+ 0x23b6: 0x0004, 0x23b7: 0x0004, 0x23b8: 0x0004, 0x23b9: 0x0004, 0x23ba: 0x0004, 0x23bb: 0x0004,
+ 0x23bc: 0x0004, 0x23bd: 0x0004, 0x23be: 0x0004, 0x23bf: 0x0400,
+ // Block 0x8f, offset 0x23c0
+ 0x23c0: 0x0400, 0x23c2: 0x0100, 0x23c3: 0x0100,
+ 0x23c9: 0x0004, 0x23ca: 0x0004, 0x23cb: 0x0004,
+ 0x23cc: 0x0004, 0x23ce: 0x0400, 0x23cf: 0x0004,
+ // Block 0x90, offset 0x2400
+ 0x242c: 0x0400, 0x242d: 0x0400, 0x242e: 0x0400, 0x242f: 0x0004,
+ 0x2430: 0x0004, 0x2431: 0x0004, 0x2432: 0x0400, 0x2433: 0x0400, 0x2434: 0x0004, 0x2435: 0x0400,
+ 0x2436: 0x0004, 0x2437: 0x0004,
+ 0x243e: 0x0004,
+ // Block 0x91, offset 0x2440
+ 0x2441: 0x0004,
+ // Block 0x92, offset 0x2480
+ 0x249f: 0x0004, 0x24a0: 0x0400, 0x24a1: 0x0400, 0x24a2: 0x0400, 0x24a3: 0x0004,
+ 0x24a4: 0x0004, 0x24a5: 0x0004, 0x24a6: 0x0004, 0x24a7: 0x0004, 0x24a8: 0x0004, 0x24a9: 0x0004,
+ 0x24aa: 0x0004,
+ // Block 0x93, offset 0x24c0
+ 0x24c0: 0x0004, 0x24c1: 0x0400, 0x24c2: 0x0400, 0x24c3: 0x0400, 0x24c4: 0x0400,
+ 0x24c7: 0x0400, 0x24c8: 0x0400, 0x24cb: 0x0400,
+ 0x24cc: 0x0400, 0x24cd: 0x0400,
+ 0x24d7: 0x0004,
+ 0x24e2: 0x0400, 0x24e3: 0x0400,
+ 0x24e6: 0x0004, 0x24e7: 0x0004, 0x24e8: 0x0004, 0x24e9: 0x0004,
+ 0x24ea: 0x0004, 0x24eb: 0x0004, 0x24ec: 0x0004,
+ 0x24f0: 0x0004, 0x24f1: 0x0004, 0x24f2: 0x0004, 0x24f3: 0x0004, 0x24f4: 0x0004,
+ // Block 0x94, offset 0x2500
+ 0x2535: 0x0400,
+ 0x2536: 0x0400, 0x2537: 0x0400, 0x2538: 0x0004, 0x2539: 0x0004, 0x253a: 0x0004, 0x253b: 0x0004,
+ 0x253c: 0x0004, 0x253d: 0x0004, 0x253e: 0x0004, 0x253f: 0x0004,
+ // Block 0x95, offset 0x2540
+ 0x2540: 0x0400, 0x2541: 0x0400, 0x2542: 0x0004, 0x2543: 0x0004, 0x2544: 0x0004, 0x2545: 0x0400,
+ 0x2546: 0x0004,
+ 0x255e: 0x0004,
+ // Block 0x96, offset 0x2580
+ 0x25b0: 0x0004, 0x25b1: 0x0400, 0x25b2: 0x0400, 0x25b3: 0x0004, 0x25b4: 0x0004, 0x25b5: 0x0004,
+ 0x25b6: 0x0004, 0x25b7: 0x0004, 0x25b8: 0x0004, 0x25b9: 0x0400, 0x25ba: 0x0004, 0x25bb: 0x0400,
+ 0x25bc: 0x0400, 0x25bd: 0x0004, 0x25be: 0x0400, 0x25bf: 0x0004,
+ // Block 0x97, offset 0x25c0
+ 0x25c0: 0x0004, 0x25c1: 0x0400, 0x25c2: 0x0004, 0x25c3: 0x0004,
+ // Block 0x98, offset 0x2600
+ 0x262f: 0x0004,
+ 0x2630: 0x0400, 0x2631: 0x0400, 0x2632: 0x0004, 0x2633: 0x0004, 0x2634: 0x0004, 0x2635: 0x0004,
+ 0x2638: 0x0400, 0x2639: 0x0400, 0x263a: 0x0400, 0x263b: 0x0400,
+ 0x263c: 0x0004, 0x263d: 0x0004, 0x263e: 0x0400, 0x263f: 0x0004,
+ // Block 0x99, offset 0x2640
+ 0x2640: 0x0004,
+ 0x265c: 0x0004, 0x265d: 0x0004,
+ // Block 0x9a, offset 0x2680
+ 0x26b0: 0x0400, 0x26b1: 0x0400, 0x26b2: 0x0400, 0x26b3: 0x0004, 0x26b4: 0x0004, 0x26b5: 0x0004,
+ 0x26b6: 0x0004, 0x26b7: 0x0004, 0x26b8: 0x0004, 0x26b9: 0x0004, 0x26ba: 0x0004, 0x26bb: 0x0400,
+ 0x26bc: 0x0400, 0x26bd: 0x0004, 0x26be: 0x0400, 0x26bf: 0x0004,
+ // Block 0x9b, offset 0x26c0
+ 0x26c0: 0x0004,
+ // Block 0x9c, offset 0x2700
+ 0x272b: 0x0004, 0x272c: 0x0400, 0x272d: 0x0004, 0x272e: 0x0400, 0x272f: 0x0400,
+ 0x2730: 0x0004, 0x2731: 0x0004, 0x2732: 0x0004, 0x2733: 0x0004, 0x2734: 0x0004, 0x2735: 0x0004,
+ 0x2736: 0x0400, 0x2737: 0x0004,
+ // Block 0x9d, offset 0x2740
+ 0x275d: 0x0004,
+ 0x275e: 0x0004, 0x275f: 0x0004, 0x2762: 0x0004, 0x2763: 0x0004,
+ 0x2764: 0x0004, 0x2765: 0x0004, 0x2766: 0x0400, 0x2767: 0x0004, 0x2768: 0x0004, 0x2769: 0x0004,
+ 0x276a: 0x0004, 0x276b: 0x0004,
+ // Block 0x9e, offset 0x2780
+ 0x27ac: 0x0400, 0x27ad: 0x0400, 0x27ae: 0x0400, 0x27af: 0x0004,
+ 0x27b0: 0x0004, 0x27b1: 0x0004, 0x27b2: 0x0004, 0x27b3: 0x0004, 0x27b4: 0x0004, 0x27b5: 0x0004,
+ 0x27b6: 0x0004, 0x27b7: 0x0004, 0x27b8: 0x0400, 0x27b9: 0x0004, 0x27ba: 0x0004,
+ // Block 0x9f, offset 0x27c0
+ 0x27f0: 0x0004, 0x27f1: 0x0400, 0x27f2: 0x0400, 0x27f3: 0x0400, 0x27f4: 0x0400, 0x27f5: 0x0400,
+ 0x27f7: 0x0400, 0x27f8: 0x0400, 0x27fb: 0x0004,
+ 0x27fc: 0x0004, 0x27fd: 0x0400, 0x27fe: 0x0004, 0x27ff: 0x0100,
+ // Block 0xa0, offset 0x2800
+ 0x2800: 0x0400, 0x2801: 0x0100, 0x2802: 0x0400, 0x2803: 0x0004,
+ // Block 0xa1, offset 0x2840
+ 0x2851: 0x0400,
+ 0x2852: 0x0400, 0x2853: 0x0400, 0x2854: 0x0004, 0x2855: 0x0004, 0x2856: 0x0004, 0x2857: 0x0004,
+ 0x285a: 0x0004, 0x285b: 0x0004, 0x285c: 0x0400, 0x285d: 0x0400,
+ 0x285e: 0x0400, 0x285f: 0x0400, 0x2860: 0x0004,
+ 0x2864: 0x0400,
+ // Block 0xa2, offset 0x2880
+ 0x2881: 0x0004, 0x2882: 0x0004, 0x2883: 0x0004, 0x2884: 0x0004, 0x2885: 0x0004,
+ 0x2886: 0x0004, 0x2887: 0x0004, 0x2888: 0x0004, 0x2889: 0x0004, 0x288a: 0x0004,
+ 0x28b3: 0x0004, 0x28b4: 0x0004, 0x28b5: 0x0004,
+ 0x28b6: 0x0004, 0x28b7: 0x0004, 0x28b8: 0x0004, 0x28b9: 0x0400, 0x28ba: 0x0100, 0x28bb: 0x0004,
+ 0x28bc: 0x0004, 0x28bd: 0x0004, 0x28be: 0x0004,
+ // Block 0xa3, offset 0x28c0
+ 0x28c7: 0x0004,
+ 0x28d1: 0x0004,
+ 0x28d2: 0x0004, 0x28d3: 0x0004, 0x28d4: 0x0004, 0x28d5: 0x0004, 0x28d6: 0x0004, 0x28d7: 0x0400,
+ 0x28d8: 0x0400, 0x28d9: 0x0004, 0x28da: 0x0004, 0x28db: 0x0004,
+ // Block 0xa4, offset 0x2900
+ 0x2904: 0x0100, 0x2905: 0x0100,
+ 0x2906: 0x0100, 0x2907: 0x0100, 0x2908: 0x0100, 0x2909: 0x0100, 0x290a: 0x0004, 0x290b: 0x0004,
+ 0x290c: 0x0004, 0x290d: 0x0004, 0x290e: 0x0004, 0x290f: 0x0004, 0x2910: 0x0004, 0x2911: 0x0004,
+ 0x2912: 0x0004, 0x2913: 0x0004, 0x2914: 0x0004, 0x2915: 0x0004, 0x2916: 0x0004, 0x2917: 0x0400,
+ 0x2918: 0x0004, 0x2919: 0x0004,
+ // Block 0xa5, offset 0x2940
+ 0x296f: 0x0400,
+ 0x2970: 0x0004, 0x2971: 0x0004, 0x2972: 0x0004, 0x2973: 0x0004, 0x2974: 0x0004, 0x2975: 0x0004,
+ 0x2976: 0x0004, 0x2978: 0x0004, 0x2979: 0x0004, 0x297a: 0x0004, 0x297b: 0x0004,
+ 0x297c: 0x0004, 0x297d: 0x0004, 0x297e: 0x0400, 0x297f: 0x0004,
+ // Block 0xa6, offset 0x2980
+ 0x2992: 0x0004, 0x2993: 0x0004, 0x2994: 0x0004, 0x2995: 0x0004, 0x2996: 0x0004, 0x2997: 0x0004,
+ 0x2998: 0x0004, 0x2999: 0x0004, 0x299a: 0x0004, 0x299b: 0x0004, 0x299c: 0x0004, 0x299d: 0x0004,
+ 0x299e: 0x0004, 0x299f: 0x0004, 0x29a0: 0x0004, 0x29a1: 0x0004, 0x29a2: 0x0004, 0x29a3: 0x0004,
+ 0x29a4: 0x0004, 0x29a5: 0x0004, 0x29a6: 0x0004, 0x29a7: 0x0004, 0x29a9: 0x0400,
+ 0x29aa: 0x0004, 0x29ab: 0x0004, 0x29ac: 0x0004, 0x29ad: 0x0004, 0x29ae: 0x0004, 0x29af: 0x0004,
+ 0x29b0: 0x0004, 0x29b1: 0x0400, 0x29b2: 0x0004, 0x29b3: 0x0004, 0x29b4: 0x0400, 0x29b5: 0x0004,
+ 0x29b6: 0x0004,
+ // Block 0xa7, offset 0x29c0
+ 0x29f1: 0x0004, 0x29f2: 0x0004, 0x29f3: 0x0004, 0x29f4: 0x0004, 0x29f5: 0x0004,
+ 0x29f6: 0x0004, 0x29fa: 0x0004,
+ 0x29fc: 0x0004, 0x29fd: 0x0004, 0x29ff: 0x0004,
+ // Block 0xa8, offset 0x2a00
+ 0x2a00: 0x0004, 0x2a01: 0x0004, 0x2a02: 0x0004, 0x2a03: 0x0004, 0x2a04: 0x0004, 0x2a05: 0x0004,
+ 0x2a06: 0x0100, 0x2a07: 0x0004,
+ // Block 0xa9, offset 0x2a40
+ 0x2a4a: 0x0400, 0x2a4b: 0x0400,
+ 0x2a4c: 0x0400, 0x2a4d: 0x0400, 0x2a4e: 0x0400, 0x2a50: 0x0004, 0x2a51: 0x0004,
+ 0x2a53: 0x0400, 0x2a54: 0x0400, 0x2a55: 0x0004, 0x2a56: 0x0400, 0x2a57: 0x0004,
+ // Block 0xaa, offset 0x2a80
+ 0x2ab3: 0x0004, 0x2ab4: 0x0004, 0x2ab5: 0x0400,
+ 0x2ab6: 0x0400,
+ // Block 0xab, offset 0x2ac0
+ 0x2ac0: 0x0004, 0x2ac1: 0x0004, 0x2ac2: 0x0100, 0x2ac3: 0x0400,
+ 0x2af4: 0x0400, 0x2af5: 0x0400,
+ 0x2af6: 0x0004, 0x2af7: 0x0004, 0x2af8: 0x0004, 0x2af9: 0x0004, 0x2afa: 0x0004,
+ 0x2afe: 0x0400, 0x2aff: 0x0400,
+ // Block 0xac, offset 0x2b00
+ 0x2b00: 0x0004, 0x2b01: 0x0400, 0x2b02: 0x0004,
+ // Block 0xad, offset 0x2b40
+ 0x2b70: 0x0002, 0x2b71: 0x0002, 0x2b72: 0x0002, 0x2b73: 0x0002, 0x2b74: 0x0002, 0x2b75: 0x0002,
+ 0x2b76: 0x0002, 0x2b77: 0x0002, 0x2b78: 0x0002, 0x2b79: 0x0002, 0x2b7a: 0x0002, 0x2b7b: 0x0002,
+ 0x2b7c: 0x0002, 0x2b7d: 0x0002, 0x2b7e: 0x0002, 0x2b7f: 0x0002,
+ // Block 0xae, offset 0x2b80
+ 0x2b80: 0x0004,
+ 0x2b87: 0x0004, 0x2b88: 0x0004, 0x2b89: 0x0004, 0x2b8a: 0x0004, 0x2b8b: 0x0004,
+ 0x2b8c: 0x0004, 0x2b8d: 0x0004, 0x2b8e: 0x0004, 0x2b8f: 0x0004, 0x2b90: 0x0004, 0x2b91: 0x0004,
+ 0x2b92: 0x0004, 0x2b93: 0x0004, 0x2b94: 0x0004, 0x2b95: 0x0004,
+ // Block 0xaf, offset 0x2bc0
+ 0x2bf0: 0x0004, 0x2bf1: 0x0004, 0x2bf2: 0x0004, 0x2bf3: 0x0004, 0x2bf4: 0x0004,
+ // Block 0xb0, offset 0x2c00
+ 0x2c30: 0x0004, 0x2c31: 0x0004, 0x2c32: 0x0004, 0x2c33: 0x0004, 0x2c34: 0x0004, 0x2c35: 0x0004,
+ 0x2c36: 0x0004,
+ // Block 0xb1, offset 0x2c40
+ 0x2c4f: 0x0004, 0x2c51: 0x0400,
+ 0x2c52: 0x0400, 0x2c53: 0x0400, 0x2c54: 0x0400, 0x2c55: 0x0400, 0x2c56: 0x0400, 0x2c57: 0x0400,
+ 0x2c58: 0x0400, 0x2c59: 0x0400, 0x2c5a: 0x0400, 0x2c5b: 0x0400, 0x2c5c: 0x0400, 0x2c5d: 0x0400,
+ 0x2c5e: 0x0400, 0x2c5f: 0x0400, 0x2c60: 0x0400, 0x2c61: 0x0400, 0x2c62: 0x0400, 0x2c63: 0x0400,
+ 0x2c64: 0x0400, 0x2c65: 0x0400, 0x2c66: 0x0400, 0x2c67: 0x0400, 0x2c68: 0x0400, 0x2c69: 0x0400,
+ 0x2c6a: 0x0400, 0x2c6b: 0x0400, 0x2c6c: 0x0400, 0x2c6d: 0x0400, 0x2c6e: 0x0400, 0x2c6f: 0x0400,
+ 0x2c70: 0x0400, 0x2c71: 0x0400, 0x2c72: 0x0400, 0x2c73: 0x0400, 0x2c74: 0x0400, 0x2c75: 0x0400,
+ 0x2c76: 0x0400, 0x2c77: 0x0400, 0x2c78: 0x0400, 0x2c79: 0x0400, 0x2c7a: 0x0400, 0x2c7b: 0x0400,
+ 0x2c7c: 0x0400, 0x2c7d: 0x0400, 0x2c7e: 0x0400, 0x2c7f: 0x0400,
+ // Block 0xb2, offset 0x2c80
+ 0x2c80: 0x0400, 0x2c81: 0x0400, 0x2c82: 0x0400, 0x2c83: 0x0400, 0x2c84: 0x0400, 0x2c85: 0x0400,
+ 0x2c86: 0x0400, 0x2c87: 0x0400,
+ 0x2c8f: 0x0004, 0x2c90: 0x0004, 0x2c91: 0x0004,
+ 0x2c92: 0x0004,
+ // Block 0xb3, offset 0x2cc0
+ 0x2ce4: 0x0004,
+ 0x2cf0: 0x0400, 0x2cf1: 0x0400,
+ // Block 0xb4, offset 0x2d00
+ 0x2d1d: 0x0004,
+ 0x2d1e: 0x0004, 0x2d20: 0x0002, 0x2d21: 0x0002, 0x2d22: 0x0002, 0x2d23: 0x0002,
+ // Block 0xb5, offset 0x2d40
+ 0x2d40: 0x0004, 0x2d41: 0x0004, 0x2d42: 0x0004, 0x2d43: 0x0004, 0x2d44: 0x0004, 0x2d45: 0x0004,
+ 0x2d46: 0x0004, 0x2d47: 0x0004, 0x2d48: 0x0004, 0x2d49: 0x0004, 0x2d4a: 0x0004, 0x2d4b: 0x0004,
+ 0x2d4c: 0x0004, 0x2d4d: 0x0004, 0x2d4e: 0x0004, 0x2d4f: 0x0004, 0x2d50: 0x0004, 0x2d51: 0x0004,
+ 0x2d52: 0x0004, 0x2d53: 0x0004, 0x2d54: 0x0004, 0x2d55: 0x0004, 0x2d56: 0x0004, 0x2d57: 0x0004,
+ 0x2d58: 0x0004, 0x2d59: 0x0004, 0x2d5a: 0x0004, 0x2d5b: 0x0004, 0x2d5c: 0x0004, 0x2d5d: 0x0004,
+ 0x2d5e: 0x0004, 0x2d5f: 0x0004, 0x2d60: 0x0004, 0x2d61: 0x0004, 0x2d62: 0x0004, 0x2d63: 0x0004,
+ 0x2d64: 0x0004, 0x2d65: 0x0004, 0x2d66: 0x0004, 0x2d67: 0x0004, 0x2d68: 0x0004, 0x2d69: 0x0004,
+ 0x2d6a: 0x0004, 0x2d6b: 0x0004, 0x2d6c: 0x0004, 0x2d6d: 0x0004,
+ 0x2d70: 0x0004, 0x2d71: 0x0004, 0x2d72: 0x0004, 0x2d73: 0x0004, 0x2d74: 0x0004, 0x2d75: 0x0004,
+ 0x2d76: 0x0004, 0x2d77: 0x0004, 0x2d78: 0x0004, 0x2d79: 0x0004, 0x2d7a: 0x0004, 0x2d7b: 0x0004,
+ 0x2d7c: 0x0004, 0x2d7d: 0x0004, 0x2d7e: 0x0004, 0x2d7f: 0x0004,
+ // Block 0xb6, offset 0x2d80
+ 0x2d80: 0x0004, 0x2d81: 0x0004, 0x2d82: 0x0004, 0x2d83: 0x0004, 0x2d84: 0x0004, 0x2d85: 0x0004,
+ 0x2d86: 0x0004,
+ // Block 0xb7, offset 0x2dc0
+ 0x2de5: 0x0004, 0x2de6: 0x0400, 0x2de7: 0x0004, 0x2de8: 0x0004, 0x2de9: 0x0004,
+ 0x2ded: 0x0400, 0x2dee: 0x0004, 0x2def: 0x0004,
+ 0x2df0: 0x0004, 0x2df1: 0x0004, 0x2df2: 0x0004, 0x2df3: 0x0002, 0x2df4: 0x0002, 0x2df5: 0x0002,
+ 0x2df6: 0x0002, 0x2df7: 0x0002, 0x2df8: 0x0002, 0x2df9: 0x0002, 0x2dfa: 0x0002, 0x2dfb: 0x0004,
+ 0x2dfc: 0x0004, 0x2dfd: 0x0004, 0x2dfe: 0x0004, 0x2dff: 0x0004,
+ // Block 0xb8, offset 0x2e00
+ 0x2e00: 0x0004, 0x2e01: 0x0004, 0x2e02: 0x0004, 0x2e05: 0x0004,
+ 0x2e06: 0x0004, 0x2e07: 0x0004, 0x2e08: 0x0004, 0x2e09: 0x0004, 0x2e0a: 0x0004, 0x2e0b: 0x0004,
+ 0x2e2a: 0x0004, 0x2e2b: 0x0004, 0x2e2c: 0x0004, 0x2e2d: 0x0004,
+ // Block 0xb9, offset 0x2e40
+ 0x2e42: 0x0004, 0x2e43: 0x0004, 0x2e44: 0x0004,
+ // Block 0xba, offset 0x2e80
+ 0x2e80: 0x0004, 0x2e81: 0x0004, 0x2e82: 0x0004, 0x2e83: 0x0004, 0x2e84: 0x0004, 0x2e85: 0x0004,
+ 0x2e86: 0x0004, 0x2e87: 0x0004, 0x2e88: 0x0004, 0x2e89: 0x0004, 0x2e8a: 0x0004, 0x2e8b: 0x0004,
+ 0x2e8c: 0x0004, 0x2e8d: 0x0004, 0x2e8e: 0x0004, 0x2e8f: 0x0004, 0x2e90: 0x0004, 0x2e91: 0x0004,
+ 0x2e92: 0x0004, 0x2e93: 0x0004, 0x2e94: 0x0004, 0x2e95: 0x0004, 0x2e96: 0x0004, 0x2e97: 0x0004,
+ 0x2e98: 0x0004, 0x2e99: 0x0004, 0x2e9a: 0x0004, 0x2e9b: 0x0004, 0x2e9c: 0x0004, 0x2e9d: 0x0004,
+ 0x2e9e: 0x0004, 0x2e9f: 0x0004, 0x2ea0: 0x0004, 0x2ea1: 0x0004, 0x2ea2: 0x0004, 0x2ea3: 0x0004,
+ 0x2ea4: 0x0004, 0x2ea5: 0x0004, 0x2ea6: 0x0004, 0x2ea7: 0x0004, 0x2ea8: 0x0004, 0x2ea9: 0x0004,
+ 0x2eaa: 0x0004, 0x2eab: 0x0004, 0x2eac: 0x0004, 0x2ead: 0x0004, 0x2eae: 0x0004, 0x2eaf: 0x0004,
+ 0x2eb0: 0x0004, 0x2eb1: 0x0004, 0x2eb2: 0x0004, 0x2eb3: 0x0004, 0x2eb4: 0x0004, 0x2eb5: 0x0004,
+ 0x2eb6: 0x0004, 0x2ebb: 0x0004,
+ 0x2ebc: 0x0004, 0x2ebd: 0x0004, 0x2ebe: 0x0004, 0x2ebf: 0x0004,
+ // Block 0xbb, offset 0x2ec0
+ 0x2ec0: 0x0004, 0x2ec1: 0x0004, 0x2ec2: 0x0004, 0x2ec3: 0x0004, 0x2ec4: 0x0004, 0x2ec5: 0x0004,
+ 0x2ec6: 0x0004, 0x2ec7: 0x0004, 0x2ec8: 0x0004, 0x2ec9: 0x0004, 0x2eca: 0x0004, 0x2ecb: 0x0004,
+ 0x2ecc: 0x0004, 0x2ecd: 0x0004, 0x2ece: 0x0004, 0x2ecf: 0x0004, 0x2ed0: 0x0004, 0x2ed1: 0x0004,
+ 0x2ed2: 0x0004, 0x2ed3: 0x0004, 0x2ed4: 0x0004, 0x2ed5: 0x0004, 0x2ed6: 0x0004, 0x2ed7: 0x0004,
+ 0x2ed8: 0x0004, 0x2ed9: 0x0004, 0x2eda: 0x0004, 0x2edb: 0x0004, 0x2edc: 0x0004, 0x2edd: 0x0004,
+ 0x2ede: 0x0004, 0x2edf: 0x0004, 0x2ee0: 0x0004, 0x2ee1: 0x0004, 0x2ee2: 0x0004, 0x2ee3: 0x0004,
+ 0x2ee4: 0x0004, 0x2ee5: 0x0004, 0x2ee6: 0x0004, 0x2ee7: 0x0004, 0x2ee8: 0x0004, 0x2ee9: 0x0004,
+ 0x2eea: 0x0004, 0x2eeb: 0x0004, 0x2eec: 0x0004,
+ 0x2ef5: 0x0004,
+ // Block 0xbc, offset 0x2f00
+ 0x2f04: 0x0004,
+ 0x2f1b: 0x0004, 0x2f1c: 0x0004, 0x2f1d: 0x0004,
+ 0x2f1e: 0x0004, 0x2f1f: 0x0004, 0x2f21: 0x0004, 0x2f22: 0x0004, 0x2f23: 0x0004,
+ 0x2f24: 0x0004, 0x2f25: 0x0004, 0x2f26: 0x0004, 0x2f27: 0x0004, 0x2f28: 0x0004, 0x2f29: 0x0004,
+ 0x2f2a: 0x0004, 0x2f2b: 0x0004, 0x2f2c: 0x0004, 0x2f2d: 0x0004, 0x2f2e: 0x0004, 0x2f2f: 0x0004,
+ // Block 0xbd, offset 0x2f40
+ 0x2f40: 0x0004, 0x2f41: 0x0004, 0x2f42: 0x0004, 0x2f43: 0x0004, 0x2f44: 0x0004, 0x2f45: 0x0004,
+ 0x2f46: 0x0004, 0x2f48: 0x0004, 0x2f49: 0x0004, 0x2f4a: 0x0004, 0x2f4b: 0x0004,
+ 0x2f4c: 0x0004, 0x2f4d: 0x0004, 0x2f4e: 0x0004, 0x2f4f: 0x0004, 0x2f50: 0x0004, 0x2f51: 0x0004,
+ 0x2f52: 0x0004, 0x2f53: 0x0004, 0x2f54: 0x0004, 0x2f55: 0x0004, 0x2f56: 0x0004, 0x2f57: 0x0004,
+ 0x2f58: 0x0004, 0x2f5b: 0x0004, 0x2f5c: 0x0004, 0x2f5d: 0x0004,
+ 0x2f5e: 0x0004, 0x2f5f: 0x0004, 0x2f60: 0x0004, 0x2f61: 0x0004, 0x2f63: 0x0004,
+ 0x2f64: 0x0004, 0x2f66: 0x0004, 0x2f67: 0x0004, 0x2f68: 0x0004, 0x2f69: 0x0004,
+ 0x2f6a: 0x0004,
+ // Block 0xbe, offset 0x2f80
+ 0x2f8f: 0x0004,
+ // Block 0xbf, offset 0x2fc0
+ 0x2fee: 0x0004,
+ // Block 0xc0, offset 0x3000
+ 0x302c: 0x0004, 0x302d: 0x0004, 0x302e: 0x0004, 0x302f: 0x0004,
+ // Block 0xc1, offset 0x3040
+ 0x3050: 0x0004, 0x3051: 0x0004,
+ 0x3052: 0x0004, 0x3053: 0x0004, 0x3054: 0x0004, 0x3055: 0x0004, 0x3056: 0x0004,
+ // Block 0xc2, offset 0x3080
+ 0x3084: 0x0004, 0x3085: 0x0004,
+ 0x3086: 0x0004, 0x3087: 0x0004, 0x3088: 0x0004, 0x3089: 0x0004, 0x308a: 0x0004,
+ // Block 0xc3, offset 0x30c0
+ 0x30cd: 0x0008, 0x30ce: 0x0008, 0x30cf: 0x0008,
+ 0x30ef: 0x0008,
+ // Block 0xc4, offset 0x3100
+ 0x312c: 0x0008, 0x312d: 0x0008, 0x312e: 0x0008, 0x312f: 0x0008,
+ 0x3130: 0x0008, 0x3131: 0x0008,
+ 0x313e: 0x0008, 0x313f: 0x0008,
+ // Block 0xc5, offset 0x3140
+ 0x314e: 0x0008, 0x3151: 0x0008,
+ 0x3152: 0x0008, 0x3153: 0x0008, 0x3154: 0x0008, 0x3155: 0x0008, 0x3156: 0x0008, 0x3157: 0x0008,
+ 0x3158: 0x0008, 0x3159: 0x0008, 0x315a: 0x0008,
+ 0x316d: 0x0008, 0x316e: 0x0008, 0x316f: 0x0008,
+ 0x3170: 0x0008, 0x3171: 0x0008, 0x3172: 0x0008, 0x3173: 0x0008, 0x3174: 0x0008, 0x3175: 0x0008,
+ 0x3176: 0x0008, 0x3177: 0x0008, 0x3178: 0x0008, 0x3179: 0x0008, 0x317a: 0x0008, 0x317b: 0x0008,
+ 0x317c: 0x0008, 0x317d: 0x0008, 0x317e: 0x0008, 0x317f: 0x0008,
+ // Block 0xc6, offset 0x3180
+ 0x3180: 0x0008, 0x3181: 0x0008, 0x3182: 0x0008, 0x3183: 0x0008, 0x3184: 0x0008, 0x3185: 0x0008,
+ 0x3186: 0x0008, 0x3187: 0x0008, 0x3188: 0x0008, 0x3189: 0x0008, 0x318a: 0x0008, 0x318b: 0x0008,
+ 0x318c: 0x0008, 0x318d: 0x0008, 0x318e: 0x0008, 0x318f: 0x0008, 0x3190: 0x0008, 0x3191: 0x0008,
+ 0x3192: 0x0008, 0x3193: 0x0008, 0x3194: 0x0008, 0x3195: 0x0008, 0x3196: 0x0008, 0x3197: 0x0008,
+ 0x3198: 0x0008, 0x3199: 0x0008, 0x319a: 0x0008, 0x319b: 0x0008, 0x319c: 0x0008, 0x319d: 0x0008,
+ 0x319e: 0x0008, 0x319f: 0x0008, 0x31a0: 0x0008, 0x31a1: 0x0008, 0x31a2: 0x0008, 0x31a3: 0x0008,
+ 0x31a4: 0x0008, 0x31a5: 0x0008, 0x31a6: 0x0200, 0x31a7: 0x0200, 0x31a8: 0x0200, 0x31a9: 0x0200,
+ 0x31aa: 0x0200, 0x31ab: 0x0200, 0x31ac: 0x0200, 0x31ad: 0x0200, 0x31ae: 0x0200, 0x31af: 0x0200,
+ 0x31b0: 0x0200, 0x31b1: 0x0200, 0x31b2: 0x0200, 0x31b3: 0x0200, 0x31b4: 0x0200, 0x31b5: 0x0200,
+ 0x31b6: 0x0200, 0x31b7: 0x0200, 0x31b8: 0x0200, 0x31b9: 0x0200, 0x31ba: 0x0200, 0x31bb: 0x0200,
+ 0x31bc: 0x0200, 0x31bd: 0x0200, 0x31be: 0x0200, 0x31bf: 0x0200,
+ // Block 0xc7, offset 0x31c0
+ 0x31c1: 0x0008, 0x31c2: 0x0008, 0x31c3: 0x0008, 0x31c4: 0x0008, 0x31c5: 0x0008,
+ 0x31c6: 0x0008, 0x31c7: 0x0008, 0x31c8: 0x0008, 0x31c9: 0x0008, 0x31ca: 0x0008, 0x31cb: 0x0008,
+ 0x31cc: 0x0008, 0x31cd: 0x0008, 0x31ce: 0x0008, 0x31cf: 0x0008,
+ 0x31da: 0x0008,
+ 0x31ef: 0x0008,
+ 0x31f2: 0x0008, 0x31f3: 0x0008, 0x31f4: 0x0008, 0x31f5: 0x0008,
+ 0x31f6: 0x0008, 0x31f7: 0x0008, 0x31f8: 0x0008, 0x31f9: 0x0008, 0x31fa: 0x0008,
+ 0x31fc: 0x0008, 0x31fd: 0x0008, 0x31fe: 0x0008, 0x31ff: 0x0008,
+ // Block 0xc8, offset 0x3200
+ 0x3209: 0x0008, 0x320a: 0x0008, 0x320b: 0x0008,
+ 0x320c: 0x0008, 0x320d: 0x0008, 0x320e: 0x0008, 0x320f: 0x0008, 0x3210: 0x0008, 0x3211: 0x0008,
+ 0x3212: 0x0008, 0x3213: 0x0008, 0x3214: 0x0008, 0x3215: 0x0008, 0x3216: 0x0008, 0x3217: 0x0008,
+ 0x3218: 0x0008, 0x3219: 0x0008, 0x321a: 0x0008, 0x321b: 0x0008, 0x321c: 0x0008, 0x321d: 0x0008,
+ 0x321e: 0x0008, 0x321f: 0x0008, 0x3220: 0x0008, 0x3221: 0x0008, 0x3222: 0x0008, 0x3223: 0x0008,
+ 0x3224: 0x0008, 0x3225: 0x0008, 0x3226: 0x0008, 0x3227: 0x0008, 0x3228: 0x0008, 0x3229: 0x0008,
+ 0x322a: 0x0008, 0x322b: 0x0008, 0x322c: 0x0008, 0x322d: 0x0008, 0x322e: 0x0008, 0x322f: 0x0008,
+ 0x3230: 0x0008, 0x3231: 0x0008, 0x3232: 0x0008, 0x3233: 0x0008, 0x3234: 0x0008, 0x3235: 0x0008,
+ 0x3236: 0x0008, 0x3237: 0x0008, 0x3238: 0x0008, 0x3239: 0x0008, 0x323a: 0x0008, 0x323b: 0x0008,
+ 0x323c: 0x0008, 0x323d: 0x0008, 0x323e: 0x0008, 0x323f: 0x0008,
+ // Block 0xc9, offset 0x3240
+ 0x3240: 0x0008, 0x3241: 0x0008, 0x3242: 0x0008, 0x3243: 0x0008, 0x3244: 0x0008, 0x3245: 0x0008,
+ 0x3246: 0x0008, 0x3247: 0x0008, 0x3248: 0x0008, 0x3249: 0x0008, 0x324a: 0x0008, 0x324b: 0x0008,
+ 0x324c: 0x0008, 0x324d: 0x0008, 0x324e: 0x0008, 0x324f: 0x0008, 0x3250: 0x0008, 0x3251: 0x0008,
+ 0x3252: 0x0008, 0x3253: 0x0008, 0x3254: 0x0008, 0x3255: 0x0008, 0x3256: 0x0008, 0x3257: 0x0008,
+ 0x3258: 0x0008, 0x3259: 0x0008, 0x325a: 0x0008, 0x325b: 0x0008, 0x325c: 0x0008, 0x325d: 0x0008,
+ 0x325e: 0x0008, 0x325f: 0x0008, 0x3260: 0x0008, 0x3261: 0x0008, 0x3262: 0x0008, 0x3263: 0x0008,
+ 0x3264: 0x0008, 0x3265: 0x0008, 0x3266: 0x0008, 0x3267: 0x0008, 0x3268: 0x0008, 0x3269: 0x0008,
+ 0x326a: 0x0008, 0x326b: 0x0008, 0x326c: 0x0008, 0x326d: 0x0008, 0x326e: 0x0008, 0x326f: 0x0008,
+ 0x3270: 0x0008, 0x3271: 0x0008, 0x3272: 0x0008, 0x3273: 0x0008, 0x3274: 0x0008, 0x3275: 0x0008,
+ 0x3276: 0x0008, 0x3277: 0x0008, 0x3278: 0x0008, 0x3279: 0x0008, 0x327a: 0x0008, 0x327b: 0x0004,
+ 0x327c: 0x0004, 0x327d: 0x0004, 0x327e: 0x0004, 0x327f: 0x0004,
+ // Block 0xca, offset 0x3280
+ 0x3280: 0x0008, 0x3281: 0x0008, 0x3282: 0x0008, 0x3283: 0x0008, 0x3284: 0x0008, 0x3285: 0x0008,
+ 0x3286: 0x0008, 0x3287: 0x0008, 0x3288: 0x0008, 0x3289: 0x0008, 0x328a: 0x0008, 0x328b: 0x0008,
+ 0x328c: 0x0008, 0x328d: 0x0008, 0x328e: 0x0008, 0x328f: 0x0008, 0x3290: 0x0008, 0x3291: 0x0008,
+ 0x3292: 0x0008, 0x3293: 0x0008, 0x3294: 0x0008, 0x3295: 0x0008, 0x3296: 0x0008, 0x3297: 0x0008,
+ 0x3298: 0x0008, 0x3299: 0x0008, 0x329a: 0x0008, 0x329b: 0x0008, 0x329c: 0x0008, 0x329d: 0x0008,
+ 0x329e: 0x0008, 0x329f: 0x0008, 0x32a0: 0x0008, 0x32a1: 0x0008, 0x32a2: 0x0008, 0x32a3: 0x0008,
+ 0x32a4: 0x0008, 0x32a5: 0x0008, 0x32a6: 0x0008, 0x32a7: 0x0008, 0x32a8: 0x0008, 0x32a9: 0x0008,
+ 0x32aa: 0x0008, 0x32ab: 0x0008, 0x32ac: 0x0008, 0x32ad: 0x0008, 0x32ae: 0x0008, 0x32af: 0x0008,
+ 0x32b0: 0x0008, 0x32b1: 0x0008, 0x32b2: 0x0008, 0x32b3: 0x0008, 0x32b4: 0x0008, 0x32b5: 0x0008,
+ 0x32b6: 0x0008, 0x32b7: 0x0008, 0x32b8: 0x0008, 0x32b9: 0x0008, 0x32ba: 0x0008, 0x32bb: 0x0008,
+ 0x32bc: 0x0008, 0x32bd: 0x0008,
+ // Block 0xcb, offset 0x32c0
+ 0x32c6: 0x0008, 0x32c7: 0x0008, 0x32c8: 0x0008, 0x32c9: 0x0008, 0x32ca: 0x0008, 0x32cb: 0x0008,
+ 0x32cc: 0x0008, 0x32cd: 0x0008, 0x32ce: 0x0008, 0x32cf: 0x0008, 0x32d0: 0x0008, 0x32d1: 0x0008,
+ 0x32d2: 0x0008, 0x32d3: 0x0008, 0x32d4: 0x0008, 0x32d5: 0x0008, 0x32d6: 0x0008, 0x32d7: 0x0008,
+ 0x32d8: 0x0008, 0x32d9: 0x0008, 0x32da: 0x0008, 0x32db: 0x0008, 0x32dc: 0x0008, 0x32dd: 0x0008,
+ 0x32de: 0x0008, 0x32df: 0x0008, 0x32e0: 0x0008, 0x32e1: 0x0008, 0x32e2: 0x0008, 0x32e3: 0x0008,
+ 0x32e4: 0x0008, 0x32e5: 0x0008, 0x32e6: 0x0008, 0x32e7: 0x0008, 0x32e8: 0x0008, 0x32e9: 0x0008,
+ 0x32ea: 0x0008, 0x32eb: 0x0008, 0x32ec: 0x0008, 0x32ed: 0x0008, 0x32ee: 0x0008, 0x32ef: 0x0008,
+ 0x32f0: 0x0008, 0x32f1: 0x0008, 0x32f2: 0x0008, 0x32f3: 0x0008, 0x32f4: 0x0008, 0x32f5: 0x0008,
+ 0x32f6: 0x0008, 0x32f7: 0x0008, 0x32f8: 0x0008, 0x32f9: 0x0008, 0x32fa: 0x0008, 0x32fb: 0x0008,
+ 0x32fc: 0x0008, 0x32fd: 0x0008, 0x32fe: 0x0008, 0x32ff: 0x0008,
+ // Block 0xcc, offset 0x3300
+ 0x3300: 0x0008, 0x3301: 0x0008, 0x3302: 0x0008, 0x3303: 0x0008, 0x3304: 0x0008, 0x3305: 0x0008,
+ 0x3306: 0x0008, 0x3307: 0x0008, 0x3308: 0x0008, 0x3309: 0x0008, 0x330a: 0x0008, 0x330b: 0x0008,
+ 0x330c: 0x0008, 0x330d: 0x0008, 0x330e: 0x0008, 0x330f: 0x0008,
+ // Block 0xcd, offset 0x3340
+ 0x3374: 0x0008, 0x3375: 0x0008,
+ 0x3376: 0x0008, 0x3377: 0x0008, 0x3378: 0x0008, 0x3379: 0x0008, 0x337a: 0x0008, 0x337b: 0x0008,
+ 0x337c: 0x0008, 0x337d: 0x0008, 0x337e: 0x0008, 0x337f: 0x0008,
+ // Block 0xce, offset 0x3380
+ 0x3395: 0x0008, 0x3396: 0x0008, 0x3397: 0x0008,
+ 0x3398: 0x0008, 0x3399: 0x0008, 0x339a: 0x0008, 0x339b: 0x0008, 0x339c: 0x0008, 0x339d: 0x0008,
+ 0x339e: 0x0008, 0x339f: 0x0008, 0x33a0: 0x0008, 0x33a1: 0x0008, 0x33a2: 0x0008, 0x33a3: 0x0008,
+ 0x33a4: 0x0008, 0x33a5: 0x0008, 0x33a6: 0x0008, 0x33a7: 0x0008, 0x33a8: 0x0008, 0x33a9: 0x0008,
+ 0x33aa: 0x0008, 0x33ab: 0x0008, 0x33ac: 0x0008, 0x33ad: 0x0008, 0x33ae: 0x0008, 0x33af: 0x0008,
+ 0x33b0: 0x0008, 0x33b1: 0x0008, 0x33b2: 0x0008, 0x33b3: 0x0008, 0x33b4: 0x0008, 0x33b5: 0x0008,
+ 0x33b6: 0x0008, 0x33b7: 0x0008, 0x33b8: 0x0008, 0x33b9: 0x0008, 0x33ba: 0x0008, 0x33bb: 0x0008,
+ 0x33bc: 0x0008, 0x33bd: 0x0008, 0x33be: 0x0008, 0x33bf: 0x0008,
+ // Block 0xcf, offset 0x33c0
+ 0x33cc: 0x0008, 0x33cd: 0x0008, 0x33ce: 0x0008, 0x33cf: 0x0008,
+ // Block 0xd0, offset 0x3400
+ 0x3408: 0x0008, 0x3409: 0x0008, 0x340a: 0x0008, 0x340b: 0x0008,
+ 0x340c: 0x0008, 0x340d: 0x0008, 0x340e: 0x0008, 0x340f: 0x0008,
+ 0x341a: 0x0008, 0x341b: 0x0008, 0x341c: 0x0008, 0x341d: 0x0008,
+ 0x341e: 0x0008, 0x341f: 0x0008,
+ // Block 0xd1, offset 0x3440
+ 0x3448: 0x0008, 0x3449: 0x0008, 0x344a: 0x0008, 0x344b: 0x0008,
+ 0x344c: 0x0008, 0x344d: 0x0008, 0x344e: 0x0008, 0x344f: 0x0008,
+ 0x346e: 0x0008, 0x346f: 0x0008,
+ 0x3470: 0x0008, 0x3471: 0x0008, 0x3472: 0x0008, 0x3473: 0x0008, 0x3474: 0x0008, 0x3475: 0x0008,
+ 0x3476: 0x0008, 0x3477: 0x0008, 0x3478: 0x0008, 0x3479: 0x0008, 0x347a: 0x0008, 0x347b: 0x0008,
+ 0x347c: 0x0008, 0x347d: 0x0008, 0x347e: 0x0008, 0x347f: 0x0008,
+ // Block 0xd2, offset 0x3480
+ 0x348c: 0x0008, 0x348d: 0x0008, 0x348e: 0x0008, 0x348f: 0x0008, 0x3490: 0x0008, 0x3491: 0x0008,
+ 0x3492: 0x0008, 0x3493: 0x0008, 0x3494: 0x0008, 0x3495: 0x0008, 0x3496: 0x0008, 0x3497: 0x0008,
+ 0x3498: 0x0008, 0x3499: 0x0008, 0x349a: 0x0008, 0x349b: 0x0008, 0x349c: 0x0008, 0x349d: 0x0008,
+ 0x349e: 0x0008, 0x349f: 0x0008, 0x34a0: 0x0008, 0x34a1: 0x0008, 0x34a2: 0x0008, 0x34a3: 0x0008,
+ 0x34a4: 0x0008, 0x34a5: 0x0008, 0x34a6: 0x0008, 0x34a7: 0x0008, 0x34a8: 0x0008, 0x34a9: 0x0008,
+ 0x34aa: 0x0008, 0x34ab: 0x0008, 0x34ac: 0x0008, 0x34ad: 0x0008, 0x34ae: 0x0008, 0x34af: 0x0008,
+ 0x34b0: 0x0008, 0x34b1: 0x0008, 0x34b2: 0x0008, 0x34b3: 0x0008, 0x34b4: 0x0008, 0x34b5: 0x0008,
+ 0x34b6: 0x0008, 0x34b7: 0x0008, 0x34b8: 0x0008, 0x34b9: 0x0008, 0x34ba: 0x0008,
+ 0x34bc: 0x0008, 0x34bd: 0x0008, 0x34be: 0x0008, 0x34bf: 0x0008,
+ // Block 0xd3, offset 0x34c0
+ 0x34c0: 0x0008, 0x34c1: 0x0008, 0x34c2: 0x0008, 0x34c3: 0x0008, 0x34c4: 0x0008, 0x34c5: 0x0008,
+ 0x34c7: 0x0008, 0x34c8: 0x0008, 0x34c9: 0x0008, 0x34ca: 0x0008, 0x34cb: 0x0008,
+ 0x34cc: 0x0008, 0x34cd: 0x0008, 0x34ce: 0x0008, 0x34cf: 0x0008, 0x34d0: 0x0008, 0x34d1: 0x0008,
+ 0x34d2: 0x0008, 0x34d3: 0x0008, 0x34d4: 0x0008, 0x34d5: 0x0008, 0x34d6: 0x0008, 0x34d7: 0x0008,
+ 0x34d8: 0x0008, 0x34d9: 0x0008, 0x34da: 0x0008, 0x34db: 0x0008, 0x34dc: 0x0008, 0x34dd: 0x0008,
+ 0x34de: 0x0008, 0x34df: 0x0008, 0x34e0: 0x0008, 0x34e1: 0x0008, 0x34e2: 0x0008, 0x34e3: 0x0008,
+ 0x34e4: 0x0008, 0x34e5: 0x0008, 0x34e6: 0x0008, 0x34e7: 0x0008, 0x34e8: 0x0008, 0x34e9: 0x0008,
+ 0x34ea: 0x0008, 0x34eb: 0x0008, 0x34ec: 0x0008, 0x34ed: 0x0008, 0x34ee: 0x0008, 0x34ef: 0x0008,
+ 0x34f0: 0x0008, 0x34f1: 0x0008, 0x34f2: 0x0008, 0x34f3: 0x0008, 0x34f4: 0x0008, 0x34f5: 0x0008,
+ 0x34f6: 0x0008, 0x34f7: 0x0008, 0x34f8: 0x0008, 0x34f9: 0x0008, 0x34fa: 0x0008, 0x34fb: 0x0008,
+ 0x34fc: 0x0008, 0x34fd: 0x0008, 0x34fe: 0x0008, 0x34ff: 0x0008,
+ // Block 0xd4, offset 0x3500
+ 0x3500: 0x0002, 0x3501: 0x0002, 0x3502: 0x0002, 0x3503: 0x0002, 0x3504: 0x0002, 0x3505: 0x0002,
+ 0x3506: 0x0002, 0x3507: 0x0002, 0x3508: 0x0002, 0x3509: 0x0002, 0x350a: 0x0002, 0x350b: 0x0002,
+ 0x350c: 0x0002, 0x350d: 0x0002, 0x350e: 0x0002, 0x350f: 0x0002, 0x3510: 0x0002, 0x3511: 0x0002,
+ 0x3512: 0x0002, 0x3513: 0x0002, 0x3514: 0x0002, 0x3515: 0x0002, 0x3516: 0x0002, 0x3517: 0x0002,
+ 0x3518: 0x0002, 0x3519: 0x0002, 0x351a: 0x0002, 0x351b: 0x0002, 0x351c: 0x0002, 0x351d: 0x0002,
+ 0x351e: 0x0002, 0x351f: 0x0002, 0x3520: 0x0004, 0x3521: 0x0004, 0x3522: 0x0004, 0x3523: 0x0004,
+ 0x3524: 0x0004, 0x3525: 0x0004, 0x3526: 0x0004, 0x3527: 0x0004, 0x3528: 0x0004, 0x3529: 0x0004,
+ 0x352a: 0x0004, 0x352b: 0x0004, 0x352c: 0x0004, 0x352d: 0x0004, 0x352e: 0x0004, 0x352f: 0x0004,
+ 0x3530: 0x0004, 0x3531: 0x0004, 0x3532: 0x0004, 0x3533: 0x0004, 0x3534: 0x0004, 0x3535: 0x0004,
+ 0x3536: 0x0004, 0x3537: 0x0004, 0x3538: 0x0004, 0x3539: 0x0004, 0x353a: 0x0004, 0x353b: 0x0004,
+ 0x353c: 0x0004, 0x353d: 0x0004, 0x353e: 0x0004, 0x353f: 0x0004,
+ // Block 0xd5, offset 0x3540
+ 0x3540: 0x0002, 0x3541: 0x0002, 0x3542: 0x0002, 0x3543: 0x0002, 0x3544: 0x0002, 0x3545: 0x0002,
+ 0x3546: 0x0002, 0x3547: 0x0002, 0x3548: 0x0002, 0x3549: 0x0002, 0x354a: 0x0002, 0x354b: 0x0002,
+ 0x354c: 0x0002, 0x354d: 0x0002, 0x354e: 0x0002, 0x354f: 0x0002, 0x3550: 0x0002, 0x3551: 0x0002,
+ 0x3552: 0x0002, 0x3553: 0x0002, 0x3554: 0x0002, 0x3555: 0x0002, 0x3556: 0x0002, 0x3557: 0x0002,
+ 0x3558: 0x0002, 0x3559: 0x0002, 0x355a: 0x0002, 0x355b: 0x0002, 0x355c: 0x0002, 0x355d: 0x0002,
+ 0x355e: 0x0002, 0x355f: 0x0002, 0x3560: 0x0002, 0x3561: 0x0002, 0x3562: 0x0002, 0x3563: 0x0002,
+ 0x3564: 0x0002, 0x3565: 0x0002, 0x3566: 0x0002, 0x3567: 0x0002, 0x3568: 0x0002, 0x3569: 0x0002,
+ 0x356a: 0x0002, 0x356b: 0x0002, 0x356c: 0x0002, 0x356d: 0x0002, 0x356e: 0x0002, 0x356f: 0x0002,
+ 0x3570: 0x0002, 0x3571: 0x0002, 0x3572: 0x0002, 0x3573: 0x0002, 0x3574: 0x0002, 0x3575: 0x0002,
+ 0x3576: 0x0002, 0x3577: 0x0002, 0x3578: 0x0002, 0x3579: 0x0002, 0x357a: 0x0002, 0x357b: 0x0002,
+ 0x357c: 0x0002, 0x357d: 0x0002, 0x357e: 0x0002, 0x357f: 0x0002,
+ // Block 0xd6, offset 0x3580
+ 0x3580: 0x0004, 0x3581: 0x0004, 0x3582: 0x0004, 0x3583: 0x0004, 0x3584: 0x0004, 0x3585: 0x0004,
+ 0x3586: 0x0004, 0x3587: 0x0004, 0x3588: 0x0004, 0x3589: 0x0004, 0x358a: 0x0004, 0x358b: 0x0004,
+ 0x358c: 0x0004, 0x358d: 0x0004, 0x358e: 0x0004, 0x358f: 0x0004, 0x3590: 0x0004, 0x3591: 0x0004,
+ 0x3592: 0x0004, 0x3593: 0x0004, 0x3594: 0x0004, 0x3595: 0x0004, 0x3596: 0x0004, 0x3597: 0x0004,
+ 0x3598: 0x0004, 0x3599: 0x0004, 0x359a: 0x0004, 0x359b: 0x0004, 0x359c: 0x0004, 0x359d: 0x0004,
+ 0x359e: 0x0004, 0x359f: 0x0004, 0x35a0: 0x0004, 0x35a1: 0x0004, 0x35a2: 0x0004, 0x35a3: 0x0004,
+ 0x35a4: 0x0004, 0x35a5: 0x0004, 0x35a6: 0x0004, 0x35a7: 0x0004, 0x35a8: 0x0004, 0x35a9: 0x0004,
+ 0x35aa: 0x0004, 0x35ab: 0x0004, 0x35ac: 0x0004, 0x35ad: 0x0004, 0x35ae: 0x0004, 0x35af: 0x0004,
+ 0x35b0: 0x0002, 0x35b1: 0x0002, 0x35b2: 0x0002, 0x35b3: 0x0002, 0x35b4: 0x0002, 0x35b5: 0x0002,
+ 0x35b6: 0x0002, 0x35b7: 0x0002, 0x35b8: 0x0002, 0x35b9: 0x0002, 0x35ba: 0x0002, 0x35bb: 0x0002,
+ 0x35bc: 0x0002, 0x35bd: 0x0002, 0x35be: 0x0002, 0x35bf: 0x0002,
+}
+
+// graphemesIndex: 25 blocks, 1600 entries, 1600 bytes
+// Block 0 is the zero block.
+var graphemesIndex = [1600]property{
+ // Block 0x0, offset 0x0
+ // Block 0x1, offset 0x40
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc2: 0x01,
+ 0xcc: 0x02, 0xcd: 0x03,
+ 0xd2: 0x04, 0xd6: 0x05, 0xd7: 0x06,
+ 0xd8: 0x07, 0xd9: 0x08, 0xdb: 0x09, 0xdc: 0x0a, 0xdd: 0x0b, 0xde: 0x0c, 0xdf: 0x0d,
+ 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+ 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+ 0xf0: 0x14, 0xf3: 0x16,
+ // Block 0x4, offset 0x100
+ 0x120: 0x0e, 0x121: 0x0f, 0x122: 0x10, 0x123: 0x11, 0x124: 0x12, 0x125: 0x13, 0x126: 0x14, 0x127: 0x15,
+ 0x128: 0x16, 0x129: 0x17, 0x12a: 0x16, 0x12b: 0x18, 0x12c: 0x19, 0x12d: 0x1a, 0x12e: 0x1b, 0x12f: 0x1c,
+ 0x130: 0x1d, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x21, 0x135: 0x22, 0x136: 0x23, 0x137: 0x24,
+ 0x138: 0x25, 0x139: 0x26, 0x13a: 0x27, 0x13b: 0x28, 0x13c: 0x29, 0x13d: 0x2a, 0x13e: 0x2b, 0x13f: 0x2c,
+ // Block 0x5, offset 0x140
+ 0x140: 0x2d, 0x141: 0x2e, 0x142: 0x2f, 0x144: 0x30, 0x145: 0x31, 0x146: 0x32, 0x147: 0x33,
+ 0x14d: 0x34,
+ 0x15c: 0x35, 0x15d: 0x36, 0x15e: 0x37, 0x15f: 0x38,
+ 0x160: 0x39, 0x162: 0x3a, 0x164: 0x3b,
+ 0x168: 0x3c, 0x169: 0x3d, 0x16a: 0x3e, 0x16b: 0x3f, 0x16c: 0x40, 0x16d: 0x41, 0x16e: 0x42, 0x16f: 0x43,
+ 0x170: 0x44, 0x173: 0x45, 0x177: 0x02,
+ // Block 0x6, offset 0x180
+ 0x180: 0x46, 0x181: 0x47, 0x183: 0x48, 0x184: 0x49, 0x186: 0x4a,
+ 0x18c: 0x4b, 0x18e: 0x4c, 0x18f: 0x4d,
+ 0x193: 0x4e, 0x196: 0x4f, 0x197: 0x50,
+ 0x198: 0x51, 0x199: 0x52, 0x19a: 0x53, 0x19b: 0x52, 0x19c: 0x54, 0x19d: 0x55, 0x19e: 0x56,
+ 0x1a4: 0x57,
+ 0x1ac: 0x58, 0x1ad: 0x59,
+ 0x1b3: 0x5a, 0x1b5: 0x5b, 0x1b7: 0x5c,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0x5d, 0x1c2: 0x5e,
+ 0x1ca: 0x5f,
+ // Block 0x8, offset 0x200
+ 0x219: 0x60, 0x21a: 0x61, 0x21b: 0x62,
+ 0x220: 0x63, 0x222: 0x64, 0x223: 0x65, 0x224: 0x66, 0x225: 0x67, 0x226: 0x68, 0x227: 0x69,
+ 0x228: 0x6a, 0x229: 0x6b, 0x22a: 0x6c, 0x22b: 0x6d, 0x22f: 0x6e,
+ 0x230: 0x6f, 0x231: 0x70, 0x232: 0x71, 0x233: 0x72, 0x234: 0x73, 0x235: 0x74, 0x236: 0x75, 0x237: 0x6f,
+ 0x238: 0x70, 0x239: 0x71, 0x23a: 0x72, 0x23b: 0x73, 0x23c: 0x74, 0x23d: 0x75, 0x23e: 0x6f, 0x23f: 0x70,
+ // Block 0x9, offset 0x240
+ 0x240: 0x71, 0x241: 0x72, 0x242: 0x73, 0x243: 0x74, 0x244: 0x75, 0x245: 0x6f, 0x246: 0x70, 0x247: 0x71,
+ 0x248: 0x72, 0x249: 0x73, 0x24a: 0x74, 0x24b: 0x75, 0x24c: 0x6f, 0x24d: 0x70, 0x24e: 0x71, 0x24f: 0x72,
+ 0x250: 0x73, 0x251: 0x74, 0x252: 0x75, 0x253: 0x6f, 0x254: 0x70, 0x255: 0x71, 0x256: 0x72, 0x257: 0x73,
+ 0x258: 0x74, 0x259: 0x75, 0x25a: 0x6f, 0x25b: 0x70, 0x25c: 0x71, 0x25d: 0x72, 0x25e: 0x73, 0x25f: 0x74,
+ 0x260: 0x75, 0x261: 0x6f, 0x262: 0x70, 0x263: 0x71, 0x264: 0x72, 0x265: 0x73, 0x266: 0x74, 0x267: 0x75,
+ 0x268: 0x6f, 0x269: 0x70, 0x26a: 0x71, 0x26b: 0x72, 0x26c: 0x73, 0x26d: 0x74, 0x26e: 0x75, 0x26f: 0x6f,
+ 0x270: 0x70, 0x271: 0x71, 0x272: 0x72, 0x273: 0x73, 0x274: 0x74, 0x275: 0x75, 0x276: 0x6f, 0x277: 0x70,
+ 0x278: 0x71, 0x279: 0x72, 0x27a: 0x73, 0x27b: 0x74, 0x27c: 0x75, 0x27d: 0x6f, 0x27e: 0x70, 0x27f: 0x71,
+ // Block 0xa, offset 0x280
+ 0x280: 0x72, 0x281: 0x73, 0x282: 0x74, 0x283: 0x75, 0x284: 0x6f, 0x285: 0x70, 0x286: 0x71, 0x287: 0x72,
+ 0x288: 0x73, 0x289: 0x74, 0x28a: 0x75, 0x28b: 0x6f, 0x28c: 0x70, 0x28d: 0x71, 0x28e: 0x72, 0x28f: 0x73,
+ 0x290: 0x74, 0x291: 0x75, 0x292: 0x6f, 0x293: 0x70, 0x294: 0x71, 0x295: 0x72, 0x296: 0x73, 0x297: 0x74,
+ 0x298: 0x75, 0x299: 0x6f, 0x29a: 0x70, 0x29b: 0x71, 0x29c: 0x72, 0x29d: 0x73, 0x29e: 0x74, 0x29f: 0x75,
+ 0x2a0: 0x6f, 0x2a1: 0x70, 0x2a2: 0x71, 0x2a3: 0x72, 0x2a4: 0x73, 0x2a5: 0x74, 0x2a6: 0x75, 0x2a7: 0x6f,
+ 0x2a8: 0x70, 0x2a9: 0x71, 0x2aa: 0x72, 0x2ab: 0x73, 0x2ac: 0x74, 0x2ad: 0x75, 0x2ae: 0x6f, 0x2af: 0x70,
+ 0x2b0: 0x71, 0x2b1: 0x72, 0x2b2: 0x73, 0x2b3: 0x74, 0x2b4: 0x75, 0x2b5: 0x6f, 0x2b6: 0x70, 0x2b7: 0x71,
+ 0x2b8: 0x72, 0x2b9: 0x73, 0x2ba: 0x74, 0x2bb: 0x75, 0x2bc: 0x6f, 0x2bd: 0x70, 0x2be: 0x71, 0x2bf: 0x72,
+ // Block 0xb, offset 0x2c0
+ 0x2c0: 0x73, 0x2c1: 0x74, 0x2c2: 0x75, 0x2c3: 0x6f, 0x2c4: 0x70, 0x2c5: 0x71, 0x2c6: 0x72, 0x2c7: 0x73,
+ 0x2c8: 0x74, 0x2c9: 0x75, 0x2ca: 0x6f, 0x2cb: 0x70, 0x2cc: 0x71, 0x2cd: 0x72, 0x2ce: 0x73, 0x2cf: 0x74,
+ 0x2d0: 0x75, 0x2d1: 0x6f, 0x2d2: 0x70, 0x2d3: 0x71, 0x2d4: 0x72, 0x2d5: 0x73, 0x2d6: 0x74, 0x2d7: 0x75,
+ 0x2d8: 0x6f, 0x2d9: 0x70, 0x2da: 0x71, 0x2db: 0x72, 0x2dc: 0x73, 0x2dd: 0x74, 0x2de: 0x76, 0x2df: 0x77,
+ // Block 0xc, offset 0x300
+ 0x32c: 0x78,
+ 0x338: 0x79, 0x33b: 0x7a, 0x33e: 0x61, 0x33f: 0x7b,
+ // Block 0xd, offset 0x340
+ 0x347: 0x7c,
+ 0x34b: 0x7d, 0x34d: 0x7e,
+ 0x368: 0x7f, 0x36b: 0x80,
+ 0x374: 0x81,
+ 0x37a: 0x82, 0x37b: 0x83, 0x37d: 0x84, 0x37e: 0x85,
+ // Block 0xe, offset 0x380
+ 0x380: 0x86, 0x381: 0x87, 0x382: 0x88, 0x383: 0x89, 0x384: 0x8a, 0x385: 0x8b, 0x386: 0x8c, 0x387: 0x8d,
+ 0x388: 0x8e, 0x389: 0x8f, 0x38b: 0x90, 0x38c: 0x21, 0x38d: 0x91,
+ 0x390: 0x92, 0x391: 0x93, 0x392: 0x94, 0x393: 0x95, 0x396: 0x96, 0x397: 0x97,
+ 0x398: 0x98, 0x399: 0x99, 0x39a: 0x9a, 0x39c: 0x9b,
+ 0x3a0: 0x9c, 0x3a4: 0x9d, 0x3a5: 0x9e, 0x3a7: 0x9f,
+ 0x3a8: 0xa0, 0x3a9: 0xa1, 0x3aa: 0xa2,
+ 0x3b0: 0xa3, 0x3b2: 0xa4, 0x3b4: 0xa5, 0x3b5: 0xa6, 0x3b6: 0xa7,
+ 0x3bb: 0xa8, 0x3bc: 0xa9, 0x3bd: 0xaa,
+ // Block 0xf, offset 0x3c0
+ 0x3d0: 0xab, 0x3d1: 0xac,
+ // Block 0x10, offset 0x400
+ 0x42b: 0xad, 0x42c: 0xae,
+ 0x43d: 0xaf, 0x43e: 0xb0, 0x43f: 0xb1,
+ // Block 0x11, offset 0x440
+ 0x472: 0xb2,
+ // Block 0x12, offset 0x480
+ 0x4bc: 0xb3, 0x4bd: 0xb4,
+ // Block 0x13, offset 0x4c0
+ 0x4c5: 0xb5, 0x4c6: 0xb6,
+ 0x4c9: 0xb7,
+ 0x4e8: 0xb8, 0x4e9: 0xb9, 0x4ea: 0xba,
+ // Block 0x14, offset 0x500
+ 0x500: 0xbb, 0x502: 0xbc, 0x504: 0xae,
+ 0x50a: 0xbd, 0x50b: 0xbe,
+ 0x513: 0xbe,
+ 0x523: 0xbf, 0x525: 0xc0,
+ // Block 0x15, offset 0x540
+ 0x540: 0x52, 0x541: 0x52, 0x542: 0x52, 0x543: 0x52, 0x544: 0xc1, 0x545: 0xc2, 0x546: 0xc3, 0x547: 0xc4,
+ 0x548: 0xc5, 0x549: 0xc6, 0x54a: 0x52, 0x54b: 0x52, 0x54c: 0x52, 0x54d: 0x52, 0x54e: 0x52, 0x54f: 0xc7,
+ 0x550: 0x52, 0x551: 0x52, 0x552: 0x52, 0x553: 0x52, 0x554: 0xc8, 0x555: 0xc9, 0x556: 0x52, 0x557: 0x52,
+ 0x558: 0x52, 0x559: 0xca, 0x55a: 0x52, 0x55b: 0x52, 0x55d: 0xcb, 0x55f: 0xcc,
+ 0x560: 0xcd, 0x561: 0xce, 0x562: 0xcf, 0x563: 0x52, 0x564: 0xd0, 0x565: 0xd1, 0x566: 0x52, 0x567: 0x52,
+ 0x568: 0x52, 0x569: 0x52, 0x56a: 0x52, 0x56b: 0x52,
+ 0x570: 0x52, 0x571: 0x52, 0x572: 0x52, 0x573: 0x52, 0x574: 0x52, 0x575: 0x52, 0x576: 0x52, 0x577: 0x52,
+ 0x578: 0x52, 0x579: 0x52, 0x57a: 0x52, 0x57b: 0x52, 0x57c: 0x52, 0x57d: 0x52, 0x57e: 0x52, 0x57f: 0xc8,
+ // Block 0x16, offset 0x580
+ 0x590: 0x0b, 0x591: 0x0c, 0x593: 0x0d, 0x596: 0x0e,
+ 0x59b: 0x0f, 0x59c: 0x10, 0x59d: 0x11, 0x59e: 0x12, 0x59f: 0x13,
+ // Block 0x17, offset 0x5c0
+ 0x5c0: 0xd2, 0x5c1: 0x02, 0x5c2: 0xd3, 0x5c3: 0xd3, 0x5c4: 0x02, 0x5c5: 0x02, 0x5c6: 0x02, 0x5c7: 0xd4,
+ 0x5c8: 0xd3, 0x5c9: 0xd3, 0x5ca: 0xd3, 0x5cb: 0xd3, 0x5cc: 0xd3, 0x5cd: 0xd3, 0x5ce: 0xd3, 0x5cf: 0xd3,
+ 0x5d0: 0xd3, 0x5d1: 0xd3, 0x5d2: 0xd3, 0x5d3: 0xd3, 0x5d4: 0xd3, 0x5d5: 0xd3, 0x5d6: 0xd3, 0x5d7: 0xd3,
+ 0x5d8: 0xd3, 0x5d9: 0xd3, 0x5da: 0xd3, 0x5db: 0xd3, 0x5dc: 0xd3, 0x5dd: 0xd3, 0x5de: 0xd3, 0x5df: 0xd3,
+ 0x5e0: 0xd3, 0x5e1: 0xd3, 0x5e2: 0xd3, 0x5e3: 0xd3, 0x5e4: 0xd3, 0x5e5: 0xd3, 0x5e6: 0xd3, 0x5e7: 0xd3,
+ 0x5e8: 0xd3, 0x5e9: 0xd3, 0x5ea: 0xd3, 0x5eb: 0xd3, 0x5ec: 0xd3, 0x5ed: 0xd3, 0x5ee: 0xd3, 0x5ef: 0xd3,
+ 0x5f0: 0xd3, 0x5f1: 0xd3, 0x5f2: 0xd3, 0x5f3: 0xd3, 0x5f4: 0xd3, 0x5f5: 0xd3, 0x5f6: 0xd3, 0x5f7: 0xd3,
+ 0x5f8: 0xd3, 0x5f9: 0xd3, 0x5fa: 0xd3, 0x5fb: 0xd3, 0x5fc: 0xd3, 0x5fd: 0xd3, 0x5fe: 0xd3, 0x5ff: 0xd3,
+ // Block 0x18, offset 0x600
+ 0x620: 0x15,
+}
diff --git a/hack/tools/vendor/github.com/clipperhouse/uax29/v2/internal/iterators/iterator.go b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/internal/iterators/iterator.go
new file mode 100644
index 0000000000..e213486380
--- /dev/null
+++ b/hack/tools/vendor/github.com/clipperhouse/uax29/v2/internal/iterators/iterator.go
@@ -0,0 +1,100 @@
+package iterators
+
+import "github.com/clipperhouse/stringish"
+
+type SplitFunc[T stringish.Interface] func(T, bool) (int, T, error)
+
+// Iterator is a generic iterator for words that are either []byte or string.
+// Iterate while Next() is true, and access the word via Value().
+type Iterator[T stringish.Interface] struct {
+ split SplitFunc[T]
+ data T
+ start int
+ pos int
+}
+
+// New creates a new Iterator for the given data and SplitFunc.
+func New[T stringish.Interface](split SplitFunc[T], data T) *Iterator[T] {
+ return &Iterator[T]{
+ split: split,
+ data: data,
+ }
+}
+
+// SetText sets the text for the iterator to operate on, and resets all state.
+func (iter *Iterator[T]) SetText(data T) {
+ iter.data = data
+ iter.start = 0
+ iter.pos = 0
+}
+
+// Split sets the SplitFunc for the Iterator.
+func (iter *Iterator[T]) Split(split SplitFunc[T]) {
+ iter.split = split
+}
+
+// Next advances the iterator to the next token. It returns false when there
+// are no remaining tokens or an error occurred.
+func (iter *Iterator[T]) Next() bool {
+ if iter.pos == len(iter.data) {
+ return false
+ }
+ if iter.pos > len(iter.data) {
+ panic("SplitFunc advanced beyond the end of the data")
+ }
+
+ iter.start = iter.pos
+
+ advance, _, err := iter.split(iter.data[iter.pos:], true)
+ if err != nil {
+ panic(err)
+ }
+ if advance <= 0 {
+ panic("SplitFunc returned a zero or negative advance")
+ }
+
+ iter.pos += advance
+ if iter.pos > len(iter.data) {
+ panic("SplitFunc advanced beyond the end of the data")
+ }
+
+ return true
+}
+
+// Value returns the current token.
+func (iter *Iterator[T]) Value() T {
+ return iter.data[iter.start:iter.pos]
+}
+
+// Start returns the byte position of the current token in the original data.
+func (iter *Iterator[T]) Start() int {
+ return iter.start
+}
+
+// End returns the byte position after the current token in the original data.
+func (iter *Iterator[T]) End() int {
+ return iter.pos
+}
+
+// Reset resets the iterator to the beginning of the data.
+func (iter *Iterator[T]) Reset() {
+ iter.start = 0
+ iter.pos = 0
+}
+
+func (iter *Iterator[T]) First() T {
+ if len(iter.data) == 0 {
+ return iter.data
+ }
+ advance, _, err := iter.split(iter.data, true)
+ if err != nil {
+ panic(err)
+ }
+ if advance <= 0 {
+ panic("SplitFunc returned a zero or negative advance")
+ }
+ if advance > len(iter.data) {
+ panic("SplitFunc advanced beyond the end of the data")
+ }
+ return iter.data[:advance]
+}
diff --git a/hack/tools/vendor/github.com/emicklei/go-restful/v3/.travis.yml b/hack/tools/vendor/github.com/emicklei/go-restful/v3/.travis.yml
deleted file mode 100644
index 3a0bf5ff1b..0000000000
--- a/hack/tools/vendor/github.com/emicklei/go-restful/v3/.travis.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-language: go
-
-go:
- - 1.x
-
-before_install:
- - go test -v
-
-script:
- - go test -race -coverprofile=coverage.txt -covermode=atomic
-
-after_success:
- - bash <(curl -s https://codecov.io/bash)
\ No newline at end of file
diff --git a/hack/tools/vendor/github.com/emicklei/go-restful/v3/CHANGES.md b/hack/tools/vendor/github.com/emicklei/go-restful/v3/CHANGES.md
index 6f24dfff56..4fcd920abe 100644
--- a/hack/tools/vendor/github.com/emicklei/go-restful/v3/CHANGES.md
+++ b/hack/tools/vendor/github.com/emicklei/go-restful/v3/CHANGES.md
@@ -1,5 +1,9 @@
# Change history of go-restful
+## [v3.13.0] - 2025-08-14
+
+- optimize performance of path matching in CurlyRouter ( thanks @wenhuang, Wen Huang)
+
## [v3.12.2] - 2025-02-21
- allow empty payloads in post,put,patch, issue #580 ( thanks @liggitt, Jordan Liggitt)
diff --git a/hack/tools/vendor/github.com/emicklei/go-restful/v3/README.md b/hack/tools/vendor/github.com/emicklei/go-restful/v3/README.md
index 3fb40d1980..50a79ab692 100644
--- a/hack/tools/vendor/github.com/emicklei/go-restful/v3/README.md
+++ b/hack/tools/vendor/github.com/emicklei/go-restful/v3/README.md
@@ -84,6 +84,7 @@ func (u UserResource) findUser(request *restful.Request, response *restful.Respo
- Configurable (trace) logging
- Customizable gzip/deflate readers and writers using CompressorProvider registration
- Inject your own http.Handler using the `HttpMiddlewareHandlerToFilter` function
+- Added `SetPathTokenCacheEnabled` and `SetCustomVerbCacheEnabled` to disable regexp caching (default=true)
## How to customize
There are several hooks to customize the behavior of the go-restful package.
diff --git a/hack/tools/vendor/github.com/emicklei/go-restful/v3/curly.go b/hack/tools/vendor/github.com/emicklei/go-restful/v3/curly.go
index 6fd2bcd5a1..eec43bfd06 100644
--- a/hack/tools/vendor/github.com/emicklei/go-restful/v3/curly.go
+++ b/hack/tools/vendor/github.com/emicklei/go-restful/v3/curly.go
@@ -9,11 +9,35 @@ import (
"regexp"
"sort"
"strings"
+ "sync"
)
// CurlyRouter expects Routes with paths that contain zero or more parameters in curly brackets.
type CurlyRouter struct{}
+var (
+ regexCache sync.Map // Cache for compiled regex patterns
+ pathTokenCacheEnabled = true // Enable/disable path token regex caching
+)
+
+// SetPathTokenCacheEnabled enables or disables path token regex caching for CurlyRouter.
+// When disabled, regex patterns will be compiled on every request.
+// When enabled (default), compiled regex patterns are cached for better performance.
+func SetPathTokenCacheEnabled(enabled bool) {
+ pathTokenCacheEnabled = enabled
+}
+
+// getCachedRegexp retrieves a compiled regex from the cache if found and valid.
+// Returns the regex and true if found and valid, nil and false otherwise.
+func getCachedRegexp(cache *sync.Map, pattern string) (*regexp.Regexp, bool) {
+ if cached, found := cache.Load(pattern); found {
+ if regex, ok := cached.(*regexp.Regexp); ok {
+ return regex, true
+ }
+ }
+ return nil, false
+}
+
// SelectRoute is part of the Router interface and returns the best match
// for the WebService and its Route for the given Request.
func (c CurlyRouter) SelectRoute(
@@ -113,8 +137,28 @@ func (c CurlyRouter) regularMatchesPathToken(routeToken string, colon int, reque
}
return true, true
}
- matched, err := regexp.MatchString(regPart, requestToken)
- return (matched && err == nil), false
+
+ // Check cache first (if enabled)
+ if pathTokenCacheEnabled {
+ if regex, found := getCachedRegexp(®exCache, regPart); found {
+ matched := regex.MatchString(requestToken)
+ return matched, false
+ }
+ }
+
+ // Compile the regex
+ regex, err := regexp.Compile(regPart)
+ if err != nil {
+ return false, false
+ }
+
+ // Cache the regex (if enabled)
+ if pathTokenCacheEnabled {
+ regexCache.Store(regPart, regex)
+ }
+
+ matched := regex.MatchString(requestToken)
+ return matched, false
}
var jsr311Router = RouterJSR311{}
@@ -168,7 +212,7 @@ func (c CurlyRouter) computeWebserviceScore(requestTokens []string, routeTokens
if matchesToken {
score++ // extra score for regex match
}
- }
+ }
} else {
// not a parameter
if eachRequestToken != eachRouteToken {
diff --git a/hack/tools/vendor/github.com/emicklei/go-restful/v3/custom_verb.go b/hack/tools/vendor/github.com/emicklei/go-restful/v3/custom_verb.go
index bfc17efde8..0b98eeb091 100644
--- a/hack/tools/vendor/github.com/emicklei/go-restful/v3/custom_verb.go
+++ b/hack/tools/vendor/github.com/emicklei/go-restful/v3/custom_verb.go
@@ -1,14 +1,28 @@
package restful
+// Copyright 2025 Ernest Micklei. All rights reserved.
+// Use of this source code is governed by a license
+// that can be found in the LICENSE file.
+
import (
"fmt"
"regexp"
+ "sync"
)
var (
- customVerbReg = regexp.MustCompile(":([A-Za-z]+)$")
+ customVerbReg = regexp.MustCompile(":([A-Za-z]+)$")
+ customVerbCache sync.Map // Cache for compiled custom verb regexes
+ customVerbCacheEnabled = true // Enable/disable custom verb regex caching
)
+// SetCustomVerbCacheEnabled enables or disables custom verb regex caching.
+// When disabled, custom verb regex patterns will be compiled on every request.
+// When enabled (default), compiled custom verb regex patterns are cached for better performance.
+func SetCustomVerbCacheEnabled(enabled bool) {
+ customVerbCacheEnabled = enabled
+}
+
func hasCustomVerb(routeToken string) bool {
return customVerbReg.MatchString(routeToken)
}
@@ -20,7 +34,23 @@ func isMatchCustomVerb(routeToken string, pathToken string) bool {
}
customVerb := rs[1]
- specificVerbReg := regexp.MustCompile(fmt.Sprintf(":%s$", customVerb))
+ regexPattern := fmt.Sprintf(":%s$", customVerb)
+
+ // Check cache first (if enabled)
+ if customVerbCacheEnabled {
+ if specificVerbReg, found := getCachedRegexp(&customVerbCache, regexPattern); found {
+ return specificVerbReg.MatchString(pathToken)
+ }
+ }
+
+ // Compile the regex
+ specificVerbReg := regexp.MustCompile(regexPattern)
+
+ // Cache the regex (if enabled)
+ if customVerbCacheEnabled {
+ customVerbCache.Store(regexPattern, specificVerbReg)
+ }
+
return specificVerbReg.MatchString(pathToken)
}
diff --git a/hack/tools/vendor/github.com/emicklei/go-restful/v3/doc.go b/hack/tools/vendor/github.com/emicklei/go-restful/v3/doc.go
index 69b13057d0..80809225b8 100644
--- a/hack/tools/vendor/github.com/emicklei/go-restful/v3/doc.go
+++ b/hack/tools/vendor/github.com/emicklei/go-restful/v3/doc.go
@@ -1,7 +1,7 @@
/*
Package restful , a lean package for creating REST-style WebServices without magic.
-WebServices and Routes
+### WebServices and Routes
A WebService has a collection of Route objects that dispatch incoming Http Requests to a function calls.
Typically, a WebService has a root path (e.g. /users) and defines common MIME types for its routes.
@@ -30,14 +30,14 @@ The (*Request, *Response) arguments provide functions for reading information fr
See the example https://github.com/emicklei/go-restful/blob/v3/examples/user-resource/restful-user-resource.go with a full implementation.
-Regular expression matching Routes
+### Regular expression matching Routes
A Route parameter can be specified using the format "uri/{var[:regexp]}" or the special version "uri/{var:*}" for matching the tail of the path.
For example, /persons/{name:[A-Z][A-Z]} can be used to restrict values for the parameter "name" to only contain capital alphabetic characters.
Regular expressions must use the standard Go syntax as described in the regexp package. (https://code.google.com/p/re2/wiki/Syntax)
This feature requires the use of a CurlyRouter.
-Containers
+### Containers
A Container holds a collection of WebServices, Filters and a http.ServeMux for multiplexing http requests.
Using the statements "restful.Add(...) and restful.Filter(...)" will register WebServices and Filters to the Default Container.
@@ -47,7 +47,7 @@ You can create your own Container and create a new http.Server for that particul
container := restful.NewContainer()
server := &http.Server{Addr: ":8081", Handler: container}
-Filters
+### Filters
A filter dynamically intercepts requests and responses to transform or use the information contained in the requests or responses.
You can use filters to perform generic logging, measurement, authentication, redirect, set response headers etc.
@@ -60,22 +60,21 @@ Use the following statement to pass the request,response pair to the next filter
chain.ProcessFilter(req, resp)
-Container Filters
+### Container Filters
These are processed before any registered WebService.
// install a (global) filter for the default container (processed before any webservice)
restful.Filter(globalLogging)
-WebService Filters
+### WebService Filters
These are processed before any Route of a WebService.
// install a webservice filter (processed before any route)
ws.Filter(webserviceLogging).Filter(measureTime)
-
-Route Filters
+### Route Filters
These are processed before calling the function associated with the Route.
@@ -84,7 +83,7 @@ These are processed before calling the function associated with the Route.
See the example https://github.com/emicklei/go-restful/blob/v3/examples/filters/restful-filters.go with full implementations.
-Response Encoding
+### Response Encoding
Two encodings are supported: gzip and deflate. To enable this for all responses:
@@ -95,20 +94,20 @@ Alternatively, you can create a Filter that performs the encoding and install it
See the example https://github.com/emicklei/go-restful/blob/v3/examples/encoding/restful-encoding-filter.go
-OPTIONS support
+### OPTIONS support
By installing a pre-defined container filter, your Webservice(s) can respond to the OPTIONS Http request.
Filter(OPTIONSFilter())
-CORS
+### CORS
By installing the filter of a CrossOriginResourceSharing (CORS), your WebService(s) can handle CORS requests.
cors := CrossOriginResourceSharing{ExposeHeaders: []string{"X-My-Header"}, CookiesAllowed: false, Container: DefaultContainer}
Filter(cors.Filter)
-Error Handling
+### Error Handling
Unexpected things happen. If a request cannot be processed because of a failure, your service needs to tell via the response what happened and why.
For this reason HTTP status codes exist and it is important to use the correct code in every exceptional situation.
@@ -137,11 +136,11 @@ The request does not have or has an unknown Accept Header set for this operation
The request does not have or has an unknown Content-Type Header set for this operation.
-ServiceError
+### ServiceError
In addition to setting the correct (error) Http status code, you can choose to write a ServiceError message on the response.
-Performance options
+### Performance options
This package has several options that affect the performance of your service. It is important to understand them and how you can change it.
@@ -156,30 +155,27 @@ Default value is true
If content encoding is enabled then the default strategy for getting new gzip/zlib writers and readers is to use a sync.Pool.
Because writers are expensive structures, performance is even more improved when using a preloaded cache. You can also inject your own implementation.
-Trouble shooting
+### Trouble shooting
This package has the means to produce detail logging of the complete Http request matching process and filter invocation.
Enabling this feature requires you to set an implementation of restful.StdLogger (e.g. log.Logger) instance such as:
restful.TraceLogger(log.New(os.Stdout, "[restful] ", log.LstdFlags|log.Lshortfile))
-Logging
+### Logging
The restful.SetLogger() method allows you to override the logger used by the package. By default restful
uses the standard library `log` package and logs to stdout. Different logging packages are supported as
long as they conform to `StdLogger` interface defined in the `log` sub-package, writing an adapter for your
preferred package is simple.
-Resources
+### Resources
-[project]: https://github.com/emicklei/go-restful
+(c) 2012-2025, http://ernestmicklei.com. MIT License
+[project]: https://github.com/emicklei/go-restful
[examples]: https://github.com/emicklei/go-restful/blob/master/examples
-
-[design]: http://ernestmicklei.com/2012/11/11/go-restful-api-design/
-
+[design]: http://ernestmicklei.com/2012/11/11/go-restful-api-design/
[showcases]: https://github.com/emicklei/mora, https://github.com/emicklei/landskape
-
-(c) 2012-2015, http://ernestmicklei.com. MIT License
*/
package restful
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/.cirrus.yml b/hack/tools/vendor/github.com/fsnotify/fsnotify/.cirrus.yml
index f4e7dbf37b..7f257e99ac 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/.cirrus.yml
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/.cirrus.yml
@@ -1,7 +1,7 @@
freebsd_task:
name: 'FreeBSD'
freebsd_instance:
- image_family: freebsd-14-1
+ image_family: freebsd-14-2
install_script:
- pkg update -f
- pkg install -y go
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/hack/tools/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
index fa854785d0..6468d2cf40 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
@@ -1,6 +1,39 @@
# Changelog
-1.8.0 2023-10-31
+1.9.0 2024-04-04
+----------------
+
+### Changes and fixes
+
+- all: make BufferedWatcher buffered again ([#657])
+
+- inotify: fix race when adding/removing watches while a watched path is being
+ deleted ([#678], [#686])
+
+- inotify: don't send empty event if a watched path is unmounted ([#655])
+
+- inotify: don't register duplicate watches when watching both a symlink and its
+ target; previously that would get "half-added" and removing the second would
+ panic ([#679])
+
+- kqueue: fix watching relative symlinks ([#681])
+
+- kqueue: correctly mark pre-existing entries when watching a link to a dir on
+ kqueue ([#682])
+
+- illumos: don't send error if changed file is deleted while processing the
+ event ([#678])
+
+
+[#657]: https://github.com/fsnotify/fsnotify/pull/657
+[#678]: https://github.com/fsnotify/fsnotify/pull/678
+[#686]: https://github.com/fsnotify/fsnotify/pull/686
+[#655]: https://github.com/fsnotify/fsnotify/pull/655
+[#681]: https://github.com/fsnotify/fsnotify/pull/681
+[#679]: https://github.com/fsnotify/fsnotify/pull/679
+[#682]: https://github.com/fsnotify/fsnotify/pull/682
+
+1.8.0 2024-10-31
----------------
### Additions
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/hack/tools/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
index e4ac2a2fff..4cc40fa597 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
@@ -77,6 +77,7 @@ End-of-line escapes with `\` are not supported.
debug [yes/no] # Enable/disable FSNOTIFY_DEBUG (tests are run in
parallel by default, so -parallel=1 is probably a good
idea).
+ print [any strings] # Print text to stdout; for debugging.
touch path
mkdir [-p] dir
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/README.md b/hack/tools/vendor/github.com/fsnotify/fsnotify/README.md
index e480733d16..1f4eb583d5 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/README.md
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/README.md
@@ -15,7 +15,6 @@ Platform support:
| ReadDirectoryChangesW | Windows | Supported |
| FEN | illumos | Supported |
| fanotify | Linux 5.9+ | [Not yet](https://github.com/fsnotify/fsnotify/issues/114) |
-| AHAFS | AIX | [aix branch]; experimental due to lack of maintainer and test environment |
| FSEvents | macOS | [Needs support in x/sys/unix][fsevents] |
| USN Journals | Windows | [Needs support in x/sys/windows][usn] |
| Polling | *All* | [Not yet](https://github.com/fsnotify/fsnotify/issues/9) |
@@ -25,7 +24,6 @@ untested.
[fsevents]: https://github.com/fsnotify/fsnotify/issues/11#issuecomment-1279133120
[usn]: https://github.com/fsnotify/fsnotify/issues/53#issuecomment-1279829847
-[aix branch]: https://github.com/fsnotify/fsnotify/issues/353#issuecomment-1284590129
Usage
-----
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_fen.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_fen.go
index c349c326c7..57fc692848 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_fen.go
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_fen.go
@@ -9,6 +9,7 @@ package fsnotify
import (
"errors"
"fmt"
+ "io/fs"
"os"
"path/filepath"
"sync"
@@ -19,27 +20,25 @@ import (
)
type fen struct {
+ *shared
Events chan Event
Errors chan error
mu sync.Mutex
port *unix.EventPort
- done chan struct{} // Channel for sending a "quit message" to the reader goroutine
dirs map[string]Op // Explicitly watched directories
watches map[string]Op // Explicitly watched non-directories
}
-func newBackend(ev chan Event, errs chan error) (backend, error) {
- return newBufferedBackend(0, ev, errs)
-}
+var defaultBufferSize = 0
-func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error) {
+func newBackend(ev chan Event, errs chan error) (backend, error) {
w := &fen{
+ shared: newShared(ev, errs),
Events: ev,
Errors: errs,
dirs: make(map[string]Op),
watches: make(map[string]Op),
- done: make(chan struct{}),
}
var err error
@@ -52,49 +51,10 @@ func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error
return w, nil
}
-// sendEvent attempts to send an event to the user, returning true if the event
-// was put in the channel successfully and false if the watcher has been closed.
-func (w *fen) sendEvent(name string, op Op) (sent bool) {
- select {
- case <-w.done:
- return false
- case w.Events <- Event{Name: name, Op: op}:
- return true
- }
-}
-
-// sendError attempts to send an error to the user, returning true if the error
-// was put in the channel successfully and false if the watcher has been closed.
-func (w *fen) sendError(err error) (sent bool) {
- if err == nil {
- return true
- }
- select {
- case <-w.done:
- return false
- case w.Errors <- err:
- return true
- }
-}
-
-func (w *fen) isClosed() bool {
- select {
- case <-w.done:
- return true
- default:
- return false
- }
-}
-
func (w *fen) Close() error {
- // Take the lock used by associateFile to prevent lingering events from
- // being processed after the close
- w.mu.Lock()
- defer w.mu.Unlock()
- if w.isClosed() {
+ if w.shared.close() {
return nil
}
- close(w.done)
return w.port.Close()
}
@@ -209,7 +169,7 @@ func (w *fen) readEvents() {
return
}
// There was an error not caused by calling w.Close()
- if !w.sendError(err) {
+ if !w.sendError(fmt.Errorf("port.Get: %w", err)) {
return
}
}
@@ -277,13 +237,13 @@ func (w *fen) handleEvent(event *unix.PortEvent) error {
isWatched := watchedDir || watchedPath
if events&unix.FILE_DELETE != 0 {
- if !w.sendEvent(path, Remove) {
+ if !w.sendEvent(Event{Name: path, Op: Remove}) {
return nil
}
reRegister = false
}
if events&unix.FILE_RENAME_FROM != 0 {
- if !w.sendEvent(path, Rename) {
+ if !w.sendEvent(Event{Name: path, Op: Rename}) {
return nil
}
// Don't keep watching the new file name
@@ -297,7 +257,7 @@ func (w *fen) handleEvent(event *unix.PortEvent) error {
// inotify reports a Remove event in this case, so we simulate this
// here.
- if !w.sendEvent(path, Remove) {
+ if !w.sendEvent(Event{Name: path, Op: Remove}) {
return nil
}
// Don't keep watching the file that was removed
@@ -331,7 +291,7 @@ func (w *fen) handleEvent(event *unix.PortEvent) error {
// get here, the sudirectory is already gone. Clearly we were watching
// this path but now it is gone. Let's tell the user that it was
// removed.
- if !w.sendEvent(path, Remove) {
+ if !w.sendEvent(Event{Name: path, Op: Remove}) {
return nil
}
// Suppress extra write events on removed directories; they are not
@@ -346,7 +306,7 @@ func (w *fen) handleEvent(event *unix.PortEvent) error {
if err != nil {
// The symlink still exists, but the target is gone. Report the
// Remove similar to above.
- if !w.sendEvent(path, Remove) {
+ if !w.sendEvent(Event{Name: path, Op: Remove}) {
return nil
}
// Don't return the error
@@ -359,7 +319,7 @@ func (w *fen) handleEvent(event *unix.PortEvent) error {
return err
}
} else {
- if !w.sendEvent(path, Write) {
+ if !w.sendEvent(Event{Name: path, Op: Write}) {
return nil
}
}
@@ -367,7 +327,7 @@ func (w *fen) handleEvent(event *unix.PortEvent) error {
if events&unix.FILE_ATTRIB != 0 && stat != nil {
// Only send Chmod if perms changed
if stat.Mode().Perm() != fmode.Perm() {
- if !w.sendEvent(path, Chmod) {
+ if !w.sendEvent(Event{Name: path, Op: Chmod}) {
return nil
}
}
@@ -376,17 +336,27 @@ func (w *fen) handleEvent(event *unix.PortEvent) error {
if stat != nil {
// If we get here, it means we've hit an event above that requires us to
// continue watching the file or directory
- return w.associateFile(path, stat, isWatched)
+ err := w.associateFile(path, stat, isWatched)
+ if errors.Is(err, fs.ErrNotExist) {
+ // Path may have been removed since the stat.
+ err = nil
+ }
+ return err
}
return nil
}
+// The directory was modified, so we must find unwatched entities and watch
+// them. If something was removed from the directory, nothing will happen, as
+// everything else should still be watched.
func (w *fen) updateDirectory(path string) error {
- // The directory was modified, so we must find unwatched entities and watch
- // them. If something was removed from the directory, nothing will happen,
- // as everything else should still be watched.
files, err := os.ReadDir(path)
if err != nil {
+ // Directory no longer exists: probably just deleted since we got the
+ // event.
+ if errors.Is(err, fs.ErrNotExist) {
+ return nil
+ }
return err
}
@@ -401,10 +371,15 @@ func (w *fen) updateDirectory(path string) error {
return err
}
err = w.associateFile(path, finfo, false)
+ if errors.Is(err, fs.ErrNotExist) {
+ // File may have disappeared between getting the dir listing and
+ // adding the port: that's okay to ignore.
+ continue
+ }
if !w.sendError(err) {
return nil
}
- if !w.sendEvent(path, Create) {
+ if !w.sendEvent(Event{Name: path, Op: Create}) {
return nil
}
}
@@ -430,7 +405,7 @@ func (w *fen) associateFile(path string, stat os.FileInfo, follow bool) error {
// has fired but we haven't processed it yet.
err := w.port.DissociatePath(path)
if err != nil && !errors.Is(err, unix.ENOENT) {
- return err
+ return fmt.Errorf("port.DissociatePath(%q): %w", path, err)
}
}
@@ -446,14 +421,22 @@ func (w *fen) associateFile(path string, stat os.FileInfo, follow bool) error {
if true {
events |= unix.FILE_ATTRIB
}
- return w.port.AssociatePath(path, stat, events, stat.Mode())
+ err := w.port.AssociatePath(path, stat, events, stat.Mode())
+ if err != nil {
+ return fmt.Errorf("port.AssociatePath(%q): %w", path, err)
+ }
+ return nil
}
func (w *fen) dissociateFile(path string, stat os.FileInfo, unused bool) error {
if !w.port.PathIsWatched(path) {
return nil
}
- return w.port.DissociatePath(path)
+ err := w.port.DissociatePath(path)
+ if err != nil {
+ return fmt.Errorf("port.DissociatePath(%q): %w", path, err)
+ }
+ return nil
}
func (w *fen) WatchList() []string {
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_inotify.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_inotify.go
index 36c311694c..a36cb89d73 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_inotify.go
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_inotify.go
@@ -19,6 +19,7 @@ import (
)
type inotify struct {
+ *shared
Events chan Event
Errors chan error
@@ -27,8 +28,6 @@ type inotify struct {
fd int
inotifyFile *os.File
watches *watches
- done chan struct{} // Channel for sending a "quit message" to the reader goroutine
- doneMu sync.Mutex
doneResp chan struct{} // Channel to respond to Close
// Store rename cookies in an array, with the index wrapping to 0. Almost
@@ -52,7 +51,6 @@ type inotify struct {
type (
watches struct {
- mu sync.RWMutex
wd map[uint32]*watch // wd → watch
path map[string]uint32 // pathname → wd
}
@@ -75,34 +73,13 @@ func newWatches() *watches {
}
}
-func (w *watches) len() int {
- w.mu.RLock()
- defer w.mu.RUnlock()
- return len(w.wd)
-}
-
-func (w *watches) add(ww *watch) {
- w.mu.Lock()
- defer w.mu.Unlock()
- w.wd[ww.wd] = ww
- w.path[ww.path] = ww.wd
-}
-
-func (w *watches) remove(wd uint32) {
- w.mu.Lock()
- defer w.mu.Unlock()
- watch := w.wd[wd] // Could have had Remove() called. See #616.
- if watch == nil {
- return
- }
- delete(w.path, watch.path)
- delete(w.wd, wd)
-}
+func (w *watches) byPath(path string) *watch { return w.wd[w.path[path]] }
+func (w *watches) byWd(wd uint32) *watch { return w.wd[wd] }
+func (w *watches) len() int { return len(w.wd) }
+func (w *watches) add(ww *watch) { w.wd[ww.wd] = ww; w.path[ww.path] = ww.wd }
+func (w *watches) remove(watch *watch) { delete(w.path, watch.path); delete(w.wd, watch.wd) }
func (w *watches) removePath(path string) ([]uint32, error) {
- w.mu.Lock()
- defer w.mu.Unlock()
-
path, recurse := recursivePath(path)
wd, ok := w.path[path]
if !ok {
@@ -123,7 +100,7 @@ func (w *watches) removePath(path string) ([]uint32, error) {
wds := make([]uint32, 0, 8)
wds = append(wds, wd)
for p, rwd := range w.path {
- if filepath.HasPrefix(p, path) {
+ if strings.HasPrefix(p, path) {
delete(w.path, p)
delete(w.wd, rwd)
wds = append(wds, rwd)
@@ -132,22 +109,7 @@ func (w *watches) removePath(path string) ([]uint32, error) {
return wds, nil
}
-func (w *watches) byPath(path string) *watch {
- w.mu.RLock()
- defer w.mu.RUnlock()
- return w.wd[w.path[path]]
-}
-
-func (w *watches) byWd(wd uint32) *watch {
- w.mu.RLock()
- defer w.mu.RUnlock()
- return w.wd[wd]
-}
-
func (w *watches) updatePath(path string, f func(*watch) (*watch, error)) error {
- w.mu.Lock()
- defer w.mu.Unlock()
-
var existing *watch
wd, ok := w.path[path]
if ok {
@@ -170,11 +132,9 @@ func (w *watches) updatePath(path string, f func(*watch) (*watch, error)) error
return nil
}
-func newBackend(ev chan Event, errs chan error) (backend, error) {
- return newBufferedBackend(0, ev, errs)
-}
+var defaultBufferSize = 0
-func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error) {
+func newBackend(ev chan Event, errs chan error) (backend, error) {
// Need to set nonblocking mode for SetDeadline to work, otherwise blocking
// I/O operations won't terminate on close.
fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC | unix.IN_NONBLOCK)
@@ -183,12 +143,12 @@ func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error
}
w := &inotify{
+ shared: newShared(ev, errs),
Events: ev,
Errors: errs,
fd: fd,
inotifyFile: os.NewFile(uintptr(fd), ""),
watches: newWatches(),
- done: make(chan struct{}),
doneResp: make(chan struct{}),
}
@@ -196,46 +156,10 @@ func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error
return w, nil
}
-// Returns true if the event was sent, or false if watcher is closed.
-func (w *inotify) sendEvent(e Event) bool {
- select {
- case <-w.done:
- return false
- case w.Events <- e:
- return true
- }
-}
-
-// Returns true if the error was sent, or false if watcher is closed.
-func (w *inotify) sendError(err error) bool {
- if err == nil {
- return true
- }
- select {
- case <-w.done:
- return false
- case w.Errors <- err:
- return true
- }
-}
-
-func (w *inotify) isClosed() bool {
- select {
- case <-w.done:
- return true
- default:
- return false
- }
-}
-
func (w *inotify) Close() error {
- w.doneMu.Lock()
- if w.isClosed() {
- w.doneMu.Unlock()
+ if w.shared.close() {
return nil
}
- close(w.done)
- w.doneMu.Unlock()
// Causes any blocking reads to return with an error, provided the file
// still supports deadline operations.
@@ -244,9 +168,7 @@ func (w *inotify) Close() error {
return err
}
- // Wait for goroutine to close
- <-w.doneResp
-
+ <-w.doneResp // Wait for readEvents() to finish.
return nil
}
@@ -266,6 +188,43 @@ func (w *inotify) AddWith(path string, opts ...addOpt) error {
return fmt.Errorf("%w: %s", xErrUnsupported, with.op)
}
+ add := func(path string, with withOpts, recurse bool) error {
+ var flags uint32
+ if with.noFollow {
+ flags |= unix.IN_DONT_FOLLOW
+ }
+ if with.op.Has(Create) {
+ flags |= unix.IN_CREATE
+ }
+ if with.op.Has(Write) {
+ flags |= unix.IN_MODIFY
+ }
+ if with.op.Has(Remove) {
+ flags |= unix.IN_DELETE | unix.IN_DELETE_SELF
+ }
+ if with.op.Has(Rename) {
+ flags |= unix.IN_MOVED_TO | unix.IN_MOVED_FROM | unix.IN_MOVE_SELF
+ }
+ if with.op.Has(Chmod) {
+ flags |= unix.IN_ATTRIB
+ }
+ if with.op.Has(xUnportableOpen) {
+ flags |= unix.IN_OPEN
+ }
+ if with.op.Has(xUnportableRead) {
+ flags |= unix.IN_ACCESS
+ }
+ if with.op.Has(xUnportableCloseWrite) {
+ flags |= unix.IN_CLOSE_WRITE
+ }
+ if with.op.Has(xUnportableCloseRead) {
+ flags |= unix.IN_CLOSE_NOWRITE
+ }
+ return w.register(path, flags, recurse)
+ }
+
+ w.mu.Lock()
+ defer w.mu.Unlock()
path, recurse := recursivePath(path)
if recurse {
return filepath.WalkDir(path, func(root string, d fs.DirEntry, err error) error {
@@ -289,46 +248,11 @@ func (w *inotify) AddWith(path string, opts ...addOpt) error {
w.sendEvent(Event{Name: root, Op: Create})
}
- return w.add(root, with, true)
+ return add(root, with, true)
})
}
- return w.add(path, with, false)
-}
-
-func (w *inotify) add(path string, with withOpts, recurse bool) error {
- var flags uint32
- if with.noFollow {
- flags |= unix.IN_DONT_FOLLOW
- }
- if with.op.Has(Create) {
- flags |= unix.IN_CREATE
- }
- if with.op.Has(Write) {
- flags |= unix.IN_MODIFY
- }
- if with.op.Has(Remove) {
- flags |= unix.IN_DELETE | unix.IN_DELETE_SELF
- }
- if with.op.Has(Rename) {
- flags |= unix.IN_MOVED_TO | unix.IN_MOVED_FROM | unix.IN_MOVE_SELF
- }
- if with.op.Has(Chmod) {
- flags |= unix.IN_ATTRIB
- }
- if with.op.Has(xUnportableOpen) {
- flags |= unix.IN_OPEN
- }
- if with.op.Has(xUnportableRead) {
- flags |= unix.IN_ACCESS
- }
- if with.op.Has(xUnportableCloseWrite) {
- flags |= unix.IN_CLOSE_WRITE
- }
- if with.op.Has(xUnportableCloseRead) {
- flags |= unix.IN_CLOSE_NOWRITE
- }
- return w.register(path, flags, recurse)
+ return add(path, with, false)
}
func (w *inotify) register(path string, flags uint32, recurse bool) error {
@@ -342,6 +266,10 @@ func (w *inotify) register(path string, flags uint32, recurse bool) error {
return nil, err
}
+ if e, ok := w.watches.wd[uint32(wd)]; ok {
+ return e, nil
+ }
+
if existing == nil {
return &watch{
wd: uint32(wd),
@@ -365,6 +293,9 @@ func (w *inotify) Remove(name string) error {
fmt.Fprintf(os.Stderr, "FSNOTIFY_DEBUG: %s Remove(%q)\n",
time.Now().Format("15:04:05.000000000"), name)
}
+
+ w.mu.Lock()
+ defer w.mu.Unlock()
return w.remove(filepath.Clean(name))
}
@@ -399,13 +330,12 @@ func (w *inotify) WatchList() []string {
return nil
}
+ w.mu.Lock()
+ defer w.mu.Unlock()
entries := make([]string, 0, w.watches.len())
- w.watches.mu.RLock()
for pathname := range w.watches.path {
entries = append(entries, pathname)
}
- w.watches.mu.RUnlock()
-
return entries
}
@@ -418,21 +348,17 @@ func (w *inotify) readEvents() {
close(w.Events)
}()
- var (
- buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events
- errno error // Syscall errno
- )
+ var buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events
for {
- // See if we have been closed.
if w.isClosed() {
return
}
n, err := w.inotifyFile.Read(buf[:])
- switch {
- case errors.Unwrap(err) == os.ErrClosed:
- return
- case err != nil:
+ if err != nil {
+ if errors.Is(err, os.ErrClosed) {
+ return
+ }
if !w.sendError(err) {
return
}
@@ -440,13 +366,9 @@ func (w *inotify) readEvents() {
}
if n < unix.SizeofInotifyEvent {
- var err error
+ err := errors.New("notify: short read in readEvents()") // Read was too short.
if n == 0 {
err = io.EOF // If EOF is received. This should really never happen.
- } else if n < 0 {
- err = errno // If an error occurred while reading.
- } else {
- err = errors.New("notify: short read in readEvents()") // Read was too short.
}
if !w.sendError(err) {
return
@@ -454,132 +376,135 @@ func (w *inotify) readEvents() {
continue
}
- // We don't know how many events we just read into the buffer
- // While the offset points to at least one whole event...
+ // We don't know how many events we just read into the buffer While the
+ // offset points to at least one whole event.
var offset uint32
for offset <= uint32(n-unix.SizeofInotifyEvent) {
- var (
- // Point "raw" to the event in the buffer
- raw = (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset]))
- mask = uint32(raw.Mask)
- nameLen = uint32(raw.Len)
- // Move to the next event in the buffer
- next = func() { offset += unix.SizeofInotifyEvent + nameLen }
- )
-
- if mask&unix.IN_Q_OVERFLOW != 0 {
+ // Point to the event in the buffer.
+ inEvent := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset]))
+
+ if inEvent.Mask&unix.IN_Q_OVERFLOW != 0 {
if !w.sendError(ErrEventOverflow) {
return
}
}
- /// If the event happened to the watched directory or the watched
- /// file, the kernel doesn't append the filename to the event, but
- /// we would like to always fill the the "Name" field with a valid
- /// filename. We retrieve the path of the watch from the "paths"
- /// map.
- watch := w.watches.byWd(uint32(raw.Wd))
- /// Can be nil if Remove() was called in another goroutine for this
- /// path inbetween reading the events from the kernel and reading
- /// the internal state. Not much we can do about it, so just skip.
- /// See #616.
- if watch == nil {
- next()
- continue
+ ev, ok := w.handleEvent(inEvent, &buf, offset)
+ if !ok {
+ return
}
-
- name := watch.path
- if nameLen > 0 {
- /// Point "bytes" at the first byte of the filename
- bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen]
- /// The filename is padded with NULL bytes. TrimRight() gets rid of those.
- name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
+ if !w.sendEvent(ev) {
+ return
}
- if debug {
- internal.Debug(name, raw.Mask, raw.Cookie)
- }
+ // Move to the next event in the buffer
+ offset += unix.SizeofInotifyEvent + inEvent.Len
+ }
+ }
+}
- if mask&unix.IN_IGNORED != 0 { //&& event.Op != 0
- next()
- continue
- }
+func (w *inotify) handleEvent(inEvent *unix.InotifyEvent, buf *[65536]byte, offset uint32) (Event, bool) {
+ w.mu.Lock()
+ defer w.mu.Unlock()
- // inotify will automatically remove the watch on deletes; just need
- // to clean our state here.
- if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF {
- w.watches.remove(watch.wd)
- }
+ /// If the event happened to the watched directory or the watched file, the
+ /// kernel doesn't append the filename to the event, but we would like to
+ /// always fill the the "Name" field with a valid filename. We retrieve the
+ /// path of the watch from the "paths" map.
+ ///
+ /// Can be nil if Remove() was called in another goroutine for this path
+ /// inbetween reading the events from the kernel and reading the internal
+ /// state. Not much we can do about it, so just skip. See #616.
+ watch := w.watches.byWd(uint32(inEvent.Wd))
+ if watch == nil {
+ return Event{}, true
+ }
- // We can't really update the state when a watched path is moved;
- // only IN_MOVE_SELF is sent and not IN_MOVED_{FROM,TO}. So remove
- // the watch.
- if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF {
- if watch.recurse {
- next() // Do nothing
- continue
- }
+ var (
+ name = watch.path
+ nameLen = uint32(inEvent.Len)
+ )
+ if nameLen > 0 {
+ /// Point "bytes" at the first byte of the filename
+ bb := *buf
+ bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&bb[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen]
+ /// The filename is padded with NULL bytes. TrimRight() gets rid of those.
+ name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\x00")
+ }
- err := w.remove(watch.path)
- if err != nil && !errors.Is(err, ErrNonExistentWatch) {
- if !w.sendError(err) {
- return
- }
- }
+ if debug {
+ internal.Debug(name, inEvent.Mask, inEvent.Cookie)
+ }
+
+ if inEvent.Mask&unix.IN_IGNORED != 0 || inEvent.Mask&unix.IN_UNMOUNT != 0 {
+ w.watches.remove(watch)
+ return Event{}, true
+ }
+
+ // inotify will automatically remove the watch on deletes; just need
+ // to clean our state here.
+ if inEvent.Mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF {
+ w.watches.remove(watch)
+ }
+
+ // We can't really update the state when a watched path is moved; only
+ // IN_MOVE_SELF is sent and not IN_MOVED_{FROM,TO}. So remove the watch.
+ if inEvent.Mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF {
+ if watch.recurse { // Do nothing
+ return Event{}, true
+ }
+
+ err := w.remove(watch.path)
+ if err != nil && !errors.Is(err, ErrNonExistentWatch) {
+ if !w.sendError(err) {
+ return Event{}, false
}
+ }
+ }
- /// Skip if we're watching both this path and the parent; the parent
- /// will already send a delete so no need to do it twice.
- if mask&unix.IN_DELETE_SELF != 0 {
- if _, ok := w.watches.path[filepath.Dir(watch.path)]; ok {
- next()
- continue
- }
+ /// Skip if we're watching both this path and the parent; the parent will
+ /// already send a delete so no need to do it twice.
+ if inEvent.Mask&unix.IN_DELETE_SELF != 0 {
+ _, ok := w.watches.path[filepath.Dir(watch.path)]
+ if ok {
+ return Event{}, true
+ }
+ }
+
+ ev := w.newEvent(name, inEvent.Mask, inEvent.Cookie)
+ // Need to update watch path for recurse.
+ if watch.recurse {
+ isDir := inEvent.Mask&unix.IN_ISDIR == unix.IN_ISDIR
+ /// New directory created: set up watch on it.
+ if isDir && ev.Has(Create) {
+ err := w.register(ev.Name, watch.flags, true)
+ if !w.sendError(err) {
+ return Event{}, false
}
- ev := w.newEvent(name, mask, raw.Cookie)
- // Need to update watch path for recurse.
- if watch.recurse {
- isDir := mask&unix.IN_ISDIR == unix.IN_ISDIR
- /// New directory created: set up watch on it.
- if isDir && ev.Has(Create) {
- err := w.register(ev.Name, watch.flags, true)
- if !w.sendError(err) {
- return
+ // This was a directory rename, so we need to update all the
+ // children.
+ //
+ // TODO: this is of course pretty slow; we should use a better data
+ // structure for storing all of this, e.g. store children in the
+ // watch. I have some code for this in my kqueue refactor we can use
+ // in the future. For now I'm okay with this as it's not publicly
+ // available. Correctness first, performance second.
+ if ev.renamedFrom != "" {
+ for k, ww := range w.watches.wd {
+ if k == watch.wd || ww.path == ev.Name {
+ continue
}
-
- // This was a directory rename, so we need to update all
- // the children.
- //
- // TODO: this is of course pretty slow; we should use a
- // better data structure for storing all of this, e.g. store
- // children in the watch. I have some code for this in my
- // kqueue refactor we can use in the future. For now I'm
- // okay with this as it's not publicly available.
- // Correctness first, performance second.
- if ev.renamedFrom != "" {
- w.watches.mu.Lock()
- for k, ww := range w.watches.wd {
- if k == watch.wd || ww.path == ev.Name {
- continue
- }
- if strings.HasPrefix(ww.path, ev.renamedFrom) {
- ww.path = strings.Replace(ww.path, ev.renamedFrom, ev.Name, 1)
- w.watches.wd[k] = ww
- }
- }
- w.watches.mu.Unlock()
+ if strings.HasPrefix(ww.path, ev.renamedFrom) {
+ ww.path = strings.Replace(ww.path, ev.renamedFrom, ev.Name, 1)
+ w.watches.wd[k] = ww
}
}
}
-
- /// Send the events that are not ignored on the events channel
- if !w.sendEvent(ev) {
- return
- }
- next()
}
}
+
+ return ev, true
}
func (w *inotify) isRecursive(path string) bool {
@@ -650,8 +575,8 @@ func (w *inotify) xSupports(op Op) bool {
}
func (w *inotify) state() {
- w.watches.mu.Lock()
- defer w.watches.mu.Unlock()
+ w.mu.Lock()
+ defer w.mu.Unlock()
for wd, ww := range w.watches.wd {
fmt.Fprintf(os.Stderr, "%4d: recurse=%t %q\n", wd, ww.recurse, ww.path)
}
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
index d8de5ab76f..340aeec061 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
@@ -16,14 +16,13 @@ import (
)
type kqueue struct {
+ *shared
Events chan Event
Errors chan error
kq int // File descriptor (as returned by the kqueue() syscall).
closepipe [2]int // Pipe used for closing kq.
watches *watches
- done chan struct{}
- doneMu sync.Mutex
}
type (
@@ -132,14 +131,18 @@ func (w *watches) byPath(path string) (watch, bool) {
return info, ok
}
-func (w *watches) updateDirFlags(path string, flags uint32) {
+func (w *watches) updateDirFlags(path string, flags uint32) bool {
w.mu.Lock()
defer w.mu.Unlock()
- fd := w.path[path]
+ fd, ok := w.path[path]
+ if !ok { // Already deleted: don't re-set it here.
+ return false
+ }
info := w.wd[fd]
info.dirFlags = flags
w.wd[fd] = info
+ return true
}
func (w *watches) remove(fd int, path string) bool {
@@ -179,22 +182,20 @@ func (w *watches) seenBefore(path string) bool {
return ok
}
-func newBackend(ev chan Event, errs chan error) (backend, error) {
- return newBufferedBackend(0, ev, errs)
-}
+var defaultBufferSize = 0
-func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error) {
+func newBackend(ev chan Event, errs chan error) (backend, error) {
kq, closepipe, err := newKqueue()
if err != nil {
return nil, err
}
w := &kqueue{
+ shared: newShared(ev, errs),
Events: ev,
Errors: errs,
kq: kq,
closepipe: closepipe,
- done: make(chan struct{}),
watches: newWatches(),
}
@@ -210,7 +211,7 @@ func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error
// all.
func newKqueue() (kq int, closepipe [2]int, err error) {
kq, err = unix.Kqueue()
- if kq == -1 {
+ if err != nil {
return kq, closepipe, err
}
@@ -239,54 +240,17 @@ func newKqueue() (kq int, closepipe [2]int, err error) {
return kq, closepipe, nil
}
-// Returns true if the event was sent, or false if watcher is closed.
-func (w *kqueue) sendEvent(e Event) bool {
- select {
- case <-w.done:
- return false
- case w.Events <- e:
- return true
- }
-}
-
-// Returns true if the error was sent, or false if watcher is closed.
-func (w *kqueue) sendError(err error) bool {
- if err == nil {
- return true
- }
- select {
- case <-w.done:
- return false
- case w.Errors <- err:
- return true
- }
-}
-
-func (w *kqueue) isClosed() bool {
- select {
- case <-w.done:
- return true
- default:
- return false
- }
-}
-
func (w *kqueue) Close() error {
- w.doneMu.Lock()
- if w.isClosed() {
- w.doneMu.Unlock()
+ if w.shared.close() {
return nil
}
- close(w.done)
- w.doneMu.Unlock()
pathsToRemove := w.watches.listPaths(false)
for _, name := range pathsToRemove {
w.Remove(name)
}
- // Send "quit" message to the reader goroutine.
- unix.Close(w.closepipe[1])
+ unix.Close(w.closepipe[1]) // Send "quit" message to readEvents
return nil
}
@@ -303,7 +267,7 @@ func (w *kqueue) AddWith(name string, opts ...addOpt) error {
return fmt.Errorf("%w: %s", xErrUnsupported, with.op)
}
- _, err := w.addWatch(name, noteAllEvents)
+ _, err := w.addWatch(name, noteAllEvents, false)
if err != nil {
return err
}
@@ -366,7 +330,7 @@ const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | un
// described in kevent(2).
//
// Returns the real path to the file which was added, with symlinks resolved.
-func (w *kqueue) addWatch(name string, flags uint32) (string, error) {
+func (w *kqueue) addWatch(name string, flags uint32, listDir bool) (string, error) {
if w.isClosed() {
return "", ErrClosed
}
@@ -385,15 +349,15 @@ func (w *kqueue) addWatch(name string, flags uint32) (string, error) {
return "", nil
}
- // Follow symlinks.
- if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
+ // Follow symlinks, but only for paths added with Add(), and not paths
+ // we're adding from internalWatch from a listdir.
+ if !listDir && fi.Mode()&os.ModeSymlink == os.ModeSymlink {
link, err := os.Readlink(name)
if err != nil {
- // Return nil because Linux can add unresolvable symlinks to the
- // watch list without problems, so maintain consistency with
- // that. There will be no file events for broken symlinks.
- // TODO: more specific check; returns os.PathError; ENOENT?
- return "", nil
+ return "", err
+ }
+ if !filepath.IsAbs(link) {
+ link = filepath.Join(filepath.Dir(name), link)
}
_, alreadyWatching = w.watches.byPath(link)
@@ -408,7 +372,7 @@ func (w *kqueue) addWatch(name string, flags uint32) (string, error) {
name = link
fi, err = os.Lstat(name)
if err != nil {
- return "", nil
+ return "", err
}
}
@@ -422,7 +386,6 @@ func (w *kqueue) addWatch(name string, flags uint32) (string, error) {
if errors.Is(err, unix.EINTR) {
continue
}
-
return "", err
}
@@ -444,10 +407,16 @@ func (w *kqueue) addWatch(name string, flags uint32) (string, error) {
if info.isDir {
watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE &&
(!alreadyWatching || (info.dirFlags&unix.NOTE_WRITE) != unix.NOTE_WRITE)
- w.watches.updateDirFlags(name, flags)
+ if !w.watches.updateDirFlags(name, flags) {
+ return "", nil
+ }
if watchDir {
- if err := w.watchDirectoryFiles(name); err != nil {
+ d := name
+ if info.linkName != "" {
+ d = info.linkName
+ }
+ if err := w.watchDirectoryFiles(d); err != nil {
return "", err
}
}
@@ -644,19 +613,22 @@ func (w *kqueue) dirChange(dir string) error {
if errors.Is(err, os.ErrNotExist) {
return nil
}
- return fmt.Errorf("fsnotify.dirChange: %w", err)
+ return fmt.Errorf("fsnotify.dirChange %q: %w", dir, err)
}
for _, f := range files {
fi, err := f.Info()
if err != nil {
+ if errors.Is(err, os.ErrNotExist) {
+ return nil
+ }
return fmt.Errorf("fsnotify.dirChange: %w", err)
}
err = w.sendCreateIfNew(filepath.Join(dir, fi.Name()), fi)
if err != nil {
// Don't need to send an error if this file isn't readable.
- if errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM) {
+ if errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM) || errors.Is(err, os.ErrNotExist) {
return nil
}
return fmt.Errorf("fsnotify.dirChange: %w", err)
@@ -688,11 +660,11 @@ func (w *kqueue) internalWatch(name string, fi os.FileInfo) (string, error) {
// mimic Linux providing delete events for subdirectories, but preserve
// the flags used if currently watching subdirectory
info, _ := w.watches.byPath(name)
- return w.addWatch(name, info.dirFlags|unix.NOTE_DELETE|unix.NOTE_RENAME)
+ return w.addWatch(name, info.dirFlags|unix.NOTE_DELETE|unix.NOTE_RENAME, true)
}
- // watch file to mimic Linux inotify
- return w.addWatch(name, noteAllEvents)
+ // Watch file to mimic Linux inotify.
+ return w.addWatch(name, noteAllEvents, true)
}
// Register events with the queue.
@@ -722,9 +694,9 @@ func (w *kqueue) read(events []unix.Kevent_t) ([]unix.Kevent_t, error) {
}
func (w *kqueue) xSupports(op Op) bool {
- if runtime.GOOS == "freebsd" {
- //return true // Supports everything.
- }
+ //if runtime.GOOS == "freebsd" {
+ // return true // Supports everything.
+ //}
if op.Has(xUnportableOpen) || op.Has(xUnportableRead) ||
op.Has(xUnportableCloseWrite) || op.Has(xUnportableCloseRead) {
return false
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_other.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_other.go
index 5eb5dbc66f..b8c0ad7226 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_other.go
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_other.go
@@ -9,12 +9,11 @@ type other struct {
Errors chan error
}
+var defaultBufferSize = 0
+
func newBackend(ev chan Event, errs chan error) (backend, error) {
return nil, errors.New("fsnotify not supported on the current platform")
}
-func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error) {
- return newBackend(ev, errs)
-}
func (w *other) Close() error { return nil }
func (w *other) WatchList() []string { return nil }
func (w *other) Add(name string) error { return nil }
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_windows.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_windows.go
index c54a630838..3433642d64 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_windows.go
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/backend_windows.go
@@ -28,18 +28,16 @@ type readDirChangesW struct {
port windows.Handle // Handle to completion port
input chan *input // Inputs to the reader are sent on this channel
- quit chan chan<- error
+ done chan chan<- error
mu sync.Mutex // Protects access to watches, closed
watches watchMap // Map of watches (key: i-number)
closed bool // Set to true when Close() is first called
}
-func newBackend(ev chan Event, errs chan error) (backend, error) {
- return newBufferedBackend(50, ev, errs)
-}
+var defaultBufferSize = 50
-func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error) {
+func newBackend(ev chan Event, errs chan error) (backend, error) {
port, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0)
if err != nil {
return nil, os.NewSyscallError("CreateIoCompletionPort", err)
@@ -50,7 +48,7 @@ func newBufferedBackend(sz uint, ev chan Event, errs chan error) (backend, error
port: port,
watches: make(watchMap),
input: make(chan *input, 1),
- quit: make(chan chan<- error, 1),
+ done: make(chan chan<- error, 1),
}
go w.readEvents()
return w, nil
@@ -70,8 +68,8 @@ func (w *readDirChangesW) sendEvent(name, renamedFrom string, mask uint64) bool
event := w.newEvent(name, uint32(mask))
event.renamedFrom = renamedFrom
select {
- case ch := <-w.quit:
- w.quit <- ch
+ case ch := <-w.done:
+ w.done <- ch
case w.Events <- event:
}
return true
@@ -83,10 +81,10 @@ func (w *readDirChangesW) sendError(err error) bool {
return true
}
select {
+ case <-w.done:
+ return false
case w.Errors <- err:
return true
- case <-w.quit:
- return false
}
}
@@ -99,9 +97,9 @@ func (w *readDirChangesW) Close() error {
w.closed = true
w.mu.Unlock()
- // Send "quit" message to the reader goroutine
+ // Send "done" message to the reader goroutine
ch := make(chan error)
- w.quit <- ch
+ w.done <- ch
if err := w.wakeupReader(); err != nil {
return err
}
@@ -495,7 +493,7 @@ func (w *readDirChangesW) readEvents() {
watch := (*watch)(unsafe.Pointer(ov))
if watch == nil {
select {
- case ch := <-w.quit:
+ case ch := <-w.done:
w.mu.Lock()
var indexes []indexMap
for _, index := range w.watches {
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/fsnotify.go
index 0760efe916..f64be4bf98 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/fsnotify.go
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/fsnotify.go
@@ -244,12 +244,13 @@ var (
// ErrUnsupported is returned by AddWith() when WithOps() specified an
// Unportable event that's not supported on this platform.
+ //lint:ignore ST1012 not relevant
xErrUnsupported = errors.New("fsnotify: not supported with this backend")
)
// NewWatcher creates a new Watcher.
func NewWatcher() (*Watcher, error) {
- ev, errs := make(chan Event), make(chan error)
+ ev, errs := make(chan Event, defaultBufferSize), make(chan error)
b, err := newBackend(ev, errs)
if err != nil {
return nil, err
@@ -266,8 +267,8 @@ func NewWatcher() (*Watcher, error) {
// cases, and whenever possible you will be better off increasing the kernel
// buffers instead of adding a large userspace buffer.
func NewBufferedWatcher(sz uint) (*Watcher, error) {
- ev, errs := make(chan Event), make(chan error)
- b, err := newBufferedBackend(sz, ev, errs)
+ ev, errs := make(chan Event, sz), make(chan error)
+ b, err := newBackend(ev, errs)
if err != nil {
return nil, err
}
@@ -337,7 +338,8 @@ func (w *Watcher) Close() error { return w.b.Close() }
// WatchList returns all paths explicitly added with [Watcher.Add] (and are not
// yet removed).
//
-// Returns nil if [Watcher.Close] was called.
+// The order is undefined, and may differ per call. Returns nil if
+// [Watcher.Close] was called.
func (w *Watcher) WatchList() []string { return w.b.WatchList() }
// Supports reports if all the listed operations are supported by this platform.
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/darwin.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/darwin.go
index b0eab10090..0b01bc182a 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/darwin.go
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/darwin.go
@@ -9,14 +9,14 @@ import (
)
var (
- SyscallEACCES = syscall.EACCES
- UnixEACCES = unix.EACCES
+ ErrSyscallEACCES = syscall.EACCES
+ ErrUnixEACCES = unix.EACCES
)
var maxfiles uint64
-// Go 1.19 will do this automatically: https://go-review.googlesource.com/c/go/+/393354/
func SetRlimit() {
+ // Go 1.19 will do this automatically: https://go-review.googlesource.com/c/go/+/393354/
var l syscall.Rlimit
err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &l)
if err == nil && l.Cur != l.Max {
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go
index 547df1df84..5ac8b50797 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/freebsd.go
@@ -9,8 +9,8 @@ import (
)
var (
- SyscallEACCES = syscall.EACCES
- UnixEACCES = unix.EACCES
+ ErrSyscallEACCES = syscall.EACCES
+ ErrUnixEACCES = unix.EACCES
)
var maxfiles uint64
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/unix.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/unix.go
index 30976ce973..b251fb8038 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/unix.go
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/unix.go
@@ -1,4 +1,4 @@
-//go:build !windows && !darwin && !freebsd
+//go:build !windows && !darwin && !freebsd && !plan9
package internal
@@ -9,8 +9,8 @@ import (
)
var (
- SyscallEACCES = syscall.EACCES
- UnixEACCES = unix.EACCES
+ ErrSyscallEACCES = syscall.EACCES
+ ErrUnixEACCES = unix.EACCES
)
var maxfiles uint64
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/windows.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/windows.go
index a72c649549..896bc2e5a2 100644
--- a/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/windows.go
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/internal/windows.go
@@ -10,8 +10,8 @@ import (
// Just a dummy.
var (
- SyscallEACCES = errors.New("dummy")
- UnixEACCES = errors.New("dummy")
+ ErrSyscallEACCES = errors.New("dummy")
+ ErrUnixEACCES = errors.New("dummy")
)
func SetRlimit() {}
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/shared.go b/hack/tools/vendor/github.com/fsnotify/fsnotify/shared.go
new file mode 100644
index 0000000000..3ee9b58f1d
--- /dev/null
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/shared.go
@@ -0,0 +1,64 @@
+package fsnotify
+
+import "sync"
+
+type shared struct {
+ Events chan Event
+ Errors chan error
+ done chan struct{}
+ mu sync.Mutex
+}
+
+func newShared(ev chan Event, errs chan error) *shared {
+ return &shared{
+ Events: ev,
+ Errors: errs,
+ done: make(chan struct{}),
+ }
+}
+
+// Returns true if the event was sent, or false if watcher is closed.
+func (w *shared) sendEvent(e Event) bool {
+ if e.Op == 0 {
+ return true
+ }
+ select {
+ case <-w.done:
+ return false
+ case w.Events <- e:
+ return true
+ }
+}
+
+// Returns true if the error was sent, or false if watcher is closed.
+func (w *shared) sendError(err error) bool {
+ if err == nil {
+ return true
+ }
+ select {
+ case <-w.done:
+ return false
+ case w.Errors <- err:
+ return true
+ }
+}
+
+func (w *shared) isClosed() bool {
+ select {
+ case <-w.done:
+ return true
+ default:
+ return false
+ }
+}
+
+// Mark as closed; returns true if it was already closed.
+func (w *shared) close() bool {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ if w.isClosed() {
+ return true
+ }
+ close(w.done)
+ return false
+}
diff --git a/hack/tools/vendor/github.com/fsnotify/fsnotify/staticcheck.conf b/hack/tools/vendor/github.com/fsnotify/fsnotify/staticcheck.conf
new file mode 100644
index 0000000000..8fa7351f0c
--- /dev/null
+++ b/hack/tools/vendor/github.com/fsnotify/fsnotify/staticcheck.conf
@@ -0,0 +1,3 @@
+checks = ['all',
+ '-U1000', # Don't complain about unused functions.
+]
diff --git a/hack/tools/vendor/github.com/fxamacker/cbor/v2/README.md b/hack/tools/vendor/github.com/fxamacker/cbor/v2/README.md
index af0a79507e..d072b81c73 100644
--- a/hack/tools/vendor/github.com/fxamacker/cbor/v2/README.md
+++ b/hack/tools/vendor/github.com/fxamacker/cbor/v2/README.md
@@ -1,30 +1,31 @@
-# CBOR Codec in Go
-
-
+CBOR Codec 
[fxamacker/cbor](https://github.com/fxamacker/cbor) is a library for encoding and decoding [CBOR](https://www.rfc-editor.org/info/std94) and [CBOR Sequences](https://www.rfc-editor.org/rfc/rfc8742.html).
CBOR is a [trusted alternative](https://www.rfc-editor.org/rfc/rfc8949.html#name-comparison-of-other-binary-) to JSON, MessagePack, Protocol Buffers, etc. CBOR is an Internet Standard defined by [IETF STD 94 (RFC 8949)](https://www.rfc-editor.org/info/std94) and is designed to be relevant for decades.
-`fxamacker/cbor` is used in projects by Arm Ltd., Cisco, EdgeX Foundry, Flow Foundation, Fraunhofer‑AISEC, Kubernetes, Let's Encrypt (ISRG), Linux Foundation, Microsoft, Mozilla, Oasis Protocol, Tailscale, Teleport, [etc](https://github.com/fxamacker/cbor#who-uses-fxamackercbor).
+`fxamacker/cbor` is used in projects by Arm Ltd., EdgeX Foundry, Flow Foundation, Fraunhofer‑AISEC, IBM, Kubernetes[*](https://github.com/search?q=org%3Akubernetes%20fxamacker%2Fcbor&type=code), Let's Encrypt, Linux Foundation, Microsoft, Oasis Protocol, Red Hat[*](https://github.com/search?q=org%3Aopenshift+fxamacker%2Fcbor&type=code), Tailscale[*](https://github.com/search?q=org%3Atailscale+fxamacker%2Fcbor&type=code), Veraison[*](https://github.com/search?q=org%3Averaison+fxamacker%2Fcbor&type=code), [etc](https://github.com/fxamacker/cbor#who-uses-fxamackercbor).
-See [Quick Start](#quick-start) and [Releases](https://github.com/fxamacker/cbor/releases/). 🆕 `UnmarshalFirst` and `DiagnoseFirst` can decode CBOR Sequences. `cbor.MarshalToBuffer()` and `UserBufferEncMode` accepts user-specified buffer.
+See [Quick Start](#quick-start) and [Releases](https://github.com/fxamacker/cbor/releases/). 🆕 `UnmarshalFirst` and `DiagnoseFirst` can decode CBOR Sequences. `MarshalToBuffer` and `UserBufferEncMode` accepts user-specified buffer.
## fxamacker/cbor
[](https://github.com/fxamacker/cbor/actions?query=workflow%3Aci)
-[](https://github.com/fxamacker/cbor/actions?query=workflow%3A%22cover+%E2%89%A596%25%22)
+[](https://github.com/fxamacker/cbor/actions?query=workflow%3A%22cover+%E2%89%A597%25%22)
[](https://github.com/fxamacker/cbor/actions/workflows/codeql-analysis.yml)
[](#fuzzing-and-code-coverage)
[](https://goreportcard.com/report/github.com/fxamacker/cbor)
+[](https://github.com/fxamacker/cbor#fuzzing-and-code-coverage)
`fxamacker/cbor` is a CBOR codec in full conformance with [IETF STD 94 (RFC 8949)](https://www.rfc-editor.org/info/std94). It also supports CBOR Sequences ([RFC 8742](https://www.rfc-editor.org/rfc/rfc8742.html)) and Extended Diagnostic Notation ([Appendix G of RFC 8610](https://www.rfc-editor.org/rfc/rfc8610.html#appendix-G)).
Features include full support for CBOR tags, [Core Deterministic Encoding](https://www.rfc-editor.org/rfc/rfc8949.html#name-core-deterministic-encoding), duplicate map key detection, etc.
+API is mostly same as `encoding/json`, plus interfaces that simplify concurrency and CBOR options.
+
Design balances trade-offs between security, speed, concurrency, encoded data size, usability, etc.
-Highlights
+ 🔎 Highlights
__🚀 Speed__
@@ -38,7 +39,7 @@ Codec passed multiple confidential security assessments in 2022. No vulnerabili
__🗜️ Data Size__
-Struct tags (`toarray`, `keyasint`, `omitempty`) automatically reduce size of encoded structs. Encoding optionally shrinks float64→32→16 when values fit.
+Struct tag options (`toarray`, `keyasint`, `omitempty`, `omitzero`) and field tag "-" automatically reduce size of encoded structs. Encoding optionally shrinks float64→32→16 when values fit.
__:jigsaw: Usability__
@@ -58,164 +59,205 @@ Features include CBOR [extension points](https://www.rfc-editor.org/rfc/rfc8949.
`fxamacker/cbor` has configurable limits, etc. that defend against malicious CBOR data.
-By contrast, `encoding/gob` is [not designed to be hardened against adversarial inputs](https://pkg.go.dev/encoding/gob#hdr-Security).
-
-Example decoding with encoding/gob 💥 fatal error (out of memory)
-
-```Go
-// Example of encoding/gob having "fatal error: runtime: out of memory"
-// while decoding 181 bytes.
-package main
-import (
- "bytes"
- "encoding/gob"
- "encoding/hex"
- "fmt"
-)
-
-// Example data is from https://github.com/golang/go/issues/24446
-// (shortened to 181 bytes).
-const data = "4dffb503010102303001ff30000109010130010800010130010800010130" +
- "01ffb80001014a01ffb60001014b01ff860001013001ff860001013001ff" +
- "860001013001ff860001013001ffb80000001eff850401010e3030303030" +
- "30303030303030303001ff3000010c0104000016ffb70201010830303030" +
- "3030303001ff3000010c000030ffb6040405fcff00303030303030303030" +
- "303030303030303030303030303030303030303030303030303030303030" +
- "30"
-
-type X struct {
- J *X
- K map[string]int
-}
-
-func main() {
- raw, _ := hex.DecodeString(data)
- decoder := gob.NewDecoder(bytes.NewReader(raw))
-
- var x X
- decoder.Decode(&x) // fatal error: runtime: out of memory
- fmt.Println("Decoding finished.")
-}
-```
-
-
-
-
-
-`fxamacker/cbor` is fast at rejecting malformed CBOR data. E.g. attempts to
-decode 10 bytes of malicious CBOR data to `[]byte` (with default settings):
-
-| Codec | Speed (ns/op) | Memory | Allocs |
-| :---- | ------------: | -----: | -----: |
-| fxamacker/cbor 2.5.0 | 44 ± 5% | 32 B/op | 2 allocs/op |
-| ugorji/go 1.2.11 | 5353261 ± 4% | 67111321 B/op | 13 allocs/op |
-
-Benchmark details
-
-Latest comparison used:
-- Input: `[]byte{0x9B, 0x00, 0x00, 0x42, 0xFA, 0x42, 0xFA, 0x42, 0xFA, 0x42}`
-- go1.19.10, linux/amd64, i5-13600K (disabled all e-cores, DDR4 @2933)
-- go test -bench=. -benchmem -count=20
-
-#### Prior comparisons
-
-| Codec | Speed (ns/op) | Memory | Allocs |
-| :---- | ------------: | -----: | -----: |
-| fxamacker/cbor 2.5.0-beta2 | 44.33 ± 2% | 32 B/op | 2 allocs/op |
-| fxamacker/cbor 0.1.0 - 2.4.0 | ~44.68 ± 6% | 32 B/op | 2 allocs/op |
-| ugorji/go 1.2.10 | 5524792.50 ± 3% | 67110491 B/op | 12 allocs/op |
-| ugorji/go 1.1.0 - 1.2.6 | 💥 runtime: | out of memory: | cannot allocate |
-
-- Input: `[]byte{0x9B, 0x00, 0x00, 0x42, 0xFA, 0x42, 0xFA, 0x42, 0xFA, 0x42}`
-- go1.19.6, linux/amd64, i5-13600K (DDR4)
-- go test -bench=. -benchmem -count=20
-
-
-
-
-
-### Smaller Encodings with Struct Tags
-
-Struct tags (`toarray`, `keyasint`, `omitempty`) reduce encoded size of structs.
-
-Example encoding 3-level nested Go struct to 1 byte CBOR
-
-https://go.dev/play/p/YxwvfPdFQG2
-
-```Go
-// Example encoding nested struct (with omitempty tag)
-// - encoding/json: 18 byte JSON
-// - fxamacker/cbor: 1 byte CBOR
-package main
-
-import (
- "encoding/hex"
- "encoding/json"
- "fmt"
-
- "github.com/fxamacker/cbor/v2"
-)
-
-type GrandChild struct {
- Quux int `json:",omitempty"`
-}
-
-type Child struct {
- Baz int `json:",omitempty"`
- Qux GrandChild `json:",omitempty"`
-}
-
-type Parent struct {
- Foo Child `json:",omitempty"`
- Bar int `json:",omitempty"`
-}
-
-func cb() {
- results, _ := cbor.Marshal(Parent{})
- fmt.Println("hex(CBOR): " + hex.EncodeToString(results))
-
- text, _ := cbor.Diagnose(results) // Diagnostic Notation
- fmt.Println("DN: " + text)
-}
-
-func js() {
- results, _ := json.Marshal(Parent{})
- fmt.Println("hex(JSON): " + hex.EncodeToString(results))
-
- text := string(results) // JSON
- fmt.Println("JSON: " + text)
-}
-
-func main() {
- cb()
- fmt.Println("-------------")
- js()
-}
-```
-
-Output (DN is Diagnostic Notation):
-```
-hex(CBOR): a0
-DN: {}
--------------
-hex(JSON): 7b22466f6f223a7b22517578223a7b7d7d7d
-JSON: {"Foo":{"Qux":{}}}
-```
-
-
-
-
-
-Example using different struct tags together:
+Notably, `fxamacker/cbor` is fast at rejecting malformed CBOR data.
+
+> [!NOTE]
+> Benchmarks rejecting 10 bytes of malicious CBOR data decoding to `[]byte`:
+>
+> | Codec | Speed (ns/op) | Memory | Allocs |
+> | :---- | ------------: | -----: | -----: |
+> | fxamacker/cbor 2.7.0 | 47 ± 7% | 32 B/op | 2 allocs/op |
+> | ugorji/go 1.2.12 | 5878187 ± 3% | 67111556 B/op | 13 allocs/op |
+>
+> Faster hardware (overclocked DDR4 or DDR5) can reduce speed difference.
+>
+> 🔎 Benchmark details
+>
+> Latest comparison for decoding CBOR data to Go `[]byte`:
+> - Input: `[]byte{0x9B, 0x00, 0x00, 0x42, 0xFA, 0x42, 0xFA, 0x42, 0xFA, 0x42}`
+> - go1.22.7, linux/amd64, i5-13600K (DDR4-2933, disabled e-cores)
+> - go test -bench=. -benchmem -count=20
+>
+> #### Prior comparisons
+>
+> | Codec | Speed (ns/op) | Memory | Allocs |
+> | :---- | ------------: | -----: | -----: |
+> | fxamacker/cbor 2.5.0-beta2 | 44.33 ± 2% | 32 B/op | 2 allocs/op |
+> | fxamacker/cbor 0.1.0 - 2.4.0 | ~44.68 ± 6% | 32 B/op | 2 allocs/op |
+> | ugorji/go 1.2.10 | 5524792.50 ± 3% | 67110491 B/op | 12 allocs/op |
+> | ugorji/go 1.1.0 - 1.2.6 | 💥 runtime: | out of memory: | cannot allocate |
+>
+> - Input: `[]byte{0x9B, 0x00, 0x00, 0x42, 0xFA, 0x42, 0xFA, 0x42, 0xFA, 0x42}`
+> - go1.19.6, linux/amd64, i5-13600K (DDR4)
+> - go test -bench=. -benchmem -count=20
+>
+>
+
+In contrast, some codecs can crash or use excessive resources while decoding bad data.
+
+> [!WARNING]
+> Go's `encoding/gob` is [not designed to be hardened against adversarial inputs](https://pkg.go.dev/encoding/gob#hdr-Security).
+>
+> 🔎 gob fatal error (out of memory) 💥 decoding 181 bytes
+>
+> ```Go
+> // Example of encoding/gob having "fatal error: runtime: out of memory"
+> // while decoding 181 bytes (all Go versions as of Dec. 8, 2024).
+> package main
+> import (
+> "bytes"
+> "encoding/gob"
+> "encoding/hex"
+> "fmt"
+> )
+>
+> // Example data is from https://github.com/golang/go/issues/24446
+> // (shortened to 181 bytes).
+> const data = "4dffb503010102303001ff30000109010130010800010130010800010130" +
+> "01ffb80001014a01ffb60001014b01ff860001013001ff860001013001ff" +
+> "860001013001ff860001013001ffb80000001eff850401010e3030303030" +
+> "30303030303030303001ff3000010c0104000016ffb70201010830303030" +
+> "3030303001ff3000010c000030ffb6040405fcff00303030303030303030" +
+> "303030303030303030303030303030303030303030303030303030303030" +
+> "30"
+>
+> type X struct {
+> J *X
+> K map[string]int
+> }
+>
+> func main() {
+> raw, _ := hex.DecodeString(data)
+> decoder := gob.NewDecoder(bytes.NewReader(raw))
+>
+> var x X
+> decoder.Decode(&x) // fatal error: runtime: out of memory
+> fmt.Println("Decoding finished.")
+> }
+> ```
+>
+>
+>
+
+### Smaller Encodings with Struct Tag Options
+
+Struct tags automatically reduce encoded size of structs and improve speed.
+
+We can write less code by using struct tag options:
+- `toarray`: encode without field names (decode back to original struct)
+- `keyasint`: encode field names as integers (decode back to original struct)
+- `omitempty`: omit empty field when encoding
+- `omitzero`: omit zero-value field when encoding
+
+As a special case, struct field tag "-" omits the field.
+
+NOTE: When a struct uses `toarray`, the encoder will ignore `omitempty` and `omitzero` to prevent position of encoded array elements from changing. This allows decoder to match encoded elements to their Go struct field.

-API is mostly same as `encoding/json`, plus interfaces that simplify concurrency for CBOR options.
+> [!NOTE]
+> `fxamacker/cbor` can encode a 3-level nested Go struct to 1 byte!
+> - `encoding/json`: 18 bytes of JSON
+> - `fxamacker/cbor`: 1 byte of CBOR
+>
+> 🔎 Encoding 3-level nested Go struct with omitempty
+>
+> https://go.dev/play/p/YxwvfPdFQG2
+>
+> ```Go
+> // Example encoding nested struct (with omitempty tag)
+> // - encoding/json: 18 byte JSON
+> // - fxamacker/cbor: 1 byte CBOR
+>
+> package main
+>
+> import (
+> "encoding/hex"
+> "encoding/json"
+> "fmt"
+>
+> "github.com/fxamacker/cbor/v2"
+> )
+>
+> type GrandChild struct {
+> Quux int `json:",omitempty"`
+> }
+>
+> type Child struct {
+> Baz int `json:",omitempty"`
+> Qux GrandChild `json:",omitempty"`
+> }
+>
+> type Parent struct {
+> Foo Child `json:",omitempty"`
+> Bar int `json:",omitempty"`
+> }
+>
+> func cb() {
+> results, _ := cbor.Marshal(Parent{})
+> fmt.Println("hex(CBOR): " + hex.EncodeToString(results))
+>
+> text, _ := cbor.Diagnose(results) // Diagnostic Notation
+> fmt.Println("DN: " + text)
+> }
+>
+> func js() {
+> results, _ := json.Marshal(Parent{})
+> fmt.Println("hex(JSON): " + hex.EncodeToString(results))
+>
+> text := string(results) // JSON
+> fmt.Println("JSON: " + text)
+> }
+>
+> func main() {
+> cb()
+> fmt.Println("-------------")
+> js()
+> }
+> ```
+>
+> Output (DN is Diagnostic Notation):
+> ```
+> hex(CBOR): a0
+> DN: {}
+> -------------
+> hex(JSON): 7b22466f6f223a7b22517578223a7b7d7d7d
+> JSON: {"Foo":{"Qux":{}}}
+> ```
+>
+>
+
## Quick Start
__Install__: `go get github.com/fxamacker/cbor/v2` and `import "github.com/fxamacker/cbor/v2"`.
+> [!TIP]
+>
+> Tinygo users can try beta/experimental branch [feature/cbor-tinygo-beta](https://github.com/fxamacker/cbor/tree/feature/cbor-tinygo-beta).
+>
+> 🔎 More about tinygo feature branch
+>
+> ### Tinygo
+>
+> Branch [feature/cbor-tinygo-beta](https://github.com/fxamacker/cbor/tree/feature/cbor-tinygo-beta) is based on fxamacker/cbor v2.7.0 and it can be compiled using tinygo v0.33 (also compiles with golang/go).
+>
+> It passes unit tests (with both go1.22 and tinygo v0.33) and is considered beta/experimental for tinygo.
+>
+> :warning: The `feature/cbor-tinygo-beta` branch does not get fuzz tested yet.
+>
+> Changes in this feature branch only affect tinygo compiled software. Summary of changes:
+> - default `DecOptions.MaxNestedLevels` is reduced to 16 (was 32). User can specify higher limit but 24+ crashes tests when compiled with tinygo v0.33.
+> - disabled decoding CBOR tag data to Go interface because tinygo v0.33 is missing needed feature.
+> - encoding error message can be different when encoding function type.
+>
+> Related tinygo issues:
+> - https://github.com/tinygo-org/tinygo/issues/4277
+> - https://github.com/tinygo-org/tinygo/issues/4458
+>
+>
+
+
### Key Points
This library can encode and decode CBOR (RFC 8949) and CBOR Sequences (RFC 8742).
@@ -252,16 +294,17 @@ rest, err = cbor.UnmarshalFirst(b, &v) // decode []byte b to v
// DiagnoseFirst translates first CBOR data item to text and returns remaining bytes.
text, rest, err = cbor.DiagnoseFirst(b) // decode []byte b to Diagnostic Notation text
-// NOTE: Unmarshal returns ExtraneousDataError if there are remaining bytes,
-// but new funcs UnmarshalFirst and DiagnoseFirst do not.
+// NOTE: Unmarshal() returns ExtraneousDataError if there are remaining bytes, but
+// UnmarshalFirst() and DiagnoseFirst() allow trailing bytes.
```
-__IMPORTANT__: 👉 CBOR settings allow trade-offs between speed, security, encoding size, etc.
-
-- Different CBOR libraries may use different default settings.
-- CBOR-based formats or protocols usually require specific settings.
-
-For example, WebAuthn uses "CTAP2 Canonical CBOR" which is available as a preset.
+> [!IMPORTANT]
+> CBOR settings allow trade-offs between speed, security, encoding size, etc.
+>
+> - Different CBOR libraries may use different default settings.
+> - CBOR-based formats or protocols usually require specific settings.
+>
+> For example, WebAuthn uses "CTAP2 Canonical CBOR" which is available as a preset.
### Presets
@@ -312,9 +355,63 @@ err = em.MarshalToBuffer(v, &buf) // encode v to provided buf
### Struct Tags
-Struct tags (`toarray`, `keyasint`, `omitempty`) reduce encoded size of structs.
+Struct tag options (`toarray`, `keyasint`, `omitempty`, `omitzero`) reduce encoded size of structs.
+
+As a special case, struct field tag "-" omits the field.
+
+ 🔎 Example encoding with struct field tag "-"
+
+https://go.dev/play/p/aWEIFxd7InX
+
+```Go
+// https://github.com/fxamacker/cbor/issues/652
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+
+ "github.com/fxamacker/cbor/v2"
+)
+
+// The `cbor:"-"` tag omits the Type field when encoding to CBOR.
+type Entity struct {
+ _ struct{} `cbor:",toarray"`
+ ID uint64 `json:"id"`
+ Type string `cbor:"-" json:"typeOf"`
+ Name string `json:"name"`
+}
+
+func main() {
+ entity := Entity{
+ ID: 1,
+ Type: "int64",
+ Name: "Identifier",
+ }
+
+ c, _ := cbor.Marshal(entity)
+ diag, _ := cbor.Diagnose(c)
+ fmt.Printf("CBOR in hex: %x\n", c)
+ fmt.Printf("CBOR in edn: %s\n", diag)
+
+ j, _ := json.Marshal(entity)
+ fmt.Printf("JSON: %s\n", string(j))
+
+ fmt.Printf("JSON encoding is %d bytes\n", len(j))
+ fmt.Printf("CBOR encoding is %d bytes\n", len(c))
+
+ // Output:
+ // CBOR in hex: 82016a4964656e746966696572
+ // CBOR in edn: [1, "Identifier"]
+ // JSON: {"id":1,"typeOf":"int64","name":"Identifier"}
+ // JSON encoding is 45 bytes
+ // CBOR encoding is 13 bytes
+}
+```
+
+
-Example encoding 3-level nested Go struct to 1 byte CBOR
+ 🔎 Example encoding 3-level nested Go struct to 1 byte CBOR
https://go.dev/play/p/YxwvfPdFQG2
@@ -382,13 +479,13 @@ JSON: {"Foo":{"Qux":{}}}
-Example using several struct tags
+ 🔎 Example using struct tag options

-Struct tags simplify use of CBOR-based protocols that require CBOR arrays or maps with integer keys.
+Struct tag options simplify use of CBOR-based protocols that require CBOR arrays or maps with integer keys.
### CBOR Tags
@@ -404,7 +501,7 @@ em, err := opts.EncModeWithSharedTags(ts) // mutable shared CBOR tags
`TagSet` and modes using it are safe for concurrent use. Equivalent API is available for `DecMode`.
-Example using TagSet and TagOptions
+ 🔎 Example using TagSet and TagOptions
```go
// Use signedCWT struct defined in "Decoding CWT" example.
@@ -430,16 +527,149 @@ if err := dm.Unmarshal(data, &v); err != nil {
em, _ := cbor.EncOptions{}.EncModeWithTags(tags)
// Marshal signedCWT with tag number.
-if data, err := cbor.Marshal(v); err != nil {
+if data, err := em.Marshal(v); err != nil {
return err
}
```
+👉 `fxamacker/cbor` allows user apps to use almost any current or future CBOR tag number by implementing `cbor.Marshaler` and `cbor.Unmarshaler` interfaces.
+
+Basically, `MarshalCBOR` and `UnmarshalCBOR` functions can be implemented by user apps and those functions will automatically be called by this CBOR codec's `Marshal`, `Unmarshal`, etc.
+
+The following [example](https://github.com/fxamacker/cbor/blob/master/example_embedded_json_tag_for_cbor_test.go) shows how to encode and decode a tagged CBOR data item with tag number 262. The tag content is a JSON object "embedded" as a CBOR byte string (major type 2).
+
+ 🔎 Example using Embedded JSON Tag for CBOR (tag 262)
+
+```go
+// https://github.com/fxamacker/cbor/issues/657
+
+package cbor_test
+
+// NOTE: RFC 8949 does not mention tag number 262. IANA assigned
+// CBOR tag number 262 as "Embedded JSON Object" specified by the
+// document Embedded JSON Tag for CBOR:
+//
+// "Tag 262 can be applied to a byte string (major type 2) to indicate
+// that the byte string is a JSON Object. The length of the byte string
+// indicates the content."
+//
+// For more info, see Embedded JSON Tag for CBOR at:
+// https://github.com/toravir/CBOR-Tag-Specs/blob/master/embeddedJSON.md
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+
+ "github.com/fxamacker/cbor/v2"
+)
+
+// cborTagNumForEmbeddedJSON is the CBOR tag number 262.
+const cborTagNumForEmbeddedJSON = 262
+
+// EmbeddedJSON represents a Go value to be encoded as a tagged CBOR data item
+// with tag number 262 and the tag content is a JSON object "embedded" as a
+// CBOR byte string (major type 2).
+type EmbeddedJSON struct {
+ any
+}
+
+func NewEmbeddedJSON(val any) EmbeddedJSON {
+ return EmbeddedJSON{val}
+}
+
+// MarshalCBOR encodes EmbeddedJSON to a tagged CBOR data item with the
+// tag number 262 and the tag content is a JSON object that is
+// "embedded" as a CBOR byte string.
+func (v EmbeddedJSON) MarshalCBOR() ([]byte, error) {
+ // Encode v to JSON object.
+ data, err := json.Marshal(v)
+ if err != nil {
+ return nil, err
+ }
+
+ // Create cbor.Tag representing a tagged CBOR data item.
+ tag := cbor.Tag{
+ Number: cborTagNumForEmbeddedJSON,
+ Content: data,
+ }
+
+ // Marshal to a tagged CBOR data item.
+ return cbor.Marshal(tag)
+}
+
+// UnmarshalCBOR decodes a tagged CBOR data item to EmbeddedJSON.
+// The byte slice provided to this function must contain a single
+// tagged CBOR data item with the tag number 262 and tag content
+// must be a JSON object "embedded" as a CBOR byte string.
+func (v *EmbeddedJSON) UnmarshalCBOR(b []byte) error {
+ // Unmarshal tagged CBOR data item.
+ var tag cbor.Tag
+ if err := cbor.Unmarshal(b, &tag); err != nil {
+ return err
+ }
+
+ // Check tag number.
+ if tag.Number != cborTagNumForEmbeddedJSON {
+ return fmt.Errorf("got tag number %d, expect tag number %d", tag.Number, cborTagNumForEmbeddedJSON)
+ }
+
+ // Check tag content.
+ jsonData, isByteString := tag.Content.([]byte)
+ if !isByteString {
+ return fmt.Errorf("got tag content type %T, expect tag content []byte", tag.Content)
+ }
+
+ // Unmarshal JSON object.
+ return json.Unmarshal(jsonData, v)
+}
+
+// MarshalJSON encodes EmbeddedJSON to a JSON object.
+func (v EmbeddedJSON) MarshalJSON() ([]byte, error) {
+ return json.Marshal(v.any)
+}
+
+// UnmarshalJSON decodes a JSON object.
+func (v *EmbeddedJSON) UnmarshalJSON(b []byte) error {
+ dec := json.NewDecoder(bytes.NewReader(b))
+ dec.UseNumber()
+ return dec.Decode(&v.any)
+}
+
+func Example_embeddedJSONTagForCBOR() {
+ value := NewEmbeddedJSON(map[string]any{
+ "name": "gopher",
+ "id": json.Number("42"),
+ })
+
+ data, err := cbor.Marshal(value)
+ if err != nil {
+ panic(err)
+ }
+
+ fmt.Printf("cbor: %x\n", data)
+
+ var v EmbeddedJSON
+ err = cbor.Unmarshal(data, &v)
+ if err != nil {
+ panic(err)
+ }
+
+ fmt.Printf("%+v\n", v.any)
+ for k, v := range v.any.(map[string]any) {
+ fmt.Printf(" %s: %v (%T)\n", k, v, v)
+ }
+}
+```
+
+
+
+
### Functions and Interfaces
-Functions and interfaces at a glance
+ 🔎 Functions and interfaces at a glance
Common functions with same API as `encoding/json`:
- `Marshal`, `Unmarshal`
@@ -453,7 +683,7 @@ because RFC 8949 treats CBOR data item with remaining bytes as malformed.
Other useful functions:
- `Diagnose`, `DiagnoseFirst` produce human-readable [Extended Diagnostic Notation](https://www.rfc-editor.org/rfc/rfc8610.html#appendix-G) from CBOR data.
- `UnmarshalFirst` decodes first CBOR data item and return any remaining bytes.
-- `Wellformed` returns true if the the CBOR data item is well-formed.
+- `Wellformed` returns true if the CBOR data item is well-formed.
Interfaces identical or comparable to Go `encoding` packages include:
`Marshaler`, `Unmarshaler`, `BinaryMarshaler`, and `BinaryUnmarshaler`.
@@ -472,15 +702,28 @@ Default limits may need to be increased for systems handling very large data (e.
## Status
-v2.7.0 (June 23, 2024) adds features and improvements that help large projects (e.g. Kubernetes) use CBOR as an alternative to JSON and Protocol Buffers. Other improvements include speedups, improved memory use, bug fixes, new serialization options, etc. It passed fuzz tests (5+ billion executions) and is production quality.
+[v2.9.0](https://github.com/fxamacker/cbor/releases/tag/v2.9.0) (Jul 13, 2025) improved interoperability/transcoding between CBOR & JSON, refactored tests, and improved docs.
+- Add opt-in support for `encoding.TextMarshaler` and `encoding.TextUnmarshaler` to encode and decode from CBOR text string.
+- Add opt-in support for `json.Marshaler` and `json.Unmarshaler` via user-provided transcoding function.
+- Update docs for TimeMode, Tag, RawTag, and add example for Embedded JSON Tag for CBOR.
+
+v2.9.0 passed fuzz tests and is production quality.
+
+The minimum version of Go required to build:
+- v2.8.0 and newer releases require go 1.20+.
+- v2.7.1 and older releases require go 1.17+.
For more details, see [release notes](https://github.com/fxamacker/cbor/releases).
-### Prior Release
+### Prior Releases
+
+[v2.8.0](https://github.com/fxamacker/cbor/releases/tag/v2.8.0) (March 30, 2025) is a small release primarily to add `omitzero` option to struct field tags and fix bugs. It passed fuzz tests (billions of executions) and is production quality.
+
+[v2.7.0](https://github.com/fxamacker/cbor/releases/tag/v2.7.0) (June 23, 2024) adds features and improvements that help large projects (e.g. Kubernetes) use CBOR as an alternative to JSON and Protocol Buffers. Other improvements include speedups, improved memory use, bug fixes, new serialization options, etc. It passed fuzz tests (5+ billion executions) and is production quality.
[v2.6.0](https://github.com/fxamacker/cbor/releases/tag/v2.6.0) (February 2024) adds important new features, optimizations, and bug fixes. It is especially useful to systems that need to convert data between CBOR and JSON. New options and optimizations improve handling of bignum, integers, maps, and strings.
-v2.5.0 was released on Sunday, August 13, 2023 with new features and important bug fixes. It is fuzz tested and production quality after extended beta [v2.5.0-beta](https://github.com/fxamacker/cbor/releases/tag/v2.5.0-beta) (Dec 2022) -> [v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) (Aug 2023).
+[v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) was released on Sunday, August 13, 2023 with new features and important bug fixes. It is fuzz tested and production quality after extended beta [v2.5.0-beta](https://github.com/fxamacker/cbor/releases/tag/v2.5.0-beta) (Dec 2022) -> [v2.5.0](https://github.com/fxamacker/cbor/releases/tag/v2.5.0) (Aug 2023).
__IMPORTANT__: 👉 Before upgrading from v2.4 or older release, please read the notable changes highlighted in the release notes. v2.5.0 is a large release with bug fixes to error handling for extraneous data in `Unmarshal`, etc. that should be reviewed before upgrading.
@@ -489,7 +732,7 @@ See [v2.5.0 release notes](https://github.com/fxamacker/cbor/releases/tag/v2.5.0
See ["Version and API Changes"](https://github.com/fxamacker/cbor#versions-and-api-changes) section for more info about version numbering, etc.
[gopkg]: https://pkg.go.dev/github.com/gostaticanalysis/nilerr
[gopkg-badge]: https://pkg.go.dev/badge/github.com/gostaticanalysis/nilerr?status.svg
diff --git a/hack/tools/vendor/github.com/gostaticanalysis/nilerr/nilerr.go b/hack/tools/vendor/github.com/gostaticanalysis/nilerr/nilerr.go
index 787a9e1e97..4615e6d149 100644
--- a/hack/tools/vendor/github.com/gostaticanalysis/nilerr/nilerr.go
+++ b/hack/tools/vendor/github.com/gostaticanalysis/nilerr/nilerr.go
@@ -4,6 +4,7 @@ import (
"fmt"
"go/token"
"go/types"
+ "slices"
"github.com/gostaticanalysis/comment"
"github.com/gostaticanalysis/comment/passes/commentmap"
@@ -30,9 +31,10 @@ func run(pass *analysis.Pass) (interface{}, error) {
reportFail := func(v ssa.Value, ret *ssa.Return, format string) {
pos := ret.Pos()
- line := getNodeLineNumber(pass, ret)
- errLines := getValueLineNumbers(pass, v)
- if !cmaps.IgnoreLine(pass.Fset, line, "nilerr") {
+ if !cmaps.IgnorePos(pos, "nilerr") {
+ seen := map[string]struct{}{}
+ errLines := getValueLineNumbers(pass, v, seen)
+
var errLineText string
if len(errLines) == 1 {
errLineText = fmt.Sprintf("line %d", errLines[0])
@@ -65,12 +67,30 @@ func run(pass *analysis.Pass) (interface{}, error) {
return nil, nil
}
-func getValueLineNumbers(pass *analysis.Pass, v ssa.Value) []int {
+// getValueLineNumbers returns the line numbers.
+// `seen` is used to avoid infinite loop.
+func getValueLineNumbers(pass *analysis.Pass, v ssa.Value, seen map[string]struct{}) []int {
if phi, ok := v.(*ssa.Phi); ok {
result := make([]int, 0, len(phi.Edges))
+
for _, edge := range phi.Edges {
- result = append(result, getValueLineNumbers(pass, edge)...)
+ if _, ok := seen[edge.Name()]; ok {
+ if edge.Pos() == token.NoPos {
+ // Skip elements without a position.
+ continue
+ }
+
+ result = append(result, pass.Fset.File(edge.Pos()).Line(edge.Pos()))
+ continue
+ }
+
+ seen[edge.Name()] = struct{}{}
+
+ result = append(result, getValueLineNumbers(pass, edge, seen)...)
}
+
+ slices.Sort(result)
+
return result
}
@@ -80,12 +100,12 @@ func getValueLineNumbers(pass *analysis.Pass, v ssa.Value) []int {
}
pos := value.Pos()
- return []int{pass.Fset.File(pos).Line(pos)}
-}
-func getNodeLineNumber(pass *analysis.Pass, node ssa.Node) int {
- pos := node.Pos()
- return pass.Fset.File(pos).Line(pos)
+ if pos == token.NoPos {
+ return nil
+ }
+
+ return []int{pass.Fset.File(pos).Line(pos)}
}
var errType = types.Universe.Lookup("error").Type().Underlying().(*types.Interface)
diff --git a/hack/tools/vendor/github.com/hashicorp/go-version/LICENSE b/hack/tools/vendor/github.com/hashicorp/go-version/LICENSE
index 1409d6ab92..bb1e9a486a 100644
--- a/hack/tools/vendor/github.com/hashicorp/go-version/LICENSE
+++ b/hack/tools/vendor/github.com/hashicorp/go-version/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2014 HashiCorp, Inc.
+Copyright IBM Corp. 2014, 2025
Mozilla Public License, version 2.0
diff --git a/hack/tools/vendor/github.com/hashicorp/go-version/README.md b/hack/tools/vendor/github.com/hashicorp/go-version/README.md
index 4b7806cd96..83a8249f72 100644
--- a/hack/tools/vendor/github.com/hashicorp/go-version/README.md
+++ b/hack/tools/vendor/github.com/hashicorp/go-version/README.md
@@ -1,6 +1,7 @@
# Versioning Library for Go
+

-[](https://godoc.org/github.com/hashicorp/go-version)
+[](https://pkg.go.dev/github.com/hashicorp/go-version)
go-version is a library for parsing versions and version constraints,
and verifying versions against a set of constraints. go-version
@@ -12,7 +13,7 @@ Versions used with go-version must follow [SemVer](http://semver.org/).
## Installation and Usage
Package documentation can be found on
-[GoDoc](http://godoc.org/github.com/hashicorp/go-version).
+[Go Reference](https://pkg.go.dev/github.com/hashicorp/go-version).
Installation can be done with a normal `go get`:
diff --git a/hack/tools/vendor/github.com/hashicorp/go-version/constraint.go b/hack/tools/vendor/github.com/hashicorp/go-version/constraint.go
index 29bdc4d2b5..3964da070d 100644
--- a/hack/tools/vendor/github.com/hashicorp/go-version/constraint.go
+++ b/hack/tools/vendor/github.com/hashicorp/go-version/constraint.go
@@ -1,4 +1,4 @@
-// Copyright (c) HashiCorp, Inc.
+// Copyright IBM Corp. 2014, 2025
// SPDX-License-Identifier: MPL-2.0
package version
@@ -8,8 +8,26 @@ import (
"regexp"
"sort"
"strings"
+ "sync"
)
+var (
+ constraintRegexp *regexp.Regexp
+ constraintRegexpOnce sync.Once
+)
+
+func getConstraintRegexp() *regexp.Regexp {
+ constraintRegexpOnce.Do(func() {
+ // This heavy lifting only happens the first time this function is called
+ constraintRegexp = regexp.MustCompile(fmt.Sprintf(
+ `^\s*(%s)\s*(%s)\s*$`,
+ `<=|>=|!=|~>|<|>|=|`,
+ VersionRegexpRaw,
+ ))
+ })
+ return constraintRegexp
+}
+
// Constraint represents a single constraint for a version, such as
// ">= 1.0".
type Constraint struct {
@@ -29,38 +47,11 @@ type Constraints []*Constraint
type constraintFunc func(v, c *Version) bool
-var constraintOperators map[string]constraintOperation
-
type constraintOperation struct {
op operator
f constraintFunc
}
-var constraintRegexp *regexp.Regexp
-
-func init() {
- constraintOperators = map[string]constraintOperation{
- "": {op: equal, f: constraintEqual},
- "=": {op: equal, f: constraintEqual},
- "!=": {op: notEqual, f: constraintNotEqual},
- ">": {op: greaterThan, f: constraintGreaterThan},
- "<": {op: lessThan, f: constraintLessThan},
- ">=": {op: greaterThanEqual, f: constraintGreaterThanEqual},
- "<=": {op: lessThanEqual, f: constraintLessThanEqual},
- "~>": {op: pessimistic, f: constraintPessimistic},
- }
-
- ops := make([]string, 0, len(constraintOperators))
- for k := range constraintOperators {
- ops = append(ops, regexp.QuoteMeta(k))
- }
-
- constraintRegexp = regexp.MustCompile(fmt.Sprintf(
- `^\s*(%s)\s*(%s)\s*$`,
- strings.Join(ops, "|"),
- VersionRegexpRaw))
-}
-
// NewConstraint will parse one or more constraints from the given
// constraint string. The string must be a comma-separated list of
// constraints.
@@ -107,7 +98,7 @@ func (cs Constraints) Check(v *Version) bool {
// to '>0.2' it is *NOT* treated as equal.
//
// Missing operator is treated as equal to '=', whitespaces
-// are ignored and constraints are sorted before comaparison.
+// are ignored and constraints are sorted before comparison.
func (cs Constraints) Equals(c Constraints) bool {
if len(cs) != len(c) {
return false
@@ -176,9 +167,9 @@ func (c *Constraint) String() string {
}
func parseSingle(v string) (*Constraint, error) {
- matches := constraintRegexp.FindStringSubmatch(v)
+ matches := getConstraintRegexp().FindStringSubmatch(v)
if matches == nil {
- return nil, fmt.Errorf("Malformed constraint: %s", v)
+ return nil, fmt.Errorf("malformed constraint: %s", v)
}
check, err := NewVersion(matches[2])
@@ -186,7 +177,25 @@ func parseSingle(v string) (*Constraint, error) {
return nil, err
}
- cop := constraintOperators[matches[1]]
+ var cop constraintOperation
+ switch matches[1] {
+ case "=":
+ cop = constraintOperation{op: equal, f: constraintEqual}
+ case "!=":
+ cop = constraintOperation{op: notEqual, f: constraintNotEqual}
+ case ">":
+ cop = constraintOperation{op: greaterThan, f: constraintGreaterThan}
+ case "<":
+ cop = constraintOperation{op: lessThan, f: constraintLessThan}
+ case ">=":
+ cop = constraintOperation{op: greaterThanEqual, f: constraintGreaterThanEqual}
+ case "<=":
+ cop = constraintOperation{op: lessThanEqual, f: constraintLessThanEqual}
+ case "~>":
+ cop = constraintOperation{op: pessimistic, f: constraintPessimistic}
+ default:
+ cop = constraintOperation{op: equal, f: constraintEqual}
+ }
return &Constraint{
f: cop.f,
diff --git a/hack/tools/vendor/github.com/hashicorp/go-version/version.go b/hack/tools/vendor/github.com/hashicorp/go-version/version.go
index 7c683c2813..17b29732ee 100644
--- a/hack/tools/vendor/github.com/hashicorp/go-version/version.go
+++ b/hack/tools/vendor/github.com/hashicorp/go-version/version.go
@@ -1,23 +1,39 @@
-// Copyright (c) HashiCorp, Inc.
+// Copyright IBM Corp. 2014, 2025
// SPDX-License-Identifier: MPL-2.0
package version
import (
- "bytes"
"database/sql/driver"
"fmt"
"regexp"
"strconv"
"strings"
+ "sync"
)
// The compiled regular expression used to test the validity of a version.
var (
- versionRegexp *regexp.Regexp
- semverRegexp *regexp.Regexp
+ versionRegexp *regexp.Regexp
+ versionRegexpOnce sync.Once
+ semverRegexp *regexp.Regexp
+ semverRegexpOnce sync.Once
)
+func getVersionRegexp() *regexp.Regexp {
+ versionRegexpOnce.Do(func() {
+ versionRegexp = regexp.MustCompile("^" + VersionRegexpRaw + "$")
+ })
+ return versionRegexp
+}
+
+func getSemverRegexp() *regexp.Regexp {
+ semverRegexpOnce.Do(func() {
+ semverRegexp = regexp.MustCompile("^" + SemverRegexpRaw + "$")
+ })
+ return semverRegexp
+}
+
// The raw regular expression string used for testing the validity
// of a version.
const (
@@ -42,28 +58,23 @@ type Version struct {
original string
}
-func init() {
- versionRegexp = regexp.MustCompile("^" + VersionRegexpRaw + "$")
- semverRegexp = regexp.MustCompile("^" + SemverRegexpRaw + "$")
-}
-
// NewVersion parses the given version and returns a new
// Version.
func NewVersion(v string) (*Version, error) {
- return newVersion(v, versionRegexp)
+ return newVersion(v, getVersionRegexp())
}
// NewSemver parses the given version and returns a new
// Version that adheres strictly to SemVer specs
// https://semver.org/
func NewSemver(v string) (*Version, error) {
- return newVersion(v, semverRegexp)
+ return newVersion(v, getSemverRegexp())
}
func newVersion(v string, pattern *regexp.Regexp) (*Version, error) {
matches := pattern.FindStringSubmatch(v)
if matches == nil {
- return nil, fmt.Errorf("Malformed version: %s", v)
+ return nil, fmt.Errorf("malformed version: %s", v)
}
segmentsStr := strings.Split(matches[1], ".")
segments := make([]int64, len(segmentsStr))
@@ -71,7 +82,7 @@ func newVersion(v string, pattern *regexp.Regexp) (*Version, error) {
val, err := strconv.ParseInt(str, 10, 64)
if err != nil {
return nil, fmt.Errorf(
- "Error parsing version: %s", err)
+ "error parsing version: %s", err)
}
segments[i] = val
@@ -174,7 +185,7 @@ func (v *Version) Compare(other *Version) int {
} else if lhs < rhs {
return -1
}
- // Otherwis, rhs was > lhs, they're not equal
+ // Otherwise, rhs was > lhs, they're not equal
return 1
}
@@ -382,22 +393,29 @@ func (v *Version) Segments64() []int64 {
// missing parts (1.0 => 1.0.0) will be made into a canonicalized form
// as shown in the parenthesized examples.
func (v *Version) String() string {
- var buf bytes.Buffer
- fmtParts := make([]string, len(v.segments))
+ return string(v.bytes())
+}
+
+func (v *Version) bytes() []byte {
+ var buf []byte
for i, s := range v.segments {
- // We can ignore err here since we've pre-parsed the values in segments
- str := strconv.FormatInt(s, 10)
- fmtParts[i] = str
+ if i > 0 {
+ buf = append(buf, '.')
+ }
+ buf = strconv.AppendInt(buf, s, 10)
}
- fmt.Fprintf(&buf, strings.Join(fmtParts, "."))
+
if v.pre != "" {
- fmt.Fprintf(&buf, "-%s", v.pre)
+ buf = append(buf, '-')
+ buf = append(buf, v.pre...)
}
+
if v.metadata != "" {
- fmt.Fprintf(&buf, "+%s", v.metadata)
+ buf = append(buf, '+')
+ buf = append(buf, v.metadata...)
}
- return buf.String()
+ return buf
}
// Original returns the original parsed version as-is, including any
diff --git a/hack/tools/vendor/github.com/hashicorp/go-version/version_collection.go b/hack/tools/vendor/github.com/hashicorp/go-version/version_collection.go
index 83547fe13d..11bc8b1c56 100644
--- a/hack/tools/vendor/github.com/hashicorp/go-version/version_collection.go
+++ b/hack/tools/vendor/github.com/hashicorp/go-version/version_collection.go
@@ -1,4 +1,4 @@
-// Copyright (c) HashiCorp, Inc.
+// Copyright IBM Corp. 2014, 2025
// SPDX-License-Identifier: MPL-2.0
package version
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/.gitignore b/hack/tools/vendor/github.com/itchyny/go-yaml/.gitignore
new file mode 100644
index 0000000000..21137ba2c9
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/.gitignore
@@ -0,0 +1,2 @@
+/.cache/
+/yts/testdata/
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/.golangci.yaml b/hack/tools/vendor/github.com/itchyny/go-yaml/.golangci.yaml
new file mode 100644
index 0000000000..67a8e89a69
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/.golangci.yaml
@@ -0,0 +1,46 @@
+version: '2'
+
+linters:
+ enable:
+ - dupword
+ - govet
+ - misspell
+ - nolintlint
+ - staticcheck
+ disable:
+ - errcheck
+ - ineffassign
+ - unused
+ settings:
+ dupword:
+ ignore:
+ - 'NULL'
+ - DOCUMENT-START
+ - BLOCK-END
+ misspell:
+ locale: US
+ nolintlint:
+ allow-unused: false
+ require-specific: true
+ require-explanation: true
+ govet:
+ enable-all: true
+ disable:
+ - fieldalignment
+ - shadow
+ staticcheck:
+ checks:
+ # enable all rules
+ - all
+ # disable some of them
+ - -QF1001 # De Morgan's laws is too opinionated.
+ - -ST1003 # The codebase has too many underscores in identifiers for now.
+
+formatters:
+ enable:
+ - gofumpt
+
+issues:
+ max-issues-per-linter: 0
+ max-same-issues: 0
+ uniq-by-line: false
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/.ls-lint.yaml b/hack/tools/vendor/github.com/itchyny/go-yaml/.ls-lint.yaml
new file mode 100644
index 0000000000..6a8a509cf8
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/.ls-lint.yaml
@@ -0,0 +1,16 @@
+# ls-lint configuration file.
+# More information on the file format can be found on https://ls-lint.org/
+ls:
+ # root directory
+ .yml: exists:0 # .yml files
+ .*.yml: exists:0 # .yml dotfiles
+
+ # any subdirectory, even dotfile directory
+ '**':
+ .yml: exists:0 # .yml files
+ .*.yml: exists:0 # .yml dotfiles
+
+ignore:
+- .git # git folder
+- .cache # cache folder
+- yts/testdata # third-party folder
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/.typos.toml b/hack/tools/vendor/github.com/itchyny/go-yaml/.typos.toml
new file mode 100644
index 0000000000..06603cf8c5
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/.typos.toml
@@ -0,0 +1,21 @@
+# this is the configuration file of typos (spell checker)
+# https://github.com/crate-ci/typos
+
+[files]
+# excluded file
+extend-exclude = [
+ "yts/testdata", # third-party test data
+]
+
+# setting for Go files configuration
+[type.go]
+extend-ignore-re = [
+ 'ba-dum-tss\W+', # this one can be found in test files
+ '"yYnNtTfFoO', # this one can be found in test files
+ 'ba\?r', # this one can be found in test files
+]
+
+[type.go.extend-words]
+# Here is a list of words we want to ignore in Go files
+typ = "typ" # commonly used abbreviation for "type" in Go as "type" is a reserved identifier
+
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/.yamllint.yaml b/hack/tools/vendor/github.com/itchyny/go-yaml/.yamllint.yaml
new file mode 100644
index 0000000000..3cd0070789
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/.yamllint.yaml
@@ -0,0 +1,19 @@
+extends: default
+
+ignore: /**/testdata/ # ignore testdata files that are not relevant for linting
+
+rules:
+ brackets:
+ min-spaces-inside: 0
+ max-spaces-inside: 1 # allow us to use space in brackets
+ document-start:
+ present: false
+ indentation:
+ spaces: 2
+ indent-sequences: false # make sure there is no indentation for sequences
+ truthy:
+ check-keys: false # there is a problem with the "on" key in GitHub Actions
+ quoted-strings:
+ check-keys: true # by default, only values are checked
+ quote-type: single
+ required: only-when-needed
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/CONTRIBUTING.md b/hack/tools/vendor/github.com/itchyny/go-yaml/CONTRIBUTING.md
new file mode 100644
index 0000000000..efa58c285a
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/CONTRIBUTING.md
@@ -0,0 +1,126 @@
+Contributing to go-yaml
+=======================
+
+Thank you for your interest in contributing to go-yaml!
+
+This document provides guidelines and instructions for contributing to this
+project.
+
+
+## Code of Conduct
+
+By participating in this project, you agree to follow our Code of Conduct.
+
+We expect all contributors to:
+- Be respectful and inclusive
+- Use welcoming and inclusive language
+- Be collaborative and constructive
+- Focus on what is best for both the Go and YAML communities
+
+
+## How to Contribute
+
+
+### Reporting Issues
+
+Before submitting an issue, please:
+- Check if the issue already exists in our issue tracker
+- Use a clear and descriptive title
+- Provide detailed steps to reproduce the issue
+- Include relevant code samples and error messages
+- Specify your Go version and operating system
+
+
+### Coding Conventions
+
+- Follow standard Go coding conventions
+- Use `make fmt` to format your code
+- Write descriptive comments for non-obvious code
+- Add tests for your work
+- Keep line length to 80 characters
+- Use meaningful variable and function names
+- Start doc and comment sentences on a new line
+
+
+### Commit Conventions
+
+- No merge commits
+- Commit subject line should:
+ - Start with a capital letter
+ - Not end with a period
+ - Be no more than 50 characters
+
+
+### Pull Requests
+
+1. Fork the repository
+1. Create a new branch for your changes
+1. Make your changes following our coding conventions
+ - If you are not sure about the coding conventions, please ask
+ - Look at the existing code for examples
+1. Write clear commit messages
+1. Update tests and documentation
+1. Submit a pull request
+
+
+### Testing
+
+- Ensure all tests pass with `make test`
+- Add new tests for new functionality
+- Update existing tests when modifying functionality
+
+
+## Development Setup
+
+- Install Go (see [go.mod](https://github.com/yaml/go-yaml/blob/main/go.mod) for
+ minimum required version)
+- Fork and clone the repository
+- Make your changes
+- Run tests and linters
+ - `make test` to run tests locally
+ - `golangci-lint run` to lint locally (requires [golangci-lint](https://golangci-lint.run/) to be installed.)
+
+
+## Using the Makefile
+
+The repository contains a `GNUmakefile` that provides a number of useful
+targets:
+
+- `make test` runs the tests
+- `make test v=1 count=3` runs the tests with options
+- `make test GO-VERSION=1.23.4` runs the tests with a specific Go version
+- `make shell` opens a shell with the project's dependencies set up
+- `make shell GO-VERSION=1.23.4` opens a shell with a specific Go version
+- `make fmt` runs `golangci-lint fmt ./...`
+- `make tidy` runs `go mod tidy`
+- `make install` runs `go install`
+- `make distclean` cleans the project completely
+
+
+## Getting Help
+
+If you need help, you can:
+- Open an issue with your question
+- Read through our documentation
+- Join our [Slack channel](https://cloud-native.slack.com/archives/C08PPAT8PS7)
+
+
+## We are a Work in Progress
+
+This project is very much a team effort.
+We are just getting things rolling and trying to get the foundations in place.
+There are lots of opinions and ideas about how to do things, even within the
+core team.
+
+Once our process is more mature, we will likely change the rules here.
+We'll make the new rules as a team.
+For now, please stick to the rules as they are.
+
+This project is focused on serving the needs of both the Go and YAML
+communities.
+Sometimes those needs can be in conflict, but we'll try to find common ground.
+
+
+## Thank You
+
+Thank you for contributing to go-yaml!
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/GNUmakefile b/hack/tools/vendor/github.com/itchyny/go-yaml/GNUmakefile
new file mode 100644
index 0000000000..0b6bee3b26
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/GNUmakefile
@@ -0,0 +1,99 @@
+# Auto-install https://github.com/makeplus/makes at specific commit:
+MAKES := .cache/makes
+MAKES-LOCAL := .cache/local
+MAKES-COMMIT ?= 74a4d03223cdaf39140613d48d3f1d8c0a0840e5
+$(shell [ -d $(MAKES) ] || ( \
+ git clone -q https://github.com/makeplus/makes $(MAKES) && \
+ git -C $(MAKES) reset -q --hard $(MAKES-COMMIT)))
+ifneq ($(shell git -C $(MAKES) rev-parse HEAD), \
+ $(shell git -C $(MAKES) rev-parse $(MAKES-COMMIT)))
+$(error $(MAKES) is not at the correct commit: $(MAKES-COMMIT))
+endif
+include $(MAKES)/init.mk
+
+# Only auto-install go if no go exists or GO-VERSION specified:
+ifeq (,$(shell which go))
+GO-VERSION ?= 1.24.0
+endif
+GO-VERSION-NEEDED := $(GO-VERSION)
+
+# yaml-test-suite info:
+YTS-TAG := data-2022-01-17
+YTS-DIR := yts/testdata/$(YTS-TAG)
+YTS-URL := https://github.com/yaml/yaml-test-suite
+TEST-DEPS := $(YTS-DIR)
+
+# Setup and include go.mk and shell.mk:
+GO-CMDS-SKIP := test fmt
+ifndef GO-VERSION-NEEDED
+GO-NO-DEP-GO := true
+endif
+include $(MAKES)/go.mk
+ifdef GO-VERSION-NEEDED
+TEST-DEPS += $(GO)
+else
+SHELL-DEPS := $(filter-out $(GO),$(SHELL-DEPS))
+endif
+SHELL-NAME := makes go-yaml
+include $(MAKES)/shell.mk
+
+v ?=
+count ?= 1
+
+fmt:
+ golangci-lint fmt ./...
+
+# Test rules:
+test: $(TEST-DEPS)
+ go test$(if $v, -v)
+
+test-data: $(YTS-DIR)
+
+test-all: test test-yts-all
+
+test-yts: $(TEST-DEPS)
+ go test$(if $v, -v) ./yts -count=$(count)
+
+test-yts-all: $(TEST-DEPS)
+ @echo 'Testing yaml-test-suite'
+ @export RUNALL=1; $(call yts-pass-fail)
+
+test-yts-fail: $(TEST-DEPS)
+ @echo 'Testing yaml-test-suite failures'
+ @export RUNFAILING=1; $(call yts-pass-fail)
+
+
+# Clean rules:
+realclean:
+ $(RM) -r $(dir $(YTS-DIR))
+
+distclean: realclean
+ $(RM) -r $(ROOT)/.cache
+
+
+# Setup rules:
+$(YTS-DIR):
+ git clone -q $(YTS-URL) $@
+ git -C $@ checkout -q $(YTS-TAG)
+
+define yts-pass-fail
+( \
+ result=.cache/local/tmp/yts-test-results; \
+ go test ./yts -count=1 -v | \
+ awk '/ --- (PASS|FAIL): / {print $$2, $$3}' > $$result; \
+ known_count=$$(grep -c '' yts/known-failing-tests); \
+ pass_count=$$(grep -c '^PASS:' $$result); \
+ fail_count=$$(grep -c '^FAIL:' $$result); \
+ echo "PASS: $$pass_count"; \
+ echo "FAIL: $$fail_count (known: $$known_count)"; \
+ if [[ $$RUNFAILING ]] && [[ $$pass_count -gt 0 ]]; then \
+ echo "ERROR: Found passing tests among expected failures:"; \
+ grep '^PASS:' $$result; \
+ exit 1; \
+ fi; \
+ if [[ $$fail_count != "$$known_count" ]]; then \
+ echo "ERROR: FAIL count differs from expected value of $$known_count"; \
+ exit 1; \
+ fi \
+)
+endef
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/LICENSE b/hack/tools/vendor/github.com/itchyny/go-yaml/LICENSE
new file mode 100644
index 0000000000..b0fa97112a
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2025 - The go-yaml Project Contributors
+
+ 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.
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/NOTICE b/hack/tools/vendor/github.com/itchyny/go-yaml/NOTICE
new file mode 100644
index 0000000000..a577834c4b
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/NOTICE
@@ -0,0 +1,21 @@
+The following files were ported to Go from C files of libyaml, and thus are
+still covered by their original MIT license, with the additional copyright
+starting in 2011 when the project was ported over:
+
+- apic.go
+- emitterc.go
+- parserc.go
+- readerc.go
+- scannerc.go
+- writerc.go
+- yamlh.go
+- yamlprivateh.go
+
+Copyright 2006-2011 - Kirill Simonov
+https://opensource.org/license/mit
+
+All the remaining project files are covered by the Apache license:
+
+Copyright 2011-2019 - Canonical Ltd
+Copyright 2025 - The go-yaml Project Contributors
+http://www.apache.org/licenses/LICENSE-2.0
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/README.md b/hack/tools/vendor/github.com/itchyny/go-yaml/README.md
new file mode 100644
index 0000000000..486d48ed87
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/README.md
@@ -0,0 +1,205 @@
+go.yaml.in/yaml
+===============
+
+YAML Support for the Go Language
+
+
+## Introduction
+
+The `yaml` package enables [Go](https://go.dev/) programs to comfortably encode
+and decode [YAML](https://yaml.org/) values.
+
+It was originally developed within [Canonical](https://www.canonical.com) as
+part of the [juju](https://juju.ubuntu.com) project, and is based on a pure Go
+port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML) C library to
+parse and generate YAML data quickly and reliably.
+
+
+## Project Status
+
+This project started as a fork of the extremely popular [go-yaml](
+https://github.com/go-yaml/yaml/)
+project, and is being maintained by the official [YAML organization](
+https://github.com/yaml/).
+
+The YAML team took over ongoing maintenance and development of the project after
+discussion with go-yaml's author, @niemeyer, following his decision to
+[label the project repository as "unmaintained"](
+https://github.com/go-yaml/yaml/blob/944c86a7d2/README.md) in April 2025.
+
+We have put together a team of dedicated maintainers including representatives
+of go-yaml's most important downstream projects.
+
+We will strive to earn the trust of the various go-yaml forks to switch back to
+this repository as their upstream.
+
+Please [contact us](https://cloud-native.slack.com/archives/C08PPAT8PS7) if you
+would like to contribute or be involved.
+
+
+### Version Intentions
+
+Versions `v1`, `v2`, and `v3` will remain as **frozen legacy**.
+They will receive **security-fixes only** so that existing consumers keep
+working without breaking changes.
+
+All ongoing work, including new features and routine bug-fixes, will happen in
+**`v4`**.
+If you’re starting a new project or upgrading an existing one, please use the
+`go.yaml.in/yaml/v4` import path.
+
+
+## Compatibility
+
+The `yaml` package supports most of YAML 1.2, but preserves some behavior from
+1.1 for backwards compatibility.
+
+Specifically, v3 of the `yaml` package:
+
+* Supports YAML 1.1 bools (`yes`/`no`, `on`/`off`) as long as they are being
+ decoded into a typed bool value.
+ Otherwise they behave as a string.
+ Booleans in YAML 1.2 are `true`/`false` only.
+* Supports octals encoded and decoded as `0777` per YAML 1.1, rather than
+ `0o777` as specified in YAML 1.2, because most parsers still use the old
+ format.
+ Octals in the `0o777` format are supported though, so new files work.
+* Does not support base-60 floats.
+ These are gone from YAML 1.2, and were actually never supported by this
+ package as it's clearly a poor choice.
+
+
+## Installation and Usage
+
+The import path for the package is *go.yaml.in/yaml/v4*.
+
+To install it, run:
+
+```bash
+go get go.yaml.in/yaml/v4
+```
+
+
+## API Documentation
+
+See:
+
+
+## API Stability
+
+The package API for yaml v3 will remain stable as described in [gopkg.in](
+https://gopkg.in).
+
+
+## Example
+
+```go
+package main
+
+import (
+ "fmt"
+ "log"
+
+ "go.yaml.in/yaml/v4"
+)
+
+var data = `
+a: Easy!
+b:
+ c: 2
+ d: [3, 4]
+`
+
+// Note: struct fields must be public in order for unmarshal to
+// correctly populate the data.
+type T struct {
+ A string
+ B struct {
+ RenamedC int `yaml:"c"`
+ D []int `yaml:",flow"`
+ }
+}
+
+func main() {
+ t := T{}
+
+ err := yaml.Unmarshal([]byte(data), &t)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- t:\n%v\n\n", t)
+
+ d, err := yaml.Marshal(&t)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- t dump:\n%s\n\n", string(d))
+
+ m := make(map[any]any)
+
+ err = yaml.Unmarshal([]byte(data), &m)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- m:\n%v\n\n", m)
+
+ d, err = yaml.Marshal(&m)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- m dump:\n%s\n\n", string(d))
+}
+```
+
+This example will generate the following output:
+
+```
+--- t:
+{Easy! {2 [3 4]}}
+
+--- t dump:
+a: Easy!
+b:
+ c: 2
+ d: [3, 4]
+
+
+--- m:
+map[a:Easy! b:map[c:2 d:[3 4]]]
+
+--- m dump:
+a: Easy!
+b:
+ c: 2
+ d:
+ - 3
+ - 4
+```
+
+
+## Testing with `make`
+
+Running `make test` in this directory should just work.
+You don't need to have `go` installed and even if you do the `GNUmakefile` will
+ignore it and setup / cache its own version under `.cache/`.
+
+The only things you need are:
+* Linux or macOS
+* `git`
+* `bash`
+* `curl`
+* `make`
+
+Some `make` commands are:
+
+* `make test`
+* `make test GO-VERSION=1.2.34`
+* `make shell` Start a shell with the local `go` environment
+* `make shell GO-VERSION=1.2.34`
+* `make distclean` - Removes `.cache/`
+
+
+## License
+
+The yaml package is licensed under the MIT and Apache License 2.0 licenses.
+Please see the LICENSE file for details.
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/apic.go b/hack/tools/vendor/github.com/itchyny/go-yaml/apic.go
new file mode 100644
index 0000000000..c878509805
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/apic.go
@@ -0,0 +1,737 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+// Copyright (c) 2006-2010 Kirill Simonov
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+package yaml
+
+import (
+ "io"
+)
+
+func (parser *yamlParser) insertToken(pos int, token *yamlToken) {
+ // fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens))
+
+ // Check if we can move the queue at the beginning of the buffer.
+ if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) {
+ if parser.tokens_head != len(parser.tokens) {
+ copy(parser.tokens, parser.tokens[parser.tokens_head:])
+ }
+ parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head]
+ parser.tokens_head = 0
+ }
+ parser.tokens = append(parser.tokens, *token)
+ if pos < 0 {
+ return
+ }
+ copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:])
+ parser.tokens[parser.tokens_head+pos] = *token
+}
+
+// Create a new parser object.
+func newYAMLParser() yamlParser {
+ return yamlParser{
+ raw_buffer: make([]byte, 0, input_raw_buffer_size),
+ buffer: make([]byte, 0, input_buffer_size),
+ }
+}
+
+// Destroy a parser object.
+func (parser *yamlParser) delete() {
+ *parser = yamlParser{}
+}
+
+// String read handler.
+func yamlStringReadHandler(parser *yamlParser, buffer []byte) (n int, err error) {
+ if parser.input_pos == len(parser.input) {
+ return 0, io.EOF
+ }
+ n = copy(buffer, parser.input[parser.input_pos:])
+ parser.input_pos += n
+ return n, nil
+}
+
+// Reader read handler.
+func yamlReaderReadHandler(parser *yamlParser, buffer []byte) (n int, err error) {
+ return parser.input_reader.Read(buffer)
+}
+
+// Set a string input.
+func (parser *yamlParser) setInputString(input []byte) {
+ if parser.read_handler != nil {
+ panic("must set the input source only once")
+ }
+ parser.read_handler = yamlStringReadHandler
+ parser.input = input
+ parser.input_pos = 0
+}
+
+// Set a file input.
+func (parser *yamlParser) setInputReader(r io.Reader) {
+ if parser.read_handler != nil {
+ panic("must set the input source only once")
+ }
+ parser.read_handler = yamlReaderReadHandler
+ parser.input_reader = r
+}
+
+// Set the source encoding.
+func (parser *yamlParser) setEncoding(encoding yamlEncoding) {
+ if parser.encoding != yaml_ANY_ENCODING {
+ panic("must set the encoding only once")
+ }
+ parser.encoding = encoding
+}
+
+// Create a new emitter object.
+func newYAMLEmitter() yamlEmitter {
+ return yamlEmitter{
+ buffer: make([]byte, output_buffer_size),
+ raw_buffer: make([]byte, 0, output_raw_buffer_size),
+ states: make([]yamlEmitterState, 0, initial_stack_size),
+ events: make([]yamlEvent, 0, initial_queue_size),
+ best_width: -1,
+ }
+}
+
+// Destroy an emitter object.
+func (emitter *yamlEmitter) delete() {
+ *emitter = yamlEmitter{}
+}
+
+// String write handler.
+func yamlStringWriteHandler(emitter *yamlEmitter, buffer []byte) error {
+ *emitter.output_buffer = append(*emitter.output_buffer, buffer...)
+ return nil
+}
+
+// yamlWriterWriteHandler uses emitter.output_writer to write the
+// emitted text.
+func yamlWriterWriteHandler(emitter *yamlEmitter, buffer []byte) error {
+ _, err := emitter.output_writer.Write(buffer)
+ return err
+}
+
+// Set a string output.
+func (emitter *yamlEmitter) setOutputString(output_buffer *[]byte) {
+ if emitter.write_handler != nil {
+ panic("must set the output target only once")
+ }
+ emitter.write_handler = yamlStringWriteHandler
+ emitter.output_buffer = output_buffer
+}
+
+// Set a file output.
+func (emitter *yamlEmitter) setOutputWriter(w io.Writer) {
+ if emitter.write_handler != nil {
+ panic("must set the output target only once")
+ }
+ emitter.write_handler = yamlWriterWriteHandler
+ emitter.output_writer = w
+}
+
+// Set the output encoding.
+func (emitter *yamlEmitter) setEncoding(encoding yamlEncoding) {
+ if emitter.encoding != yaml_ANY_ENCODING {
+ panic("must set the output encoding only once")
+ }
+ emitter.encoding = encoding
+}
+
+// Set the canonical output style.
+func (emitter *yamlEmitter) setCanonical(canonical bool) {
+ emitter.canonical = canonical
+}
+
+// Set the indentation increment.
+func (emitter *yamlEmitter) setIndent(indent int) {
+ if indent < 2 || indent > 9 {
+ indent = 2
+ }
+ emitter.best_indent = indent
+}
+
+// Set the preferred line width.
+func (emitter *yamlEmitter) setWidth(width int) {
+ if width < 0 {
+ width = -1
+ }
+ emitter.best_width = width
+}
+
+// Set if unescaped non-ASCII characters are allowed.
+func (emitter *yamlEmitter) setUnicode(unicode bool) {
+ emitter.unicode = unicode
+}
+
+// Set the preferred line break character.
+func (emitter *yamlEmitter) setLineBreak(line_break yamlLineBreak) {
+ emitter.line_break = line_break
+}
+
+///*
+// * Destroy a token object.
+// */
+//
+//YAML_DECLARE(void)
+//yaml_token_delete(yaml_token_t *token)
+//{
+// assert(token); // Non-NULL token object expected.
+//
+// switch (token.type)
+// {
+// case YAML_TAG_DIRECTIVE_TOKEN:
+// yaml_free(token.data.tag_directive.handle);
+// yaml_free(token.data.tag_directive.prefix);
+// break;
+//
+// case YAML_ALIAS_TOKEN:
+// yaml_free(token.data.alias.value);
+// break;
+//
+// case YAML_ANCHOR_TOKEN:
+// yaml_free(token.data.anchor.value);
+// break;
+//
+// case YAML_TAG_TOKEN:
+// yaml_free(token.data.tag.handle);
+// yaml_free(token.data.tag.suffix);
+// break;
+//
+// case YAML_SCALAR_TOKEN:
+// yaml_free(token.data.scalar.value);
+// break;
+//
+// default:
+// break;
+// }
+//
+// memset(token, 0, sizeof(yaml_token_t));
+//}
+//
+///*
+// * Check if a string is a valid UTF-8 sequence.
+// *
+// * Check 'reader.c' for more details on UTF-8 encoding.
+// */
+//
+//static int
+//yaml_check_utf8(yaml_char_t *start, size_t length)
+//{
+// yaml_char_t *end = start+length;
+// yaml_char_t *pointer = start;
+//
+// while (pointer < end) {
+// unsigned char octet;
+// unsigned int width;
+// unsigned int value;
+// size_t k;
+//
+// octet = pointer[0];
+// width = (octet & 0x80) == 0x00 ? 1 :
+// (octet & 0xE0) == 0xC0 ? 2 :
+// (octet & 0xF0) == 0xE0 ? 3 :
+// (octet & 0xF8) == 0xF0 ? 4 : 0;
+// value = (octet & 0x80) == 0x00 ? octet & 0x7F :
+// (octet & 0xE0) == 0xC0 ? octet & 0x1F :
+// (octet & 0xF0) == 0xE0 ? octet & 0x0F :
+// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
+// if (!width) return 0;
+// if (pointer+width > end) return 0;
+// for (k = 1; k < width; k ++) {
+// octet = pointer[k];
+// if ((octet & 0xC0) != 0x80) return 0;
+// value = (value << 6) + (octet & 0x3F);
+// }
+// if (!((width == 1) ||
+// (width == 2 && value >= 0x80) ||
+// (width == 3 && value >= 0x800) ||
+// (width == 4 && value >= 0x10000))) return 0;
+//
+// pointer += width;
+// }
+//
+// return 1;
+//}
+//
+
+// Create STREAM-START.
+func newStreamStartEvent(encoding yamlEncoding) yamlEvent {
+ return yamlEvent{
+ typ: yaml_STREAM_START_EVENT,
+ encoding: encoding,
+ }
+}
+
+// Create STREAM-END.
+func newStreamEndEvent() yamlEvent {
+ return yamlEvent{
+ typ: yaml_STREAM_END_EVENT,
+ }
+}
+
+// Create DOCUMENT-START.
+func newDocumentStartEvent(version_directive *yamlVersionDirective, tag_directives []yamlTagDirective, implicit bool) yamlEvent {
+ return yamlEvent{
+ typ: yaml_DOCUMENT_START_EVENT,
+ version_directive: version_directive,
+ tag_directives: tag_directives,
+ implicit: implicit,
+ }
+}
+
+// Create DOCUMENT-END.
+func newDocumentEndEvent(implicit bool) yamlEvent {
+ return yamlEvent{
+ typ: yaml_DOCUMENT_END_EVENT,
+ implicit: implicit,
+ }
+}
+
+// Create ALIAS.
+func newAliasEvent(anchor []byte) yamlEvent {
+ return yamlEvent{
+ typ: yaml_ALIAS_EVENT,
+ anchor: anchor,
+ }
+}
+
+// Create SCALAR.
+func newScalarEvent(anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yamlScalarStyle) yamlEvent {
+ return yamlEvent{
+ typ: yaml_SCALAR_EVENT,
+ anchor: anchor,
+ tag: tag,
+ value: value,
+ implicit: plain_implicit,
+ quoted_implicit: quoted_implicit,
+ style: yamlStyle(style),
+ }
+}
+
+// Create SEQUENCE-START.
+func newSequenceStartEvent(anchor, tag []byte, implicit bool, style yamlSequenceStyle) yamlEvent {
+ return yamlEvent{
+ typ: yaml_SEQUENCE_START_EVENT,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yamlStyle(style),
+ }
+}
+
+// Create SEQUENCE-END.
+func newSequenceEndEvent() yamlEvent {
+ return yamlEvent{
+ typ: yaml_SEQUENCE_END_EVENT,
+ }
+}
+
+// Create MAPPING-START.
+func newMappingStartEvent(anchor, tag []byte, implicit bool, style yamlMappingStyle) yamlEvent {
+ return yamlEvent{
+ typ: yaml_MAPPING_START_EVENT,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yamlStyle(style),
+ }
+}
+
+// Create MAPPING-END.
+func newMappingEndEvent() yamlEvent {
+ return yamlEvent{
+ typ: yaml_MAPPING_END_EVENT,
+ }
+}
+
+// Destroy an event object.
+func (e *yamlEvent) delete() {
+ *e = yamlEvent{}
+}
+
+///*
+// * Create a document object.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_initialize(document *yaml_document_t,
+// version_directive *yaml_version_directive_t,
+// tag_directives_start *yaml_tag_directive_t,
+// tag_directives_end *yaml_tag_directive_t,
+// start_implicit int, end_implicit int)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// struct {
+// start *yaml_node_t
+// end *yaml_node_t
+// top *yaml_node_t
+// } nodes = { NULL, NULL, NULL }
+// version_directive_copy *yaml_version_directive_t = NULL
+// struct {
+// start *yaml_tag_directive_t
+// end *yaml_tag_directive_t
+// top *yaml_tag_directive_t
+// } tag_directives_copy = { NULL, NULL, NULL }
+// value yaml_tag_directive_t = { NULL, NULL }
+// mark yaml_mark_t = { 0, 0, 0 }
+//
+// assert(document) // Non-NULL document object is expected.
+// assert((tag_directives_start && tag_directives_end) ||
+// (tag_directives_start == tag_directives_end))
+// // Valid tag directives are expected.
+//
+// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error
+//
+// if (version_directive) {
+// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t))
+// if (!version_directive_copy) goto error
+// version_directive_copy.major = version_directive.major
+// version_directive_copy.minor = version_directive.minor
+// }
+//
+// if (tag_directives_start != tag_directives_end) {
+// tag_directive *yaml_tag_directive_t
+// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE))
+// goto error
+// for (tag_directive = tag_directives_start
+// tag_directive != tag_directives_end; tag_directive ++) {
+// assert(tag_directive.handle)
+// assert(tag_directive.prefix)
+// if (!yaml_check_utf8(tag_directive.handle,
+// strlen((char *)tag_directive.handle)))
+// goto error
+// if (!yaml_check_utf8(tag_directive.prefix,
+// strlen((char *)tag_directive.prefix)))
+// goto error
+// value.handle = yaml_strdup(tag_directive.handle)
+// value.prefix = yaml_strdup(tag_directive.prefix)
+// if (!value.handle || !value.prefix) goto error
+// if (!PUSH(&context, tag_directives_copy, value))
+// goto error
+// value.handle = NULL
+// value.prefix = NULL
+// }
+// }
+//
+// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy,
+// tag_directives_copy.start, tag_directives_copy.top,
+// start_implicit, end_implicit, mark, mark)
+//
+// return 1
+//
+//error:
+// STACK_DEL(&context, nodes)
+// yaml_free(version_directive_copy)
+// while (!STACK_EMPTY(&context, tag_directives_copy)) {
+// value yaml_tag_directive_t = POP(&context, tag_directives_copy)
+// yaml_free(value.handle)
+// yaml_free(value.prefix)
+// }
+// STACK_DEL(&context, tag_directives_copy)
+// yaml_free(value.handle)
+// yaml_free(value.prefix)
+//
+// return 0
+//}
+//
+///*
+// * Destroy a document object.
+// */
+//
+//YAML_DECLARE(void)
+//yaml_document_delete(document *yaml_document_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// tag_directive *yaml_tag_directive_t
+//
+// context.error = YAML_NO_ERROR // Eliminate a compiler warning.
+//
+// assert(document) // Non-NULL document object is expected.
+//
+// while (!STACK_EMPTY(&context, document.nodes)) {
+// node yaml_node_t = POP(&context, document.nodes)
+// yaml_free(node.tag)
+// switch (node.type) {
+// case YAML_SCALAR_NODE:
+// yaml_free(node.data.scalar.value)
+// break
+// case YAML_SEQUENCE_NODE:
+// STACK_DEL(&context, node.data.sequence.items)
+// break
+// case YAML_MAPPING_NODE:
+// STACK_DEL(&context, node.data.mapping.pairs)
+// break
+// default:
+// assert(0) // Should not happen.
+// }
+// }
+// STACK_DEL(&context, document.nodes)
+//
+// yaml_free(document.version_directive)
+// for (tag_directive = document.tag_directives.start
+// tag_directive != document.tag_directives.end
+// tag_directive++) {
+// yaml_free(tag_directive.handle)
+// yaml_free(tag_directive.prefix)
+// }
+// yaml_free(document.tag_directives.start)
+//
+// memset(document, 0, sizeof(yaml_document_t))
+//}
+//
+///**
+// * Get a document node.
+// */
+//
+//YAML_DECLARE(yaml_node_t *)
+//yaml_document_get_node(document *yaml_document_t, index int)
+//{
+// assert(document) // Non-NULL document object is expected.
+//
+// if (index > 0 && document.nodes.start + index <= document.nodes.top) {
+// return document.nodes.start + index - 1
+// }
+// return NULL
+//}
+//
+///**
+// * Get the root object.
+// */
+//
+//YAML_DECLARE(yaml_node_t *)
+//yaml_document_get_root_node(document *yaml_document_t)
+//{
+// assert(document) // Non-NULL document object is expected.
+//
+// if (document.nodes.top != document.nodes.start) {
+// return document.nodes.start
+// }
+// return NULL
+//}
+//
+///*
+// * Add a scalar node to a document.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_add_scalar(document *yaml_document_t,
+// tag *yaml_char_t, value *yaml_char_t, length int,
+// style yaml_scalar_style_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// mark yaml_mark_t = { 0, 0, 0 }
+// tag_copy *yaml_char_t = NULL
+// value_copy *yaml_char_t = NULL
+// node yaml_node_t
+//
+// assert(document) // Non-NULL document object is expected.
+// assert(value) // Non-NULL value is expected.
+//
+// if (!tag) {
+// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG
+// }
+//
+// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
+// tag_copy = yaml_strdup(tag)
+// if (!tag_copy) goto error
+//
+// if (length < 0) {
+// length = strlen((char *)value)
+// }
+//
+// if (!yaml_check_utf8(value, length)) goto error
+// value_copy = yaml_malloc(length+1)
+// if (!value_copy) goto error
+// memcpy(value_copy, value, length)
+// value_copy[length] = '\0'
+//
+// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark)
+// if (!PUSH(&context, document.nodes, node)) goto error
+//
+// return document.nodes.top - document.nodes.start
+//
+//error:
+// yaml_free(tag_copy)
+// yaml_free(value_copy)
+//
+// return 0
+//}
+//
+///*
+// * Add a sequence node to a document.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_add_sequence(document *yaml_document_t,
+// tag *yaml_char_t, style yaml_sequence_style_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// mark yaml_mark_t = { 0, 0, 0 }
+// tag_copy *yaml_char_t = NULL
+// struct {
+// start *yaml_node_item_t
+// end *yaml_node_item_t
+// top *yaml_node_item_t
+// } items = { NULL, NULL, NULL }
+// node yaml_node_t
+//
+// assert(document) // Non-NULL document object is expected.
+//
+// if (!tag) {
+// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG
+// }
+//
+// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
+// tag_copy = yaml_strdup(tag)
+// if (!tag_copy) goto error
+//
+// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error
+//
+// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end,
+// style, mark, mark)
+// if (!PUSH(&context, document.nodes, node)) goto error
+//
+// return document.nodes.top - document.nodes.start
+//
+//error:
+// STACK_DEL(&context, items)
+// yaml_free(tag_copy)
+//
+// return 0
+//}
+//
+///*
+// * Add a mapping node to a document.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_add_mapping(document *yaml_document_t,
+// tag *yaml_char_t, style yaml_mapping_style_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// mark yaml_mark_t = { 0, 0, 0 }
+// tag_copy *yaml_char_t = NULL
+// struct {
+// start *yaml_node_pair_t
+// end *yaml_node_pair_t
+// top *yaml_node_pair_t
+// } pairs = { NULL, NULL, NULL }
+// node yaml_node_t
+//
+// assert(document) // Non-NULL document object is expected.
+//
+// if (!tag) {
+// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG
+// }
+//
+// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
+// tag_copy = yaml_strdup(tag)
+// if (!tag_copy) goto error
+//
+// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error
+//
+// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end,
+// style, mark, mark)
+// if (!PUSH(&context, document.nodes, node)) goto error
+//
+// return document.nodes.top - document.nodes.start
+//
+//error:
+// STACK_DEL(&context, pairs)
+// yaml_free(tag_copy)
+//
+// return 0
+//}
+//
+///*
+// * Append an item to a sequence node.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_append_sequence_item(document *yaml_document_t,
+// sequence int, item int)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+//
+// assert(document) // Non-NULL document is required.
+// assert(sequence > 0
+// && document.nodes.start + sequence <= document.nodes.top)
+// // Valid sequence id is required.
+// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE)
+// // A sequence node is required.
+// assert(item > 0 && document.nodes.start + item <= document.nodes.top)
+// // Valid item id is required.
+//
+// if (!PUSH(&context,
+// document.nodes.start[sequence-1].data.sequence.items, item))
+// return 0
+//
+// return 1
+//}
+//
+///*
+// * Append a pair of a key and a value to a mapping node.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_append_mapping_pair(document *yaml_document_t,
+// mapping int, key int, value int)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+//
+// pair yaml_node_pair_t
+//
+// assert(document) // Non-NULL document is required.
+// assert(mapping > 0
+// && document.nodes.start + mapping <= document.nodes.top)
+// // Valid mapping id is required.
+// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE)
+// // A mapping node is required.
+// assert(key > 0 && document.nodes.start + key <= document.nodes.top)
+// // Valid key id is required.
+// assert(value > 0 && document.nodes.start + value <= document.nodes.top)
+// // Valid value id is required.
+//
+// pair.key = key
+// pair.value = value
+//
+// if (!PUSH(&context,
+// document.nodes.start[mapping-1].data.mapping.pairs, pair))
+// return 0
+//
+// return 1
+//}
+//
+//
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/decode.go b/hack/tools/vendor/github.com/itchyny/go-yaml/decode.go
new file mode 100644
index 0000000000..cdfa4e89c0
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/decode.go
@@ -0,0 +1,1038 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+//
+// 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.
+
+package yaml
+
+import (
+ "encoding"
+ "encoding/base64"
+ "encoding/json"
+ "fmt"
+ "io"
+ "math"
+ "reflect"
+ "strconv"
+ "strings"
+)
+
+// ----------------------------------------------------------------------------
+// Parser, produces a node tree out of a libyaml event stream.
+
+type parser struct {
+ parser yamlParser
+ event yamlEvent
+ doc *Node
+ anchors map[string]*Node
+ doneInit bool
+ textless bool
+}
+
+func newParser(b []byte) *parser {
+ p := parser{
+ parser: newYAMLParser(),
+ }
+ if len(b) == 0 {
+ b = []byte{'\n'}
+ }
+ p.parser.setInputString(b)
+ return &p
+}
+
+func newParserFromReader(r io.Reader) *parser {
+ p := parser{
+ parser: newYAMLParser(),
+ }
+ p.parser.setInputReader(r)
+ return &p
+}
+
+func (p *parser) init() {
+ if p.doneInit {
+ return
+ }
+ p.anchors = make(map[string]*Node)
+ p.expect(yaml_STREAM_START_EVENT)
+ p.doneInit = true
+}
+
+func (p *parser) destroy() {
+ if p.event.typ != yaml_NO_EVENT {
+ p.event.delete()
+ }
+ p.parser.delete()
+}
+
+// expect consumes an event from the event stream and
+// checks that it's of the expected type.
+func (p *parser) expect(e yamlEventType) {
+ if p.event.typ == yaml_NO_EVENT {
+ if !p.parser.parse(&p.event) {
+ p.fail()
+ }
+ }
+ if p.event.typ == yaml_STREAM_END_EVENT {
+ failf("attempted to go past the end of stream; corrupted value?")
+ }
+ if p.event.typ != e {
+ p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ)
+ p.fail()
+ }
+ p.event.delete()
+ p.event.typ = yaml_NO_EVENT
+}
+
+// peek peeks at the next event in the event stream,
+// puts the results into p.event and returns the event type.
+func (p *parser) peek() yamlEventType {
+ if p.event.typ != yaml_NO_EVENT {
+ return p.event.typ
+ }
+ // It's curious choice from the underlying API to generally return a
+ // positive result on success, but on this case return true in an error
+ // scenario. This was the source of bugs in the past (issue #666).
+ if !p.parser.parse(&p.event) || p.parser.error != yaml_NO_ERROR {
+ p.fail()
+ }
+ return p.event.typ
+}
+
+func (p *parser) fail() {
+ line := p.parser.context_mark.line
+ if !p.parser.stream_end_produced {
+ line++ // Line in errors are 1-origin
+ }
+ column := p.parser.context_mark.column + 1
+ index := p.parser.context_mark.index
+ var msg string
+ if len(p.parser.problem) > 0 {
+ msg = p.parser.problem
+ } else {
+ msg = "unknown problem parsing YAML content"
+ }
+ fail(&ParserError{Message: msg, Line: line, Column: column, Index: index})
+}
+
+func (p *parser) anchor(n *Node, anchor []byte) {
+ if anchor != nil {
+ n.Anchor = string(anchor)
+ p.anchors[n.Anchor] = n
+ }
+}
+
+func (p *parser) parse() *Node {
+ p.init()
+ switch p.peek() {
+ case yaml_SCALAR_EVENT:
+ return p.scalar()
+ case yaml_ALIAS_EVENT:
+ return p.alias()
+ case yaml_MAPPING_START_EVENT:
+ return p.mapping()
+ case yaml_SEQUENCE_START_EVENT:
+ return p.sequence()
+ case yaml_DOCUMENT_START_EVENT:
+ return p.document()
+ case yaml_STREAM_END_EVENT:
+ // Happens when attempting to decode an empty buffer.
+ return nil
+ case yaml_TAIL_COMMENT_EVENT:
+ panic("internal error: unexpected tail comment event (please report)")
+ default:
+ panic("internal error: attempted to parse unknown event (please report): " + p.event.typ.String())
+ }
+}
+
+func (p *parser) node(kind Kind, defaultTag, tag, value string) *Node {
+ var style Style
+ if tag != "" && tag != "!" {
+ tag = shortTag(tag)
+ style = TaggedStyle
+ } else if defaultTag != "" {
+ tag = defaultTag
+ } else if kind == ScalarNode {
+ tag, _ = resolve("", value)
+ }
+ n := &Node{
+ Kind: kind,
+ Tag: tag,
+ Value: value,
+ Style: style,
+ }
+ if !p.textless {
+ n.Line = p.event.start_mark.line + 1
+ n.Column = p.event.start_mark.column + 1
+ n.Index = p.event.start_mark.index
+ n.HeadComment = string(p.event.head_comment)
+ n.LineComment = string(p.event.line_comment)
+ n.FootComment = string(p.event.foot_comment)
+ }
+ return n
+}
+
+func (p *parser) parseChild(parent *Node) *Node {
+ child := p.parse()
+ parent.Content = append(parent.Content, child)
+ return child
+}
+
+func (p *parser) document() *Node {
+ n := p.node(DocumentNode, "", "", "")
+ p.doc = n
+ p.expect(yaml_DOCUMENT_START_EVENT)
+ p.parseChild(n)
+ if p.peek() == yaml_DOCUMENT_END_EVENT {
+ n.FootComment = string(p.event.foot_comment)
+ }
+ p.expect(yaml_DOCUMENT_END_EVENT)
+ return n
+}
+
+func (p *parser) alias() *Node {
+ n := p.node(AliasNode, "", "", string(p.event.anchor))
+ n.Alias = p.anchors[n.Value]
+ if n.Alias == nil {
+ failf("unknown anchor '%s' referenced", n.Value)
+ }
+ p.expect(yaml_ALIAS_EVENT)
+ return n
+}
+
+func (p *parser) scalar() *Node {
+ parsedStyle := p.event.scalarStyle()
+ var nodeStyle Style
+ switch {
+ case parsedStyle&yaml_DOUBLE_QUOTED_SCALAR_STYLE != 0:
+ nodeStyle = DoubleQuotedStyle
+ case parsedStyle&yaml_SINGLE_QUOTED_SCALAR_STYLE != 0:
+ nodeStyle = SingleQuotedStyle
+ case parsedStyle&yaml_LITERAL_SCALAR_STYLE != 0:
+ nodeStyle = LiteralStyle
+ case parsedStyle&yaml_FOLDED_SCALAR_STYLE != 0:
+ nodeStyle = FoldedStyle
+ }
+ nodeValue := string(p.event.value)
+ nodeTag := string(p.event.tag)
+ var defaultTag string
+ if nodeStyle == 0 {
+ if nodeValue == "<<" {
+ defaultTag = mergeTag
+ }
+ } else {
+ defaultTag = strTag
+ }
+ n := p.node(ScalarNode, defaultTag, nodeTag, nodeValue)
+ n.Style |= nodeStyle
+ p.anchor(n, p.event.anchor)
+ p.expect(yaml_SCALAR_EVENT)
+ return n
+}
+
+func (p *parser) sequence() *Node {
+ n := p.node(SequenceNode, seqTag, string(p.event.tag), "")
+ if p.event.sequenceStyle()&yaml_FLOW_SEQUENCE_STYLE != 0 {
+ n.Style |= FlowStyle
+ }
+ p.anchor(n, p.event.anchor)
+ p.expect(yaml_SEQUENCE_START_EVENT)
+ for p.peek() != yaml_SEQUENCE_END_EVENT {
+ p.parseChild(n)
+ }
+ n.LineComment = string(p.event.line_comment)
+ n.FootComment = string(p.event.foot_comment)
+ p.expect(yaml_SEQUENCE_END_EVENT)
+ return n
+}
+
+func (p *parser) mapping() *Node {
+ n := p.node(MappingNode, mapTag, string(p.event.tag), "")
+ block := true
+ if p.event.mappingStyle()&yaml_FLOW_MAPPING_STYLE != 0 {
+ block = false
+ n.Style |= FlowStyle
+ }
+ p.anchor(n, p.event.anchor)
+ p.expect(yaml_MAPPING_START_EVENT)
+ for p.peek() != yaml_MAPPING_END_EVENT {
+ k := p.parseChild(n)
+ if block && k.FootComment != "" {
+ // Must be a foot comment for the prior value when being dedented.
+ if len(n.Content) > 2 {
+ n.Content[len(n.Content)-3].FootComment = k.FootComment
+ k.FootComment = ""
+ }
+ }
+ v := p.parseChild(n)
+ if k.FootComment == "" && v.FootComment != "" {
+ k.FootComment = v.FootComment
+ v.FootComment = ""
+ }
+ if p.peek() == yaml_TAIL_COMMENT_EVENT {
+ if k.FootComment == "" {
+ k.FootComment = string(p.event.foot_comment)
+ }
+ p.expect(yaml_TAIL_COMMENT_EVENT)
+ }
+ }
+ n.LineComment = string(p.event.line_comment)
+ n.FootComment = string(p.event.foot_comment)
+ if n.Style&FlowStyle == 0 && n.FootComment != "" && len(n.Content) > 1 {
+ n.Content[len(n.Content)-2].FootComment = n.FootComment
+ n.FootComment = ""
+ }
+ p.expect(yaml_MAPPING_END_EVENT)
+ return n
+}
+
+// ----------------------------------------------------------------------------
+// Decoder, unmarshals a node into a provided value.
+
+type decoder struct {
+ doc *Node
+ aliases map[*Node]bool
+ terrors []*UnmarshalError
+
+ stringMapType reflect.Type
+ generalMapType reflect.Type
+
+ knownFields bool
+ uniqueKeys bool
+ decodeCount int
+ aliasCount int
+ aliasDepth int
+
+ mergedFields map[any]bool
+}
+
+var (
+ nodeType = reflect.TypeOf(Node{})
+ stringMapType = reflect.TypeOf(map[string]any{})
+ generalMapType = reflect.TypeOf(map[any]any{})
+ ifaceType = generalMapType.Elem()
+)
+
+func newDecoder() *decoder {
+ d := &decoder{
+ stringMapType: stringMapType,
+ generalMapType: generalMapType,
+ uniqueKeys: true,
+ }
+ d.aliases = make(map[*Node]bool)
+ return d
+}
+
+func (d *decoder) terror(n *Node, tag string, out reflect.Value) {
+ if n.Tag != "" {
+ tag = n.Tag
+ }
+ value := n.Value
+ if tag != seqTag && tag != mapTag {
+ if len(value) > 10 {
+ value = " `" + value[:7] + "...`"
+ } else {
+ value = " `" + value + "`"
+ }
+ }
+ d.terrors = append(d.terrors, &UnmarshalError{
+ Err: fmt.Errorf("cannot unmarshal %s%s into %s", shortTag(tag), value, out.Type()),
+ Line: n.Line,
+ Column: n.Column,
+ Index: n.Index,
+ })
+}
+
+func (d *decoder) callUnmarshaler(n *Node, u Unmarshaler) (good bool) {
+ err := u.UnmarshalYAML(n)
+ switch e := err.(type) {
+ case nil:
+ return true
+ case *TypeError:
+ d.terrors = append(d.terrors, e.Errors...)
+ return false
+ default:
+ d.terrors = append(d.terrors, &UnmarshalError{
+ Err: err,
+ Line: n.Line,
+ Column: n.Column,
+ Index: n.Index,
+ })
+ return false
+ }
+}
+
+func (d *decoder) callObsoleteUnmarshaler(n *Node, u obsoleteUnmarshaler) (good bool) {
+ terrlen := len(d.terrors)
+ err := u.UnmarshalYAML(func(v any) (err error) {
+ defer handleErr(&err)
+ d.unmarshal(n, reflect.ValueOf(v))
+ if len(d.terrors) > terrlen {
+ issues := d.terrors[terrlen:]
+ d.terrors = d.terrors[:terrlen]
+ return &TypeError{issues}
+ }
+ return nil
+ })
+ switch e := err.(type) {
+ case nil:
+ return true
+ case *TypeError:
+ d.terrors = append(d.terrors, e.Errors...)
+ return false
+ default:
+ d.terrors = append(d.terrors, &UnmarshalError{
+ Err: err,
+ Line: n.Line,
+ Column: n.Column,
+ Index: n.Index,
+ })
+ return false
+ }
+}
+
+// d.prepare initializes and dereferences pointers and calls UnmarshalYAML
+// if a value is found to implement it.
+// It returns the initialized and dereferenced out value, whether
+// unmarshalling was already done by UnmarshalYAML, and if so whether
+// its types unmarshalled appropriately.
+//
+// If n holds a null value, prepare returns before doing anything.
+func (d *decoder) prepare(n *Node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) {
+ if n.ShortTag() == nullTag {
+ return out, false, false
+ }
+ again := true
+ for again {
+ again = false
+ if out.Kind() == reflect.Pointer {
+ if out.IsNil() {
+ out.Set(reflect.New(out.Type().Elem()))
+ }
+ out = out.Elem()
+ again = true
+ }
+ if out.CanAddr() {
+ outi := out.Addr().Interface()
+ if u, ok := outi.(Unmarshaler); ok {
+ good = d.callUnmarshaler(n, u)
+ return out, true, good
+ }
+ if u, ok := outi.(obsoleteUnmarshaler); ok {
+ good = d.callObsoleteUnmarshaler(n, u)
+ return out, true, good
+ }
+ }
+ }
+ return out, false, false
+}
+
+func (d *decoder) fieldByIndex(n *Node, v reflect.Value, index []int) (field reflect.Value) {
+ if n.ShortTag() == nullTag {
+ return reflect.Value{}
+ }
+ for _, num := range index {
+ for {
+ if v.Kind() == reflect.Pointer {
+ if v.IsNil() {
+ v.Set(reflect.New(v.Type().Elem()))
+ }
+ v = v.Elem()
+ continue
+ }
+ break
+ }
+ v = v.Field(num)
+ }
+ return v
+}
+
+const (
+ // 400,000 decode operations is ~500kb of dense object declarations, or
+ // ~5kb of dense object declarations with 10000% alias expansion
+ alias_ratio_range_low = 400000
+
+ // 4,000,000 decode operations is ~5MB of dense object declarations, or
+ // ~4.5MB of dense object declarations with 10% alias expansion
+ alias_ratio_range_high = 4000000
+
+ // alias_ratio_range is the range over which we scale allowed alias ratios
+ alias_ratio_range = float64(alias_ratio_range_high - alias_ratio_range_low)
+)
+
+func allowedAliasRatio(decodeCount int) float64 {
+ switch {
+ case decodeCount <= alias_ratio_range_low:
+ // allow 99% to come from alias expansion for small-to-medium documents
+ return 0.99
+ case decodeCount >= alias_ratio_range_high:
+ // allow 10% to come from alias expansion for very large documents
+ return 0.10
+ default:
+ // scale smoothly from 99% down to 10% over the range.
+ // this maps to 396,000 - 400,000 allowed alias-driven decodes over the range.
+ // 400,000 decode operations is ~100MB of allocations in worst-case scenarios (single-item maps).
+ return 0.99 - 0.89*(float64(decodeCount-alias_ratio_range_low)/alias_ratio_range)
+ }
+}
+
+func (d *decoder) unmarshal(n *Node, out reflect.Value) (good bool) {
+ d.decodeCount++
+ if d.aliasDepth > 0 {
+ d.aliasCount++
+ }
+ if d.aliasCount > 100 && d.decodeCount > 1000 && float64(d.aliasCount)/float64(d.decodeCount) > allowedAliasRatio(d.decodeCount) {
+ failf("document contains excessive aliasing")
+ }
+ if out.Type() == nodeType {
+ out.Set(reflect.ValueOf(n).Elem())
+ return true
+ }
+ switch n.Kind {
+ case DocumentNode:
+ return d.document(n, out)
+ case AliasNode:
+ return d.alias(n, out)
+ }
+ out, unmarshaled, good := d.prepare(n, out)
+ if unmarshaled {
+ return good
+ }
+ switch n.Kind {
+ case ScalarNode:
+ good = d.scalar(n, out)
+ case MappingNode:
+ good = d.mapping(n, out)
+ case SequenceNode:
+ good = d.sequence(n, out)
+ case 0:
+ if n.IsZero() {
+ return d.null(out)
+ }
+ fallthrough
+ default:
+ failf("cannot decode node with unknown kind %d", n.Kind)
+ }
+ return good
+}
+
+func (d *decoder) document(n *Node, out reflect.Value) (good bool) {
+ if len(n.Content) == 1 {
+ d.doc = n
+ d.unmarshal(n.Content[0], out)
+ return true
+ }
+ return false
+}
+
+func (d *decoder) alias(n *Node, out reflect.Value) (good bool) {
+ if d.aliases[n] {
+ // TODO this could actually be allowed in some circumstances.
+ failf("anchor '%s' value contains itself", n.Value)
+ }
+ d.aliases[n] = true
+ d.aliasDepth++
+ good = d.unmarshal(n.Alias, out)
+ d.aliasDepth--
+ delete(d.aliases, n)
+ return good
+}
+
+func (d *decoder) null(out reflect.Value) bool {
+ if out.CanAddr() {
+ switch out.Kind() {
+ case reflect.Interface, reflect.Pointer, reflect.Map, reflect.Slice:
+ out.Set(reflect.Zero(out.Type()))
+ return true
+ }
+ }
+ return false
+}
+
+func (d *decoder) scalar(n *Node, out reflect.Value) bool {
+ var tag string
+ var resolved any
+ if n.indicatedString() {
+ tag = strTag
+ resolved = n.Value
+ } else {
+ tag, resolved = resolve(n.Tag, n.Value)
+ if tag == binaryTag {
+ data, err := base64.StdEncoding.DecodeString(resolved.(string))
+ if err != nil {
+ failf("!!binary value contains invalid base64 data")
+ }
+ resolved = string(data)
+ }
+ }
+ if resolved == nil {
+ return d.null(out)
+ }
+ if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() {
+ // We've resolved to exactly the type we want, so use that.
+ out.Set(resolvedv)
+ return true
+ }
+ // Perhaps we can use the value as a TextUnmarshaler to
+ // set its value.
+ if out.CanAddr() {
+ u, ok := out.Addr().Interface().(encoding.TextUnmarshaler)
+ if ok {
+ var text []byte
+ if tag == binaryTag {
+ text = []byte(resolved.(string))
+ } else {
+ // We let any value be unmarshaled into TextUnmarshaler.
+ // That might be more lax than we'd like, but the
+ // TextUnmarshaler itself should bowl out any dubious values.
+ text = []byte(n.Value)
+ }
+ err := u.UnmarshalText(text)
+ if err != nil {
+ d.terrors = append(d.terrors, &UnmarshalError{
+ Err: err,
+ Line: n.Line,
+ Column: n.Column,
+ Index: n.Index,
+ })
+ return false
+ }
+ return true
+ }
+ }
+ switch out.Kind() {
+ case reflect.String:
+ if tag == binaryTag {
+ out.SetString(resolved.(string))
+ return true
+ }
+ out.SetString(n.Value)
+ return true
+ case reflect.Interface:
+ out.Set(reflect.ValueOf(resolved))
+ return true
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ switch resolved := resolved.(type) {
+ case int:
+ if !out.OverflowInt(int64(resolved)) {
+ out.SetInt(int64(resolved))
+ return true
+ }
+ case int64:
+ if !out.OverflowInt(resolved) {
+ out.SetInt(resolved)
+ return true
+ }
+ case uint64:
+ if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
+ out.SetInt(int64(resolved))
+ return true
+ }
+ case float64:
+ if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
+ out.SetInt(int64(resolved))
+ return true
+ }
+ case json.Number:
+ i, err := resolved.Int64()
+ if err == nil && !out.OverflowInt(i) {
+ out.SetInt(i)
+ return true
+ }
+ if tag == floatTag {
+ f, err := resolved.Float64()
+ if err == nil && math.MinInt64 <= f && f <= math.MaxInt64 && !out.OverflowInt(int64(f)) {
+ out.SetInt(int64(f))
+ return true
+ }
+ }
+ }
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ switch resolved := resolved.(type) {
+ case int:
+ if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
+ out.SetUint(uint64(resolved))
+ return true
+ }
+ case int64:
+ if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
+ out.SetUint(uint64(resolved))
+ return true
+ }
+ case uint64:
+ if !out.OverflowUint(uint64(resolved)) {
+ out.SetUint(uint64(resolved))
+ return true
+ }
+ case float64:
+ if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) {
+ out.SetUint(uint64(resolved))
+ return true
+ }
+ case json.Number:
+ i, err := strconv.ParseUint(strings.TrimPrefix(resolved.String(), "+"), 10, 64)
+ if err == nil && !out.OverflowUint(i) {
+ out.SetUint(i)
+ return true
+ }
+ if tag == floatTag {
+ f, err := resolved.Float64()
+ if err == nil && 0 <= f && f <= math.MaxInt64 && !out.OverflowUint(uint64(f)) {
+ out.SetUint(uint64(f))
+ return true
+ }
+ }
+ }
+ case reflect.Bool:
+ switch resolved := resolved.(type) {
+ case bool:
+ out.SetBool(resolved)
+ return true
+ case string:
+ // This offers some compatibility with the 1.1 spec (https://yaml.org/type/bool.html).
+ // It only works if explicitly attempting to unmarshal into a typed bool value.
+ switch resolved {
+ case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON":
+ out.SetBool(true)
+ return true
+ case "n", "N", "no", "No", "NO", "off", "Off", "OFF":
+ out.SetBool(false)
+ return true
+ }
+ }
+ case reflect.Float32, reflect.Float64:
+ switch resolved := resolved.(type) {
+ case int:
+ out.SetFloat(float64(resolved))
+ return true
+ case int64:
+ out.SetFloat(float64(resolved))
+ return true
+ case uint64:
+ out.SetFloat(float64(resolved))
+ return true
+ case float64:
+ out.SetFloat(resolved)
+ return true
+ case json.Number:
+ f, err := resolved.Float64()
+ if err == nil {
+ out.SetFloat(f)
+ return true
+ }
+ }
+ case reflect.Struct:
+ if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() {
+ out.Set(resolvedv)
+ return true
+ }
+ case reflect.Pointer:
+ panic("yaml internal error: please report the issue")
+ }
+ d.terror(n, tag, out)
+ return false
+}
+
+func settableValueOf(i any) reflect.Value {
+ v := reflect.ValueOf(i)
+ sv := reflect.New(v.Type()).Elem()
+ sv.Set(v)
+ return sv
+}
+
+func (d *decoder) sequence(n *Node, out reflect.Value) (good bool) {
+ l := len(n.Content)
+
+ var iface reflect.Value
+ switch out.Kind() {
+ case reflect.Slice:
+ out.Set(reflect.MakeSlice(out.Type(), l, l))
+ case reflect.Array:
+ if l != out.Len() {
+ failf("invalid array: want %d elements but got %d", out.Len(), l)
+ }
+ case reflect.Interface:
+ // No type hints. Will have to use a generic sequence.
+ iface = out
+ out = settableValueOf(make([]any, l))
+ default:
+ d.terror(n, seqTag, out)
+ return false
+ }
+ et := out.Type().Elem()
+
+ j := 0
+ for i := 0; i < l; i++ {
+ e := reflect.New(et).Elem()
+ if ok := d.unmarshal(n.Content[i], e); ok {
+ out.Index(j).Set(e)
+ j++
+ }
+ }
+ if out.Kind() != reflect.Array {
+ out.Set(out.Slice(0, j))
+ }
+ if iface.IsValid() {
+ iface.Set(out)
+ }
+ return true
+}
+
+func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) {
+ l := len(n.Content)
+ if d.uniqueKeys {
+ nerrs := len(d.terrors)
+ for i := 0; i < l; i += 2 {
+ ni := n.Content[i]
+ for j := i + 2; j < l; j += 2 {
+ nj := n.Content[j]
+ if ni.Kind == nj.Kind && ni.Value == nj.Value {
+ d.terrors = append(d.terrors, &UnmarshalError{
+ Err: fmt.Errorf("mapping key %#v already defined at line %d", nj.Value, ni.Line),
+ Line: nj.Line,
+ Column: nj.Column,
+ Index: nj.Index,
+ })
+ }
+ }
+ }
+ if len(d.terrors) > nerrs {
+ return false
+ }
+ }
+ switch out.Kind() {
+ case reflect.Struct:
+ return d.mappingStruct(n, out)
+ case reflect.Map:
+ // okay
+ case reflect.Interface:
+ iface := out
+ out = reflect.MakeMap(d.stringMapType)
+ iface.Set(out)
+ default:
+ d.terror(n, mapTag, out)
+ return false
+ }
+
+ outt := out.Type()
+ kt := outt.Key()
+ et := outt.Elem()
+
+ stringMapType := d.stringMapType
+ generalMapType := d.generalMapType
+ if outt.Elem() == ifaceType {
+ if outt.Key().Kind() == reflect.String {
+ d.stringMapType = outt
+ } else if outt.Key() == ifaceType {
+ d.generalMapType = outt
+ }
+ }
+
+ mergedFields := d.mergedFields
+ d.mergedFields = nil
+
+ var mergeNode *Node
+
+ mapIsNew := false
+ if out.IsNil() {
+ out.Set(reflect.MakeMap(outt))
+ mapIsNew = true
+ }
+ for i := 0; i < l; i += 2 {
+ if isMerge(n.Content[i]) {
+ mergeNode = n.Content[i+1]
+ continue
+ }
+ k := reflect.New(kt).Elem()
+ if d.unmarshal(n.Content[i], k) {
+ if mergedFields != nil {
+ ki := k.Interface()
+ if d.getPossiblyUnhashableKey(mergedFields, ki) {
+ continue
+ }
+ d.setPossiblyUnhashableKey(mergedFields, ki, true)
+ }
+ kkind := k.Kind()
+ if kkind == reflect.Interface {
+ kkind = k.Elem().Kind()
+ }
+ if kkind == reflect.Map || kkind == reflect.Slice {
+ failf("cannot use '%#v' as a map key; try decoding into yaml.Node", k.Interface())
+ }
+ e := reflect.New(et).Elem()
+ if d.unmarshal(n.Content[i+1], e) || n.Content[i+1].ShortTag() == nullTag && (mapIsNew || !out.MapIndex(k).IsValid()) {
+ out.SetMapIndex(k, e)
+ }
+ }
+ }
+
+ d.mergedFields = mergedFields
+ if mergeNode != nil {
+ d.merge(n, mergeNode, out)
+ }
+
+ d.stringMapType = stringMapType
+ d.generalMapType = generalMapType
+ return true
+}
+
+func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) {
+ sinfo, err := getStructInfo(out.Type())
+ if err != nil {
+ panic(err)
+ }
+
+ var inlineMap reflect.Value
+ var elemType reflect.Type
+ if sinfo.InlineMap != -1 {
+ inlineMap = out.Field(sinfo.InlineMap)
+ elemType = inlineMap.Type().Elem()
+ }
+
+ for _, index := range sinfo.InlineUnmarshalers {
+ field := d.fieldByIndex(n, out, index)
+ d.prepare(n, field)
+ }
+
+ mergedFields := d.mergedFields
+ d.mergedFields = nil
+ var mergeNode *Node
+ var doneFields []bool
+ if d.uniqueKeys {
+ doneFields = make([]bool, len(sinfo.FieldsList))
+ }
+ name := settableValueOf("")
+ l := len(n.Content)
+ for i := 0; i < l; i += 2 {
+ ni := n.Content[i]
+ if isMerge(ni) {
+ mergeNode = n.Content[i+1]
+ continue
+ }
+ if !d.unmarshal(ni, name) {
+ continue
+ }
+ sname := name.String()
+ if mergedFields != nil {
+ if mergedFields[sname] {
+ continue
+ }
+ mergedFields[sname] = true
+ }
+ if info, ok := sinfo.FieldsMap[sname]; ok {
+ if d.uniqueKeys {
+ if doneFields[info.Id] {
+ d.terrors = append(d.terrors, &UnmarshalError{
+ Err: fmt.Errorf("field %s already set in type %s", name.String(), out.Type()),
+ Line: ni.Line,
+ Column: ni.Column,
+ Index: ni.Index,
+ })
+ continue
+ }
+ doneFields[info.Id] = true
+ }
+ var field reflect.Value
+ if info.Inline == nil {
+ field = out.Field(info.Num)
+ } else {
+ field = d.fieldByIndex(n, out, info.Inline)
+ }
+ d.unmarshal(n.Content[i+1], field)
+ } else if sinfo.InlineMap != -1 {
+ if inlineMap.IsNil() {
+ inlineMap.Set(reflect.MakeMap(inlineMap.Type()))
+ }
+ value := reflect.New(elemType).Elem()
+ d.unmarshal(n.Content[i+1], value)
+ inlineMap.SetMapIndex(name, value)
+ } else if d.knownFields {
+ d.terrors = append(d.terrors, &UnmarshalError{
+ Err: fmt.Errorf("field %s not found in type %s", name.String(), out.Type()),
+ Line: ni.Line,
+ Column: ni.Column,
+ Index: ni.Index,
+ })
+ }
+ }
+
+ d.mergedFields = mergedFields
+ if mergeNode != nil {
+ d.merge(n, mergeNode, out)
+ }
+ return true
+}
+
+func failWantMap() {
+ failf("map merge requires map or sequence of maps as the value")
+}
+
+func (d *decoder) setPossiblyUnhashableKey(m map[any]bool, key any, value bool) {
+ defer func() {
+ if err := recover(); err != nil {
+ failf("%v", err)
+ }
+ }()
+ m[key] = value
+}
+
+func (d *decoder) getPossiblyUnhashableKey(m map[any]bool, key any) bool {
+ defer func() {
+ if err := recover(); err != nil {
+ failf("%v", err)
+ }
+ }()
+ return m[key]
+}
+
+func (d *decoder) merge(parent *Node, merge *Node, out reflect.Value) {
+ mergedFields := d.mergedFields
+ if mergedFields == nil {
+ d.mergedFields = make(map[any]bool)
+ for i := 0; i < len(parent.Content); i += 2 {
+ k := reflect.New(ifaceType).Elem()
+ if d.unmarshal(parent.Content[i], k) {
+ d.setPossiblyUnhashableKey(d.mergedFields, k.Interface(), true)
+ }
+ }
+ }
+
+ switch merge.Kind {
+ case MappingNode:
+ d.unmarshal(merge, out)
+ case AliasNode:
+ if merge.Alias != nil && merge.Alias.Kind != MappingNode {
+ failWantMap()
+ }
+ d.unmarshal(merge, out)
+ case SequenceNode:
+ for i := 0; i < len(merge.Content); i++ {
+ ni := merge.Content[i]
+ if ni.Kind == AliasNode {
+ if ni.Alias != nil && ni.Alias.Kind != MappingNode {
+ failWantMap()
+ }
+ } else if ni.Kind != MappingNode {
+ failWantMap()
+ }
+ d.unmarshal(ni, out)
+ }
+ default:
+ failWantMap()
+ }
+
+ d.mergedFields = mergedFields
+}
+
+func isMerge(n *Node) bool {
+ return n.Kind == ScalarNode && n.Value == "<<" && (n.Tag == "" || n.Tag == "!" || shortTag(n.Tag) == mergeTag)
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/emitterc.go b/hack/tools/vendor/github.com/itchyny/go-yaml/emitterc.go
new file mode 100644
index 0000000000..aaf37746c9
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/emitterc.go
@@ -0,0 +1,2045 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+// Copyright (c) 2006-2010 Kirill Simonov
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+package yaml
+
+import (
+ "bytes"
+ "fmt"
+)
+
+// Flush the buffer if needed.
+func (emitter *yamlEmitter) flushIfNeeded() bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) {
+ return emitter.flush()
+ }
+ return true
+}
+
+// Put a character to the output buffer.
+func (emitter *yamlEmitter) put(value byte) bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) && !emitter.flush() {
+ return false
+ }
+ emitter.buffer[emitter.buffer_pos] = value
+ emitter.buffer_pos++
+ emitter.column++
+ return true
+}
+
+// Put a line break to the output buffer.
+func (emitter *yamlEmitter) putLineBreak() bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) && !emitter.flush() {
+ return false
+ }
+ switch emitter.line_break {
+ case yaml_CR_BREAK:
+ emitter.buffer[emitter.buffer_pos] = '\r'
+ emitter.buffer_pos += 1
+ case yaml_LN_BREAK:
+ emitter.buffer[emitter.buffer_pos] = '\n'
+ emitter.buffer_pos += 1
+ case yaml_CRLN_BREAK:
+ emitter.buffer[emitter.buffer_pos+0] = '\r'
+ emitter.buffer[emitter.buffer_pos+1] = '\n'
+ emitter.buffer_pos += 2
+ default:
+ panic("unknown line break setting")
+ }
+ if emitter.column == 0 {
+ emitter.space_above = true
+ }
+ emitter.column = 0
+ emitter.line++
+ // [Go] Do this here and below and drop from everywhere else (see commented lines).
+ emitter.indention = true
+ return true
+}
+
+// Copy a character from a string into buffer.
+func (emitter *yamlEmitter) write(s []byte, i *int) bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) && !emitter.flush() {
+ return false
+ }
+ p := emitter.buffer_pos
+ w := width(s[*i])
+ switch w {
+ case 4:
+ emitter.buffer[p+3] = s[*i+3]
+ fallthrough
+ case 3:
+ emitter.buffer[p+2] = s[*i+2]
+ fallthrough
+ case 2:
+ emitter.buffer[p+1] = s[*i+1]
+ fallthrough
+ case 1:
+ emitter.buffer[p+0] = s[*i+0]
+ default:
+ panic("unknown character width")
+ }
+ emitter.column++
+ emitter.buffer_pos += w
+ *i += w
+ return true
+}
+
+// Write a whole string into buffer.
+func (emitter *yamlEmitter) writeAll(s []byte) bool {
+ for i := 0; i < len(s); {
+ if !emitter.write(s, &i) {
+ return false
+ }
+ }
+ return true
+}
+
+// Copy a line break character from a string into buffer.
+func (emitter *yamlEmitter) writeLineBreak(s []byte, i *int) bool {
+ if s[*i] == '\n' {
+ if !emitter.putLineBreak() {
+ return false
+ }
+ *i++
+ } else {
+ if !emitter.write(s, i) {
+ return false
+ }
+ if emitter.column == 0 {
+ emitter.space_above = true
+ }
+ emitter.column = 0
+ emitter.line++
+ // [Go] Do this here and above and drop from everywhere else (see commented lines).
+ emitter.indention = true
+ }
+ return true
+}
+
+// Set an emitter error and return false.
+func (emitter *yamlEmitter) setEmitterError(problem string) bool {
+ emitter.error = yaml_EMITTER_ERROR
+ emitter.problem = problem
+ return false
+}
+
+// Emit an event.
+func (emitter *yamlEmitter) emit(event *yamlEvent) bool {
+ emitter.events = append(emitter.events, *event)
+ for !emitter.needMoreEvents() {
+ event := &emitter.events[emitter.events_head]
+ if !emitter.analyzeEvent(event) {
+ return false
+ }
+ if !emitter.stateMachine(event) {
+ return false
+ }
+ event.delete()
+ emitter.events_head++
+ }
+ return true
+}
+
+// Check if we need to accumulate more events before emitting.
+//
+// We accumulate extra
+// - 1 event for DOCUMENT-START
+// - 2 events for SEQUENCE-START
+// - 3 events for MAPPING-START
+func (emitter *yamlEmitter) needMoreEvents() bool {
+ if emitter.events_head == len(emitter.events) {
+ return true
+ }
+ var accumulate int
+ switch emitter.events[emitter.events_head].typ {
+ case yaml_DOCUMENT_START_EVENT:
+ accumulate = 1
+ case yaml_SEQUENCE_START_EVENT:
+ accumulate = 2
+ case yaml_MAPPING_START_EVENT:
+ accumulate = 3
+ default:
+ return false
+ }
+ if len(emitter.events)-emitter.events_head > accumulate {
+ return false
+ }
+ var level int
+ for i := emitter.events_head; i < len(emitter.events); i++ {
+ switch emitter.events[i].typ {
+ case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT:
+ level++
+ case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT:
+ level--
+ }
+ if level == 0 {
+ return false
+ }
+ }
+ return true
+}
+
+// Append a directive to the directives stack.
+func (emitter *yamlEmitter) appendTagDirective(value *yamlTagDirective, allow_duplicates bool) bool {
+ for i := 0; i < len(emitter.tag_directives); i++ {
+ if bytes.Equal(value.handle, emitter.tag_directives[i].handle) {
+ if allow_duplicates {
+ return true
+ }
+ return emitter.setEmitterError("duplicate %TAG directive")
+ }
+ }
+
+ // [Go] Do we actually need to copy this given garbage collection
+ // and the lack of deallocating destructors?
+ tag_copy := yamlTagDirective{
+ handle: make([]byte, len(value.handle)),
+ prefix: make([]byte, len(value.prefix)),
+ }
+ copy(tag_copy.handle, value.handle)
+ copy(tag_copy.prefix, value.prefix)
+ emitter.tag_directives = append(emitter.tag_directives, tag_copy)
+ return true
+}
+
+// Increase the indentation level.
+func (emitter *yamlEmitter) increaseIndentCompact(flow, indentless bool, compact_seq bool) bool {
+ emitter.indents = append(emitter.indents, emitter.indent)
+ if emitter.indent < 0 {
+ if flow {
+ emitter.indent = emitter.best_indent
+ } else {
+ emitter.indent = 0
+ }
+ } else if !indentless {
+ // [Go] This was changed so that indentations are more regular.
+ if emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE {
+ // The first indent inside a sequence will just skip the "- " indicator.
+ emitter.indent += 2
+ } else {
+ // Everything else aligns to the chosen indentation.
+ emitter.indent = emitter.best_indent * ((emitter.indent + emitter.best_indent) / emitter.best_indent)
+ if compact_seq {
+ // The value compact_seq passed in is almost always set to `false` when this function is called,
+ // except when we are dealing with sequence nodes. So this gets triggered to subtract 2 only when we
+ // are increasing the indent to account for sequence nodes, which will be correct because we need to
+ // subtract 2 to account for the - at the beginning of the sequence node.
+ emitter.indent = emitter.indent - 2
+ }
+ }
+ }
+ return true
+}
+
+// State dispatcher.
+func (emitter *yamlEmitter) stateMachine(event *yamlEvent) bool {
+ switch emitter.state {
+ default:
+ case yaml_EMIT_STREAM_START_STATE:
+ return emitter.emitStreamStart(event)
+
+ case yaml_EMIT_FIRST_DOCUMENT_START_STATE:
+ return emitter.emitDocumentStart(event, true)
+
+ case yaml_EMIT_DOCUMENT_START_STATE:
+ return emitter.emitDocumentStart(event, false)
+
+ case yaml_EMIT_DOCUMENT_CONTENT_STATE:
+ return emitter.emitDocumentContent(event)
+
+ case yaml_EMIT_DOCUMENT_END_STATE:
+ return emitter.emitDocumentEnd(event)
+
+ case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
+ return emitter.emitFlowSequenceItem(event, true, false)
+
+ case yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE:
+ return emitter.emitFlowSequenceItem(event, false, true)
+
+ case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE:
+ return emitter.emitFlowSequenceItem(event, false, false)
+
+ case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
+ return emitter.emitFlowMappingKey(event, true, false)
+
+ case yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE:
+ return emitter.emitFlowMappingKey(event, false, true)
+
+ case yaml_EMIT_FLOW_MAPPING_KEY_STATE:
+ return emitter.emitFlowMappingKey(event, false, false)
+
+ case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
+ return emitter.emitFlowMappingValue(event, true)
+
+ case yaml_EMIT_FLOW_MAPPING_VALUE_STATE:
+ return emitter.emitFlowMappingValue(event, false)
+
+ case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
+ return emitter.emitBlockSequenceItem(event, true)
+
+ case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
+ return emitter.emitBlockSequenceItem(event, false)
+
+ case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
+ return emitter.emitBlockMappingKey(event, true)
+
+ case yaml_EMIT_BLOCK_MAPPING_KEY_STATE:
+ return emitter.emitBlockMappingKey(event, false)
+
+ case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
+ return emitter.emitBlockMappingValue(event, true)
+
+ case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE:
+ return emitter.emitBlockMappingValue(event, false)
+
+ case yaml_EMIT_END_STATE:
+ return emitter.setEmitterError("expected nothing after STREAM-END")
+ }
+ panic("invalid emitter state")
+}
+
+// Expect STREAM-START.
+func (emitter *yamlEmitter) emitStreamStart(event *yamlEvent) bool {
+ if event.typ != yaml_STREAM_START_EVENT {
+ return emitter.setEmitterError("expected STREAM-START")
+ }
+ if emitter.encoding == yaml_ANY_ENCODING {
+ emitter.encoding = event.encoding
+ if emitter.encoding == yaml_ANY_ENCODING {
+ emitter.encoding = yaml_UTF8_ENCODING
+ }
+ }
+ if emitter.best_indent < 2 || emitter.best_indent > 9 {
+ emitter.best_indent = 2
+ }
+ if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 {
+ emitter.best_width = 80
+ }
+ if emitter.best_width < 0 {
+ emitter.best_width = 1<<31 - 1
+ }
+ if emitter.line_break == yaml_ANY_BREAK {
+ emitter.line_break = yaml_LN_BREAK
+ }
+
+ emitter.indent = -1
+ emitter.line = 0
+ emitter.column = 0
+ emitter.whitespace = true
+ emitter.indention = true
+ emitter.space_above = true
+ emitter.foot_indent = -1
+
+ if emitter.encoding != yaml_UTF8_ENCODING {
+ if !emitter.writeBom() {
+ return false
+ }
+ }
+ emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE
+ return true
+}
+
+// Expect DOCUMENT-START or STREAM-END.
+func (emitter *yamlEmitter) emitDocumentStart(event *yamlEvent, first bool) bool {
+ if event.typ == yaml_DOCUMENT_START_EVENT {
+
+ if event.version_directive != nil {
+ if !emitter.analyzeVersionDirective(event.version_directive) {
+ return false
+ }
+ }
+
+ for i := 0; i < len(event.tag_directives); i++ {
+ tag_directive := &event.tag_directives[i]
+ if !emitter.analyzeTagDirective(tag_directive) {
+ return false
+ }
+ if !emitter.appendTagDirective(tag_directive, false) {
+ return false
+ }
+ }
+
+ for i := 0; i < len(default_tag_directives); i++ {
+ tag_directive := &default_tag_directives[i]
+ if !emitter.appendTagDirective(tag_directive, true) {
+ return false
+ }
+ }
+
+ implicit := event.implicit
+ if !first || emitter.canonical {
+ implicit = false
+ }
+
+ if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) {
+ if !emitter.writeIndicator([]byte("..."), true, false, false) {
+ return false
+ }
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+
+ if event.version_directive != nil {
+ implicit = false
+ if !emitter.writeIndicator([]byte("%YAML"), true, false, false) {
+ return false
+ }
+ if !emitter.writeIndicator([]byte("1.1"), true, false, false) {
+ return false
+ }
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+
+ if len(event.tag_directives) > 0 {
+ implicit = false
+ for i := 0; i < len(event.tag_directives); i++ {
+ tag_directive := &event.tag_directives[i]
+ if !emitter.writeIndicator([]byte("%TAG"), true, false, false) {
+ return false
+ }
+ if !emitter.writeTagHandle(tag_directive.handle) {
+ return false
+ }
+ if !emitter.writeTagContent(tag_directive.prefix, true) {
+ return false
+ }
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ }
+
+ if emitter.checkEmptyDocument() {
+ implicit = false
+ }
+ if !implicit {
+ if !emitter.writeIndent() {
+ return false
+ }
+ if !emitter.writeIndicator([]byte("---"), true, false, false) {
+ return false
+ }
+ if emitter.canonical || true {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ }
+
+ if len(emitter.head_comment) > 0 {
+ if !emitter.processHeadComment() {
+ return false
+ }
+ if !emitter.putLineBreak() {
+ return false
+ }
+ }
+
+ emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE
+ return true
+ }
+
+ if event.typ == yaml_STREAM_END_EVENT {
+ if emitter.open_ended {
+ if !emitter.writeIndicator([]byte("..."), true, false, false) {
+ return false
+ }
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ if !emitter.flush() {
+ return false
+ }
+ emitter.state = yaml_EMIT_END_STATE
+ return true
+ }
+
+ return emitter.setEmitterError("expected DOCUMENT-START or STREAM-END")
+}
+
+// emitter preserves the original signature and delegates to
+// increaseIndentCompact without compact-sequence indentation
+func (emitter *yamlEmitter) increaseIndent(flow, indentless bool) bool {
+ return emitter.increaseIndentCompact(flow, indentless, false)
+}
+
+// processLineComment preserves the original signature and delegates to
+// processLineCommentLinebreak passing false for linebreak
+func (emitter *yamlEmitter) processLineComment() bool {
+ return emitter.processLineCommentLinebreak(false)
+}
+
+// Expect the root node.
+func (emitter *yamlEmitter) emitDocumentContent(event *yamlEvent) bool {
+ emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE)
+
+ if !emitter.processHeadComment() {
+ return false
+ }
+ if !emitter.emitNode(event, true, false, false, false) {
+ return false
+ }
+ if !emitter.processLineComment() {
+ return false
+ }
+ if !emitter.processFootComment() {
+ return false
+ }
+ return true
+}
+
+// Expect DOCUMENT-END.
+func (emitter *yamlEmitter) emitDocumentEnd(event *yamlEvent) bool {
+ if event.typ != yaml_DOCUMENT_END_EVENT {
+ return emitter.setEmitterError("expected DOCUMENT-END")
+ }
+ // [Go] Force document foot separation.
+ emitter.foot_indent = 0
+ if !emitter.processFootComment() {
+ return false
+ }
+ emitter.foot_indent = -1
+ if !emitter.writeIndent() {
+ return false
+ }
+ if !event.implicit {
+ // [Go] Allocate the slice elsewhere.
+ if !emitter.writeIndicator([]byte("..."), true, false, false) {
+ return false
+ }
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ if !emitter.flush() {
+ return false
+ }
+ emitter.state = yaml_EMIT_DOCUMENT_START_STATE
+ emitter.tag_directives = emitter.tag_directives[:0]
+ return true
+}
+
+// Expect a flow item node.
+func (emitter *yamlEmitter) emitFlowSequenceItem(event *yamlEvent, first, trail bool) bool {
+ if first {
+ if !emitter.writeIndicator([]byte{'['}, true, true, false) {
+ return false
+ }
+ if !emitter.increaseIndent(true, false) {
+ return false
+ }
+ emitter.flow_level++
+ }
+
+ if event.typ == yaml_SEQUENCE_END_EVENT {
+ if emitter.canonical && !first && !trail {
+ if !emitter.writeIndicator([]byte{','}, false, false, false) {
+ return false
+ }
+ }
+ emitter.flow_level--
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ if emitter.column == 0 || emitter.canonical && !first {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ if !emitter.writeIndicator([]byte{']'}, false, false, false) {
+ return false
+ }
+ if !emitter.processLineComment() {
+ return false
+ }
+ if !emitter.processFootComment() {
+ return false
+ }
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+
+ return true
+ }
+
+ if !first && !trail {
+ if !emitter.writeIndicator([]byte{','}, false, false, false) {
+ return false
+ }
+ }
+
+ if !emitter.processHeadComment() {
+ return false
+ }
+ if emitter.column == 0 {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+
+ if emitter.canonical || emitter.column > emitter.best_width {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE)
+ } else {
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE)
+ }
+ if !emitter.emitNode(event, false, true, false, false) {
+ return false
+ }
+ if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
+ if !emitter.writeIndicator([]byte{','}, false, false, false) {
+ return false
+ }
+ }
+ if !emitter.processLineComment() {
+ return false
+ }
+ if !emitter.processFootComment() {
+ return false
+ }
+ return true
+}
+
+// Expect a flow key node.
+func (emitter *yamlEmitter) emitFlowMappingKey(event *yamlEvent, first, trail bool) bool {
+ if first {
+ if !emitter.writeIndicator([]byte{'{'}, true, true, false) {
+ return false
+ }
+ if !emitter.increaseIndent(true, false) {
+ return false
+ }
+ emitter.flow_level++
+ }
+
+ if event.typ == yaml_MAPPING_END_EVENT {
+ if (emitter.canonical || len(emitter.head_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0) && !first && !trail {
+ if !emitter.writeIndicator([]byte{','}, false, false, false) {
+ return false
+ }
+ }
+ if !emitter.processHeadComment() {
+ return false
+ }
+ emitter.flow_level--
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ if emitter.canonical && !first {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ if !emitter.writeIndicator([]byte{'}'}, false, false, false) {
+ return false
+ }
+ if !emitter.processLineComment() {
+ return false
+ }
+ if !emitter.processFootComment() {
+ return false
+ }
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+ }
+
+ if !first && !trail {
+ if !emitter.writeIndicator([]byte{','}, false, false, false) {
+ return false
+ }
+ }
+
+ if !emitter.processHeadComment() {
+ return false
+ }
+
+ if emitter.column == 0 {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+
+ if emitter.canonical || emitter.column > emitter.best_width {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+
+ if !emitter.canonical && emitter.checkSimpleKey() {
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE)
+ return emitter.emitNode(event, false, false, true, true)
+ }
+ if !emitter.writeIndicator([]byte{'?'}, true, false, false) {
+ return false
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE)
+ return emitter.emitNode(event, false, false, true, false)
+}
+
+// Expect a flow value node.
+func (emitter *yamlEmitter) emitFlowMappingValue(event *yamlEvent, simple bool) bool {
+ if simple {
+ if !emitter.writeIndicator([]byte{':'}, false, false, false) {
+ return false
+ }
+ } else {
+ if emitter.canonical || emitter.column > emitter.best_width {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ if !emitter.writeIndicator([]byte{':'}, true, false, false) {
+ return false
+ }
+ }
+ if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE)
+ } else {
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE)
+ }
+ if !emitter.emitNode(event, false, false, true, false) {
+ return false
+ }
+ if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
+ if !emitter.writeIndicator([]byte{','}, false, false, false) {
+ return false
+ }
+ }
+ if !emitter.processLineComment() {
+ return false
+ }
+ if !emitter.processFootComment() {
+ return false
+ }
+ return true
+}
+
+// Expect a block item node.
+func (emitter *yamlEmitter) emitBlockSequenceItem(event *yamlEvent, first bool) bool {
+ if first {
+ // emitter.mapping context tells us if we are currently in a mapping context.
+ // emitter.column tells us which column we are in the yaml output. 0 is the first char of the column.
+ // emitter.indentation tells us if the last character was an indentation character.
+ // emitter.compact_sequence_indent tells us if '- ' is considered part of the indentation for sequence elements.
+ // So, `seq` means that we are in a mapping context, and we are either at the first char of the column or
+ // the last character was not an indentation character, and we consider '- ' part of the indentation
+ // for sequence elements.
+ seq := emitter.mapping_context && (emitter.column == 0 || !emitter.indention) &&
+ emitter.compact_sequence_indent
+ if !emitter.increaseIndentCompact(false, false, seq) {
+ return false
+ }
+ }
+ if event.typ == yaml_SEQUENCE_END_EVENT {
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+ }
+ if !emitter.processHeadComment() {
+ return false
+ }
+ if !emitter.writeIndent() {
+ return false
+ }
+ if !emitter.writeIndicator([]byte{'-'}, true, false, true) {
+ return false
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE)
+ if !emitter.emitNode(event, false, true, false, false) {
+ return false
+ }
+ if !emitter.processLineComment() {
+ return false
+ }
+ if !emitter.processFootComment() {
+ return false
+ }
+ return true
+}
+
+// Expect a block key node.
+func (emitter *yamlEmitter) emitBlockMappingKey(event *yamlEvent, first bool) bool {
+ if first {
+ if !emitter.increaseIndent(false, false) {
+ return false
+ }
+ }
+ if !emitter.processHeadComment() {
+ return false
+ }
+ if event.typ == yaml_MAPPING_END_EVENT {
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+ }
+ if !emitter.writeIndent() {
+ return false
+ }
+ if len(emitter.line_comment) > 0 {
+ // [Go] A line comment was provided for the key. That's unusual as the
+ // scanner associates line comments with the value. Either way,
+ // save the line comment and render it appropriately later.
+ emitter.key_line_comment = emitter.line_comment
+ emitter.line_comment = nil
+ }
+ if emitter.checkSimpleKey() {
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE)
+ return emitter.emitNode(event, false, false, true, true)
+ }
+ if !emitter.writeIndicator([]byte{'?'}, true, false, true) {
+ return false
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE)
+ return emitter.emitNode(event, false, false, true, false)
+}
+
+// Expect a block value node.
+func (emitter *yamlEmitter) emitBlockMappingValue(event *yamlEvent, simple bool) bool {
+ if simple {
+ if !emitter.writeIndicator([]byte{':'}, false, false, false) {
+ return false
+ }
+ } else {
+ if !emitter.writeIndent() {
+ return false
+ }
+ if !emitter.writeIndicator([]byte{':'}, true, false, true) {
+ return false
+ }
+ }
+ if len(emitter.key_line_comment) > 0 {
+ // [Go] Line comments are generally associated with the value, but when there's
+ // no value on the same line as a mapping key they end up attached to the
+ // key itself.
+ if event.typ == yaml_SCALAR_EVENT {
+ if len(emitter.line_comment) == 0 {
+ // A scalar is coming and it has no line comments by itself yet,
+ // so just let it handle the line comment as usual. If it has a
+ // line comment, we can't have both so the one from the key is lost.
+ emitter.line_comment = emitter.key_line_comment
+ emitter.key_line_comment = nil
+ }
+ } else if event.sequenceStyle() != yaml_FLOW_SEQUENCE_STYLE && (event.typ == yaml_MAPPING_START_EVENT || event.typ == yaml_SEQUENCE_START_EVENT) {
+ // An indented block follows, so write the comment right now.
+ emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment
+ if !emitter.processLineComment() {
+ return false
+ }
+ emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment
+ }
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE)
+ if !emitter.emitNode(event, false, false, true, false) {
+ return false
+ }
+ if !emitter.processLineComment() {
+ return false
+ }
+ if !emitter.processFootComment() {
+ return false
+ }
+ return true
+}
+
+func (emitter *yamlEmitter) silentNilEvent(event *yamlEvent) bool {
+ return event.typ == yaml_SCALAR_EVENT && event.implicit && !emitter.canonical && len(emitter.scalar_data.value) == 0
+}
+
+// Expect a node.
+func (emitter *yamlEmitter) emitNode(event *yamlEvent,
+ root bool, sequence bool, mapping bool, simple_key bool,
+) bool {
+ emitter.root_context = root
+ emitter.sequence_context = sequence
+ emitter.mapping_context = mapping
+ emitter.simple_key_context = simple_key
+
+ switch event.typ {
+ case yaml_ALIAS_EVENT:
+ return emitter.emitAlias(event)
+ case yaml_SCALAR_EVENT:
+ return emitter.emitScalar(event)
+ case yaml_SEQUENCE_START_EVENT:
+ return emitter.emitSequenceStart(event)
+ case yaml_MAPPING_START_EVENT:
+ return emitter.emitMappingStart(event)
+ default:
+ return emitter.setEmitterError(
+ fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ))
+ }
+}
+
+// Expect ALIAS.
+func (emitter *yamlEmitter) emitAlias(event *yamlEvent) bool {
+ if !emitter.processAnchor() {
+ return false
+ }
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+}
+
+// Expect SCALAR.
+func (emitter *yamlEmitter) emitScalar(event *yamlEvent) bool {
+ if !emitter.selectScalarStyle(event) {
+ return false
+ }
+ if !emitter.processAnchor() {
+ return false
+ }
+ if !emitter.processTag() {
+ return false
+ }
+ if !emitter.increaseIndent(true, false) {
+ return false
+ }
+ if !emitter.processScalar() {
+ return false
+ }
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+}
+
+// Expect SEQUENCE-START.
+func (emitter *yamlEmitter) emitSequenceStart(event *yamlEvent) bool {
+ if !emitter.processAnchor() {
+ return false
+ }
+ if !emitter.processTag() {
+ return false
+ }
+ if emitter.flow_level > 0 || emitter.canonical || event.sequenceStyle() == yaml_FLOW_SEQUENCE_STYLE ||
+ emitter.checkEmptySequence() {
+ emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
+ } else {
+ emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
+ }
+ return true
+}
+
+// Expect MAPPING-START.
+func (emitter *yamlEmitter) emitMappingStart(event *yamlEvent) bool {
+ if !emitter.processAnchor() {
+ return false
+ }
+ if !emitter.processTag() {
+ return false
+ }
+ if emitter.flow_level > 0 || emitter.canonical || event.mappingStyle() == yaml_FLOW_MAPPING_STYLE ||
+ emitter.checkEmptyMapping() {
+ emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
+ } else {
+ emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
+ }
+ return true
+}
+
+// Check if the document content is an empty scalar.
+func (emitter *yamlEmitter) checkEmptyDocument() bool {
+ return false // [Go] Huh?
+}
+
+// Check if the next events represent an empty sequence.
+func (emitter *yamlEmitter) checkEmptySequence() bool {
+ if len(emitter.events)-emitter.events_head < 2 {
+ return false
+ }
+ return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT &&
+ emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT
+}
+
+// Check if the next events represent an empty mapping.
+func (emitter *yamlEmitter) checkEmptyMapping() bool {
+ if len(emitter.events)-emitter.events_head < 2 {
+ return false
+ }
+ return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT &&
+ emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT
+}
+
+// Check if the next node can be expressed as a simple key.
+func (emitter *yamlEmitter) checkSimpleKey() bool {
+ length := 0
+ switch emitter.events[emitter.events_head].typ {
+ case yaml_ALIAS_EVENT:
+ length += len(emitter.anchor_data.anchor)
+ case yaml_SCALAR_EVENT:
+ if emitter.scalar_data.multiline {
+ return false
+ }
+ length += len(emitter.anchor_data.anchor) +
+ len(emitter.tag_data.handle) +
+ len(emitter.tag_data.suffix) +
+ len(emitter.scalar_data.value)
+ case yaml_SEQUENCE_START_EVENT:
+ if !emitter.checkEmptySequence() {
+ return false
+ }
+ length += len(emitter.anchor_data.anchor) +
+ len(emitter.tag_data.handle) +
+ len(emitter.tag_data.suffix)
+ case yaml_MAPPING_START_EVENT:
+ if !emitter.checkEmptyMapping() {
+ return false
+ }
+ length += len(emitter.anchor_data.anchor) +
+ len(emitter.tag_data.handle) +
+ len(emitter.tag_data.suffix)
+ default:
+ return false
+ }
+ return length <= 128
+}
+
+// Determine an acceptable scalar style.
+func (emitter *yamlEmitter) selectScalarStyle(event *yamlEvent) bool {
+ no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0
+ if no_tag && !event.implicit && !event.quoted_implicit {
+ return emitter.setEmitterError("neither tag nor implicit flags are specified")
+ }
+
+ style := event.scalarStyle()
+ if style == yaml_ANY_SCALAR_STYLE {
+ style = yaml_PLAIN_SCALAR_STYLE
+ }
+ if emitter.canonical {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ if emitter.simple_key_context && emitter.scalar_data.multiline {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+
+ if style == yaml_PLAIN_SCALAR_STYLE {
+ if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed ||
+ emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed {
+ style = yaml_SINGLE_QUOTED_SCALAR_STYLE
+ }
+ if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) {
+ style = yaml_SINGLE_QUOTED_SCALAR_STYLE
+ }
+ if no_tag && !event.implicit {
+ style = yaml_SINGLE_QUOTED_SCALAR_STYLE
+ }
+ }
+ if style == yaml_SINGLE_QUOTED_SCALAR_STYLE {
+ if !emitter.scalar_data.single_quoted_allowed {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ }
+ if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE {
+ if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ }
+
+ if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE {
+ emitter.tag_data.handle = []byte{'!'}
+ }
+ emitter.scalar_data.style = style
+ return true
+}
+
+// Write an anchor.
+func (emitter *yamlEmitter) processAnchor() bool {
+ if emitter.anchor_data.anchor == nil {
+ return true
+ }
+ c := []byte{'&'}
+ if emitter.anchor_data.alias {
+ c[0] = '*'
+ }
+ if !emitter.writeIndicator(c, true, false, false) {
+ return false
+ }
+ return emitter.writeAnchor(emitter.anchor_data.anchor)
+}
+
+// Write a tag.
+func (emitter *yamlEmitter) processTag() bool {
+ if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 {
+ return true
+ }
+ if len(emitter.tag_data.handle) > 0 {
+ if !emitter.writeTagHandle(emitter.tag_data.handle) {
+ return false
+ }
+ if len(emitter.tag_data.suffix) > 0 {
+ if !emitter.writeTagContent(emitter.tag_data.suffix, false) {
+ return false
+ }
+ }
+ } else {
+ // [Go] Allocate these slices elsewhere.
+ if !emitter.writeIndicator([]byte("!<"), true, false, false) {
+ return false
+ }
+ if !emitter.writeTagContent(emitter.tag_data.suffix, false) {
+ return false
+ }
+ if !emitter.writeIndicator([]byte{'>'}, false, false, false) {
+ return false
+ }
+ }
+ return true
+}
+
+// Write a scalar.
+func (emitter *yamlEmitter) processScalar() bool {
+ switch emitter.scalar_data.style {
+ case yaml_PLAIN_SCALAR_STYLE:
+ return emitter.writePlainScalar(emitter.scalar_data.value, !emitter.simple_key_context)
+
+ case yaml_SINGLE_QUOTED_SCALAR_STYLE:
+ return emitter.writeSingleQuotedScalar(emitter.scalar_data.value, !emitter.simple_key_context)
+
+ case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
+ return emitter.writeDoubleQuotedScalar(emitter.scalar_data.value, !emitter.simple_key_context)
+
+ case yaml_LITERAL_SCALAR_STYLE:
+ return emitter.writeLiteralScalar(emitter.scalar_data.value)
+
+ case yaml_FOLDED_SCALAR_STYLE:
+ return emitter.writeFoldedScalar(emitter.scalar_data.value)
+ }
+ panic("unknown scalar style")
+}
+
+// Write a head comment.
+func (emitter *yamlEmitter) processHeadComment() bool {
+ if len(emitter.tail_comment) > 0 {
+ if !emitter.writeIndent() {
+ return false
+ }
+ if !emitter.writeComment(emitter.tail_comment) {
+ return false
+ }
+ emitter.tail_comment = emitter.tail_comment[:0]
+ emitter.foot_indent = emitter.indent
+ if emitter.foot_indent < 0 {
+ emitter.foot_indent = 0
+ }
+ }
+
+ if len(emitter.head_comment) == 0 {
+ return true
+ }
+ if !emitter.writeIndent() {
+ return false
+ }
+ if !emitter.writeComment(emitter.head_comment) {
+ return false
+ }
+ emitter.head_comment = emitter.head_comment[:0]
+ return true
+}
+
+// Write an line comment.
+func (emitter *yamlEmitter) processLineCommentLinebreak(linebreak bool) bool {
+ if len(emitter.line_comment) == 0 {
+ // The next 3 lines are needed to resolve an issue with leading newlines
+ // See https://github.com/go-yaml/yaml/issues/755
+ // When linebreak is set to true, put_break will be called and will add
+ // the needed newline.
+ if linebreak && !emitter.putLineBreak() {
+ return false
+ }
+ return true
+ }
+ if !emitter.whitespace {
+ if !emitter.put(' ') {
+ return false
+ }
+ }
+ if !emitter.writeComment(emitter.line_comment) {
+ return false
+ }
+ emitter.line_comment = emitter.line_comment[:0]
+ return true
+}
+
+// Write a foot comment.
+func (emitter *yamlEmitter) processFootComment() bool {
+ if len(emitter.foot_comment) == 0 {
+ return true
+ }
+ if !emitter.writeIndent() {
+ return false
+ }
+ if !emitter.writeComment(emitter.foot_comment) {
+ return false
+ }
+ emitter.foot_comment = emitter.foot_comment[:0]
+ emitter.foot_indent = emitter.indent
+ if emitter.foot_indent < 0 {
+ emitter.foot_indent = 0
+ }
+ return true
+}
+
+// Check if a %YAML directive is valid.
+func (emitter *yamlEmitter) analyzeVersionDirective(version_directive *yamlVersionDirective) bool {
+ if version_directive.major != 1 || version_directive.minor != 1 {
+ return emitter.setEmitterError("incompatible %YAML directive")
+ }
+ return true
+}
+
+// Check if a %TAG directive is valid.
+func (emitter *yamlEmitter) analyzeTagDirective(tag_directive *yamlTagDirective) bool {
+ handle := tag_directive.handle
+ prefix := tag_directive.prefix
+ if len(handle) == 0 {
+ return emitter.setEmitterError("tag handle must not be empty")
+ }
+ if handle[0] != '!' {
+ return emitter.setEmitterError("tag handle must start with '!'")
+ }
+ if handle[len(handle)-1] != '!' {
+ return emitter.setEmitterError("tag handle must end with '!'")
+ }
+ for i := 1; i < len(handle)-1; i += width(handle[i]) {
+ if !isAlpha(handle, i) {
+ return emitter.setEmitterError("tag handle must contain alphanumerical characters only")
+ }
+ }
+ if len(prefix) == 0 {
+ return emitter.setEmitterError("tag prefix must not be empty")
+ }
+ return true
+}
+
+// Check if an anchor is valid.
+func (emitter *yamlEmitter) analyzeAnchor(anchor []byte, alias bool) bool {
+ if len(anchor) == 0 {
+ problem := "anchor value must not be empty"
+ if alias {
+ problem = "alias value must not be empty"
+ }
+ return emitter.setEmitterError(problem)
+ }
+ for i := 0; i < len(anchor); i += width(anchor[i]) {
+ if !isAnchorChar(anchor, i) {
+ problem := "anchor value must contain valid characters only"
+ if alias {
+ problem = "alias value must contain valid characters only"
+ }
+ return emitter.setEmitterError(problem)
+ }
+ }
+ emitter.anchor_data.anchor = anchor
+ emitter.anchor_data.alias = alias
+ return true
+}
+
+// Check if a tag is valid.
+func (emitter *yamlEmitter) analyzeTag(tag []byte) bool {
+ if len(tag) == 0 {
+ return emitter.setEmitterError("tag value must not be empty")
+ }
+ for i := 0; i < len(emitter.tag_directives); i++ {
+ tag_directive := &emitter.tag_directives[i]
+ if bytes.HasPrefix(tag, tag_directive.prefix) {
+ emitter.tag_data.handle = tag_directive.handle
+ emitter.tag_data.suffix = tag[len(tag_directive.prefix):]
+ return true
+ }
+ }
+ emitter.tag_data.suffix = tag
+ return true
+}
+
+// Check if a scalar is valid.
+func (emitter *yamlEmitter) analyzeScalar(value []byte) bool {
+ var block_indicators,
+ flow_indicators,
+ line_breaks,
+ special_characters,
+ tab_characters,
+
+ leading_space,
+ leading_break,
+ trailing_space,
+ trailing_break,
+ break_space,
+ space_break,
+
+ preceded_by_whitespace,
+ followed_by_whitespace,
+ previous_space,
+ previous_break bool
+
+ emitter.scalar_data.value = value
+
+ if len(value) == 0 {
+ emitter.scalar_data.multiline = false
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = true
+ emitter.scalar_data.single_quoted_allowed = true
+ emitter.scalar_data.block_allowed = false
+ return true
+ }
+
+ if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) {
+ block_indicators = true
+ flow_indicators = true
+ }
+
+ preceded_by_whitespace = true
+ for i, w := 0, 0; i < len(value); i += w {
+ w = width(value[i])
+ followed_by_whitespace = i+w >= len(value) || isBlank(value, i+w)
+
+ if i == 0 {
+ switch value[i] {
+ case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`':
+ flow_indicators = true
+ block_indicators = true
+ case '?', ':':
+ flow_indicators = true
+ if followed_by_whitespace {
+ block_indicators = true
+ }
+ case '-':
+ if followed_by_whitespace {
+ flow_indicators = true
+ block_indicators = true
+ }
+ }
+ } else {
+ switch value[i] {
+ case ',', '?', '[', ']', '{', '}':
+ flow_indicators = true
+ case ':':
+ flow_indicators = true
+ if followed_by_whitespace {
+ block_indicators = true
+ }
+ case '#':
+ if preceded_by_whitespace {
+ flow_indicators = true
+ block_indicators = true
+ }
+ }
+ }
+
+ if value[i] == '\t' {
+ tab_characters = true
+ } else if !isPrintable(value, i) || !isASCII(value, i) && !emitter.unicode {
+ special_characters = true
+ }
+ if isSpace(value, i) {
+ if i == 0 {
+ leading_space = true
+ }
+ if i+width(value[i]) == len(value) {
+ trailing_space = true
+ }
+ if previous_break {
+ break_space = true
+ }
+ previous_space = true
+ previous_break = false
+ } else if isLineBreak(value, i) {
+ line_breaks = true
+ if i == 0 {
+ leading_break = true
+ }
+ if i+width(value[i]) == len(value) {
+ trailing_break = true
+ }
+ if previous_space {
+ space_break = true
+ }
+ previous_space = false
+ previous_break = true
+ } else {
+ previous_space = false
+ previous_break = false
+ }
+
+ // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
+ preceded_by_whitespace = isBlankOrZero(value, i)
+ }
+
+ emitter.scalar_data.multiline = line_breaks
+ emitter.scalar_data.flow_plain_allowed = true
+ emitter.scalar_data.block_plain_allowed = true
+ emitter.scalar_data.single_quoted_allowed = true
+ emitter.scalar_data.block_allowed = true
+
+ if leading_space || leading_break || trailing_space || trailing_break {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ }
+ if trailing_space {
+ emitter.scalar_data.block_allowed = false
+ }
+ if break_space {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ emitter.scalar_data.single_quoted_allowed = false
+ }
+ if space_break || tab_characters || special_characters {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ emitter.scalar_data.single_quoted_allowed = false
+ }
+ if space_break || special_characters {
+ emitter.scalar_data.block_allowed = false
+ }
+ if line_breaks {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ }
+ if flow_indicators {
+ emitter.scalar_data.flow_plain_allowed = false
+ }
+ if block_indicators {
+ emitter.scalar_data.block_plain_allowed = false
+ }
+ return true
+}
+
+// Check if the event data is valid.
+func (emitter *yamlEmitter) analyzeEvent(event *yamlEvent) bool {
+ emitter.anchor_data.anchor = nil
+ emitter.tag_data.handle = nil
+ emitter.tag_data.suffix = nil
+ emitter.scalar_data.value = nil
+
+ if len(event.head_comment) > 0 {
+ emitter.head_comment = event.head_comment
+ }
+ if len(event.line_comment) > 0 {
+ emitter.line_comment = event.line_comment
+ }
+ if len(event.foot_comment) > 0 {
+ emitter.foot_comment = event.foot_comment
+ }
+ if len(event.tail_comment) > 0 {
+ emitter.tail_comment = event.tail_comment
+ }
+
+ switch event.typ {
+ case yaml_ALIAS_EVENT:
+ if !emitter.analyzeAnchor(event.anchor, true) {
+ return false
+ }
+
+ case yaml_SCALAR_EVENT:
+ if len(event.anchor) > 0 {
+ if !emitter.analyzeAnchor(event.anchor, false) {
+ return false
+ }
+ }
+ if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) {
+ if !emitter.analyzeTag(event.tag) {
+ return false
+ }
+ }
+ if !emitter.analyzeScalar(event.value) {
+ return false
+ }
+
+ case yaml_SEQUENCE_START_EVENT:
+ if len(event.anchor) > 0 {
+ if !emitter.analyzeAnchor(event.anchor, false) {
+ return false
+ }
+ }
+ if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
+ if !emitter.analyzeTag(event.tag) {
+ return false
+ }
+ }
+
+ case yaml_MAPPING_START_EVENT:
+ if len(event.anchor) > 0 {
+ if !emitter.analyzeAnchor(event.anchor, false) {
+ return false
+ }
+ }
+ if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
+ if !emitter.analyzeTag(event.tag) {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+// Write the BOM character.
+func (emitter *yamlEmitter) writeBom() bool {
+ if !emitter.flushIfNeeded() {
+ return false
+ }
+ pos := emitter.buffer_pos
+ emitter.buffer[pos+0] = '\xEF'
+ emitter.buffer[pos+1] = '\xBB'
+ emitter.buffer[pos+2] = '\xBF'
+ emitter.buffer_pos += 3
+ return true
+}
+
+func (emitter *yamlEmitter) writeIndent() bool {
+ indent := emitter.indent
+ if indent < 0 {
+ indent = 0
+ }
+ if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) {
+ if !emitter.putLineBreak() {
+ return false
+ }
+ }
+ if emitter.foot_indent == indent {
+ if !emitter.putLineBreak() {
+ return false
+ }
+ }
+ for emitter.column < indent {
+ if !emitter.put(' ') {
+ return false
+ }
+ }
+ emitter.whitespace = true
+ // emitter.indention = true
+ emitter.space_above = false
+ emitter.foot_indent = -1
+ return true
+}
+
+func (emitter *yamlEmitter) writeIndicator(indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool {
+ if need_whitespace && !emitter.whitespace {
+ if !emitter.put(' ') {
+ return false
+ }
+ }
+ if !emitter.writeAll(indicator) {
+ return false
+ }
+ emitter.whitespace = is_whitespace
+ emitter.indention = (emitter.indention && is_indention)
+ emitter.open_ended = false
+ return true
+}
+
+func (emitter *yamlEmitter) writeAnchor(value []byte) bool {
+ if !emitter.writeAll(value) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func (emitter *yamlEmitter) writeTagHandle(value []byte) bool {
+ if !emitter.whitespace {
+ if !emitter.put(' ') {
+ return false
+ }
+ }
+ if !emitter.writeAll(value) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func (emitter *yamlEmitter) writeTagContent(value []byte, need_whitespace bool) bool {
+ if need_whitespace && !emitter.whitespace {
+ if !emitter.put(' ') {
+ return false
+ }
+ }
+ for i := 0; i < len(value); {
+ var must_write bool
+ switch value[i] {
+ case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']':
+ must_write = true
+ default:
+ must_write = isAlpha(value, i)
+ }
+ if must_write {
+ if !emitter.write(value, &i) {
+ return false
+ }
+ } else {
+ w := width(value[i])
+ for k := 0; k < w; k++ {
+ octet := value[i]
+ i++
+ if !emitter.put('%') {
+ return false
+ }
+
+ c := octet >> 4
+ if c < 10 {
+ c += '0'
+ } else {
+ c += 'A' - 10
+ }
+ if !emitter.put(c) {
+ return false
+ }
+
+ c = octet & 0x0f
+ if c < 10 {
+ c += '0'
+ } else {
+ c += 'A' - 10
+ }
+ if !emitter.put(c) {
+ return false
+ }
+ }
+ }
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func (emitter *yamlEmitter) writePlainScalar(value []byte, allow_breaks bool) bool {
+ if len(value) > 0 && !emitter.whitespace {
+ if !emitter.put(' ') {
+ return false
+ }
+ }
+
+ spaces := false
+ breaks := false
+ for i := 0; i < len(value); {
+ if isSpace(value, i) {
+ if allow_breaks && !spaces && emitter.column > emitter.best_width && !isSpace(value, i+1) {
+ if !emitter.writeIndent() {
+ return false
+ }
+ i += width(value[i])
+ } else {
+ if !emitter.write(value, &i) {
+ return false
+ }
+ }
+ spaces = true
+ } else if isLineBreak(value, i) {
+ if !breaks && value[i] == '\n' {
+ if !emitter.putLineBreak() {
+ return false
+ }
+ }
+ if !emitter.writeLineBreak(value, &i) {
+ return false
+ }
+ // emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ if !emitter.write(value, &i) {
+ return false
+ }
+ emitter.indention = false
+ spaces = false
+ breaks = false
+ }
+ }
+
+ if len(value) > 0 {
+ emitter.whitespace = false
+ }
+ emitter.indention = false
+ if emitter.root_context {
+ emitter.open_ended = true
+ }
+
+ return true
+}
+
+func (emitter *yamlEmitter) writeSingleQuotedScalar(value []byte, allow_breaks bool) bool {
+ if !emitter.writeIndicator([]byte{'\''}, true, false, false) {
+ return false
+ }
+
+ spaces := false
+ breaks := false
+ for i := 0; i < len(value); {
+ if isSpace(value, i) {
+ if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !isSpace(value, i+1) {
+ if !emitter.writeIndent() {
+ return false
+ }
+ i += width(value[i])
+ } else {
+ if !emitter.write(value, &i) {
+ return false
+ }
+ }
+ spaces = true
+ } else if isLineBreak(value, i) {
+ if !breaks && value[i] == '\n' {
+ if !emitter.putLineBreak() {
+ return false
+ }
+ }
+ if !emitter.writeLineBreak(value, &i) {
+ return false
+ }
+ // emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ if value[i] == '\'' {
+ if !emitter.put('\'') {
+ return false
+ }
+ }
+ if !emitter.write(value, &i) {
+ return false
+ }
+ emitter.indention = false
+ spaces = false
+ breaks = false
+ }
+ }
+ if !emitter.writeIndicator([]byte{'\''}, false, false, false) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func (emitter *yamlEmitter) writeDoubleQuotedScalar(value []byte, allow_breaks bool) bool {
+ spaces := false
+ if !emitter.writeIndicator([]byte{'"'}, true, false, false) {
+ return false
+ }
+
+ for i := 0; i < len(value); {
+ if !isPrintable(value, i) || (!emitter.unicode && !isASCII(value, i)) ||
+ isBOM(value, i) || isLineBreak(value, i) ||
+ value[i] == '"' || value[i] == '\\' {
+
+ octet := value[i]
+
+ var w int
+ var v rune
+ switch {
+ case octet&0x80 == 0x00:
+ w, v = 1, rune(octet&0x7F)
+ case octet&0xE0 == 0xC0:
+ w, v = 2, rune(octet&0x1F)
+ case octet&0xF0 == 0xE0:
+ w, v = 3, rune(octet&0x0F)
+ case octet&0xF8 == 0xF0:
+ w, v = 4, rune(octet&0x07)
+ }
+ for k := 1; k < w; k++ {
+ octet = value[i+k]
+ v = (v << 6) + (rune(octet) & 0x3F)
+ }
+ i += w
+
+ if !emitter.put('\\') {
+ return false
+ }
+
+ var ok bool
+ switch v {
+ case 0x00:
+ ok = emitter.put('0')
+ case 0x07:
+ ok = emitter.put('a')
+ case 0x08:
+ ok = emitter.put('b')
+ case 0x09:
+ ok = emitter.put('t')
+ case 0x0A:
+ ok = emitter.put('n')
+ case 0x0b:
+ ok = emitter.put('v')
+ case 0x0c:
+ ok = emitter.put('f')
+ case 0x0d:
+ ok = emitter.put('r')
+ case 0x1b:
+ ok = emitter.put('e')
+ case 0x22:
+ ok = emitter.put('"')
+ case 0x5c:
+ ok = emitter.put('\\')
+ case 0x85:
+ ok = emitter.put('N')
+ case 0xA0:
+ ok = emitter.put('_')
+ case 0x2028:
+ ok = emitter.put('L')
+ case 0x2029:
+ ok = emitter.put('P')
+ default:
+ if v <= 0xFF {
+ ok = emitter.put('x')
+ w = 2
+ } else if v <= 0xFFFF {
+ ok = emitter.put('u')
+ w = 4
+ } else {
+ ok = emitter.put('U')
+ w = 8
+ }
+ for k := (w - 1) * 4; ok && k >= 0; k -= 4 {
+ digit := byte((v >> uint(k)) & 0x0F)
+ if digit < 10 {
+ ok = emitter.put(digit + '0')
+ } else {
+ ok = emitter.put(digit + 'A' - 10)
+ }
+ }
+ }
+ if !ok {
+ return false
+ }
+ spaces = false
+ } else if isSpace(value, i) {
+ if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 {
+ if !emitter.writeIndent() {
+ return false
+ }
+ if isSpace(value, i+1) {
+ if !emitter.put('\\') {
+ return false
+ }
+ }
+ i += width(value[i])
+ } else if !emitter.write(value, &i) {
+ return false
+ }
+ spaces = true
+ } else {
+ if !emitter.write(value, &i) {
+ return false
+ }
+ spaces = false
+ }
+ }
+ if !emitter.writeIndicator([]byte{'"'}, false, false, false) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func (emitter *yamlEmitter) writeBlockScalarHints(value []byte) bool {
+ if isSpace(value, 0) || isLineBreak(value, 0) {
+ indent_hint := []byte{'0' + byte(emitter.best_indent)}
+ if !emitter.writeIndicator(indent_hint, false, false, false) {
+ return false
+ }
+ }
+
+ emitter.open_ended = false
+
+ var chomp_hint [1]byte
+ if len(value) == 0 {
+ chomp_hint[0] = '-'
+ } else {
+ i := len(value) - 1
+ for value[i]&0xC0 == 0x80 {
+ i--
+ }
+ if !isLineBreak(value, i) {
+ chomp_hint[0] = '-'
+ } else if i == 0 {
+ chomp_hint[0] = '+'
+ emitter.open_ended = true
+ } else {
+ i--
+ for value[i]&0xC0 == 0x80 {
+ i--
+ }
+ if isLineBreak(value, i) {
+ chomp_hint[0] = '+'
+ emitter.open_ended = true
+ }
+ }
+ }
+ if chomp_hint[0] != 0 {
+ if !emitter.writeIndicator(chomp_hint[:], false, false, false) {
+ return false
+ }
+ }
+ return true
+}
+
+func (emitter *yamlEmitter) writeLiteralScalar(value []byte) bool {
+ if !emitter.writeIndicator([]byte{'|'}, true, false, false) {
+ return false
+ }
+ if !emitter.writeBlockScalarHints(value) {
+ return false
+ }
+ if !emitter.processLineCommentLinebreak(true) {
+ return false
+ }
+ // emitter.indention = true
+ emitter.whitespace = true
+ breaks := true
+ for i := 0; i < len(value); {
+ if isLineBreak(value, i) {
+ if !emitter.writeLineBreak(value, &i) {
+ return false
+ }
+ // emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !emitter.writeIndent() {
+ return false
+ }
+ }
+ if !emitter.write(value, &i) {
+ return false
+ }
+ emitter.indention = false
+ breaks = false
+ }
+ }
+
+ return true
+}
+
+func (emitter *yamlEmitter) writeFoldedScalar(value []byte) bool {
+ if !emitter.writeIndicator([]byte{'>'}, true, false, false) {
+ return false
+ }
+ if !emitter.writeBlockScalarHints(value) {
+ return false
+ }
+ if !emitter.processLineCommentLinebreak(true) {
+ return false
+ }
+
+ // emitter.indention = true
+ emitter.whitespace = true
+
+ breaks := true
+ leading_spaces := true
+ for i := 0; i < len(value); {
+ if isLineBreak(value, i) {
+ if !breaks && !leading_spaces && value[i] == '\n' {
+ k := 0
+ for isLineBreak(value, k) {
+ k += width(value[k])
+ }
+ if !isBlankOrZero(value, k) {
+ if !emitter.putLineBreak() {
+ return false
+ }
+ }
+ }
+ if !emitter.writeLineBreak(value, &i) {
+ return false
+ }
+ // emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !emitter.writeIndent() {
+ return false
+ }
+ leading_spaces = isBlank(value, i)
+ }
+ if !breaks && isSpace(value, i) && !isSpace(value, i+1) && emitter.column > emitter.best_width {
+ if !emitter.writeIndent() {
+ return false
+ }
+ i += width(value[i])
+ } else {
+ if !emitter.write(value, &i) {
+ return false
+ }
+ }
+ emitter.indention = false
+ breaks = false
+ }
+ }
+ return true
+}
+
+func (emitter *yamlEmitter) writeComment(comment []byte) bool {
+ breaks := false
+ pound := false
+ for i := 0; i < len(comment); {
+ if isLineBreak(comment, i) {
+ if !emitter.writeLineBreak(comment, &i) {
+ return false
+ }
+ // emitter.indention = true
+ breaks = true
+ pound = false
+ } else {
+ if breaks && !emitter.writeIndent() {
+ return false
+ }
+ if !pound {
+ if comment[i] != '#' && (!emitter.put('#') || !emitter.put(' ')) {
+ return false
+ }
+ pound = true
+ }
+ if !emitter.write(comment, &i) {
+ return false
+ }
+ emitter.indention = false
+ breaks = false
+ }
+ }
+ if !breaks && !emitter.putLineBreak() {
+ return false
+ }
+
+ emitter.whitespace = true
+ // emitter.indention = true
+ return true
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/encode.go b/hack/tools/vendor/github.com/itchyny/go-yaml/encode.go
new file mode 100644
index 0000000000..f81db5086a
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/encode.go
@@ -0,0 +1,594 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+//
+// 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.
+
+package yaml
+
+import (
+ "encoding"
+ "encoding/json"
+ "fmt"
+ "io"
+ "reflect"
+ "regexp"
+ "sort"
+ "strconv"
+ "strings"
+ "time"
+ "unicode/utf8"
+)
+
+type encoder struct {
+ emitter yamlEmitter
+ event yamlEvent
+ out []byte
+ flow bool
+ indent int
+ doneInit bool
+}
+
+func newEncoder() *encoder {
+ e := &encoder{
+ emitter: newYAMLEmitter(),
+ }
+ e.emitter.setOutputString(&e.out)
+ e.emitter.setUnicode(true)
+ return e
+}
+
+func newEncoderWithWriter(w io.Writer) *encoder {
+ e := &encoder{
+ emitter: newYAMLEmitter(),
+ }
+ e.emitter.setOutputWriter(w)
+ e.emitter.setUnicode(true)
+ return e
+}
+
+func (e *encoder) init() {
+ if e.doneInit {
+ return
+ }
+ if e.indent == 0 {
+ e.indent = 4
+ }
+ e.emitter.best_indent = e.indent
+ e.event = newStreamStartEvent(yaml_UTF8_ENCODING)
+ e.emit()
+ e.doneInit = true
+}
+
+func (e *encoder) finish() {
+ e.emitter.open_ended = false
+ e.event = newStreamEndEvent()
+ e.emit()
+}
+
+func (e *encoder) destroy() {
+ e.emitter.delete()
+}
+
+func (e *encoder) emit() {
+ // This will internally delete the e.event value.
+ e.must(e.emitter.emit(&e.event))
+}
+
+func (e *encoder) must(ok bool) {
+ if !ok {
+ msg := e.emitter.problem
+ if msg == "" {
+ msg = "unknown problem generating YAML content"
+ }
+ failf("%s", msg)
+ }
+}
+
+func (e *encoder) marshalDoc(tag string, in reflect.Value) {
+ e.init()
+ var node *Node
+ if in.IsValid() {
+ node, _ = in.Interface().(*Node)
+ }
+ if node != nil && node.Kind == DocumentNode {
+ e.nodev(in)
+ } else {
+ e.event = newDocumentStartEvent(nil, nil, true)
+ e.emit()
+ e.marshal(tag, in)
+ e.event = newDocumentEndEvent(true)
+ e.emit()
+ }
+}
+
+func (e *encoder) marshal(tag string, in reflect.Value) {
+ tag = shortTag(tag)
+ if !in.IsValid() || in.Kind() == reflect.Pointer && in.IsNil() {
+ e.nilv()
+ return
+ }
+ iface := in.Interface()
+ switch value := iface.(type) {
+ case *Node:
+ e.nodev(in)
+ return
+ case Node:
+ if !in.CanAddr() {
+ n := reflect.New(in.Type()).Elem()
+ n.Set(in)
+ in = n
+ }
+ e.nodev(in.Addr())
+ return
+ case time.Time:
+ e.timev(tag, in)
+ return
+ case *time.Time:
+ e.timev(tag, in.Elem())
+ return
+ case time.Duration:
+ e.stringv(tag, reflect.ValueOf(value.String()))
+ return
+ case json.Number:
+ e.emitScalar(value.String(), "", "", yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
+ return
+ case Marshaler:
+ v, err := value.MarshalYAML()
+ if err != nil {
+ fail(err)
+ }
+ if v == nil {
+ e.nilv()
+ return
+ }
+ e.marshal(tag, reflect.ValueOf(v))
+ return
+ case encoding.TextMarshaler:
+ text, err := value.MarshalText()
+ if err != nil {
+ fail(err)
+ }
+ in = reflect.ValueOf(string(text))
+ case nil:
+ e.nilv()
+ return
+ }
+ switch in.Kind() {
+ case reflect.Interface:
+ e.marshal(tag, in.Elem())
+ case reflect.Map:
+ e.mapv(tag, in)
+ case reflect.Pointer:
+ e.marshal(tag, in.Elem())
+ case reflect.Struct:
+ e.structv(tag, in)
+ case reflect.Slice, reflect.Array:
+ e.slicev(tag, in)
+ case reflect.String:
+ e.stringv(tag, in)
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ e.intv(tag, in)
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ e.uintv(tag, in)
+ case reflect.Float32, reflect.Float64:
+ e.floatv(tag, in)
+ case reflect.Bool:
+ e.boolv(tag, in)
+ default:
+ panic("cannot marshal type: " + in.Type().String())
+ }
+}
+
+func (e *encoder) mapv(tag string, in reflect.Value) {
+ e.mappingv(tag, func() {
+ keys := keyList(in.MapKeys())
+ sort.Sort(keys)
+ for _, k := range keys {
+ e.marshal("", k)
+ e.marshal("", in.MapIndex(k))
+ }
+ })
+}
+
+func (e *encoder) fieldByIndex(v reflect.Value, index []int) (field reflect.Value) {
+ for _, num := range index {
+ for {
+ if v.Kind() == reflect.Pointer {
+ if v.IsNil() {
+ return reflect.Value{}
+ }
+ v = v.Elem()
+ continue
+ }
+ break
+ }
+ v = v.Field(num)
+ }
+ return v
+}
+
+func (e *encoder) structv(tag string, in reflect.Value) {
+ sinfo, err := getStructInfo(in.Type())
+ if err != nil {
+ panic(err)
+ }
+ e.mappingv(tag, func() {
+ for _, info := range sinfo.FieldsList {
+ var value reflect.Value
+ if info.Inline == nil {
+ value = in.Field(info.Num)
+ } else {
+ value = e.fieldByIndex(in, info.Inline)
+ if !value.IsValid() {
+ continue
+ }
+ }
+ if info.OmitEmpty && isZero(value) {
+ continue
+ }
+ e.marshal("", reflect.ValueOf(info.Key))
+ e.flow = info.Flow
+ e.marshal("", value)
+ }
+ if sinfo.InlineMap >= 0 {
+ m := in.Field(sinfo.InlineMap)
+ if m.Len() > 0 {
+ e.flow = false
+ keys := keyList(m.MapKeys())
+ sort.Sort(keys)
+ for _, k := range keys {
+ if _, found := sinfo.FieldsMap[k.String()]; found {
+ panic(fmt.Sprintf("cannot have key %q in inlined map: conflicts with struct field", k.String()))
+ }
+ e.marshal("", k)
+ e.flow = false
+ e.marshal("", m.MapIndex(k))
+ }
+ }
+ }
+ })
+}
+
+func (e *encoder) mappingv(tag string, f func()) {
+ implicit := tag == ""
+ style := yaml_BLOCK_MAPPING_STYLE
+ if e.flow {
+ e.flow = false
+ style = yaml_FLOW_MAPPING_STYLE
+ }
+ e.event = newMappingStartEvent(nil, []byte(tag), implicit, style)
+ e.emit()
+ f()
+ e.event = newMappingEndEvent()
+ e.emit()
+}
+
+func (e *encoder) slicev(tag string, in reflect.Value) {
+ implicit := tag == ""
+ style := yaml_BLOCK_SEQUENCE_STYLE
+ if e.flow {
+ e.flow = false
+ style = yaml_FLOW_SEQUENCE_STYLE
+ }
+ e.event = newSequenceStartEvent(nil, []byte(tag), implicit, style)
+ e.emit()
+ n := in.Len()
+ for i := 0; i < n; i++ {
+ e.marshal("", in.Index(i))
+ }
+ e.event = newSequenceEndEvent()
+ e.emit()
+}
+
+// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1.
+//
+// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported
+// in YAML 1.2 and by this package, but these should be marshaled quoted for
+// the time being for compatibility with other parsers.
+func isBase60Float(s string) (result bool) {
+ // Fast path.
+ if s == "" {
+ return false
+ }
+ c := s[0]
+ if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 {
+ return false
+ }
+ // Do the full match.
+ return base60float.MatchString(s)
+}
+
+// From http://yaml.org/type/float.html, except the regular expression there
+// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix.
+var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`)
+
+// isOldBool returns whether s is bool notation as defined in YAML 1.1.
+//
+// We continue to force strings that YAML 1.1 would interpret as booleans to be
+// rendered as quotes strings so that the marshaled output valid for YAML 1.1
+// parsing.
+func isOldBool(s string) (result bool) {
+ switch s {
+ case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON",
+ "n", "N", "no", "No", "NO", "off", "Off", "OFF":
+ return true
+ default:
+ return false
+ }
+}
+
+// looksLikeMerge returns true if the given string is the merge indicator "<<".
+//
+// When encoding a scalar with this exact value, it must be quoted to prevent it
+// from being interpreted as a merge indicator during decoding.
+func looksLikeMerge(s string) (result bool) {
+ return s == "<<"
+}
+
+func (e *encoder) stringv(tag string, in reflect.Value) {
+ var style yamlScalarStyle
+ s := in.String()
+ canUsePlain := true
+ switch {
+ case !utf8.ValidString(s):
+ if tag == binaryTag {
+ failf("explicitly tagged !!binary data must be base64-encoded")
+ }
+ if tag != "" {
+ failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag))
+ }
+ // It can't be encoded directly as YAML so use a binary tag
+ // and encode it as base64.
+ tag = binaryTag
+ s = encodeBase64(s)
+ case tag == "":
+ // Check to see if it would resolve to a specific
+ // tag when encoded unquoted. If it doesn't,
+ // there's no need to quote it.
+ rtag, _ := resolve("", s)
+ canUsePlain = rtag == strTag &&
+ !(isBase60Float(s) ||
+ isOldBool(s) ||
+ looksLikeMerge(s))
+ }
+ // Note: it's possible for user code to emit invalid YAML
+ // if they explicitly specify a tag and a string containing
+ // text that's incompatible with that tag.
+ switch {
+ case strings.Contains(s, "\n"):
+ if e.flow || !shouldUseLiteralStyle(s) {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ } else {
+ style = yaml_LITERAL_SCALAR_STYLE
+ }
+ case canUsePlain:
+ style = yaml_PLAIN_SCALAR_STYLE
+ default:
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ e.emitScalar(s, "", tag, style, nil, nil, nil, nil)
+}
+
+func (e *encoder) boolv(tag string, in reflect.Value) {
+ var s string
+ if in.Bool() {
+ s = "true"
+ } else {
+ s = "false"
+ }
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
+}
+
+func (e *encoder) intv(tag string, in reflect.Value) {
+ s := strconv.FormatInt(in.Int(), 10)
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
+}
+
+func (e *encoder) uintv(tag string, in reflect.Value) {
+ s := strconv.FormatUint(in.Uint(), 10)
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
+}
+
+func (e *encoder) timev(tag string, in reflect.Value) {
+ t := in.Interface().(time.Time)
+ s := t.Format(time.RFC3339Nano)
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
+}
+
+func (e *encoder) floatv(tag string, in reflect.Value) {
+ // Issue #352: When formatting, use the precision of the underlying value
+ precision := 64
+ if in.Kind() == reflect.Float32 {
+ precision = 32
+ }
+
+ s := strconv.FormatFloat(in.Float(), 'g', -1, precision)
+ switch s {
+ case "+Inf":
+ s = ".inf"
+ case "-Inf":
+ s = "-.inf"
+ case "NaN":
+ s = ".nan"
+ }
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
+}
+
+func (e *encoder) nilv() {
+ e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil)
+}
+
+func (e *encoder) emitScalar(value, anchor, tag string, style yamlScalarStyle, head, line, foot, tail []byte) {
+ // TODO Kill this function. Replace all initialize calls by their underlining Go literals.
+ implicit := tag == ""
+ if !implicit {
+ tag = longTag(tag)
+ }
+ e.event = newScalarEvent([]byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)
+ e.event.head_comment = head
+ e.event.line_comment = line
+ e.event.foot_comment = foot
+ e.event.tail_comment = tail
+ e.emit()
+}
+
+func (e *encoder) nodev(in reflect.Value) {
+ e.node(in.Interface().(*Node), "")
+}
+
+func (e *encoder) node(node *Node, tail string) {
+ // Zero nodes behave as nil.
+ if node.Kind == 0 && node.IsZero() {
+ e.nilv()
+ return
+ }
+
+ // If the tag was not explicitly requested, and dropping it won't change the
+ // implicit tag of the value, don't include it in the presentation.
+ tag := node.Tag
+ stag := shortTag(tag)
+ var forceQuoting bool
+ if tag != "" && node.Style&TaggedStyle == 0 {
+ if node.Kind == ScalarNode {
+ if stag == strTag && node.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0 {
+ tag = ""
+ } else {
+ rtag, _ := resolve("", node.Value)
+ if rtag == stag {
+ tag = ""
+ } else if stag == strTag {
+ tag = ""
+ forceQuoting = true
+ }
+ }
+ } else {
+ var rtag string
+ switch node.Kind {
+ case MappingNode:
+ rtag = mapTag
+ case SequenceNode:
+ rtag = seqTag
+ }
+ if rtag == stag {
+ tag = ""
+ }
+ }
+ }
+
+ switch node.Kind {
+ case DocumentNode:
+ e.event = newDocumentStartEvent(nil, nil, true)
+ e.event.head_comment = []byte(node.HeadComment)
+ e.emit()
+ for _, node := range node.Content {
+ e.node(node, "")
+ }
+ e.event = newDocumentEndEvent(true)
+ e.event.foot_comment = []byte(node.FootComment)
+ e.emit()
+
+ case SequenceNode:
+ style := yaml_BLOCK_SEQUENCE_STYLE
+ if node.Style&FlowStyle != 0 {
+ style = yaml_FLOW_SEQUENCE_STYLE
+ }
+ e.event = newSequenceStartEvent([]byte(node.Anchor), []byte(longTag(tag)), tag == "", style)
+ e.event.head_comment = []byte(node.HeadComment)
+ e.emit()
+ for _, node := range node.Content {
+ e.node(node, "")
+ }
+ e.event = newSequenceEndEvent()
+ e.event.line_comment = []byte(node.LineComment)
+ e.event.foot_comment = []byte(node.FootComment)
+ e.emit()
+
+ case MappingNode:
+ style := yaml_BLOCK_MAPPING_STYLE
+ if node.Style&FlowStyle != 0 {
+ style = yaml_FLOW_MAPPING_STYLE
+ }
+ e.event = newMappingStartEvent([]byte(node.Anchor), []byte(longTag(tag)), tag == "", style)
+ e.event.tail_comment = []byte(tail)
+ e.event.head_comment = []byte(node.HeadComment)
+ e.emit()
+
+ // The tail logic below moves the foot comment of prior keys to the following key,
+ // since the value for each key may be a nested structure and the foot needs to be
+ // processed only the entirety of the value is streamed. The last tail is processed
+ // with the mapping end event.
+ var tail string
+ for i := 0; i+1 < len(node.Content); i += 2 {
+ k := node.Content[i]
+ foot := k.FootComment
+ if foot != "" {
+ kopy := *k
+ kopy.FootComment = ""
+ k = &kopy
+ }
+ e.node(k, tail)
+ tail = foot
+
+ v := node.Content[i+1]
+ e.node(v, "")
+ }
+
+ e.event = newMappingEndEvent()
+ e.event.tail_comment = []byte(tail)
+ e.event.line_comment = []byte(node.LineComment)
+ e.event.foot_comment = []byte(node.FootComment)
+ e.emit()
+
+ case AliasNode:
+ e.event = newAliasEvent([]byte(node.Value))
+ e.event.head_comment = []byte(node.HeadComment)
+ e.event.line_comment = []byte(node.LineComment)
+ e.event.foot_comment = []byte(node.FootComment)
+ e.emit()
+
+ case ScalarNode:
+ value := node.Value
+ if !utf8.ValidString(value) {
+ if stag == binaryTag {
+ failf("explicitly tagged !!binary data must be base64-encoded")
+ }
+ if stag != "" {
+ failf("cannot marshal invalid UTF-8 data as %s", stag)
+ }
+ // It can't be encoded directly as YAML so use a binary tag
+ // and encode it as base64.
+ tag = binaryTag
+ value = encodeBase64(value)
+ }
+
+ style := yaml_PLAIN_SCALAR_STYLE
+ switch {
+ case node.Style&DoubleQuotedStyle != 0:
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ case node.Style&SingleQuotedStyle != 0:
+ style = yaml_SINGLE_QUOTED_SCALAR_STYLE
+ case node.Style&LiteralStyle != 0:
+ style = yaml_LITERAL_SCALAR_STYLE
+ case node.Style&FoldedStyle != 0:
+ style = yaml_FOLDED_SCALAR_STYLE
+ case strings.Contains(value, "\n"):
+ style = yaml_LITERAL_SCALAR_STYLE
+ case forceQuoting:
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+
+ e.emitScalar(value, node.Anchor, tag, style, []byte(node.HeadComment), []byte(node.LineComment), []byte(node.FootComment), []byte(tail))
+ default:
+ failf("cannot encode node with unknown kind %d", node.Kind)
+ }
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/parserc.go b/hack/tools/vendor/github.com/itchyny/go-yaml/parserc.go
new file mode 100644
index 0000000000..5b8952f3bc
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/parserc.go
@@ -0,0 +1,1273 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+// Copyright (c) 2006-2010 Kirill Simonov
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+package yaml
+
+import (
+ "bytes"
+)
+
+// The parser implements the following grammar:
+//
+// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
+// implicit_document ::= block_node DOCUMENT-END*
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+// block_node_or_indentless_sequence ::=
+// ALIAS
+// | properties (block_content | indentless_block_sequence)?
+// | block_content
+// | indentless_block_sequence
+// block_node ::= ALIAS
+// | properties block_content?
+// | block_content
+// flow_node ::= ALIAS
+// | properties flow_content?
+// | flow_content
+// properties ::= TAG ANCHOR? | ANCHOR TAG?
+// block_content ::= block_collection | flow_collection | SCALAR
+// flow_content ::= flow_collection | SCALAR
+// block_collection ::= block_sequence | block_mapping
+// flow_collection ::= flow_sequence | flow_mapping
+// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
+// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
+// block_mapping ::= BLOCK-MAPPING_START
+// ((KEY block_node_or_indentless_sequence?)?
+// (VALUE block_node_or_indentless_sequence?)?)*
+// BLOCK-END
+// flow_sequence ::= FLOW-SEQUENCE-START
+// (flow_sequence_entry FLOW-ENTRY)*
+// flow_sequence_entry?
+// FLOW-SEQUENCE-END
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// flow_mapping ::= FLOW-MAPPING-START
+// (flow_mapping_entry FLOW-ENTRY)*
+// flow_mapping_entry?
+// FLOW-MAPPING-END
+// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+
+// Peek the next token in the token queue.
+func (parser *yamlParser) peekToken() *yamlToken {
+ if parser.token_available || parser.fetchMoreTokens() {
+ token := &parser.tokens[parser.tokens_head]
+ parser.unfoldComments(token)
+ return token
+ }
+ return nil
+}
+
+// unfoldComments walks through the comments queue and joins all
+// comments behind the position of the provided token into the respective
+// top-level comment slices in the parser.
+func (parser *yamlParser) unfoldComments(token *yamlToken) {
+ for parser.comments_head < len(parser.comments) && token.start_mark.index >= parser.comments[parser.comments_head].token_mark.index {
+ comment := &parser.comments[parser.comments_head]
+ if len(comment.head) > 0 {
+ if token.typ == yaml_BLOCK_END_TOKEN {
+ // No heads on ends, so keep comment.head for a follow up token.
+ break
+ }
+ if len(parser.head_comment) > 0 {
+ parser.head_comment = append(parser.head_comment, '\n')
+ }
+ parser.head_comment = append(parser.head_comment, comment.head...)
+ }
+ if len(comment.foot) > 0 {
+ if len(parser.foot_comment) > 0 {
+ parser.foot_comment = append(parser.foot_comment, '\n')
+ }
+ parser.foot_comment = append(parser.foot_comment, comment.foot...)
+ }
+ if len(comment.line) > 0 {
+ if len(parser.line_comment) > 0 {
+ parser.line_comment = append(parser.line_comment, '\n')
+ }
+ parser.line_comment = append(parser.line_comment, comment.line...)
+ }
+ *comment = yamlComment{}
+ parser.comments_head++
+ }
+}
+
+// Remove the next token from the queue (must be called after peek_token).
+func (parser *yamlParser) skipToken() {
+ parser.token_available = false
+ parser.tokens_parsed++
+ parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN
+ parser.tokens_head++
+}
+
+// Get the next event.
+func (parser *yamlParser) parse(event *yamlEvent) bool {
+ // Erase the event object.
+ *event = yamlEvent{}
+
+ // No events after the end of the stream or error.
+ if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE {
+ return true
+ }
+
+ // Generate the next event.
+ return parser.stateMachine(event)
+}
+
+// Set parser error.
+func (parser *yamlParser) setParserError(problem string, problem_mark yamlMark) bool {
+ parser.error = yaml_PARSER_ERROR
+ parser.problem = problem
+ parser.problem_mark = problem_mark
+ return false
+}
+
+func (parser *yamlParser) setParserErrorContext(context string, context_mark yamlMark, problem string, problem_mark yamlMark) bool {
+ parser.error = yaml_PARSER_ERROR
+ parser.context = context
+ parser.context_mark = context_mark
+ parser.problem = problem
+ parser.problem_mark = problem_mark
+ return false
+}
+
+// State dispatcher.
+func (parser *yamlParser) stateMachine(event *yamlEvent) bool {
+ // trace("yaml_parser_state_machine", "state:", parser.state.String())
+
+ switch parser.state {
+ case yaml_PARSE_STREAM_START_STATE:
+ return parser.parseStreamStart(event)
+
+ case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
+ return parser.parseDocumentStart(event, true)
+
+ case yaml_PARSE_DOCUMENT_START_STATE:
+ return parser.parseDocumentStart(event, false)
+
+ case yaml_PARSE_DOCUMENT_CONTENT_STATE:
+ return parser.parseDocumentContent(event)
+
+ case yaml_PARSE_DOCUMENT_END_STATE:
+ return parser.parseDocumentEnd(event)
+
+ case yaml_PARSE_BLOCK_NODE_STATE:
+ return parser.parseNode(event, true, false)
+
+ case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
+ return parser.parseNode(event, true, true)
+
+ case yaml_PARSE_FLOW_NODE_STATE:
+ return parser.parseNode(event, false, false)
+
+ case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
+ return parser.parseBlockSequenceEntry(event, true)
+
+ case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
+ return parser.parseBlockSequenceEntry(event, false)
+
+ case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
+ return parser.parseIndentlessSequenceEntry(event)
+
+ case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
+ return parser.parseBlockMappingKey(event, true)
+
+ case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
+ return parser.parseBlockMappingKey(event, false)
+
+ case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
+ return parser.parseBlockMappingValue(event)
+
+ case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
+ return parser.parseFlowSequenceEntry(event, true)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
+ return parser.parseFlowSequenceEntry(event, false)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
+ return parser.parseFlowSequenceEntryMappingKey(event)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
+ return parser.parseFlowSequenceEntryMappingValue(event)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
+ return parser.parseFlowSequenceEntryMappingEnd(event)
+
+ case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
+ return parser.parseFlowMappingKey(event, true)
+
+ case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
+ return parser.parseFlowMappingKey(event, false)
+
+ case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
+ return parser.parseFlowMappingValue(event, false)
+
+ case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
+ return parser.parseFlowMappingValue(event, true)
+
+ default:
+ panic("invalid parser state")
+ }
+}
+
+// Parse the production:
+// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
+//
+// ************
+func (parser *yamlParser) parseStreamStart(event *yamlEvent) bool {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_STREAM_START_TOKEN {
+ return parser.setParserError("did not find expected ", token.start_mark)
+ }
+ parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE
+ *event = yamlEvent{
+ typ: yaml_STREAM_START_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ encoding: token.encoding,
+ }
+ parser.skipToken()
+ return true
+}
+
+// Parse the productions:
+// implicit_document ::= block_node DOCUMENT-END*
+//
+// *
+//
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+//
+// *************************
+func (parser *yamlParser) parseDocumentStart(event *yamlEvent, implicit bool) bool {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+
+ // Parse extra document end indicators.
+ if !implicit {
+ for token.typ == yaml_DOCUMENT_END_TOKEN {
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ }
+ }
+
+ if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN &&
+ token.typ != yaml_TAG_DIRECTIVE_TOKEN &&
+ token.typ != yaml_DOCUMENT_START_TOKEN &&
+ token.typ != yaml_STREAM_END_TOKEN {
+ // Parse an implicit document.
+ if !parser.processDirectives(nil, nil) {
+ return false
+ }
+ parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
+ parser.state = yaml_PARSE_BLOCK_NODE_STATE
+
+ var head_comment []byte
+ if len(parser.head_comment) > 0 {
+ // [Go] Scan the header comment backwards, and if an empty line is found, break
+ // the header so the part before the last empty line goes into the
+ // document header, while the bottom of it goes into a follow up event.
+ for i := len(parser.head_comment) - 1; i > 0; i-- {
+ if parser.head_comment[i] == '\n' {
+ if i == len(parser.head_comment)-1 {
+ head_comment = parser.head_comment[:i]
+ parser.head_comment = parser.head_comment[i+1:]
+ break
+ } else if parser.head_comment[i-1] == '\n' {
+ head_comment = parser.head_comment[:i-1]
+ parser.head_comment = parser.head_comment[i+1:]
+ break
+ }
+ }
+ }
+ }
+
+ *event = yamlEvent{
+ typ: yaml_DOCUMENT_START_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+
+ head_comment: head_comment,
+ }
+
+ } else if token.typ != yaml_STREAM_END_TOKEN {
+ // Parse an explicit document.
+ var version_directive *yamlVersionDirective
+ var tag_directives []yamlTagDirective
+ start_mark := token.start_mark
+ if !parser.processDirectives(&version_directive, &tag_directives) {
+ return false
+ }
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_DOCUMENT_START_TOKEN {
+ parser.setParserError(
+ "did not find expected ", token.start_mark)
+ return false
+ }
+ parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
+ parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE
+ end_mark := token.end_mark
+
+ *event = yamlEvent{
+ typ: yaml_DOCUMENT_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ version_directive: version_directive,
+ tag_directives: tag_directives,
+ implicit: false,
+ }
+ parser.skipToken()
+
+ } else {
+ // Parse the stream end.
+ parser.state = yaml_PARSE_END_STATE
+ *event = yamlEvent{
+ typ: yaml_STREAM_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+ parser.skipToken()
+ }
+
+ return true
+}
+
+// Parse the productions:
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+//
+// ***********
+func (parser *yamlParser) parseDocumentContent(event *yamlEvent) bool {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_VERSION_DIRECTIVE_TOKEN ||
+ token.typ == yaml_TAG_DIRECTIVE_TOKEN ||
+ token.typ == yaml_DOCUMENT_START_TOKEN ||
+ token.typ == yaml_DOCUMENT_END_TOKEN ||
+ token.typ == yaml_STREAM_END_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ return parser.processEmptyScalar(event,
+ token.start_mark)
+ }
+ return parser.parseNode(event, true, false)
+}
+
+// Parse the productions:
+// implicit_document ::= block_node DOCUMENT-END*
+//
+// *************
+//
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+func (parser *yamlParser) parseDocumentEnd(event *yamlEvent) bool {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+
+ start_mark := token.start_mark
+ end_mark := token.start_mark
+
+ implicit := true
+ if token.typ == yaml_DOCUMENT_END_TOKEN {
+ end_mark = token.end_mark
+ parser.skipToken()
+ implicit = false
+ }
+
+ parser.tag_directives = parser.tag_directives[:0]
+
+ parser.state = yaml_PARSE_DOCUMENT_START_STATE
+ *event = yamlEvent{
+ typ: yaml_DOCUMENT_END_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ implicit: implicit,
+ }
+ parser.setEventComments(event)
+ if len(event.head_comment) > 0 && len(event.foot_comment) == 0 {
+ event.foot_comment = event.head_comment
+ event.head_comment = nil
+ }
+ return true
+}
+
+func (parser *yamlParser) setEventComments(event *yamlEvent) {
+ event.head_comment = parser.head_comment
+ event.line_comment = parser.line_comment
+ event.foot_comment = parser.foot_comment
+ parser.head_comment = nil
+ parser.line_comment = nil
+ parser.foot_comment = nil
+ parser.tail_comment = nil
+ parser.stem_comment = nil
+}
+
+// Parse the productions:
+// block_node_or_indentless_sequence ::=
+//
+// ALIAS
+// *****
+// | properties (block_content | indentless_block_sequence)?
+// ********** *
+// | block_content | indentless_block_sequence
+// *
+//
+// block_node ::= ALIAS
+//
+// *****
+// | properties block_content?
+// ********** *
+// | block_content
+// *
+//
+// flow_node ::= ALIAS
+//
+// *****
+// | properties flow_content?
+// ********** *
+// | flow_content
+// *
+//
+// properties ::= TAG ANCHOR? | ANCHOR TAG?
+//
+// *************************
+//
+// block_content ::= block_collection | flow_collection | SCALAR
+//
+// ******
+//
+// flow_content ::= flow_collection | SCALAR
+//
+// ******
+func (parser *yamlParser) parseNode(event *yamlEvent, block, indentless_sequence bool) bool {
+ // defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)()
+
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_ALIAS_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ *event = yamlEvent{
+ typ: yaml_ALIAS_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ anchor: token.value,
+ }
+ parser.setEventComments(event)
+ parser.skipToken()
+ return true
+ }
+
+ start_mark := token.start_mark
+ end_mark := token.start_mark
+
+ var tag_token bool
+ var tag_handle, tag_suffix, anchor []byte
+ var tag_mark yamlMark
+ switch token.typ {
+ case yaml_ANCHOR_TOKEN:
+ anchor = token.value
+ start_mark = token.start_mark
+ end_mark = token.end_mark
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_TAG_TOKEN {
+ tag_token = true
+ tag_handle = token.value
+ tag_suffix = token.suffix
+ tag_mark = token.start_mark
+ end_mark = token.end_mark
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ }
+ case yaml_TAG_TOKEN:
+ tag_token = true
+ tag_handle = token.value
+ tag_suffix = token.suffix
+ start_mark = token.start_mark
+ tag_mark = token.start_mark
+ end_mark = token.end_mark
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_ANCHOR_TOKEN {
+ anchor = token.value
+ end_mark = token.end_mark
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ }
+ }
+
+ var tag []byte
+ if tag_token {
+ if len(tag_handle) == 0 {
+ tag = tag_suffix
+ } else {
+ for i := range parser.tag_directives {
+ if bytes.Equal(parser.tag_directives[i].handle, tag_handle) {
+ tag = append([]byte(nil), parser.tag_directives[i].prefix...)
+ tag = append(tag, tag_suffix...)
+ break
+ }
+ }
+ if len(tag) == 0 {
+ parser.setParserErrorContext(
+ "while parsing a node", start_mark,
+ "found undefined tag handle", tag_mark)
+ return false
+ }
+ }
+ }
+
+ implicit := len(tag) == 0
+ if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
+ *event = yamlEvent{
+ typ: yaml_SEQUENCE_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yamlStyle(yaml_BLOCK_SEQUENCE_STYLE),
+ }
+ return true
+ }
+ if token.typ == yaml_SCALAR_TOKEN {
+ var plain_implicit, quoted_implicit bool
+ end_mark = token.end_mark
+ if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') {
+ plain_implicit = true
+ } else if len(tag) == 0 {
+ quoted_implicit = true
+ }
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+
+ *event = yamlEvent{
+ typ: yaml_SCALAR_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ value: token.value,
+ implicit: plain_implicit,
+ quoted_implicit: quoted_implicit,
+ style: yamlStyle(token.style),
+ }
+ parser.setEventComments(event)
+ parser.skipToken()
+ return true
+ }
+ if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN {
+ // [Go] Some of the events below can be merged as they differ only on style.
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE
+ *event = yamlEvent{
+ typ: yaml_SEQUENCE_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yamlStyle(yaml_FLOW_SEQUENCE_STYLE),
+ }
+ parser.setEventComments(event)
+ return true
+ }
+ if token.typ == yaml_FLOW_MAPPING_START_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE
+ *event = yamlEvent{
+ typ: yaml_MAPPING_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yamlStyle(yaml_FLOW_MAPPING_STYLE),
+ }
+ parser.setEventComments(event)
+ return true
+ }
+ if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE
+ *event = yamlEvent{
+ typ: yaml_SEQUENCE_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yamlStyle(yaml_BLOCK_SEQUENCE_STYLE),
+ }
+ if parser.stem_comment != nil {
+ event.head_comment = parser.stem_comment
+ parser.stem_comment = nil
+ }
+ return true
+ }
+ if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE
+ *event = yamlEvent{
+ typ: yaml_MAPPING_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yamlStyle(yaml_BLOCK_MAPPING_STYLE),
+ }
+ if parser.stem_comment != nil {
+ event.head_comment = parser.stem_comment
+ parser.stem_comment = nil
+ }
+ return true
+ }
+ if len(anchor) > 0 || len(tag) > 0 {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+
+ *event = yamlEvent{
+ typ: yaml_SCALAR_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ quoted_implicit: false,
+ style: yamlStyle(yaml_PLAIN_SCALAR_STYLE),
+ }
+ return true
+ }
+
+ context := "while parsing a flow node"
+ if block {
+ context = "while parsing a block node"
+ }
+ parser.skipToken()
+ parser.setParserErrorContext(context, start_mark,
+ "did not find expected node content", token.start_mark)
+ return false
+}
+
+// Parse the productions:
+// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
+//
+// ******************** *********** * *********
+func (parser *yamlParser) parseBlockSequenceEntry(event *yamlEvent, first bool) bool {
+ if first {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ parser.marks = append(parser.marks, token.start_mark)
+ parser.skipToken()
+ }
+
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_BLOCK_ENTRY_TOKEN {
+ mark := token.end_mark
+ prior_head_len := len(parser.head_comment)
+ parser.skipToken()
+ parser.splitStemComment(prior_head_len)
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE)
+ return parser.parseNode(event, true, false)
+ } else {
+ parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE
+ return parser.processEmptyScalar(event, mark)
+ }
+ }
+ if token.typ == yaml_BLOCK_END_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+
+ *event = yamlEvent{
+ typ: yaml_SEQUENCE_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+
+ parser.skipToken()
+ return true
+ }
+
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return parser.setParserErrorContext(
+ "while parsing a block collection", context_mark,
+ "did not find expected '-' indicator", token.start_mark)
+}
+
+// Parse the productions:
+// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
+//
+// *********** *
+func (parser *yamlParser) parseIndentlessSequenceEntry(event *yamlEvent) bool {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_BLOCK_ENTRY_TOKEN {
+ mark := token.end_mark
+ prior_head_len := len(parser.head_comment)
+ parser.skipToken()
+ parser.splitStemComment(prior_head_len)
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_BLOCK_ENTRY_TOKEN &&
+ token.typ != yaml_KEY_TOKEN &&
+ token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE)
+ return parser.parseNode(event, true, false)
+ }
+ parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
+ return parser.processEmptyScalar(event, mark)
+ }
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+
+ *event = yamlEvent{
+ typ: yaml_SEQUENCE_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark?
+ }
+ return true
+}
+
+// Split stem comment from head comment.
+//
+// When a sequence or map is found under a sequence entry, the former head comment
+// is assigned to the underlying sequence or map as a whole, not the individual
+// sequence or map entry as would be expected otherwise. To handle this case the
+// previous head comment is moved aside as the stem comment.
+func (parser *yamlParser) splitStemComment(stem_len int) {
+ if stem_len == 0 {
+ return
+ }
+
+ token := parser.peekToken()
+ if token == nil || token.typ != yaml_BLOCK_SEQUENCE_START_TOKEN && token.typ != yaml_BLOCK_MAPPING_START_TOKEN {
+ return
+ }
+
+ parser.stem_comment = parser.head_comment[:stem_len]
+ if len(parser.head_comment) == stem_len {
+ parser.head_comment = nil
+ } else {
+ // Copy suffix to prevent very strange bugs if someone ever appends
+ // further bytes to the prefix in the stem_comment slice above.
+ parser.head_comment = append([]byte(nil), parser.head_comment[stem_len+1:]...)
+ }
+}
+
+// Parse the productions:
+// block_mapping ::= BLOCK-MAPPING_START
+//
+// *******************
+// ((KEY block_node_or_indentless_sequence?)?
+// *** *
+// (VALUE block_node_or_indentless_sequence?)?)*
+//
+// BLOCK-END
+// *********
+func (parser *yamlParser) parseBlockMappingKey(event *yamlEvent, first bool) bool {
+ if first {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ parser.marks = append(parser.marks, token.start_mark)
+ parser.skipToken()
+ }
+
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+
+ // [Go] A tail comment was left from the prior mapping value processed. Emit an event
+ // as it needs to be processed with that value and not the following key.
+ if len(parser.tail_comment) > 0 {
+ *event = yamlEvent{
+ typ: yaml_TAIL_COMMENT_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ foot_comment: parser.tail_comment,
+ }
+ parser.tail_comment = nil
+ return true
+ }
+
+ switch token.typ {
+ case yaml_KEY_TOKEN:
+ mark := token.end_mark
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_KEY_TOKEN &&
+ token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE)
+ return parser.parseNode(event, true, true)
+ } else {
+ parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE
+ return parser.processEmptyScalar(event, mark)
+ }
+ case yaml_BLOCK_END_TOKEN:
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ *event = yamlEvent{
+ typ: yaml_MAPPING_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+ parser.setEventComments(event)
+ parser.skipToken()
+ return true
+ }
+
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return parser.setParserErrorContext(
+ "while parsing a block mapping", context_mark,
+ "did not find expected key", token.start_mark)
+}
+
+// Parse the productions:
+// block_mapping ::= BLOCK-MAPPING_START
+//
+// ((KEY block_node_or_indentless_sequence?)?
+//
+// (VALUE block_node_or_indentless_sequence?)?)*
+// ***** *
+// BLOCK-END
+func (parser *yamlParser) parseBlockMappingValue(event *yamlEvent) bool {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_VALUE_TOKEN {
+ mark := token.end_mark
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_KEY_TOKEN &&
+ token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE)
+ return parser.parseNode(event, true, true)
+ }
+ parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
+ return parser.processEmptyScalar(event, mark)
+ }
+ parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
+ return parser.processEmptyScalar(event, token.start_mark)
+}
+
+// Parse the productions:
+// flow_sequence ::= FLOW-SEQUENCE-START
+//
+// *******************
+// (flow_sequence_entry FLOW-ENTRY)*
+// * **********
+// flow_sequence_entry?
+// *
+// FLOW-SEQUENCE-END
+// *****************
+//
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+//
+// *
+func (parser *yamlParser) parseFlowSequenceEntry(event *yamlEvent, first bool) bool {
+ if first {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ parser.marks = append(parser.marks, token.start_mark)
+ parser.skipToken()
+ }
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ if !first {
+ if token.typ == yaml_FLOW_ENTRY_TOKEN {
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ } else {
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return parser.setParserErrorContext(
+ "while parsing a flow sequence", context_mark,
+ "did not find expected ',' or ']'", token.start_mark)
+ }
+ }
+
+ if token.typ == yaml_KEY_TOKEN {
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE
+ *event = yamlEvent{
+ typ: yaml_MAPPING_START_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ implicit: true,
+ style: yamlStyle(yaml_FLOW_MAPPING_STYLE),
+ }
+ parser.skipToken()
+ return true
+ } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE)
+ return parser.parseNode(event, false, false)
+ }
+ }
+
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+
+ *event = yamlEvent{
+ typ: yaml_SEQUENCE_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+ parser.setEventComments(event)
+
+ parser.skipToken()
+ return true
+}
+
+// Parse the productions:
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+//
+// *** *
+func (parser *yamlParser) parseFlowSequenceEntryMappingKey(event *yamlEvent) bool {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_FLOW_ENTRY_TOKEN &&
+ token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE)
+ return parser.parseNode(event, false, false)
+ }
+ mark := token.end_mark
+ parser.skipToken()
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE
+ return parser.processEmptyScalar(event, mark)
+}
+
+// Parse the productions:
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+//
+// ***** *
+func (parser *yamlParser) parseFlowSequenceEntryMappingValue(event *yamlEvent) bool {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_VALUE_TOKEN {
+ parser.skipToken()
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE)
+ return parser.parseNode(event, false, false)
+ }
+ }
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE
+ return parser.processEmptyScalar(event, token.start_mark)
+}
+
+// Parse the productions:
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+//
+// *
+func (parser *yamlParser) parseFlowSequenceEntryMappingEnd(event *yamlEvent) bool {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE
+ *event = yamlEvent{
+ typ: yaml_MAPPING_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.start_mark, // [Go] Shouldn't this be end_mark?
+ }
+ return true
+}
+
+// Parse the productions:
+// flow_mapping ::= FLOW-MAPPING-START
+//
+// ******************
+// (flow_mapping_entry FLOW-ENTRY)*
+// * **********
+// flow_mapping_entry?
+// ******************
+// FLOW-MAPPING-END
+// ****************
+//
+// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// - *** *
+func (parser *yamlParser) parseFlowMappingKey(event *yamlEvent, first bool) bool {
+ if first {
+ token := parser.peekToken()
+ parser.marks = append(parser.marks, token.start_mark)
+ parser.skipToken()
+ }
+
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+
+ if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ if !first {
+ if token.typ == yaml_FLOW_ENTRY_TOKEN {
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ } else {
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return parser.setParserErrorContext(
+ "while parsing a flow mapping", context_mark,
+ "did not find expected ',' or '}'", token.start_mark)
+ }
+ }
+
+ if token.typ == yaml_KEY_TOKEN {
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_FLOW_ENTRY_TOKEN &&
+ token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE)
+ return parser.parseNode(event, false, false)
+ } else {
+ parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE
+ return parser.processEmptyScalar(event, token.start_mark)
+ }
+ } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE)
+ return parser.parseNode(event, false, false)
+ }
+ }
+
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ *event = yamlEvent{
+ typ: yaml_MAPPING_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+ parser.setEventComments(event)
+ parser.skipToken()
+ return true
+}
+
+// Parse the productions:
+// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// - ***** *
+func (parser *yamlParser) parseFlowMappingValue(event *yamlEvent, empty bool) bool {
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if empty {
+ parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
+ return parser.processEmptyScalar(event, token.start_mark)
+ }
+ if token.typ == yaml_VALUE_TOKEN {
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE)
+ return parser.parseNode(event, false, false)
+ }
+ }
+ parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
+ return parser.processEmptyScalar(event, token.start_mark)
+}
+
+// Generate an empty scalar event.
+func (parser *yamlParser) processEmptyScalar(event *yamlEvent, mark yamlMark) bool {
+ *event = yamlEvent{
+ typ: yaml_SCALAR_EVENT,
+ start_mark: mark,
+ end_mark: mark,
+ value: nil, // Empty
+ implicit: true,
+ style: yamlStyle(yaml_PLAIN_SCALAR_STYLE),
+ }
+ return true
+}
+
+var default_tag_directives = []yamlTagDirective{
+ {[]byte("!"), []byte("!")},
+ {[]byte("!!"), []byte("tag:yaml.org,2002:")},
+}
+
+// Parse directives.
+func (parser *yamlParser) processDirectives(version_directive_ref **yamlVersionDirective, tag_directives_ref *[]yamlTagDirective) bool {
+ var version_directive *yamlVersionDirective
+ var tag_directives []yamlTagDirective
+
+ token := parser.peekToken()
+ if token == nil {
+ return false
+ }
+
+ for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN {
+ switch token.typ {
+ case yaml_VERSION_DIRECTIVE_TOKEN:
+ if version_directive != nil {
+ parser.setParserError(
+ "found duplicate %YAML directive", token.start_mark)
+ return false
+ }
+ if token.major != 1 || token.minor != 1 {
+ parser.setParserError(
+ "found incompatible YAML document", token.start_mark)
+ return false
+ }
+ version_directive = &yamlVersionDirective{
+ major: token.major,
+ minor: token.minor,
+ }
+ case yaml_TAG_DIRECTIVE_TOKEN:
+ value := yamlTagDirective{
+ handle: token.value,
+ prefix: token.prefix,
+ }
+ if !parser.appendTagDirective(value, false, token.start_mark) {
+ return false
+ }
+ tag_directives = append(tag_directives, value)
+ }
+
+ parser.skipToken()
+ token = parser.peekToken()
+ if token == nil {
+ return false
+ }
+ }
+
+ for i := range default_tag_directives {
+ if !parser.appendTagDirective(default_tag_directives[i], true, token.start_mark) {
+ return false
+ }
+ }
+
+ if version_directive_ref != nil {
+ *version_directive_ref = version_directive
+ }
+ if tag_directives_ref != nil {
+ *tag_directives_ref = tag_directives
+ }
+ return true
+}
+
+// Append a tag directive to the directives stack.
+func (parser *yamlParser) appendTagDirective(value yamlTagDirective, allow_duplicates bool, mark yamlMark) bool {
+ for i := range parser.tag_directives {
+ if bytes.Equal(value.handle, parser.tag_directives[i].handle) {
+ if allow_duplicates {
+ return true
+ }
+ return parser.setParserError("found duplicate %TAG directive", mark)
+ }
+ }
+
+ // [Go] I suspect the copy is unnecessary. This was likely done
+ // because there was no way to track ownership of the data.
+ value_copy := yamlTagDirective{
+ handle: make([]byte, len(value.handle)),
+ prefix: make([]byte, len(value.prefix)),
+ }
+ copy(value_copy.handle, value.handle)
+ copy(value_copy.prefix, value.prefix)
+ parser.tag_directives = append(parser.tag_directives, value_copy)
+ return true
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/readerc.go b/hack/tools/vendor/github.com/itchyny/go-yaml/readerc.go
new file mode 100644
index 0000000000..ff4efa022a
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/readerc.go
@@ -0,0 +1,436 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+// Copyright (c) 2006-2010 Kirill Simonov
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+package yaml
+
+import (
+ "io"
+)
+
+// Set the reader error and return 0.
+func (parser *yamlParser) setReaderError(problem string, offset int, value int) bool {
+ parser.error = yaml_READER_ERROR
+ parser.problem = problem
+ parser.problem_offset = offset
+ parser.problem_value = value
+ return false
+}
+
+// Byte order marks.
+const (
+ bom_UTF8 = "\xef\xbb\xbf"
+ bom_UTF16LE = "\xff\xfe"
+ bom_UTF16BE = "\xfe\xff"
+)
+
+// Determine the input stream encoding by checking the BOM symbol. If no BOM is
+// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure.
+func (parser *yamlParser) determineEncoding() bool {
+ // Ensure that we had enough bytes in the raw buffer.
+ for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 {
+ if !parser.updateRawBuffer() {
+ return false
+ }
+ }
+
+ // Determine the encoding.
+ buf := parser.raw_buffer
+ pos := parser.raw_buffer_pos
+ avail := len(buf) - pos
+ if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] {
+ parser.encoding = yaml_UTF16LE_ENCODING
+ parser.raw_buffer_pos += 2
+ parser.offset += 2
+ } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] {
+ parser.encoding = yaml_UTF16BE_ENCODING
+ parser.raw_buffer_pos += 2
+ parser.offset += 2
+ } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] {
+ parser.encoding = yaml_UTF8_ENCODING
+ parser.raw_buffer_pos += 3
+ parser.offset += 3
+ } else {
+ parser.encoding = yaml_UTF8_ENCODING
+ }
+ return true
+}
+
+// Update the raw buffer.
+func (parser *yamlParser) updateRawBuffer() bool {
+ size_read := 0
+
+ // Return if the raw buffer is full.
+ if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) {
+ return true
+ }
+
+ // Return on EOF.
+ if parser.eof {
+ return true
+ }
+
+ // Move the remaining bytes in the raw buffer to the beginning.
+ if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) {
+ copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:])
+ }
+ parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos]
+ parser.raw_buffer_pos = 0
+
+ // Call the read handler to fill the buffer.
+ size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)])
+ parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read]
+ if err == io.EOF {
+ parser.eof = true
+ } else if err != nil {
+ return parser.setReaderError("input error: "+err.Error(), parser.offset, -1)
+ }
+ return true
+}
+
+// Ensure that the buffer contains at least `length` characters.
+// Return true on success, false on failure.
+//
+// The length is supposed to be significantly less that the buffer size.
+func (parser *yamlParser) updateBuffer(length int) bool {
+ if parser.read_handler == nil {
+ panic("read handler must be set")
+ }
+
+ // [Go] This function was changed to guarantee the requested length size at EOF.
+ // The fact we need to do this is pretty awful, but the description above implies
+ // for that to be the case, and there are tests
+
+ // If the EOF flag is set and the raw buffer is empty, do nothing.
+ //
+ //nolint:staticcheck // there is no problem with this empty branch as it's documentation.
+ if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) {
+ // [Go] ACTUALLY! Read the documentation of this function above.
+ // This is just broken. To return true, we need to have the
+ // given length in the buffer. Not doing that means every single
+ // check that calls this function to make sure the buffer has a
+ // given length is Go) panicking; or C) accessing invalid memory.
+ // return true
+ }
+
+ // Return if the buffer contains enough characters.
+ if parser.unread >= length {
+ return true
+ }
+
+ // Determine the input encoding if it is not known yet.
+ if parser.encoding == yaml_ANY_ENCODING {
+ if !parser.determineEncoding() {
+ return false
+ }
+ }
+
+ // Move the unread characters to the beginning of the buffer.
+ buffer_len := len(parser.buffer)
+ if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len {
+ copy(parser.buffer, parser.buffer[parser.buffer_pos:])
+ buffer_len -= parser.buffer_pos
+ parser.buffer_pos = 0
+ } else if parser.buffer_pos == buffer_len {
+ buffer_len = 0
+ parser.buffer_pos = 0
+ }
+
+ // Open the whole buffer for writing, and cut it before returning.
+ parser.buffer = parser.buffer[:cap(parser.buffer)]
+
+ // Fill the buffer until it has enough characters.
+ first := true
+ for parser.unread < length {
+
+ // Fill the raw buffer if necessary.
+ if !first || parser.raw_buffer_pos == len(parser.raw_buffer) {
+ if !parser.updateRawBuffer() {
+ parser.buffer = parser.buffer[:buffer_len]
+ return false
+ }
+ }
+ first = false
+
+ // Decode the raw buffer.
+ inner:
+ for parser.raw_buffer_pos != len(parser.raw_buffer) {
+ var value rune
+ var width int
+
+ raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos
+
+ // Decode the next character.
+ switch parser.encoding {
+ case yaml_UTF8_ENCODING:
+ // Decode a UTF-8 character. Check RFC 3629
+ // (http://www.ietf.org/rfc/rfc3629.txt) for more details.
+ //
+ // The following table (taken from the RFC) is used for
+ // decoding.
+ //
+ // Char. number range | UTF-8 octet sequence
+ // (hexadecimal) | (binary)
+ // --------------------+------------------------------------
+ // 0000 0000-0000 007F | 0xxxxxxx
+ // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+ // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+ // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ //
+ // Additionally, the characters in the range 0xD800-0xDFFF
+ // are prohibited as they are reserved for use with UTF-16
+ // surrogate pairs.
+
+ // Determine the length of the UTF-8 sequence.
+ octet := parser.raw_buffer[parser.raw_buffer_pos]
+ switch {
+ case octet&0x80 == 0x00:
+ width = 1
+ case octet&0xE0 == 0xC0:
+ width = 2
+ case octet&0xF0 == 0xE0:
+ width = 3
+ case octet&0xF8 == 0xF0:
+ width = 4
+ default:
+ // The leading octet is invalid.
+ return parser.setReaderError(
+ "invalid leading UTF-8 octet",
+ parser.offset, int(octet))
+ }
+
+ // Check if the raw buffer contains an incomplete character.
+ if width > raw_unread {
+ if parser.eof {
+ return parser.setReaderError(
+ "incomplete UTF-8 octet sequence",
+ parser.offset, -1)
+ }
+ break inner
+ }
+
+ // Decode the leading octet.
+ switch {
+ case octet&0x80 == 0x00:
+ value = rune(octet & 0x7F)
+ case octet&0xE0 == 0xC0:
+ value = rune(octet & 0x1F)
+ case octet&0xF0 == 0xE0:
+ value = rune(octet & 0x0F)
+ case octet&0xF8 == 0xF0:
+ value = rune(octet & 0x07)
+ default:
+ value = 0
+ }
+
+ // Check and decode the trailing octets.
+ for k := 1; k < width; k++ {
+ octet = parser.raw_buffer[parser.raw_buffer_pos+k]
+
+ // Check if the octet is valid.
+ if (octet & 0xC0) != 0x80 {
+ return parser.setReaderError(
+ "invalid trailing UTF-8 octet",
+ parser.offset+k, int(octet))
+ }
+
+ // Decode the octet.
+ value = (value << 6) + rune(octet&0x3F)
+ }
+
+ // Check the length of the sequence against the value.
+ switch {
+ case width == 1:
+ case width == 2 && value >= 0x80:
+ case width == 3 && value >= 0x800:
+ case width == 4 && value >= 0x10000:
+ default:
+ return parser.setReaderError(
+ "invalid length of a UTF-8 sequence",
+ parser.offset, -1)
+ }
+
+ // Check the range of the value.
+ if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF {
+ return parser.setReaderError(
+ "invalid Unicode character",
+ parser.offset, int(value))
+ }
+
+ case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING:
+ var low, high int
+ if parser.encoding == yaml_UTF16LE_ENCODING {
+ low, high = 0, 1
+ } else {
+ low, high = 1, 0
+ }
+
+ // The UTF-16 encoding is not as simple as one might
+ // naively think. Check RFC 2781
+ // (http://www.ietf.org/rfc/rfc2781.txt).
+ //
+ // Normally, two subsequent bytes describe a Unicode
+ // character. However a special technique (called a
+ // surrogate pair) is used for specifying character
+ // values larger than 0xFFFF.
+ //
+ // A surrogate pair consists of two pseudo-characters:
+ // high surrogate area (0xD800-0xDBFF)
+ // low surrogate area (0xDC00-0xDFFF)
+ //
+ // The following formulas are used for decoding
+ // and encoding characters using surrogate pairs:
+ //
+ // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF)
+ // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF)
+ // W1 = 110110yyyyyyyyyy
+ // W2 = 110111xxxxxxxxxx
+ //
+ // where U is the character value, W1 is the high surrogate
+ // area, W2 is the low surrogate area.
+
+ // Check for incomplete UTF-16 character.
+ if raw_unread < 2 {
+ if parser.eof {
+ return parser.setReaderError(
+ "incomplete UTF-16 character",
+ parser.offset, -1)
+ }
+ break inner
+ }
+
+ // Get the character.
+ value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) +
+ (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8)
+
+ // Check for unexpected low surrogate area.
+ if value&0xFC00 == 0xDC00 {
+ return parser.setReaderError(
+ "unexpected low surrogate area",
+ parser.offset, int(value))
+ }
+
+ // Check for a high surrogate area.
+ if value&0xFC00 == 0xD800 {
+ width = 4
+
+ // Check for incomplete surrogate pair.
+ if raw_unread < 4 {
+ if parser.eof {
+ return parser.setReaderError(
+ "incomplete UTF-16 surrogate pair",
+ parser.offset, -1)
+ }
+ break inner
+ }
+
+ // Get the next character.
+ value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) +
+ (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8)
+
+ // Check for a low surrogate area.
+ if value2&0xFC00 != 0xDC00 {
+ return parser.setReaderError(
+ "expected low surrogate area",
+ parser.offset+2, int(value2))
+ }
+
+ // Generate the value of the surrogate pair.
+ value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF)
+ } else {
+ width = 2
+ }
+
+ default:
+ panic("impossible")
+ }
+
+ // Check if the character is in the allowed range:
+ // #x9 | #xA | #xD | [#x20-#x7E] (8 bit)
+ // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit)
+ // | [#x10000-#x10FFFF] (32 bit)
+ switch {
+ case value == 0x09:
+ case value == 0x0A:
+ case value == 0x0D:
+ case value >= 0x20 && value <= 0x7E:
+ case value == 0x85:
+ case value >= 0xA0 && value <= 0xD7FF:
+ case value >= 0xE000 && value <= 0xFFFD:
+ case value >= 0x10000 && value <= 0x10FFFF:
+ default:
+ return parser.setReaderError(
+ "control characters are not allowed",
+ parser.offset, int(value))
+ }
+
+ // Move the raw pointers.
+ parser.raw_buffer_pos += width
+ parser.offset += width
+
+ // Finally put the character into the buffer.
+ if value <= 0x7F {
+ // 0000 0000-0000 007F . 0xxxxxxx
+ parser.buffer[buffer_len+0] = byte(value)
+ buffer_len += 1
+ } else if value <= 0x7FF {
+ // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx
+ parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6))
+ parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F))
+ buffer_len += 2
+ } else if value <= 0xFFFF {
+ // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx
+ parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12))
+ parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F))
+ parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F))
+ buffer_len += 3
+ } else {
+ // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18))
+ parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F))
+ parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F))
+ parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F))
+ buffer_len += 4
+ }
+
+ parser.unread++
+ }
+
+ // On EOF, put NUL into the buffer and return.
+ if parser.eof {
+ parser.buffer[buffer_len] = 0
+ buffer_len++
+ parser.unread++
+ break
+ }
+ }
+ // [Go] Read the documentation of this function above. To return true,
+ // we need to have the given length in the buffer. Not doing that means
+ // every single check that calls this function to make sure the buffer
+ // has a given length is Go) panicking; or C) accessing invalid memory.
+ // This happens here due to the EOF above breaking early.
+ for buffer_len < length {
+ parser.buffer[buffer_len] = 0
+ buffer_len++
+ }
+ parser.buffer = parser.buffer[:buffer_len]
+ return true
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/resolve.go b/hack/tools/vendor/github.com/itchyny/go-yaml/resolve.go
new file mode 100644
index 0000000000..b4dc72f2f0
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/resolve.go
@@ -0,0 +1,322 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+//
+// 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.
+
+package yaml
+
+import (
+ "encoding/base64"
+ "encoding/json"
+ "math"
+ "regexp"
+ "strconv"
+ "strings"
+)
+
+type resolveMapItem struct {
+ value any
+ tag string
+}
+
+var (
+ resolveTable = make([]byte, 256)
+ resolveMap = make(map[string]resolveMapItem)
+)
+
+func init() {
+ t := resolveTable
+ t[int('+')] = 'S' // Sign
+ t[int('-')] = 'S'
+ for _, c := range "0123456789" {
+ t[int(c)] = 'D' // Digit
+ }
+ for _, c := range "yYnNtTfFoO~" {
+ t[int(c)] = 'M' // In map
+ }
+ t[int('.')] = '.' // Float (potentially in map)
+
+ resolveMapList := []struct {
+ v any
+ tag string
+ l []string
+ }{
+ {true, boolTag, []string{"true", "True", "TRUE"}},
+ {false, boolTag, []string{"false", "False", "FALSE"}},
+ {nil, nullTag, []string{"", "~", "null", "Null", "NULL"}},
+ {math.NaN(), floatTag, []string{".nan", ".NaN", ".NAN"}},
+ {math.Inf(+1), floatTag, []string{".inf", ".Inf", ".INF"}},
+ {math.Inf(+1), floatTag, []string{"+.inf", "+.Inf", "+.INF"}},
+ {math.Inf(-1), floatTag, []string{"-.inf", "-.Inf", "-.INF"}},
+ {negativeZero, floatTag, []string{"-0", "-0.0"}},
+ {"<<", mergeTag, []string{"<<"}},
+ }
+
+ m := resolveMap
+ for _, item := range resolveMapList {
+ for _, s := range item.l {
+ m[s] = resolveMapItem{item.v, item.tag}
+ }
+ }
+}
+
+const (
+ nullTag = "!!null"
+ boolTag = "!!bool"
+ strTag = "!!str"
+ intTag = "!!int"
+ floatTag = "!!float"
+ timestampTag = "!!timestamp"
+ seqTag = "!!seq"
+ mapTag = "!!map"
+ binaryTag = "!!binary"
+ mergeTag = "!!merge"
+)
+
+// negativeZero represents -0.0 for YAML encoding/decoding
+// this is needed because Go constants cannot express -0.0
+// https://staticcheck.dev/docs/checks/#SA4026
+var negativeZero = math.Copysign(0.0, -1.0)
+
+var (
+ longTags = make(map[string]string)
+ shortTags = make(map[string]string)
+)
+
+func init() {
+ for _, stag := range []string{nullTag, boolTag, strTag, intTag, floatTag, timestampTag, seqTag, mapTag, binaryTag, mergeTag} {
+ ltag := longTag(stag)
+ longTags[stag] = ltag
+ shortTags[ltag] = stag
+ }
+}
+
+const longTagPrefix = "tag:yaml.org,2002:"
+
+func shortTag(tag string) string {
+ if strings.HasPrefix(tag, longTagPrefix) {
+ if stag, ok := shortTags[tag]; ok {
+ return stag
+ }
+ return "!!" + tag[len(longTagPrefix):]
+ }
+ return tag
+}
+
+func longTag(tag string) string {
+ if strings.HasPrefix(tag, "!!") {
+ if ltag, ok := longTags[tag]; ok {
+ return ltag
+ }
+ return longTagPrefix + tag[2:]
+ }
+ return tag
+}
+
+func resolvableTag(tag string) bool {
+ switch tag {
+ case "", strTag, boolTag, intTag, floatTag, nullTag, timestampTag:
+ return true
+ }
+ return false
+}
+
+var (
+ yamlStyleInt = regexp.MustCompile(`^[-+]?(?:0|[1-9][0-9_]*)$`)
+ yamlStyleBases = regexp.MustCompile(`^[-+]?0(?:b[01_]+|o?[0-7_]+|x[0-9a-fA-F_]+)$`)
+ yamlStyleFloat = regexp.MustCompile(`^[-+]?(?:\.[0-9][0-9_]*|[0-9][0-9_]*(?:\.(?:[0-9][0-9_]*)?)?)(?:[eE][-+]?[0-9][0-9_]*)?$`)
+)
+
+func resolve(tag string, in string) (rtag string, out any) {
+ tag = shortTag(tag)
+ if !resolvableTag(tag) {
+ return tag, in
+ }
+
+ defer func() {
+ switch tag {
+ case "", rtag, strTag, binaryTag:
+ return
+ case floatTag:
+ if rtag == intTag {
+ switch v := out.(type) {
+ case int:
+ rtag = floatTag
+ out = float64(v)
+ return
+ case json.Number:
+ rtag = floatTag
+ f, err := v.Float64()
+ if err == nil {
+ out = f
+ return
+ }
+ }
+ }
+ }
+ failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag))
+ }()
+
+ // Any data is accepted as a !!str or !!binary.
+ // Otherwise, the prefix is enough of a hint about what it might be.
+ hint := byte('N')
+ if in != "" {
+ hint = resolveTable[in[0]]
+ }
+ if hint != 0 && tag != strTag && tag != binaryTag {
+ // Handle things we can lookup in a map.
+ if item, ok := resolveMap[in]; ok {
+ return item.tag, item.value
+ }
+
+ // Base 60 floats are a bad idea, were dropped in YAML 1.2, and
+ // are purposefully unsupported here. They're still quoted on
+ // the way out for compatibility with other parser, though.
+
+ switch hint {
+ case 'M':
+ // We've already checked the map above.
+
+ case '.':
+ // Not in the map, so maybe a normal float.
+ floatv, err := strconv.ParseFloat(in, 64)
+ if err == nil {
+ return floatTag, floatv
+ }
+
+ case 'D', 'S':
+ // Int, float, or timestamp.
+ if tag == timestampTag {
+ // Ignore timestamp tag.
+ tag = strTag
+ return strTag, in
+ }
+
+ plain := strings.ReplaceAll(in, "_", "")
+ if yamlStyleInt.MatchString(in) {
+ return intTag, json.Number(plain)
+ }
+ if yamlStyleBases.MatchString(in) {
+ var neg bool
+ switch plain[0] {
+ case '-':
+ neg = true
+ fallthrough
+ case '+':
+ plain = plain[1:]
+ }
+ u, err := strconv.ParseUint(plain, 0, 64)
+ if err == nil {
+ if !neg {
+ return intTag, json.Number(strconv.FormatUint(u, 10))
+ }
+ if u <= -math.MinInt64 {
+ return intTag, json.Number(strconv.FormatInt(-int64(u), 10))
+ }
+ }
+ }
+ if yamlStyleFloat.MatchString(in) {
+ return floatTag, json.Number(plain)
+ }
+ if strings.HasPrefix(plain, "0b") {
+ intv, err := strconv.ParseInt(plain[2:], 2, 64)
+ if err == nil {
+ if intv == int64(int(intv)) {
+ return intTag, int(intv)
+ } else {
+ return intTag, intv
+ }
+ }
+ uintv, err := strconv.ParseUint(plain[2:], 2, 64)
+ if err == nil {
+ return intTag, uintv
+ }
+ } else if strings.HasPrefix(plain, "-0b") {
+ intv, err := strconv.ParseInt("-"+plain[3:], 2, 64)
+ if err == nil {
+ if true || intv == int64(int(intv)) {
+ return intTag, int(intv)
+ } else {
+ return intTag, intv
+ }
+ }
+ }
+ // Octals as introduced in version 1.2 of the spec.
+ // Octals from the 1.1 spec, spelled as 0777, are still
+ // decoded by default in v3 as well for compatibility.
+ // May be dropped in v4 depending on how usage evolves.
+ if strings.HasPrefix(plain, "0o") {
+ intv, err := strconv.ParseInt(plain[2:], 8, 64)
+ if err == nil {
+ if intv == int64(int(intv)) {
+ return intTag, int(intv)
+ } else {
+ return intTag, intv
+ }
+ }
+ uintv, err := strconv.ParseUint(plain[2:], 8, 64)
+ if err == nil {
+ return intTag, uintv
+ }
+ } else if strings.HasPrefix(plain, "-0o") {
+ intv, err := strconv.ParseInt("-"+plain[3:], 8, 64)
+ if err == nil {
+ if true || intv == int64(int(intv)) {
+ return intTag, int(intv)
+ } else {
+ return intTag, intv
+ }
+ }
+ }
+ default:
+ panic("internal error: missing handler for resolver table: " + string(rune(hint)) + " (with " + in + ")")
+ }
+ }
+ return strTag, in
+}
+
+// encodeBase64 encodes s as base64 that is broken up into multiple lines
+// as appropriate for the resulting length.
+func encodeBase64(s string) string {
+ const lineLen = 70
+ encLen := base64.StdEncoding.EncodedLen(len(s))
+ lines := encLen/lineLen + 1
+ buf := make([]byte, encLen*2+lines)
+ in := buf[0:encLen]
+ out := buf[encLen:]
+ base64.StdEncoding.Encode(in, []byte(s))
+ k := 0
+ for i := 0; i < len(in); i += lineLen {
+ j := i + lineLen
+ if j > len(in) {
+ j = len(in)
+ }
+ k += copy(out[k:], in[i:j])
+ if lines > 1 {
+ out[k] = '\n'
+ k++
+ }
+ }
+ return string(out[:k])
+}
+
+// This is a subset of the formats allowed by the regular expression
+// defined at http://yaml.org/type/timestamp.html.
+var allowedTimestampFormats = []string{
+ "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields.
+ "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t".
+ "2006-1-2 15:4:5.999999999", // space separated with no time zone
+ "2006-1-2", // date only
+ // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5"
+ // from the set of examples.
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/scannerc.go b/hack/tools/vendor/github.com/itchyny/go-yaml/scannerc.go
new file mode 100644
index 0000000000..38042c3a76
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/scannerc.go
@@ -0,0 +1,3030 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+// Copyright (c) 2006-2010 Kirill Simonov
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+package yaml
+
+import (
+ "bytes"
+ "fmt"
+)
+
+// Introduction
+// ************
+//
+// The following notes assume that you are familiar with the YAML specification
+// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in
+// some cases we are less restrictive that it requires.
+//
+// The process of transforming a YAML stream into a sequence of events is
+// divided on two steps: Scanning and Parsing.
+//
+// The Scanner transforms the input stream into a sequence of tokens, while the
+// parser transform the sequence of tokens produced by the Scanner into a
+// sequence of parsing events.
+//
+// The Scanner is rather clever and complicated. The Parser, on the contrary,
+// is a straightforward implementation of a recursive-descendant parser (or,
+// LL(1) parser, as it is usually called).
+//
+// Actually there are two issues of Scanning that might be called "clever", the
+// rest is quite straightforward. The issues are "block collection start" and
+// "simple keys". Both issues are explained below in details.
+//
+// Here the Scanning step is explained and implemented. We start with the list
+// of all the tokens produced by the Scanner together with short descriptions.
+//
+// Now, tokens:
+//
+// STREAM-START(encoding) # The stream start.
+// STREAM-END # The stream end.
+// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive.
+// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive.
+// DOCUMENT-START # '---'
+// DOCUMENT-END # '...'
+// BLOCK-SEQUENCE-START # Indentation increase denoting a block
+// BLOCK-MAPPING-START # sequence or a block mapping.
+// BLOCK-END # Indentation decrease.
+// FLOW-SEQUENCE-START # '['
+// FLOW-SEQUENCE-END # ']'
+// BLOCK-SEQUENCE-START # '{'
+// BLOCK-SEQUENCE-END # '}'
+// BLOCK-ENTRY # '-'
+// FLOW-ENTRY # ','
+// KEY # '?' or nothing (simple keys).
+// VALUE # ':'
+// ALIAS(anchor) # '*anchor'
+// ANCHOR(anchor) # '&anchor'
+// TAG(handle,suffix) # '!handle!suffix'
+// SCALAR(value,style) # A scalar.
+//
+// The following two tokens are "virtual" tokens denoting the beginning and the
+// end of the stream:
+//
+// STREAM-START(encoding)
+// STREAM-END
+//
+// We pass the information about the input stream encoding with the
+// STREAM-START token.
+//
+// The next two tokens are responsible for tags:
+//
+// VERSION-DIRECTIVE(major,minor)
+// TAG-DIRECTIVE(handle,prefix)
+//
+// Example:
+//
+// %YAML 1.1
+// %TAG ! !foo
+// %TAG !yaml! tag:yaml.org,2002:
+// ---
+//
+// The corresponding sequence of tokens:
+//
+// STREAM-START(utf-8)
+// VERSION-DIRECTIVE(1,1)
+// TAG-DIRECTIVE("!","!foo")
+// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:")
+// DOCUMENT-START
+// STREAM-END
+//
+// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole
+// line.
+//
+// The document start and end indicators are represented by:
+//
+// DOCUMENT-START
+// DOCUMENT-END
+//
+// Note that if a YAML stream contains an implicit document (without '---'
+// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be
+// produced.
+//
+// In the following examples, we present whole documents together with the
+// produced tokens.
+//
+// 1. An implicit document:
+//
+// 'a scalar'
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// SCALAR("a scalar",single-quoted)
+// STREAM-END
+//
+// 2. An explicit document:
+//
+// ---
+// 'a scalar'
+// ...
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// DOCUMENT-START
+// SCALAR("a scalar",single-quoted)
+// DOCUMENT-END
+// STREAM-END
+//
+// 3. Several documents in a stream:
+//
+// 'a scalar'
+// ---
+// 'another scalar'
+// ---
+// 'yet another scalar'
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// SCALAR("a scalar",single-quoted)
+// DOCUMENT-START
+// SCALAR("another scalar",single-quoted)
+// DOCUMENT-START
+// SCALAR("yet another scalar",single-quoted)
+// STREAM-END
+//
+// We have already introduced the SCALAR token above. The following tokens are
+// used to describe aliases, anchors, tag, and scalars:
+//
+// ALIAS(anchor)
+// ANCHOR(anchor)
+// TAG(handle,suffix)
+// SCALAR(value,style)
+//
+// The following series of examples illustrate the usage of these tokens:
+//
+// 1. A recursive sequence:
+//
+// &A [ *A ]
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// ANCHOR("A")
+// FLOW-SEQUENCE-START
+// ALIAS("A")
+// FLOW-SEQUENCE-END
+// STREAM-END
+//
+// 2. A tagged scalar:
+//
+// !!float "3.14" # A good approximation.
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// TAG("!!","float")
+// SCALAR("3.14",double-quoted)
+// STREAM-END
+//
+// 3. Various scalar styles:
+//
+// --- # Implicit empty plain scalars do not produce tokens.
+// --- a plain scalar
+// --- 'a single-quoted scalar'
+// --- "a double-quoted scalar"
+// --- |-
+// a literal scalar
+// --- >-
+// a folded
+// scalar
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// DOCUMENT-START
+// DOCUMENT-START
+// SCALAR("a plain scalar",plain)
+// DOCUMENT-START
+// SCALAR("a single-quoted scalar",single-quoted)
+// DOCUMENT-START
+// SCALAR("a double-quoted scalar",double-quoted)
+// DOCUMENT-START
+// SCALAR("a literal scalar",literal)
+// DOCUMENT-START
+// SCALAR("a folded scalar",folded)
+// STREAM-END
+//
+// Now it's time to review collection-related tokens. We will start with
+// flow collections:
+//
+// FLOW-SEQUENCE-START
+// FLOW-SEQUENCE-END
+// FLOW-MAPPING-START
+// FLOW-MAPPING-END
+// FLOW-ENTRY
+// KEY
+// VALUE
+//
+// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and
+// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}'
+// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the
+// indicators '?' and ':', which are used for denoting mapping keys and values,
+// are represented by the KEY and VALUE tokens.
+//
+// The following examples show flow collections:
+//
+// 1. A flow sequence:
+//
+// [item 1, item 2, item 3]
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// FLOW-SEQUENCE-START
+// SCALAR("item 1",plain)
+// FLOW-ENTRY
+// SCALAR("item 2",plain)
+// FLOW-ENTRY
+// SCALAR("item 3",plain)
+// FLOW-SEQUENCE-END
+// STREAM-END
+//
+// 2. A flow mapping:
+//
+// {
+// a simple key: a value, # Note that the KEY token is produced.
+// ? a complex key: another value,
+// }
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// FLOW-MAPPING-START
+// KEY
+// SCALAR("a simple key",plain)
+// VALUE
+// SCALAR("a value",plain)
+// FLOW-ENTRY
+// KEY
+// SCALAR("a complex key",plain)
+// VALUE
+// SCALAR("another value",plain)
+// FLOW-ENTRY
+// FLOW-MAPPING-END
+// STREAM-END
+//
+// A simple key is a key which is not denoted by the '?' indicator. Note that
+// the Scanner still produce the KEY token whenever it encounters a simple key.
+//
+// For scanning block collections, the following tokens are used (note that we
+// repeat KEY and VALUE here):
+//
+// BLOCK-SEQUENCE-START
+// BLOCK-MAPPING-START
+// BLOCK-END
+// BLOCK-ENTRY
+// KEY
+// VALUE
+//
+// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation
+// increase that precedes a block collection (cf. the INDENT token in Python).
+// The token BLOCK-END denote indentation decrease that ends a block collection
+// (cf. the DEDENT token in Python). However YAML has some syntax peculiarities
+// that makes detections of these tokens more complex.
+//
+// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators
+// '-', '?', and ':' correspondingly.
+//
+// The following examples show how the tokens BLOCK-SEQUENCE-START,
+// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner:
+//
+// 1. Block sequences:
+//
+// - item 1
+// - item 2
+// -
+// - item 3.1
+// - item 3.2
+// -
+// key 1: value 1
+// key 2: value 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-ENTRY
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 3.1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 3.2",plain)
+// BLOCK-END
+// BLOCK-ENTRY
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// 2. Block mappings:
+//
+// a simple key: a value # The KEY token is produced here.
+// ? a complex key
+// : another value
+// a mapping:
+// key 1: value 1
+// key 2: value 2
+// a sequence:
+// - item 1
+// - item 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("a simple key",plain)
+// VALUE
+// SCALAR("a value",plain)
+// KEY
+// SCALAR("a complex key",plain)
+// VALUE
+// SCALAR("another value",plain)
+// KEY
+// SCALAR("a mapping",plain)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// KEY
+// SCALAR("a sequence",plain)
+// VALUE
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// YAML does not always require to start a new block collection from a new
+// line. If the current line contains only '-', '?', and ':' indicators, a new
+// block collection may start at the current line. The following examples
+// illustrate this case:
+//
+// 1. Collections in a sequence:
+//
+// - - item 1
+// - item 2
+// - key 1: value 1
+// key 2: value 2
+// - ? complex key
+// : complex value
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+// BLOCK-ENTRY
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// BLOCK-ENTRY
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("complex key")
+// VALUE
+// SCALAR("complex value")
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// 2. Collections in a mapping:
+//
+// ? a sequence
+// : - item 1
+// - item 2
+// ? a mapping
+// : key 1: value 1
+// key 2: value 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("a sequence",plain)
+// VALUE
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+// KEY
+// SCALAR("a mapping",plain)
+// VALUE
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// YAML also permits non-indented sequences if they are included into a block
+// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced:
+//
+// key:
+// - item 1 # BLOCK-SEQUENCE-START is NOT produced here.
+// - item 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key",plain)
+// VALUE
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+//
+
+// Ensure that the buffer contains the required number of characters.
+// Return true on success, false on failure (reader error or memory error).
+func (parser *yamlParser) cache(length int) bool {
+ // [Go] This was inlined: !A.cache(B) -> unread < B && !A.update(B)
+ return parser.unread >= length || parser.updateBuffer(length)
+}
+
+// Advance the buffer pointer.
+func (parser *yamlParser) skip() {
+ if !isBlank(parser.buffer, parser.buffer_pos) {
+ parser.newlines = 0
+ }
+ parser.mark.index++
+ parser.mark.column++
+ parser.unread--
+ parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
+}
+
+func (parser *yamlParser) skipLine() {
+ if isCRLF(parser.buffer, parser.buffer_pos) {
+ parser.mark.index += 2
+ parser.mark.column = 0
+ parser.mark.line++
+ parser.unread -= 2
+ parser.buffer_pos += 2
+ parser.newlines++
+ } else if isLineBreak(parser.buffer, parser.buffer_pos) {
+ parser.mark.index++
+ parser.mark.column = 0
+ parser.mark.line++
+ parser.unread--
+ parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
+ parser.newlines++
+ }
+}
+
+// Copy a character to a string buffer and advance pointers.
+func (parser *yamlParser) read(s []byte) []byte {
+ if !isBlank(parser.buffer, parser.buffer_pos) {
+ parser.newlines = 0
+ }
+ w := width(parser.buffer[parser.buffer_pos])
+ if w == 0 {
+ panic("invalid character sequence")
+ }
+ if len(s) == 0 {
+ s = make([]byte, 0, 32)
+ }
+ if w == 1 && len(s)+w <= cap(s) {
+ s = s[:len(s)+1]
+ s[len(s)-1] = parser.buffer[parser.buffer_pos]
+ parser.buffer_pos++
+ } else {
+ s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...)
+ parser.buffer_pos += w
+ }
+ parser.mark.index++
+ parser.mark.column++
+ parser.unread--
+ return s
+}
+
+// Copy a line break character to a string buffer and advance pointers.
+func (parser *yamlParser) readLine(s []byte) []byte {
+ buf := parser.buffer
+ pos := parser.buffer_pos
+ switch {
+ case buf[pos] == '\r' && buf[pos+1] == '\n':
+ // CR LF . LF
+ s = append(s, '\n')
+ parser.buffer_pos += 2
+ parser.mark.index++
+ parser.unread--
+ case buf[pos] == '\r' || buf[pos] == '\n':
+ // CR|LF . LF
+ s = append(s, '\n')
+ parser.buffer_pos += 1
+ case buf[pos] == '\xC2' && buf[pos+1] == '\x85':
+ // NEL . LF
+ s = append(s, '\n')
+ parser.buffer_pos += 2
+ case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'):
+ // LS|PS . LS|PS
+ s = append(s, buf[parser.buffer_pos:pos+3]...)
+ parser.buffer_pos += 3
+ default:
+ return s
+ }
+ parser.mark.index++
+ parser.mark.column = 0
+ parser.mark.line++
+ parser.unread--
+ parser.newlines++
+ return s
+}
+
+// Get the next token.
+func (parser *yamlParser) scan(token *yamlToken) bool {
+ // Erase the token object.
+ *token = yamlToken{} // [Go] Is this necessary?
+
+ // No tokens after STREAM-END or error.
+ if parser.stream_end_produced || parser.error != yaml_NO_ERROR {
+ return true
+ }
+
+ // Ensure that the tokens queue contains enough tokens.
+ if !parser.token_available {
+ if !parser.fetchMoreTokens() {
+ return false
+ }
+ }
+
+ // Fetch the next token from the queue.
+ *token = parser.tokens[parser.tokens_head]
+ parser.tokens_head++
+ parser.tokens_parsed++
+ parser.token_available = false
+
+ if token.typ == yaml_STREAM_END_TOKEN {
+ parser.stream_end_produced = true
+ }
+ return true
+}
+
+// Set the scanner error and return false.
+func (parser *yamlParser) setScannerError(context string, context_mark yamlMark, problem string) bool {
+ parser.error = yaml_SCANNER_ERROR
+ parser.context = context
+ parser.context_mark = context_mark
+ parser.problem = problem
+ parser.problem_mark = parser.mark
+ return false
+}
+
+func (parser *yamlParser) setScannerTagError(directive bool, context_mark yamlMark, problem string) bool {
+ context := "while parsing a tag"
+ if directive {
+ context = "while parsing a %TAG directive"
+ }
+ return parser.setScannerError(context, context_mark, problem)
+}
+
+func trace(args ...any) func() {
+ pargs := append([]any{"+++"}, args...)
+ fmt.Println(pargs...)
+ pargs = append([]any{"---"}, args...)
+ return func() { fmt.Println(pargs...) }
+}
+
+// Ensure that the tokens queue contains at least one token which can be
+// returned to the Parser.
+func (parser *yamlParser) fetchMoreTokens() bool {
+ // While we need more tokens to fetch, do it.
+ for {
+ // [Go] The comment parsing logic requires a lookahead of two tokens
+ // so that foot comments may be parsed in time of associating them
+ // with the tokens that are parsed before them, and also for line
+ // comments to be transformed into head comments in some edge cases.
+ if parser.tokens_head < len(parser.tokens)-2 {
+ // If a potential simple key is at the head position, we need to fetch
+ // the next token to disambiguate it.
+ head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed]
+ if !ok {
+ break
+ } else if valid, ok := parser.simpleKeyIsValid(&parser.simple_keys[head_tok_idx]); !ok {
+ return false
+ } else if !valid {
+ break
+ }
+ }
+ // Fetch the next token.
+ if !parser.fetchNextToken() {
+ return false
+ }
+ }
+
+ parser.token_available = true
+ return true
+}
+
+// The dispatcher for token fetchers.
+func (parser *yamlParser) fetchNextToken() (ok bool) {
+ // Ensure that the buffer is initialized.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+
+ // Check if we just started scanning. Fetch STREAM-START then.
+ if !parser.stream_start_produced {
+ return parser.fetchStreamStart()
+ }
+
+ scan_mark := parser.mark
+
+ // Eat whitespaces and comments until we reach the next token.
+ if !parser.scanToNextToken() {
+ return false
+ }
+
+ // [Go] While unrolling indents, transform the head comments of prior
+ // indentation levels observed after scan_start into foot comments at
+ // the respective indexes.
+
+ // Check the indentation level against the current column.
+ if !parser.unrollIndent(parser.mark.column, scan_mark) {
+ return false
+ }
+
+ // Ensure that the buffer contains at least 4 characters. 4 is the length
+ // of the longest indicators ('--- ' and '... ').
+ if parser.unread < 4 && !parser.updateBuffer(4) {
+ return false
+ }
+
+ // Is it the end of the stream?
+ if isZeroChar(parser.buffer, parser.buffer_pos) {
+ return parser.fetchStreamEnd()
+ }
+
+ // Is it a directive?
+ if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' {
+ return parser.fetchDirective()
+ }
+
+ buf := parser.buffer
+ pos := parser.buffer_pos
+
+ // Is it the document start indicator?
+ if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && isBlankOrZero(buf, pos+3) {
+ return parser.fetchDocumentIndicator(yaml_DOCUMENT_START_TOKEN)
+ }
+
+ // Is it the document end indicator?
+ if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && isBlankOrZero(buf, pos+3) {
+ return parser.fetchDocumentIndicator(yaml_DOCUMENT_END_TOKEN)
+ }
+
+ comment_mark := parser.mark
+ if len(parser.tokens) > 0 && (parser.flow_level == 0 && buf[pos] == ':' || parser.flow_level > 0 && buf[pos] == ',') {
+ // Associate any following comments with the prior token.
+ comment_mark = parser.tokens[len(parser.tokens)-1].start_mark
+ }
+ defer func() {
+ if !ok {
+ return
+ }
+ if len(parser.tokens) > 0 && parser.tokens[len(parser.tokens)-1].typ == yaml_BLOCK_ENTRY_TOKEN {
+ // Sequence indicators alone have no line comments. It becomes
+ // a head comment for whatever follows.
+ return
+ }
+ if !parser.scanLineComment(comment_mark) {
+ ok = false
+ return
+ }
+ }()
+
+ // Is it the flow sequence start indicator?
+ if buf[pos] == '[' {
+ return parser.fetchFlowCollectionStart(yaml_FLOW_SEQUENCE_START_TOKEN)
+ }
+
+ // Is it the flow mapping start indicator?
+ if parser.buffer[parser.buffer_pos] == '{' {
+ return parser.fetchFlowCollectionStart(yaml_FLOW_MAPPING_START_TOKEN)
+ }
+
+ // Is it the flow sequence end indicator?
+ if parser.buffer[parser.buffer_pos] == ']' {
+ return parser.fetchFlowCollectionEnd(
+ yaml_FLOW_SEQUENCE_END_TOKEN)
+ }
+
+ // Is it the flow mapping end indicator?
+ if parser.buffer[parser.buffer_pos] == '}' {
+ return parser.fetchFlowCollectionEnd(
+ yaml_FLOW_MAPPING_END_TOKEN)
+ }
+
+ // Is it the flow entry indicator?
+ if parser.buffer[parser.buffer_pos] == ',' {
+ return parser.fetchFlowEntry()
+ }
+
+ // Is it the block entry indicator?
+ if parser.buffer[parser.buffer_pos] == '-' && isBlankOrZero(parser.buffer, parser.buffer_pos+1) {
+ return parser.fetchBlockEntry()
+ }
+
+ // Is it the key indicator?
+ if parser.buffer[parser.buffer_pos] == '?' && isBlankOrZero(parser.buffer, parser.buffer_pos+1) {
+ return parser.fetchKey()
+ }
+
+ // Is it the value indicator?
+ if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || isBlankOrZero(parser.buffer, parser.buffer_pos+1)) {
+ return parser.fetchValue()
+ }
+
+ // Is it an alias?
+ if parser.buffer[parser.buffer_pos] == '*' {
+ return parser.fetchAnchor(yaml_ALIAS_TOKEN)
+ }
+
+ // Is it an anchor?
+ if parser.buffer[parser.buffer_pos] == '&' {
+ return parser.fetchAnchor(yaml_ANCHOR_TOKEN)
+ }
+
+ // Is it a tag?
+ if parser.buffer[parser.buffer_pos] == '!' {
+ return parser.fetchTag()
+ }
+
+ // Is it a literal scalar?
+ if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 {
+ return parser.fetchBlockScalar(true)
+ }
+
+ // Is it a folded scalar?
+ if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 {
+ return parser.fetchBlockScalar(false)
+ }
+
+ // Is it a single-quoted scalar?
+ if parser.buffer[parser.buffer_pos] == '\'' {
+ return parser.fetchFlowScalar(true)
+ }
+
+ // Is it a double-quoted scalar?
+ if parser.buffer[parser.buffer_pos] == '"' {
+ return parser.fetchFlowScalar(false)
+ }
+
+ // Is it a plain scalar?
+ //
+ // A plain scalar may start with any non-blank characters except
+ //
+ // '-', '?', ':', ',', '[', ']', '{', '}',
+ // '#', '&', '*', '!', '|', '>', '\'', '\"',
+ // '%', '@', '`'.
+ //
+ // In the block context (and, for the '-' indicator, in the flow context
+ // too), it may also start with the characters
+ //
+ // '-', '?', ':'
+ //
+ // if it is followed by a non-space character.
+ //
+ // The last rule is more restrictive than the specification requires.
+ // [Go] TODO Make this logic more reasonable.
+ //switch parser.buffer[parser.buffer_pos] {
+ //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`':
+ //}
+ if !(isBlankOrZero(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' ||
+ parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' ||
+ parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' ||
+ parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
+ parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' ||
+ parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' ||
+ parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' ||
+ parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' ||
+ parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' ||
+ parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') ||
+ (parser.buffer[parser.buffer_pos] == '-' && !isBlank(parser.buffer, parser.buffer_pos+1)) ||
+ ((parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') &&
+ !isBlankOrZero(parser.buffer, parser.buffer_pos+1)) {
+ return parser.fetchPlainScalar()
+ }
+
+ // If we don't determine the token type so far, it is an error.
+ return parser.setScannerError(
+ "while scanning for the next token", parser.mark,
+ "found character that cannot start any token")
+}
+
+func (parser *yamlParser) simpleKeyIsValid(simple_key *yamlSimpleKey) (valid, ok bool) {
+ if !simple_key.possible {
+ return false, true
+ }
+
+ // The 1.2 specification says:
+ //
+ // "If the ? indicator is omitted, parsing needs to see past the
+ // implicit key to recognize it as such. To limit the amount of
+ // lookahead required, the “:” indicator must appear at most 1024
+ // Unicode characters beyond the start of the key. In addition, the key
+ // is restricted to a single line."
+ //
+ if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index {
+ // Check if the potential simple key to be removed is required.
+ if simple_key.required {
+ return false, parser.setScannerError(
+ "while scanning a simple key", simple_key.mark,
+ "could not find expected ':'")
+ }
+ simple_key.possible = false
+ return false, true
+ }
+ return true, true
+}
+
+// Check if a simple key may start at the current position and add it if
+// needed.
+func (parser *yamlParser) saveSimpleKey() bool {
+ // A simple key is required at the current position if the scanner is in
+ // the block context and the current column coincides with the indentation
+ // level.
+
+ required := parser.flow_level == 0 && parser.indent == parser.mark.column
+
+ //
+ // If the current position may start a simple key, save it.
+ //
+ if parser.simple_key_allowed {
+ simple_key := yamlSimpleKey{
+ possible: true,
+ required: required,
+ token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
+ mark: parser.mark,
+ }
+
+ if !parser.removeSimpleKey() {
+ return false
+ }
+ parser.simple_keys[len(parser.simple_keys)-1] = simple_key
+ parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1
+ }
+ return true
+}
+
+// Remove a potential simple key at the current flow level.
+func (parser *yamlParser) removeSimpleKey() bool {
+ i := len(parser.simple_keys) - 1
+ if parser.simple_keys[i].possible {
+ // If the key is required, it is an error.
+ if parser.simple_keys[i].required {
+ return parser.setScannerError(
+ "while scanning a simple key", parser.simple_keys[i].mark,
+ "could not find expected ':'")
+ }
+ // Remove the key from the stack.
+ parser.simple_keys[i].possible = false
+ delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number)
+ }
+ return true
+}
+
+// max_flow_level limits the flow_level
+const max_flow_level = 10000
+
+// Increase the flow level and resize the simple key list if needed.
+func (parser *yamlParser) increaseFlowLevel() bool {
+ // Reset the simple key on the next level.
+ parser.simple_keys = append(parser.simple_keys, yamlSimpleKey{
+ possible: false,
+ required: false,
+ token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
+ mark: parser.mark,
+ })
+
+ // Increase the flow level.
+ parser.flow_level++
+ if parser.flow_level > max_flow_level {
+ return parser.setScannerError(
+ "while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark,
+ fmt.Sprintf("exceeded max depth of %d", max_flow_level))
+ }
+ return true
+}
+
+// Decrease the flow level.
+func (parser *yamlParser) decreaseFlowLevel() bool {
+ if parser.flow_level > 0 {
+ parser.flow_level--
+ last := len(parser.simple_keys) - 1
+ delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number)
+ parser.simple_keys = parser.simple_keys[:last]
+ }
+ return true
+}
+
+// max_indents limits the indents stack size
+const max_indents = 10000
+
+// Push the current indentation level to the stack and set the new level
+// the current column is greater than the indentation level. In this case,
+// append or insert the specified token into the token queue.
+func (parser *yamlParser) rollIndent(column, number int, typ yamlTokenType, mark yamlMark) bool {
+ // In the flow context, do nothing.
+ if parser.flow_level > 0 {
+ return true
+ }
+
+ if parser.indent < column {
+ // Push the current indentation level to the stack and set the new
+ // indentation level.
+ parser.indents = append(parser.indents, parser.indent)
+ parser.indent = column
+ if len(parser.indents) > max_indents {
+ return parser.setScannerError(
+ "while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark,
+ fmt.Sprintf("exceeded max depth of %d", max_indents))
+ }
+
+ // Create a token and insert it into the queue.
+ token := yamlToken{
+ typ: typ,
+ start_mark: mark,
+ end_mark: mark,
+ }
+ if number > -1 {
+ number -= parser.tokens_parsed
+ }
+ parser.insertToken(number, &token)
+ }
+ return true
+}
+
+// Pop indentation levels from the indents stack until the current level
+// becomes less or equal to the column. For each indentation level, append
+// the BLOCK-END token.
+func (parser *yamlParser) unrollIndent(column int, scan_mark yamlMark) bool {
+ // In the flow context, do nothing.
+ if parser.flow_level > 0 {
+ return true
+ }
+
+ block_mark := scan_mark
+ block_mark.index--
+
+ // Loop through the indentation levels in the stack.
+ for parser.indent > column {
+
+ // [Go] Reposition the end token before potential following
+ // foot comments of parent blocks. For that, search
+ // backwards for recent comments that were at the same
+ // indent as the block that is ending now.
+ stop_index := block_mark.index
+ for i := len(parser.comments) - 1; i >= 0; i-- {
+ comment := &parser.comments[i]
+
+ if comment.end_mark.index < stop_index {
+ // Don't go back beyond the start of the comment/whitespace scan, unless column < 0.
+ // If requested indent column is < 0, then the document is over and everything else
+ // is a foot anyway.
+ break
+ }
+ if comment.start_mark.column == parser.indent+1 {
+ // This is a good match. But maybe there's a former comment
+ // at that same indent level, so keep searching.
+ block_mark = comment.start_mark
+ }
+
+ // While the end of the former comment matches with
+ // the start of the following one, we know there's
+ // nothing in between and scanning is still safe.
+ stop_index = comment.scan_mark.index
+ }
+
+ // Create a token and append it to the queue.
+ token := yamlToken{
+ typ: yaml_BLOCK_END_TOKEN,
+ start_mark: block_mark,
+ end_mark: block_mark,
+ }
+ parser.insertToken(-1, &token)
+
+ // Pop the indentation level.
+ parser.indent = parser.indents[len(parser.indents)-1]
+ parser.indents = parser.indents[:len(parser.indents)-1]
+ }
+ return true
+}
+
+// Initialize the scanner and produce the STREAM-START token.
+func (parser *yamlParser) fetchStreamStart() bool {
+ // Set the initial indentation.
+ parser.indent = -1
+
+ // Initialize the simple key stack.
+ parser.simple_keys = append(parser.simple_keys, yamlSimpleKey{})
+
+ parser.simple_keys_by_tok = make(map[int]int)
+
+ // A simple key is allowed at the beginning of the stream.
+ parser.simple_key_allowed = true
+
+ // We have started.
+ parser.stream_start_produced = true
+
+ // Create the STREAM-START token and append it to the queue.
+ token := yamlToken{
+ typ: yaml_STREAM_START_TOKEN,
+ start_mark: parser.mark,
+ end_mark: parser.mark,
+ encoding: parser.encoding,
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the STREAM-END token and shut down the scanner.
+func (parser *yamlParser) fetchStreamEnd() bool {
+ // Force new line.
+ if parser.mark.column != 0 {
+ parser.mark.column = 0
+ parser.mark.line++
+ }
+
+ // Reset the indentation level.
+ if !parser.unrollIndent(-1, parser.mark) {
+ return false
+ }
+
+ // Reset simple keys.
+ if !parser.removeSimpleKey() {
+ return false
+ }
+
+ parser.simple_key_allowed = false
+
+ // Create the STREAM-END token and append it to the queue.
+ token := yamlToken{
+ typ: yaml_STREAM_END_TOKEN,
+ start_mark: parser.mark,
+ end_mark: parser.mark,
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token.
+func (parser *yamlParser) fetchDirective() bool {
+ // Reset the indentation level.
+ if !parser.unrollIndent(-1, parser.mark) {
+ return false
+ }
+
+ // Reset simple keys.
+ if !parser.removeSimpleKey() {
+ return false
+ }
+
+ parser.simple_key_allowed = false
+
+ // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token.
+ token := yamlToken{}
+ if !parser.scanDirective(&token) {
+ return false
+ }
+ // Append the token to the queue.
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the DOCUMENT-START or DOCUMENT-END token.
+func (parser *yamlParser) fetchDocumentIndicator(typ yamlTokenType) bool {
+ // Reset the indentation level.
+ if !parser.unrollIndent(-1, parser.mark) {
+ return false
+ }
+
+ // Reset simple keys.
+ if !parser.removeSimpleKey() {
+ return false
+ }
+
+ parser.simple_key_allowed = false
+
+ // Consume the token.
+ start_mark := parser.mark
+
+ parser.skip()
+ parser.skip()
+ parser.skip()
+
+ end_mark := parser.mark
+
+ // Create the DOCUMENT-START or DOCUMENT-END token.
+ token := yamlToken{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ // Append the token to the queue.
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token.
+func (parser *yamlParser) fetchFlowCollectionStart(typ yamlTokenType) bool {
+ // The indicators '[' and '{' may start a simple key.
+ if !parser.saveSimpleKey() {
+ return false
+ }
+
+ // Increase the flow level.
+ if !parser.increaseFlowLevel() {
+ return false
+ }
+
+ // A simple key may follow the indicators '[' and '{'.
+ parser.simple_key_allowed = true
+
+ // Consume the token.
+ start_mark := parser.mark
+ parser.skip()
+ end_mark := parser.mark
+
+ // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token.
+ token := yamlToken{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ // Append the token to the queue.
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token.
+func (parser *yamlParser) fetchFlowCollectionEnd(typ yamlTokenType) bool {
+ // Reset any potential simple key on the current flow level.
+ if !parser.removeSimpleKey() {
+ return false
+ }
+
+ // Decrease the flow level.
+ if !parser.decreaseFlowLevel() {
+ return false
+ }
+
+ // No simple keys after the indicators ']' and '}'.
+ parser.simple_key_allowed = false
+
+ // Consume the token.
+
+ start_mark := parser.mark
+ parser.skip()
+ end_mark := parser.mark
+
+ // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token.
+ token := yamlToken{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ // Append the token to the queue.
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the FLOW-ENTRY token.
+func (parser *yamlParser) fetchFlowEntry() bool {
+ // Reset any potential simple keys on the current flow level.
+ if !parser.removeSimpleKey() {
+ return false
+ }
+
+ // Simple keys are allowed after ','.
+ parser.simple_key_allowed = true
+
+ // Consume the token.
+ start_mark := parser.mark
+ parser.skip()
+ end_mark := parser.mark
+
+ // Create the FLOW-ENTRY token and append it to the queue.
+ token := yamlToken{
+ typ: yaml_FLOW_ENTRY_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the BLOCK-ENTRY token.
+func (parser *yamlParser) fetchBlockEntry() bool {
+ // Check if the scanner is in the block context.
+ if parser.flow_level == 0 {
+ // Check if we are allowed to start a new entry.
+ if !parser.simple_key_allowed {
+ return parser.setScannerError("", parser.mark,
+ "block sequence entries are not allowed in this context")
+ }
+ // Add the BLOCK-SEQUENCE-START token if needed.
+ if !parser.rollIndent(parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) {
+ return false
+ }
+ } else { //nolint:staticcheck // there is no problem with this empty branch as it's documentation.
+
+ // It is an error for the '-' indicator to occur in the flow context,
+ // but we let the Parser detect and report about it because the Parser
+ // is able to point to the context.
+ }
+
+ // Reset any potential simple keys on the current flow level.
+ if !parser.removeSimpleKey() {
+ return false
+ }
+
+ // Simple keys are allowed after '-'.
+ parser.simple_key_allowed = true
+
+ // Consume the token.
+ start_mark := parser.mark
+ parser.skip()
+ end_mark := parser.mark
+
+ // Create the BLOCK-ENTRY token and append it to the queue.
+ token := yamlToken{
+ typ: yaml_BLOCK_ENTRY_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the KEY token.
+func (parser *yamlParser) fetchKey() bool {
+ // In the block context, additional checks are required.
+ if parser.flow_level == 0 {
+ // Check if we are allowed to start a new key (not necessary simple).
+ if !parser.simple_key_allowed {
+ return parser.setScannerError("", parser.mark,
+ "mapping keys are not allowed in this context")
+ }
+ // Add the BLOCK-MAPPING-START token if needed.
+ if !parser.rollIndent(parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
+ return false
+ }
+ }
+
+ // Reset any potential simple keys on the current flow level.
+ if !parser.removeSimpleKey() {
+ return false
+ }
+
+ // Simple keys are allowed after '?' in the block context.
+ parser.simple_key_allowed = parser.flow_level == 0
+
+ // Consume the token.
+ start_mark := parser.mark
+ parser.skip()
+ end_mark := parser.mark
+
+ // Create the KEY token and append it to the queue.
+ token := yamlToken{
+ typ: yaml_KEY_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the VALUE token.
+func (parser *yamlParser) fetchValue() bool {
+ simple_key := &parser.simple_keys[len(parser.simple_keys)-1]
+
+ // Have we found a simple key?
+ if valid, ok := parser.simpleKeyIsValid(simple_key); !ok {
+ return false
+ } else if valid {
+
+ // Create the KEY token and insert it into the queue.
+ token := yamlToken{
+ typ: yaml_KEY_TOKEN,
+ start_mark: simple_key.mark,
+ end_mark: simple_key.mark,
+ }
+ parser.insertToken(simple_key.token_number-parser.tokens_parsed, &token)
+
+ // In the block context, we may need to add the BLOCK-MAPPING-START token.
+ if !parser.rollIndent(simple_key.mark.column,
+ simple_key.token_number,
+ yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) {
+ return false
+ }
+
+ // Remove the simple key.
+ simple_key.possible = false
+ delete(parser.simple_keys_by_tok, simple_key.token_number)
+
+ // A simple key cannot follow another simple key.
+ parser.simple_key_allowed = false
+
+ } else {
+ // The ':' indicator follows a complex key.
+
+ // In the block context, extra checks are required.
+ if parser.flow_level == 0 {
+
+ // Check if we are allowed to start a complex value.
+ if !parser.simple_key_allowed {
+ return parser.setScannerError("", parser.mark,
+ "mapping values are not allowed in this context")
+ }
+
+ // Add the BLOCK-MAPPING-START token if needed.
+ if !parser.rollIndent(parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
+ return false
+ }
+ }
+
+ // Simple keys after ':' are allowed in the block context.
+ parser.simple_key_allowed = parser.flow_level == 0
+ }
+
+ // Consume the token.
+ start_mark := parser.mark
+ parser.skip()
+ end_mark := parser.mark
+
+ // Create the VALUE token and append it to the queue.
+ token := yamlToken{
+ typ: yaml_VALUE_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the ALIAS or ANCHOR token.
+func (parser *yamlParser) fetchAnchor(typ yamlTokenType) bool {
+ // An anchor or an alias could be a simple key.
+ if !parser.saveSimpleKey() {
+ return false
+ }
+
+ // A simple key cannot follow an anchor or an alias.
+ parser.simple_key_allowed = false
+
+ // Create the ALIAS or ANCHOR token and append it to the queue.
+ var token yamlToken
+ if !parser.scanAnchor(&token, typ) {
+ return false
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the TAG token.
+func (parser *yamlParser) fetchTag() bool {
+ // A tag could be a simple key.
+ if !parser.saveSimpleKey() {
+ return false
+ }
+
+ // A simple key cannot follow a tag.
+ parser.simple_key_allowed = false
+
+ // Create the TAG token and append it to the queue.
+ var token yamlToken
+ if !parser.scanTag(&token) {
+ return false
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens.
+func (parser *yamlParser) fetchBlockScalar(literal bool) bool {
+ // Remove any potential simple keys.
+ if !parser.removeSimpleKey() {
+ return false
+ }
+
+ // A simple key may follow a block scalar.
+ parser.simple_key_allowed = true
+
+ // Create the SCALAR token and append it to the queue.
+ var token yamlToken
+ if !parser.scanBlockScalar(&token, literal) {
+ return false
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens.
+func (parser *yamlParser) fetchFlowScalar(single bool) bool {
+ // A plain scalar could be a simple key.
+ if !parser.saveSimpleKey() {
+ return false
+ }
+
+ // A simple key cannot follow a flow scalar.
+ parser.simple_key_allowed = false
+
+ // Create the SCALAR token and append it to the queue.
+ var token yamlToken
+ if !parser.scanFlowScalar(&token, single) {
+ return false
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Produce the SCALAR(...,plain) token.
+func (parser *yamlParser) fetchPlainScalar() bool {
+ // A plain scalar could be a simple key.
+ if !parser.saveSimpleKey() {
+ return false
+ }
+
+ // A simple key cannot follow a flow scalar.
+ parser.simple_key_allowed = false
+
+ // Create the SCALAR token and append it to the queue.
+ var token yamlToken
+ if !parser.scanPlainScalar(&token) {
+ return false
+ }
+ parser.insertToken(-1, &token)
+ return true
+}
+
+// Eat whitespaces and comments until the next token is found.
+func (parser *yamlParser) scanToNextToken() bool {
+ scan_mark := parser.mark
+
+ // Until the next token is not found.
+ for {
+ // Allow the BOM mark to start a line.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ if parser.mark.column == 0 && isBOM(parser.buffer, parser.buffer_pos) {
+ parser.skip()
+ }
+
+ // Eat whitespaces.
+ // Tabs are allowed:
+ // - in the flow context
+ // - in the block context, but not at the beginning of the line or
+ // after '-', '?', or ':' (complex value).
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+
+ for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') {
+ parser.skip()
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ // Check if we just had a line comment under a sequence entry that
+ // looks more like a header to the following content. Similar to this:
+ //
+ // - # The comment
+ // - Some data
+ //
+ // If so, transform the line comment to a head comment and reposition.
+ if len(parser.comments) > 0 && len(parser.tokens) > 1 {
+ tokenA := parser.tokens[len(parser.tokens)-2]
+ tokenB := parser.tokens[len(parser.tokens)-1]
+ comment := &parser.comments[len(parser.comments)-1]
+ if tokenA.typ == yaml_BLOCK_SEQUENCE_START_TOKEN && tokenB.typ == yaml_BLOCK_ENTRY_TOKEN && len(comment.line) > 0 && !isLineBreak(parser.buffer, parser.buffer_pos) {
+ // If it was in the prior line, reposition so it becomes a
+ // header of the follow up token. Otherwise, keep it in place
+ // so it becomes a header of the former.
+ comment.head = comment.line
+ comment.line = nil
+ if comment.start_mark.line == parser.mark.line-1 {
+ comment.token_mark = parser.mark
+ }
+ }
+ }
+
+ // Eat a comment until a line break.
+ if parser.buffer[parser.buffer_pos] == '#' {
+ if !parser.scanComments(scan_mark) {
+ return false
+ }
+ }
+
+ // If it is a line break, eat it.
+ if isLineBreak(parser.buffer, parser.buffer_pos) {
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+ parser.skipLine()
+
+ // In the block context, a new line may start a simple key.
+ if parser.flow_level == 0 {
+ parser.simple_key_allowed = true
+ }
+ } else {
+ break // We have found a token.
+ }
+ }
+
+ return true
+}
+
+// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token.
+//
+// Scope:
+//
+// %YAML 1.1 # a comment \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+func (parser *yamlParser) scanDirective(token *yamlToken) bool {
+ // Eat '%'.
+ start_mark := parser.mark
+ parser.skip()
+
+ // Scan the directive name.
+ var name []byte
+ if !parser.scanDirectiveName(start_mark, &name) {
+ return false
+ }
+
+ // Is it a YAML directive?
+ if bytes.Equal(name, []byte("YAML")) {
+ // Scan the VERSION directive value.
+ var major, minor int8
+ if !parser.scanVersionDirectiveValue(start_mark, &major, &minor) {
+ return false
+ }
+ end_mark := parser.mark
+
+ // Create a VERSION-DIRECTIVE token.
+ *token = yamlToken{
+ typ: yaml_VERSION_DIRECTIVE_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ major: major,
+ minor: minor,
+ }
+
+ // Is it a TAG directive?
+ } else if bytes.Equal(name, []byte("TAG")) {
+ // Scan the TAG directive value.
+ var handle, prefix []byte
+ if !parser.scanTagDirectiveValue(start_mark, &handle, &prefix) {
+ return false
+ }
+ end_mark := parser.mark
+
+ // Create a TAG-DIRECTIVE token.
+ *token = yamlToken{
+ typ: yaml_TAG_DIRECTIVE_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: handle,
+ prefix: prefix,
+ }
+
+ // Unknown directive.
+ } else {
+ parser.setScannerError("while scanning a directive",
+ start_mark, "found unknown directive name")
+ return false
+ }
+
+ // Eat the rest of the line including any comments.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+
+ for isBlank(parser.buffer, parser.buffer_pos) {
+ parser.skip()
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ if parser.buffer[parser.buffer_pos] == '#' {
+ // [Go] Discard this inline comment for the time being.
+ //if !parser.ScanLineComment(start_mark) {
+ // return false
+ //}
+ for !isBreakOrZero(parser.buffer, parser.buffer_pos) {
+ parser.skip()
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+ }
+
+ // Check if we are at the end of the line.
+ if !isBreakOrZero(parser.buffer, parser.buffer_pos) {
+ parser.setScannerError("while scanning a directive",
+ start_mark, "did not find expected comment or line break")
+ return false
+ }
+
+ // Eat a line break.
+ if isLineBreak(parser.buffer, parser.buffer_pos) {
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+ parser.skipLine()
+ }
+
+ return true
+}
+
+// Scan the directive name.
+//
+// Scope:
+//
+// %YAML 1.1 # a comment \n
+// ^^^^
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^
+func (parser *yamlParser) scanDirectiveName(start_mark yamlMark, name *[]byte) bool {
+ // Consume the directive name.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+
+ var s []byte
+ for isAlpha(parser.buffer, parser.buffer_pos) {
+ s = parser.read(s)
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ // Check if the name is empty.
+ if len(s) == 0 {
+ parser.setScannerError("while scanning a directive",
+ start_mark, "could not find expected directive name")
+ return false
+ }
+
+ // Check for an blank character after the name.
+ if !isBlankOrZero(parser.buffer, parser.buffer_pos) {
+ parser.setScannerError("while scanning a directive",
+ start_mark, "found unexpected non-alphabetical character")
+ return false
+ }
+ *name = s
+ return true
+}
+
+// Scan the value of VERSION-DIRECTIVE.
+//
+// Scope:
+//
+// %YAML 1.1 # a comment \n
+// ^^^^^^
+func (parser *yamlParser) scanVersionDirectiveValue(start_mark yamlMark, major, minor *int8) bool {
+ // Eat whitespaces.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ for isBlank(parser.buffer, parser.buffer_pos) {
+ parser.skip()
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ // Consume the major version number.
+ if !parser.scanVersionDirectiveNumber(start_mark, major) {
+ return false
+ }
+
+ // Eat '.'.
+ if parser.buffer[parser.buffer_pos] != '.' {
+ return parser.setScannerError("while scanning a %YAML directive",
+ start_mark, "did not find expected digit or '.' character")
+ }
+
+ parser.skip()
+
+ // Consume the minor version number.
+ if !parser.scanVersionDirectiveNumber(start_mark, minor) {
+ return false
+ }
+ return true
+}
+
+const max_number_length = 2
+
+// Scan the version number of VERSION-DIRECTIVE.
+//
+// Scope:
+//
+// %YAML 1.1 # a comment \n
+// ^
+// %YAML 1.1 # a comment \n
+// ^
+func (parser *yamlParser) scanVersionDirectiveNumber(start_mark yamlMark, number *int8) bool {
+ // Repeat while the next character is digit.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ var value, length int8
+ for isDigit(parser.buffer, parser.buffer_pos) {
+ // Check if the number is too long.
+ length++
+ if length > max_number_length {
+ return parser.setScannerError("while scanning a %YAML directive",
+ start_mark, "found extremely long version number")
+ }
+ value = value*10 + int8(asDigit(parser.buffer, parser.buffer_pos))
+ parser.skip()
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ // Check if the number was present.
+ if length == 0 {
+ return parser.setScannerError("while scanning a %YAML directive",
+ start_mark, "did not find expected version number")
+ }
+ *number = value
+ return true
+}
+
+// Scan the value of a TAG-DIRECTIVE token.
+//
+// Scope:
+//
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+func (parser *yamlParser) scanTagDirectiveValue(start_mark yamlMark, handle, prefix *[]byte) bool {
+ var handle_value, prefix_value []byte
+
+ // Eat whitespaces.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+
+ for isBlank(parser.buffer, parser.buffer_pos) {
+ parser.skip()
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ // Scan a handle.
+ if !parser.scanTagHandle(true, start_mark, &handle_value) {
+ return false
+ }
+
+ // Expect a whitespace.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ if !isBlank(parser.buffer, parser.buffer_pos) {
+ parser.setScannerError("while scanning a %TAG directive",
+ start_mark, "did not find expected whitespace")
+ return false
+ }
+
+ // Eat whitespaces.
+ for isBlank(parser.buffer, parser.buffer_pos) {
+ parser.skip()
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ // Scan a prefix.
+ if !parser.scanTagURI(true, nil, start_mark, &prefix_value) {
+ return false
+ }
+
+ // Expect a whitespace or line break.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ if !isBlankOrZero(parser.buffer, parser.buffer_pos) {
+ parser.setScannerError("while scanning a %TAG directive",
+ start_mark, "did not find expected whitespace or line break")
+ return false
+ }
+
+ *handle = handle_value
+ *prefix = prefix_value
+ return true
+}
+
+func (parser *yamlParser) scanAnchor(token *yamlToken, typ yamlTokenType) bool {
+ var s []byte
+
+ // Eat the indicator character.
+ start_mark := parser.mark
+ parser.skip()
+
+ // Consume the value.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+
+ for isAnchorChar(parser.buffer, parser.buffer_pos) {
+ s = parser.read(s)
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ end_mark := parser.mark
+
+ /*
+ * Check if length of the anchor is greater than 0 and it is followed by
+ * a whitespace character or one of the indicators:
+ *
+ * '?', ':', ',', ']', '}', '%', '@', '`'.
+ */
+
+ if len(s) == 0 ||
+ !(isBlankOrZero(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' ||
+ parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' ||
+ parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' ||
+ parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' ||
+ parser.buffer[parser.buffer_pos] == '`') {
+ context := "while scanning an alias"
+ if typ == yaml_ANCHOR_TOKEN {
+ context = "while scanning an anchor"
+ }
+ parser.setScannerError(context, start_mark,
+ "did not find expected alphabetic or numeric character")
+ return false
+ }
+
+ // Create a token.
+ *token = yamlToken{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ }
+
+ return true
+}
+
+/*
+ * Scan a TAG token.
+ */
+
+func (parser *yamlParser) scanTag(token *yamlToken) bool {
+ var handle, suffix []byte
+
+ start_mark := parser.mark
+
+ // Check if the tag is in the canonical form.
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+
+ if parser.buffer[parser.buffer_pos+1] == '<' {
+ // Keep the handle as ''
+
+ // Eat '!<'
+ parser.skip()
+ parser.skip()
+
+ // Consume the tag value.
+ if !parser.scanTagURI(false, nil, start_mark, &suffix) {
+ return false
+ }
+
+ // Check for '>' and eat it.
+ if parser.buffer[parser.buffer_pos] != '>' {
+ parser.setScannerError("while scanning a tag",
+ start_mark, "did not find the expected '>'")
+ return false
+ }
+
+ parser.skip()
+ } else {
+ // The tag has either the '!suffix' or the '!handle!suffix' form.
+
+ // First, try to scan a handle.
+ if !parser.scanTagHandle(false, start_mark, &handle) {
+ return false
+ }
+
+ // Check if it is, indeed, handle.
+ if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' {
+ // Scan the suffix now.
+ if !parser.scanTagURI(false, nil, start_mark, &suffix) {
+ return false
+ }
+ } else {
+ // It wasn't a handle after all. Scan the rest of the tag.
+ if !parser.scanTagURI(false, handle, start_mark, &suffix) {
+ return false
+ }
+
+ // Set the handle to '!'.
+ handle = []byte{'!'}
+
+ // A special case: the '!' tag. Set the handle to '' and the
+ // suffix to '!'.
+ if len(suffix) == 0 {
+ handle, suffix = suffix, handle
+ }
+ }
+ }
+
+ // Check the character which ends the tag.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ if !isBlankOrZero(parser.buffer, parser.buffer_pos) {
+ parser.setScannerError("while scanning a tag",
+ start_mark, "did not find expected whitespace or line break")
+ return false
+ }
+
+ end_mark := parser.mark
+
+ // Create a token.
+ *token = yamlToken{
+ typ: yaml_TAG_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: handle,
+ suffix: suffix,
+ }
+ return true
+}
+
+// Scan a tag handle.
+func (parser *yamlParser) scanTagHandle(directive bool, start_mark yamlMark, handle *[]byte) bool {
+ // Check the initial '!' character.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ if parser.buffer[parser.buffer_pos] != '!' {
+ parser.setScannerTagError(directive,
+ start_mark, "did not find expected '!'")
+ return false
+ }
+
+ var s []byte
+
+ // Copy the '!' character.
+ s = parser.read(s)
+
+ // Copy all subsequent alphabetical and numerical characters.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ for isAlpha(parser.buffer, parser.buffer_pos) {
+ s = parser.read(s)
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ // Check if the trailing character is '!' and copy it.
+ if parser.buffer[parser.buffer_pos] == '!' {
+ s = parser.read(s)
+ } else {
+ // It's either the '!' tag or not really a tag handle. If it's a %TAG
+ // directive, it's an error. If it's a tag token, it must be a part of URI.
+ if directive && string(s) != "!" {
+ parser.setScannerTagError(directive,
+ start_mark, "did not find expected '!'")
+ return false
+ }
+ }
+
+ *handle = s
+ return true
+}
+
+// Scan a tag.
+func (parser *yamlParser) scanTagURI(directive bool, head []byte, start_mark yamlMark, uri *[]byte) bool {
+ // size_t length = head ? strlen((char *)head) : 0
+ var s []byte
+ hasTag := len(head) > 0
+
+ // Copy the head if needed.
+ //
+ // Note that we don't copy the leading '!' character.
+ if len(head) > 1 {
+ s = append(s, head[1:]...)
+ }
+
+ // Scan the tag.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+
+ // The set of characters that may appear in URI is as follows:
+ //
+ // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
+ // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
+ // '%'.
+ // [Go] TODO Convert this into more reasonable logic.
+ for isAlpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' ||
+ parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' ||
+ parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' ||
+ parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' ||
+ parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' ||
+ parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' ||
+ parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' ||
+ parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' ||
+ parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' ||
+ parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' ||
+ parser.buffer[parser.buffer_pos] == '%' {
+ // Check if it is a URI-escape sequence.
+ if parser.buffer[parser.buffer_pos] == '%' {
+ if !parser.scanURIEscapes(directive, start_mark, &s) {
+ return false
+ }
+ } else {
+ s = parser.read(s)
+ }
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ hasTag = true
+ }
+
+ if !hasTag {
+ parser.setScannerTagError(directive,
+ start_mark, "did not find expected tag URI")
+ return false
+ }
+ *uri = s
+ return true
+}
+
+// Decode an URI-escape sequence corresponding to a single UTF-8 character.
+func (parser *yamlParser) scanURIEscapes(directive bool, start_mark yamlMark, s *[]byte) bool {
+ // Decode the required number of characters.
+ w := 1024
+ for w > 0 {
+ // Check for a URI-escaped octet.
+ if parser.unread < 3 && !parser.updateBuffer(3) {
+ return false
+ }
+
+ if !(parser.buffer[parser.buffer_pos] == '%' &&
+ isHex(parser.buffer, parser.buffer_pos+1) &&
+ isHex(parser.buffer, parser.buffer_pos+2)) {
+ return parser.setScannerTagError(directive,
+ start_mark, "did not find URI escaped octet")
+ }
+
+ // Get the octet.
+ octet := byte((asHex(parser.buffer, parser.buffer_pos+1) << 4) + asHex(parser.buffer, parser.buffer_pos+2))
+
+ // If it is the leading octet, determine the length of the UTF-8 sequence.
+ if w == 1024 {
+ w = width(octet)
+ if w == 0 {
+ return parser.setScannerTagError(directive,
+ start_mark, "found an incorrect leading UTF-8 octet")
+ }
+ } else {
+ // Check if the trailing octet is correct.
+ if octet&0xC0 != 0x80 {
+ return parser.setScannerTagError(directive,
+ start_mark, "found an incorrect trailing UTF-8 octet")
+ }
+ }
+
+ // Copy the octet and move the pointers.
+ *s = append(*s, octet)
+ parser.skip()
+ parser.skip()
+ parser.skip()
+ w--
+ }
+ return true
+}
+
+// Scan a block scalar.
+func (parser *yamlParser) scanBlockScalar(token *yamlToken, literal bool) bool {
+ // Eat the indicator '|' or '>'.
+ start_mark := parser.mark
+ parser.skip()
+
+ // Scan the additional block scalar indicators.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+
+ // Check for a chomping indicator.
+ var chomping, increment int
+ if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
+ // Set the chomping method and eat the indicator.
+ if parser.buffer[parser.buffer_pos] == '+' {
+ chomping = +1
+ } else {
+ chomping = -1
+ }
+ parser.skip()
+
+ // Check for an indentation indicator.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ if isDigit(parser.buffer, parser.buffer_pos) {
+ // Check that the indentation is greater than 0.
+ if parser.buffer[parser.buffer_pos] == '0' {
+ parser.setScannerError("while scanning a block scalar",
+ start_mark, "found an indentation indicator equal to 0")
+ return false
+ }
+
+ // Get the indentation level and eat the indicator.
+ increment = asDigit(parser.buffer, parser.buffer_pos)
+ parser.skip()
+ }
+
+ } else if isDigit(parser.buffer, parser.buffer_pos) {
+ // Do the same as above, but in the opposite order.
+
+ if parser.buffer[parser.buffer_pos] == '0' {
+ parser.setScannerError("while scanning a block scalar",
+ start_mark, "found an indentation indicator equal to 0")
+ return false
+ }
+ increment = asDigit(parser.buffer, parser.buffer_pos)
+ parser.skip()
+
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
+ if parser.buffer[parser.buffer_pos] == '+' {
+ chomping = +1
+ } else {
+ chomping = -1
+ }
+ parser.skip()
+ }
+ }
+
+ // Eat whitespaces and comments to the end of the line.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ for isBlank(parser.buffer, parser.buffer_pos) {
+ parser.skip()
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+ if parser.buffer[parser.buffer_pos] == '#' {
+ if !parser.scanLineComment(start_mark) {
+ return false
+ }
+ for !isBreakOrZero(parser.buffer, parser.buffer_pos) {
+ parser.skip()
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+ }
+
+ // Check if we are at the end of the line.
+ if !isBreakOrZero(parser.buffer, parser.buffer_pos) {
+ parser.setScannerError("while scanning a block scalar",
+ start_mark, "did not find expected comment or line break")
+ return false
+ }
+
+ // Eat a line break.
+ if isLineBreak(parser.buffer, parser.buffer_pos) {
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+ parser.skipLine()
+ }
+
+ end_mark := parser.mark
+
+ // Set the indentation level if it was specified.
+ var indent int
+ if increment > 0 {
+ if parser.indent >= 0 {
+ indent = parser.indent + increment
+ } else {
+ indent = increment
+ }
+ }
+
+ // Scan the leading line breaks and determine the indentation level if needed.
+ var s, leading_break, trailing_breaks []byte
+ if !parser.scanBlockScalarBreaks(&indent, &trailing_breaks, start_mark, &end_mark) {
+ return false
+ }
+
+ // Scan the block scalar content.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ var leading_blank, trailing_blank bool
+ for parser.mark.column == indent && !isZeroChar(parser.buffer, parser.buffer_pos) {
+ // We are at the beginning of a non-empty line.
+
+ // Is it a trailing whitespace?
+ trailing_blank = isBlank(parser.buffer, parser.buffer_pos)
+
+ // Check if we need to fold the leading line break.
+ if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' {
+ // Do we need to join the lines by space?
+ if len(trailing_breaks) == 0 {
+ s = append(s, ' ')
+ }
+ } else {
+ s = append(s, leading_break...)
+ }
+ leading_break = leading_break[:0]
+
+ // Append the remaining line breaks.
+ s = append(s, trailing_breaks...)
+ trailing_breaks = trailing_breaks[:0]
+
+ // Is it a leading whitespace?
+ leading_blank = isBlank(parser.buffer, parser.buffer_pos)
+
+ // Consume the current line.
+ for !isBreakOrZero(parser.buffer, parser.buffer_pos) {
+ s = parser.read(s)
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ // Consume the line break.
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+
+ leading_break = parser.readLine(leading_break)
+
+ // Eat the following indentation spaces and line breaks.
+ if !parser.scanBlockScalarBreaks(&indent, &trailing_breaks, start_mark, &end_mark) {
+ return false
+ }
+ }
+
+ // Chomp the tail.
+ if chomping != -1 {
+ s = append(s, leading_break...)
+ }
+ if chomping == 1 {
+ s = append(s, trailing_breaks...)
+ }
+
+ // Create a token.
+ *token = yamlToken{
+ typ: yaml_SCALAR_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ style: yaml_LITERAL_SCALAR_STYLE,
+ }
+ if !literal {
+ token.style = yaml_FOLDED_SCALAR_STYLE
+ }
+ return true
+}
+
+// Scan indentation spaces and line breaks for a block scalar. Determine the
+// indentation level if needed.
+func (parser *yamlParser) scanBlockScalarBreaks(indent *int, breaks *[]byte, start_mark yamlMark, end_mark *yamlMark) bool {
+ *end_mark = parser.mark
+
+ // Eat the indentation spaces and line breaks.
+ max_indent := 0
+ for {
+ // Eat the indentation spaces.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ for (*indent == 0 || parser.mark.column < *indent) && isSpace(parser.buffer, parser.buffer_pos) {
+ parser.skip()
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+ if parser.mark.column > max_indent {
+ max_indent = parser.mark.column
+ }
+
+ // Check for a tab character messing the indentation.
+ if (*indent == 0 || parser.mark.column < *indent) && isTab(parser.buffer, parser.buffer_pos) {
+ return parser.setScannerError("while scanning a block scalar",
+ start_mark, "found a tab character where an indentation space is expected")
+ }
+
+ // Have we found a non-empty line?
+ if !isLineBreak(parser.buffer, parser.buffer_pos) {
+ break
+ }
+
+ // Consume the line break.
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+ // [Go] Should really be returning breaks instead.
+ *breaks = parser.readLine(*breaks)
+ *end_mark = parser.mark
+ }
+
+ // Determine the indentation level if needed.
+ if *indent == 0 {
+ *indent = max_indent
+ if *indent < parser.indent+1 {
+ *indent = parser.indent + 1
+ }
+ if *indent < 1 {
+ *indent = 1
+ }
+ }
+ return true
+}
+
+// Scan a quoted scalar.
+func (parser *yamlParser) scanFlowScalar(token *yamlToken, single bool) bool {
+ // Eat the left quote.
+ start_mark := parser.mark
+ parser.skip()
+
+ // Consume the content of the quoted scalar.
+ var s, leading_break, trailing_breaks, whitespaces []byte
+ for {
+ // Check that there are no document indicators at the beginning of the line.
+ if parser.unread < 4 && !parser.updateBuffer(4) {
+ return false
+ }
+
+ if parser.mark.column == 0 &&
+ ((parser.buffer[parser.buffer_pos+0] == '-' &&
+ parser.buffer[parser.buffer_pos+1] == '-' &&
+ parser.buffer[parser.buffer_pos+2] == '-') ||
+ (parser.buffer[parser.buffer_pos+0] == '.' &&
+ parser.buffer[parser.buffer_pos+1] == '.' &&
+ parser.buffer[parser.buffer_pos+2] == '.')) &&
+ isBlankOrZero(parser.buffer, parser.buffer_pos+3) {
+ parser.setScannerError("while scanning a quoted scalar",
+ start_mark, "found unexpected document indicator")
+ return false
+ }
+
+ // Check for EOF.
+ if isZeroChar(parser.buffer, parser.buffer_pos) {
+ parser.setScannerError("while scanning a quoted scalar",
+ start_mark, "found unexpected end of stream")
+ return false
+ }
+
+ // Consume non-blank characters.
+ leading_blanks := false
+ for !isBlankOrZero(parser.buffer, parser.buffer_pos) {
+ if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' {
+ // Is is an escaped single quote.
+ s = append(s, '\'')
+ parser.skip()
+ parser.skip()
+
+ } else if single && parser.buffer[parser.buffer_pos] == '\'' {
+ // It is a right single quote.
+ break
+ } else if !single && parser.buffer[parser.buffer_pos] == '"' {
+ // It is a right double quote.
+ break
+ } else if !single && parser.buffer[parser.buffer_pos] == '\\' && isLineBreak(parser.buffer, parser.buffer_pos+1) {
+ // It is an escaped line break.
+ if parser.unread < 3 && !parser.updateBuffer(3) {
+ return false
+ }
+ parser.skip()
+ parser.skipLine()
+ leading_blanks = true
+ break
+
+ } else if !single && parser.buffer[parser.buffer_pos] == '\\' {
+ // It is an escape sequence.
+ code_length := 0
+
+ // Check the escape character.
+ switch parser.buffer[parser.buffer_pos+1] {
+ case '0':
+ s = append(s, 0)
+ case 'a':
+ s = append(s, '\x07')
+ case 'b':
+ s = append(s, '\x08')
+ case 't', '\t':
+ s = append(s, '\x09')
+ case 'n':
+ s = append(s, '\x0A')
+ case 'v':
+ s = append(s, '\x0B')
+ case 'f':
+ s = append(s, '\x0C')
+ case 'r':
+ s = append(s, '\x0D')
+ case 'e':
+ s = append(s, '\x1B')
+ case ' ':
+ s = append(s, '\x20')
+ case '"':
+ s = append(s, '"')
+ case '\'':
+ s = append(s, '\'')
+ case '\\':
+ s = append(s, '\\')
+ case 'N': // NEL (#x85)
+ s = append(s, '\xC2')
+ s = append(s, '\x85')
+ case '_': // #xA0
+ s = append(s, '\xC2')
+ s = append(s, '\xA0')
+ case 'L': // LS (#x2028)
+ s = append(s, '\xE2')
+ s = append(s, '\x80')
+ s = append(s, '\xA8')
+ case 'P': // PS (#x2029)
+ s = append(s, '\xE2')
+ s = append(s, '\x80')
+ s = append(s, '\xA9')
+ case 'x':
+ code_length = 2
+ case 'u':
+ code_length = 4
+ case 'U':
+ code_length = 8
+ default:
+ parser.setScannerError("while parsing a quoted scalar",
+ start_mark, "found unknown escape character")
+ return false
+ }
+
+ parser.skip()
+ parser.skip()
+
+ // Consume an arbitrary escape code.
+ if code_length > 0 {
+ var value int
+
+ // Scan the character value.
+ if parser.unread < code_length && !parser.updateBuffer(code_length) {
+ return false
+ }
+ for k := 0; k < code_length; k++ {
+ if !isHex(parser.buffer, parser.buffer_pos+k) {
+ parser.setScannerError("while parsing a quoted scalar",
+ start_mark, "did not find expected hexadecimal number")
+ return false
+ }
+ value = (value << 4) + asHex(parser.buffer, parser.buffer_pos+k)
+ }
+
+ // Check the value and write the character.
+ if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF {
+ parser.setScannerError("while parsing a quoted scalar",
+ start_mark, "found invalid Unicode character escape code")
+ return false
+ }
+ if value <= 0x7F {
+ s = append(s, byte(value))
+ } else if value <= 0x7FF {
+ s = append(s, byte(0xC0+(value>>6)))
+ s = append(s, byte(0x80+(value&0x3F)))
+ } else if value <= 0xFFFF {
+ s = append(s, byte(0xE0+(value>>12)))
+ s = append(s, byte(0x80+((value>>6)&0x3F)))
+ s = append(s, byte(0x80+(value&0x3F)))
+ } else {
+ s = append(s, byte(0xF0+(value>>18)))
+ s = append(s, byte(0x80+((value>>12)&0x3F)))
+ s = append(s, byte(0x80+((value>>6)&0x3F)))
+ s = append(s, byte(0x80+(value&0x3F)))
+ }
+
+ // Advance the pointer.
+ for k := 0; k < code_length; k++ {
+ parser.skip()
+ }
+ }
+ } else {
+ // It is a non-escaped non-blank character.
+ s = parser.read(s)
+ }
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+ }
+
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+
+ // Check if we are at the end of the scalar.
+ if single {
+ if parser.buffer[parser.buffer_pos] == '\'' {
+ break
+ }
+ } else {
+ if parser.buffer[parser.buffer_pos] == '"' {
+ break
+ }
+ }
+
+ // Consume blank characters.
+ for isBlank(parser.buffer, parser.buffer_pos) || isLineBreak(parser.buffer, parser.buffer_pos) {
+ if isBlank(parser.buffer, parser.buffer_pos) {
+ // Consume a space or a tab character.
+ if !leading_blanks {
+ whitespaces = parser.read(whitespaces)
+ } else {
+ parser.skip()
+ }
+ } else {
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+
+ // Check if it is a first line break.
+ if !leading_blanks {
+ whitespaces = whitespaces[:0]
+ leading_break = parser.readLine(leading_break)
+ leading_blanks = true
+ } else {
+ trailing_breaks = parser.readLine(trailing_breaks)
+ }
+ }
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ // Join the whitespaces or fold line breaks.
+ if leading_blanks {
+ // Do we need to fold line breaks?
+ if len(leading_break) > 0 && leading_break[0] == '\n' {
+ if len(trailing_breaks) == 0 {
+ s = append(s, ' ')
+ } else {
+ s = append(s, trailing_breaks...)
+ }
+ } else {
+ s = append(s, leading_break...)
+ s = append(s, trailing_breaks...)
+ }
+ trailing_breaks = trailing_breaks[:0]
+ leading_break = leading_break[:0]
+ } else {
+ s = append(s, whitespaces...)
+ whitespaces = whitespaces[:0]
+ }
+ }
+
+ // Eat the right quote.
+ parser.skip()
+ end_mark := parser.mark
+
+ // Create a token.
+ *token = yamlToken{
+ typ: yaml_SCALAR_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ style: yaml_SINGLE_QUOTED_SCALAR_STYLE,
+ }
+ if !single {
+ token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ return true
+}
+
+// Scan a plain scalar.
+func (parser *yamlParser) scanPlainScalar(token *yamlToken) bool {
+ var s, leading_break, trailing_breaks, whitespaces []byte
+ var leading_blanks bool
+ indent := parser.indent + 1
+
+ start_mark := parser.mark
+ end_mark := parser.mark
+
+ // Consume the content of the plain scalar.
+ for {
+ // Check for a document indicator.
+ if parser.unread < 4 && !parser.updateBuffer(4) {
+ return false
+ }
+ if parser.mark.column == 0 &&
+ ((parser.buffer[parser.buffer_pos+0] == '-' &&
+ parser.buffer[parser.buffer_pos+1] == '-' &&
+ parser.buffer[parser.buffer_pos+2] == '-') ||
+ (parser.buffer[parser.buffer_pos+0] == '.' &&
+ parser.buffer[parser.buffer_pos+1] == '.' &&
+ parser.buffer[parser.buffer_pos+2] == '.')) &&
+ isBlankOrZero(parser.buffer, parser.buffer_pos+3) {
+ break
+ }
+
+ // Check for a comment.
+ if parser.buffer[parser.buffer_pos] == '#' {
+ break
+ }
+
+ // Consume non-blank characters.
+ for !isBlankOrZero(parser.buffer, parser.buffer_pos) {
+
+ // Check for indicators that may end a plain scalar.
+ if (parser.buffer[parser.buffer_pos] == ':' && isBlankOrZero(parser.buffer, parser.buffer_pos+1)) ||
+ (parser.flow_level > 0 &&
+ (parser.buffer[parser.buffer_pos] == ',' ||
+ (parser.buffer[parser.buffer_pos] == '?' && isBlankOrZero(parser.buffer, parser.buffer_pos+1)) ||
+ parser.buffer[parser.buffer_pos] == '[' ||
+ parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
+ parser.buffer[parser.buffer_pos] == '}')) {
+ break
+ }
+
+ // Check if we need to join whitespaces and breaks.
+ if leading_blanks || len(whitespaces) > 0 {
+ if leading_blanks {
+ // Do we need to fold line breaks?
+ if leading_break[0] == '\n' {
+ if len(trailing_breaks) == 0 {
+ s = append(s, ' ')
+ } else {
+ s = append(s, trailing_breaks...)
+ }
+ } else {
+ s = append(s, leading_break...)
+ s = append(s, trailing_breaks...)
+ }
+ trailing_breaks = trailing_breaks[:0]
+ leading_break = leading_break[:0]
+ leading_blanks = false
+ } else {
+ s = append(s, whitespaces...)
+ whitespaces = whitespaces[:0]
+ }
+ }
+
+ // Copy the character.
+ s = parser.read(s)
+
+ end_mark = parser.mark
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+ }
+
+ // Is it the end?
+ if !(isBlank(parser.buffer, parser.buffer_pos) || isLineBreak(parser.buffer, parser.buffer_pos)) {
+ break
+ }
+
+ // Consume blank characters.
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+
+ for isBlank(parser.buffer, parser.buffer_pos) || isLineBreak(parser.buffer, parser.buffer_pos) {
+ if isBlank(parser.buffer, parser.buffer_pos) {
+
+ // Check for tab characters that abuse indentation.
+ if leading_blanks && parser.mark.column < indent && isTab(parser.buffer, parser.buffer_pos) {
+ parser.setScannerError("while scanning a plain scalar",
+ start_mark, "found a tab character that violates indentation")
+ return false
+ }
+
+ // Consume a space or a tab character.
+ if !leading_blanks {
+ whitespaces = parser.read(whitespaces)
+ } else {
+ parser.skip()
+ }
+ } else {
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+
+ // Check if it is a first line break.
+ if !leading_blanks {
+ whitespaces = whitespaces[:0]
+ leading_break = parser.readLine(leading_break)
+ leading_blanks = true
+ } else {
+ trailing_breaks = parser.readLine(trailing_breaks)
+ }
+ }
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ }
+
+ // Check indentation level.
+ if parser.flow_level == 0 && parser.mark.column < indent {
+ break
+ }
+ }
+
+ // Create a token.
+ *token = yamlToken{
+ typ: yaml_SCALAR_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ style: yaml_PLAIN_SCALAR_STYLE,
+ }
+
+ // Note that we change the 'simple_key_allowed' flag.
+ if leading_blanks {
+ parser.simple_key_allowed = true
+ }
+ return true
+}
+
+func (parser *yamlParser) scanLineComment(token_mark yamlMark) bool {
+ if parser.newlines > 0 {
+ return true
+ }
+
+ var start_mark yamlMark
+ var text []byte
+
+ for peek := 0; peek < 512; peek++ {
+ if parser.unread < peek+1 && !parser.updateBuffer(peek+1) {
+ break
+ }
+ if isBlank(parser.buffer, parser.buffer_pos+peek) {
+ continue
+ }
+ if parser.buffer[parser.buffer_pos+peek] == '#' {
+ seen := parser.mark.index + peek
+ for {
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ if isBreakOrZero(parser.buffer, parser.buffer_pos) {
+ if parser.mark.index >= seen {
+ break
+ }
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+ parser.skipLine()
+ } else if parser.mark.index >= seen {
+ if len(text) == 0 {
+ start_mark = parser.mark
+ }
+ text = parser.read(text)
+ } else {
+ parser.skip()
+ }
+ }
+ }
+ break
+ }
+ if len(text) > 0 {
+ parser.comments = append(parser.comments, yamlComment{
+ token_mark: token_mark,
+ start_mark: start_mark,
+ line: text,
+ })
+ }
+ return true
+}
+
+func (parser *yamlParser) scanComments(scan_mark yamlMark) bool {
+ token := parser.tokens[len(parser.tokens)-1]
+
+ if token.typ == yaml_FLOW_ENTRY_TOKEN && len(parser.tokens) > 1 {
+ token = parser.tokens[len(parser.tokens)-2]
+ }
+
+ token_mark := token.start_mark
+ var start_mark yamlMark
+ next_indent := parser.indent
+ if next_indent < 0 {
+ next_indent = 0
+ }
+
+ recent_empty := false
+ first_empty := parser.newlines <= 1
+
+ line := parser.mark.line
+ column := parser.mark.column
+
+ var text []byte
+
+ // The foot line is the place where a comment must start to
+ // still be considered as a foot of the prior content.
+ // If there's some content in the currently parsed line, then
+ // the foot is the line below it.
+ foot_line := -1
+ if scan_mark.line > 0 {
+ foot_line = parser.mark.line - parser.newlines + 1
+ if parser.newlines == 0 && parser.mark.column > 1 {
+ foot_line++
+ }
+ }
+
+ peek := 0
+ for ; peek < 512; peek++ {
+ if parser.unread < peek+1 && !parser.updateBuffer(peek+1) {
+ break
+ }
+ column++
+ if isBlank(parser.buffer, parser.buffer_pos+peek) {
+ continue
+ }
+ c := parser.buffer[parser.buffer_pos+peek]
+ close_flow := parser.flow_level > 0 && (c == ']' || c == '}')
+ if close_flow || isBreakOrZero(parser.buffer, parser.buffer_pos+peek) {
+ // Got line break or terminator.
+ if close_flow || !recent_empty {
+ if close_flow || first_empty && (start_mark.line == foot_line && token.typ != yaml_VALUE_TOKEN || start_mark.column-1 < next_indent) {
+ // This is the first empty line and there were no empty lines before,
+ // so this initial part of the comment is a foot of the prior token
+ // instead of being a head for the following one. Split it up.
+ // Alternatively, this might also be the last comment inside a flow
+ // scope, so it must be a footer.
+ if len(text) > 0 {
+ if start_mark.column-1 < next_indent {
+ // If dedented it's unrelated to the prior token.
+ token_mark = start_mark
+ }
+ parser.comments = append(parser.comments, yamlComment{
+ scan_mark: scan_mark,
+ token_mark: token_mark,
+ start_mark: start_mark,
+ end_mark: yamlMark{parser.mark.index + peek, line, column},
+ foot: text,
+ })
+ scan_mark = yamlMark{parser.mark.index + peek, line, column}
+ token_mark = scan_mark
+ text = nil
+ }
+ } else {
+ if len(text) > 0 && parser.buffer[parser.buffer_pos+peek] != 0 {
+ text = append(text, '\n')
+ }
+ }
+ }
+ if !isLineBreak(parser.buffer, parser.buffer_pos+peek) {
+ break
+ }
+ first_empty = false
+ recent_empty = true
+ column = 0
+ line++
+ continue
+ }
+
+ if len(text) > 0 && (close_flow || column-1 < next_indent && column != start_mark.column) {
+ // The comment at the different indentation is a foot of the
+ // preceding data rather than a head of the upcoming one.
+ parser.comments = append(parser.comments, yamlComment{
+ scan_mark: scan_mark,
+ token_mark: token_mark,
+ start_mark: start_mark,
+ end_mark: yamlMark{parser.mark.index + peek, line, column},
+ foot: text,
+ })
+ scan_mark = yamlMark{parser.mark.index + peek, line, column}
+ token_mark = scan_mark
+ text = nil
+ }
+
+ if parser.buffer[parser.buffer_pos+peek] != '#' {
+ break
+ }
+
+ if len(text) == 0 {
+ start_mark = yamlMark{parser.mark.index + peek, line, column}
+ } else {
+ text = append(text, '\n')
+ }
+
+ recent_empty = false
+
+ // Consume until after the consumed comment line.
+ seen := parser.mark.index + peek
+ for {
+ if parser.unread < 1 && !parser.updateBuffer(1) {
+ return false
+ }
+ if isBreakOrZero(parser.buffer, parser.buffer_pos) {
+ if parser.mark.index >= seen {
+ break
+ }
+ if parser.unread < 2 && !parser.updateBuffer(2) {
+ return false
+ }
+ parser.skipLine()
+ } else if parser.mark.index >= seen {
+ text = parser.read(text)
+ } else {
+ parser.skip()
+ }
+ }
+
+ peek = 0
+ column = 0
+ line = parser.mark.line
+ next_indent = parser.indent
+ if next_indent < 0 {
+ next_indent = 0
+ }
+ }
+
+ if len(text) > 0 {
+ parser.comments = append(parser.comments, yamlComment{
+ scan_mark: scan_mark,
+ token_mark: start_mark,
+ start_mark: start_mark,
+ end_mark: yamlMark{parser.mark.index + peek - 1, line, column},
+ head: text,
+ })
+ }
+ return true
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/sorter.go b/hack/tools/vendor/github.com/itchyny/go-yaml/sorter.go
new file mode 100644
index 0000000000..7131bbaec9
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/sorter.go
@@ -0,0 +1,134 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+//
+// 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.
+
+package yaml
+
+import (
+ "reflect"
+ "unicode"
+)
+
+type keyList []reflect.Value
+
+func (l keyList) Len() int { return len(l) }
+func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
+func (l keyList) Less(i, j int) bool {
+ a := l[i]
+ b := l[j]
+ ak := a.Kind()
+ bk := b.Kind()
+ for (ak == reflect.Interface || ak == reflect.Pointer) && !a.IsNil() {
+ a = a.Elem()
+ ak = a.Kind()
+ }
+ for (bk == reflect.Interface || bk == reflect.Pointer) && !b.IsNil() {
+ b = b.Elem()
+ bk = b.Kind()
+ }
+ af, aok := keyFloat(a)
+ bf, bok := keyFloat(b)
+ if aok && bok {
+ if af != bf {
+ return af < bf
+ }
+ if ak != bk {
+ return ak < bk
+ }
+ return numLess(a, b)
+ }
+ if ak != reflect.String || bk != reflect.String {
+ return ak < bk
+ }
+ ar, br := []rune(a.String()), []rune(b.String())
+ digits := false
+ for i := 0; i < len(ar) && i < len(br); i++ {
+ if ar[i] == br[i] {
+ digits = unicode.IsDigit(ar[i])
+ continue
+ }
+ al := unicode.IsLetter(ar[i])
+ bl := unicode.IsLetter(br[i])
+ if al && bl {
+ return ar[i] < br[i]
+ }
+ if al || bl {
+ if digits {
+ return al
+ } else {
+ return bl
+ }
+ }
+ var ai, bi int
+ var an, bn int64
+ if ar[i] == '0' || br[i] == '0' {
+ for j := i - 1; j >= 0 && unicode.IsDigit(ar[j]); j-- {
+ if ar[j] != '0' {
+ an = 1
+ bn = 1
+ break
+ }
+ }
+ }
+ for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
+ an = an*10 + int64(ar[ai]-'0')
+ }
+ for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
+ bn = bn*10 + int64(br[bi]-'0')
+ }
+ if an != bn {
+ return an < bn
+ }
+ if ai != bi {
+ return ai < bi
+ }
+ return ar[i] < br[i]
+ }
+ return len(ar) < len(br)
+}
+
+// keyFloat returns a float value for v if it is a number/bool
+// and whether it is a number/bool or not.
+func keyFloat(v reflect.Value) (f float64, ok bool) {
+ switch v.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return float64(v.Int()), true
+ case reflect.Float32, reflect.Float64:
+ return v.Float(), true
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return float64(v.Uint()), true
+ case reflect.Bool:
+ if v.Bool() {
+ return 1, true
+ }
+ return 0, true
+ }
+ return 0, false
+}
+
+// numLess returns whether a < b.
+// a and b must necessarily have the same kind.
+func numLess(a, b reflect.Value) bool {
+ switch a.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return a.Int() < b.Int()
+ case reflect.Float32, reflect.Float64:
+ return a.Float() < b.Float()
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return a.Uint() < b.Uint()
+ case reflect.Bool:
+ return !a.Bool() && b.Bool()
+ }
+ panic("not a number")
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/writerc.go b/hack/tools/vendor/github.com/itchyny/go-yaml/writerc.go
new file mode 100644
index 0000000000..f7cfb32260
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/writerc.go
@@ -0,0 +1,48 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+// Copyright (c) 2006-2010 Kirill Simonov
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+package yaml
+
+// Set the writer error and return false.
+func (emitter *yamlEmitter) setWriterError(problem string) bool {
+ emitter.error = yaml_WRITER_ERROR
+ emitter.problem = problem
+ return false
+}
+
+// Flush the output buffer.
+func (emitter *yamlEmitter) flush() bool {
+ if emitter.write_handler == nil {
+ panic("write handler not set")
+ }
+
+ // Check if the buffer is empty.
+ if emitter.buffer_pos == 0 {
+ return true
+ }
+
+ if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil {
+ return emitter.setWriterError("write error: " + err.Error())
+ }
+ emitter.buffer_pos = 0
+ return true
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/yaml.go b/hack/tools/vendor/github.com/itchyny/go-yaml/yaml.go
new file mode 100644
index 0000000000..f8b0f2c542
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/yaml.go
@@ -0,0 +1,905 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+//
+// 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.
+
+// Package yaml implements YAML support for the Go language.
+//
+// Source code and other details for the project are available at GitHub:
+//
+// https://github.com/yaml/go-yaml
+package yaml
+
+import (
+ "errors"
+ "fmt"
+ "io"
+ "reflect"
+ "strconv"
+ "strings"
+ "sync"
+ "unicode"
+ "unicode/utf8"
+)
+
+// The Unmarshaler interface may be implemented by types to customize their
+// behavior when being unmarshaled from a YAML document.
+type Unmarshaler interface {
+ UnmarshalYAML(value *Node) error
+}
+
+type obsoleteUnmarshaler interface {
+ UnmarshalYAML(unmarshal func(any) error) error
+}
+
+// The Marshaler interface may be implemented by types to customize their
+// behavior when being marshaled into a YAML document. The returned value
+// is marshaled in place of the original value implementing Marshaler.
+//
+// If an error is returned by MarshalYAML, the marshaling procedure stops
+// and returns with the provided error.
+type Marshaler interface {
+ MarshalYAML() (any, error)
+}
+
+// Unmarshal decodes the first document found within the in byte slice
+// and assigns decoded values into the out value.
+//
+// Maps and pointers (to a struct, string, int, etc) are accepted as out
+// values. If an internal pointer within a struct is not initialized,
+// the yaml package will initialize it if necessary for unmarshalling
+// the provided data. The out parameter must not be nil.
+//
+// The type of the decoded values should be compatible with the respective
+// values in out. If one or more values cannot be decoded due to a type
+// mismatches, decoding continues partially until the end of the YAML
+// content, and a *yaml.TypeError is returned with details for all
+// missed values.
+//
+// Struct fields are only unmarshalled if they are exported (have an
+// upper case first letter), and are unmarshalled using the field name
+// lowercased as the default key. Custom keys may be defined via the
+// "yaml" name in the field tag: the content preceding the first comma
+// is used as the key, and the following comma-separated options are
+// used to tweak the marshaling process (see Marshal).
+// Conflicting names result in a runtime error.
+//
+// For example:
+//
+// type T struct {
+// F int `yaml:"a,omitempty"`
+// B int
+// }
+// var t T
+// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
+//
+// See the documentation of Marshal for the format of tags and a list of
+// supported tag options.
+func Unmarshal(in []byte, out any) (err error) {
+ return unmarshal(in, out, false)
+}
+
+// A Decoder reads and decodes YAML values from an input stream.
+type Decoder struct {
+ parser *parser
+ knownFields bool
+}
+
+// NewDecoder returns a new decoder that reads from r.
+//
+// The decoder introduces its own buffering and may read
+// data from r beyond the YAML values requested.
+func NewDecoder(r io.Reader) *Decoder {
+ return &Decoder{
+ parser: newParserFromReader(r),
+ }
+}
+
+// KnownFields ensures that the keys in decoded mappings to
+// exist as fields in the struct being decoded into.
+func (dec *Decoder) KnownFields(enable bool) {
+ dec.knownFields = enable
+}
+
+// Decode reads the next YAML-encoded value from its input
+// and stores it in the value pointed to by v.
+//
+// See the documentation for Unmarshal for details about the
+// conversion of YAML into a Go value.
+func (dec *Decoder) Decode(v any) (err error) {
+ d := newDecoder()
+ d.knownFields = dec.knownFields
+ defer handleErr(&err)
+ node := dec.parser.parse()
+ if node == nil {
+ return io.EOF
+ }
+ out := reflect.ValueOf(v)
+ if out.Kind() == reflect.Pointer && !out.IsNil() {
+ out = out.Elem()
+ }
+ d.unmarshal(node, out)
+ if len(d.terrors) > 0 {
+ return &TypeError{d.terrors}
+ }
+ return nil
+}
+
+// Decode decodes the node and stores its data into the value pointed to by v.
+//
+// See the documentation for Unmarshal for details about the
+// conversion of YAML into a Go value.
+func (n *Node) Decode(v any) (err error) {
+ d := newDecoder()
+ defer handleErr(&err)
+ out := reflect.ValueOf(v)
+ if out.Kind() == reflect.Pointer && !out.IsNil() {
+ out = out.Elem()
+ }
+ d.unmarshal(n, out)
+ if len(d.terrors) > 0 {
+ return &TypeError{d.terrors}
+ }
+ return nil
+}
+
+func unmarshal(in []byte, out any, strict bool) (err error) {
+ defer handleErr(&err)
+ d := newDecoder()
+ p := newParser(in)
+ defer p.destroy()
+ node := p.parse()
+ if node != nil {
+ v := reflect.ValueOf(out)
+ if v.Kind() == reflect.Pointer && !v.IsNil() {
+ v = v.Elem()
+ }
+ d.unmarshal(node, v)
+ }
+ if len(d.terrors) > 0 {
+ return &TypeError{d.terrors}
+ }
+ return nil
+}
+
+// Marshal serializes the value provided into a YAML document. The structure
+// of the generated document will reflect the structure of the value itself.
+// Maps and pointers (to struct, string, int, etc) are accepted as the in value.
+//
+// Struct fields are only marshaled if they are exported (have an upper case
+// first letter), and are marshaled using the field name lowercased as the
+// default key. Custom keys may be defined via the "yaml" name in the field
+// tag: the content preceding the first comma is used as the key, and the
+// following comma-separated options are used to tweak the marshaling process.
+// Conflicting names result in a runtime error.
+//
+// The field tag format accepted is:
+//
+// `(...) yaml:"[][,[,]]" (...)`
+//
+// The following flags are currently supported:
+//
+// omitempty Only include the field if it's not set to the zero
+// value for the type or to empty slices or maps.
+// Zero valued structs will be omitted if all their public
+// fields are zero, unless they implement an IsZero
+// method (see the IsZeroer interface type), in which
+// case the field will be excluded if IsZero returns true.
+//
+// flow Marshal using a flow style (useful for structs,
+// sequences and maps).
+//
+// inline Inline the field, which must be a struct or a map,
+// causing all of its fields or keys to be processed as if
+// they were part of the outer struct. For maps, keys must
+// not conflict with the yaml keys of other struct fields.
+//
+// In addition, if the key is "-", the field is ignored.
+//
+// For example:
+//
+// type T struct {
+// F int `yaml:"a,omitempty"`
+// B int
+// }
+// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n"
+// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
+func Marshal(in any) (out []byte, err error) {
+ defer handleErr(&err)
+ e := newEncoder()
+ defer e.destroy()
+ e.marshalDoc("", reflect.ValueOf(in))
+ e.finish()
+ out = e.out
+ return
+}
+
+// An Encoder writes YAML values to an output stream.
+type Encoder struct {
+ encoder *encoder
+}
+
+// NewEncoder returns a new encoder that writes to w.
+// The Encoder should be closed after use to flush all data
+// to w.
+func NewEncoder(w io.Writer) *Encoder {
+ return &Encoder{
+ encoder: newEncoderWithWriter(w),
+ }
+}
+
+// Encode writes the YAML encoding of v to the stream.
+// If multiple items are encoded to the stream, the
+// second and subsequent document will be preceded
+// with a "---" document separator, but the first will not.
+//
+// See the documentation for Marshal for details about the conversion of Go
+// values to YAML.
+func (e *Encoder) Encode(v any) (err error) {
+ defer handleErr(&err)
+ e.encoder.marshalDoc("", reflect.ValueOf(v))
+ return nil
+}
+
+// Encode encodes value v and stores its representation in n.
+//
+// See the documentation for Marshal for details about the
+// conversion of Go values into YAML.
+func (n *Node) Encode(v any) (err error) {
+ defer handleErr(&err)
+ e := newEncoder()
+ defer e.destroy()
+ e.marshalDoc("", reflect.ValueOf(v))
+ e.finish()
+ p := newParser(e.out)
+ p.textless = true
+ defer p.destroy()
+ doc := p.parse()
+ *n = *doc.Content[0]
+ return nil
+}
+
+// SetIndent changes the used indentation used when encoding.
+func (e *Encoder) SetIndent(spaces int) {
+ if spaces < 0 {
+ panic("yaml: cannot indent to a negative number of spaces")
+ }
+ e.encoder.indent = spaces
+}
+
+// CompactSeqIndent makes it so that '- ' is considered part of the indentation.
+func (e *Encoder) CompactSeqIndent() {
+ e.encoder.emitter.compact_sequence_indent = true
+}
+
+// DefaultSeqIndent makes it so that '- ' is not considered part of the indentation.
+func (e *Encoder) DefaultSeqIndent() {
+ e.encoder.emitter.compact_sequence_indent = false
+}
+
+// Close closes the encoder by writing any remaining data.
+// It does not write a stream terminating string "...".
+func (e *Encoder) Close() (err error) {
+ defer handleErr(&err)
+ e.encoder.finish()
+ return nil
+}
+
+func handleErr(err *error) {
+ if v := recover(); v != nil {
+ if e, ok := v.(*yamlError); ok {
+ *err = e.err
+ } else {
+ panic(v)
+ }
+ }
+}
+
+type yamlError struct {
+ err error
+}
+
+func fail(err error) {
+ panic(&yamlError{err})
+}
+
+func failf(format string, args ...any) {
+ panic(&yamlError{fmt.Errorf("yaml: "+format, args...)})
+}
+
+// ParserError represents a fatal error encountered during the parsing phase.
+// These errors typically indicate a syntax issue in the YAML document that
+// prevents further processing.
+type ParserError struct {
+ Message string
+ Line int
+ Column int
+ Index int
+}
+
+func (e *ParserError) Error() string {
+ var b strings.Builder
+ b.WriteString("yaml: ")
+ if e.Line != 0 {
+ b.WriteString("line " + strconv.Itoa(e.Line) + ": ")
+ }
+ b.WriteString(e.Message)
+ return b.String()
+}
+
+// UnmarshalError represents a single, non-fatal error that occurred during
+// the unmarshaling of a YAML document into a Go value.
+type UnmarshalError struct {
+ Err error
+ Line int
+ Column int
+ Index int
+}
+
+func (e *UnmarshalError) Error() string {
+ return fmt.Sprintf("line %d: %s", e.Line, e.Err.Error())
+}
+
+func (e *UnmarshalError) Unwrap() error {
+ return e.Err
+}
+
+// A TypeError is returned by Unmarshal when one or more fields in
+// the YAML document cannot be properly decoded into the requested
+// types. When this error is returned, the value is still
+// unmarshaled partially.
+type TypeError struct {
+ Errors []*UnmarshalError
+}
+
+func (e *TypeError) Error() string {
+ var b strings.Builder
+ b.WriteString("yaml: unmarshal errors:")
+ for _, err := range e.Errors {
+ b.WriteString("\n " + err.Error())
+ }
+ return b.String()
+}
+
+// Is checks if the error is equal to any of the errors in the TypeError.
+//
+// [errors.Is] will call this method when unwrapping errors.
+func (e *TypeError) Is(target error) bool {
+ for _, err := range e.Errors {
+ if errors.Is(err, target) {
+ return true
+ }
+
+ // Check if the error is not wrapped in the UnmarshalError.
+ if err != nil && errors.Is(err.Err, target) {
+ return true
+ }
+ }
+ return false
+}
+
+// As checks if the error is equal to any of the errors in the TypeError.
+//
+// [errors.As] will call this method when unwrapping errors.
+func (e *TypeError) As(target any) bool {
+ for _, err := range e.Errors {
+ if errors.As(err, target) {
+ return true
+ }
+ }
+ return false
+}
+
+type Kind uint32
+
+const (
+ DocumentNode Kind = 1 << iota
+ SequenceNode
+ MappingNode
+ ScalarNode
+ AliasNode
+)
+
+type Style uint32
+
+const (
+ TaggedStyle Style = 1 << iota
+ DoubleQuotedStyle
+ SingleQuotedStyle
+ LiteralStyle
+ FoldedStyle
+ FlowStyle
+)
+
+// Node represents an element in the YAML document hierarchy. While documents
+// are typically encoded and decoded into higher level types, such as structs
+// and maps, Node is an intermediate representation that allows detailed
+// control over the content being decoded or encoded.
+//
+// It's worth noting that although Node offers access into details such as
+// line numbers, columns, and comments, the content when re-encoded will not
+// have its original textual representation preserved. An effort is made to
+// render the data pleasantly, and to preserve comments near the data they
+// describe, though.
+//
+// Values that make use of the Node type interact with the yaml package in the
+// same way any other type would do, by encoding and decoding yaml data
+// directly or indirectly into them.
+//
+// For example:
+//
+// var person struct {
+// Name string
+// Address yaml.Node
+// }
+// err := yaml.Unmarshal(data, &person)
+//
+// Or by itself:
+//
+// var person Node
+// err := yaml.Unmarshal(data, &person)
+type Node struct {
+ // Kind defines whether the node is a document, a mapping, a sequence,
+ // a scalar value, or an alias to another node. The specific data type of
+ // scalar nodes may be obtained via the ShortTag and LongTag methods.
+ Kind Kind
+
+ // Style allows customizing the appearance of the node in the tree.
+ Style Style
+
+ // Tag holds the YAML tag defining the data type for the value.
+ // When decoding, this field will always be set to the resolved tag,
+ // even when it wasn't explicitly provided in the YAML content.
+ // When encoding, if this field is unset the value type will be
+ // implied from the node properties, and if it is set, it will only
+ // be serialized into the representation if TaggedStyle is used or
+ // the implicit tag diverges from the provided one.
+ Tag string
+
+ // Value holds the unescaped and unquoted representation of the value.
+ Value string
+
+ // Anchor holds the anchor name for this node, which allows aliases to point to it.
+ Anchor string
+
+ // Alias holds the node that this alias points to. Only valid when Kind is AliasNode.
+ Alias *Node
+
+ // Content holds contained nodes for documents, mappings, and sequences.
+ Content []*Node
+
+ // HeadComment holds any comments in the lines preceding the node and
+ // not separated by an empty line.
+ HeadComment string
+
+ // LineComment holds any comments at the end of the line where the node is in.
+ LineComment string
+
+ // FootComment holds any comments following the node and before empty lines.
+ FootComment string
+
+ // Line, Column and Index hold the node position in the decoded YAML text.
+ // These fields are not respected when encoding the node.
+ Line int
+ Column int
+ Index int
+}
+
+// IsZero returns whether the node has all of its fields unset.
+func (n *Node) IsZero() bool {
+ return n.Kind == 0 && n.Style == 0 && n.Tag == "" && n.Value == "" && n.Anchor == "" && n.Alias == nil && n.Content == nil &&
+ n.HeadComment == "" && n.LineComment == "" && n.FootComment == "" && n.Line == 0 && n.Column == 0
+}
+
+// LongTag returns the long form of the tag that indicates the data type for
+// the node. If the Tag field isn't explicitly defined, one will be computed
+// based on the node properties.
+func (n *Node) LongTag() string {
+ return longTag(n.ShortTag())
+}
+
+// ShortTag returns the short form of the YAML tag that indicates data type for
+// the node. If the Tag field isn't explicitly defined, one will be computed
+// based on the node properties.
+func (n *Node) ShortTag() string {
+ if n.indicatedString() {
+ return strTag
+ }
+ if n.Tag == "" || n.Tag == "!" {
+ switch n.Kind {
+ case MappingNode:
+ return mapTag
+ case SequenceNode:
+ return seqTag
+ case AliasNode:
+ if n.Alias != nil {
+ return n.Alias.ShortTag()
+ }
+ case ScalarNode:
+ tag, _ := resolve("", n.Value)
+ return tag
+ case 0:
+ // Special case to make the zero value convenient.
+ if n.IsZero() {
+ return nullTag
+ }
+ }
+ return ""
+ }
+ return shortTag(n.Tag)
+}
+
+func (n *Node) indicatedString() bool {
+ return n.Kind == ScalarNode &&
+ (shortTag(n.Tag) == strTag ||
+ (n.Tag == "" || n.Tag == "!") && n.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0)
+}
+
+// shouldUseLiteralStyle determines if a string should use literal style.
+// It returns true if the string contains newlines AND meets additional criteria:
+// - is at least 2 characters long
+// - contains at least one non-whitespace character
+func shouldUseLiteralStyle(s string) bool {
+ if !strings.Contains(s, "\n") || len(s) < 2 {
+ return false
+ }
+ // Must contain at least one non-whitespace character
+ for _, r := range s {
+ if !unicode.IsSpace(r) {
+ return true
+ }
+ }
+ return false
+}
+
+// SetString is a convenience function that sets the node to a string value
+// and defines its style in a pleasant way depending on its content.
+func (n *Node) SetString(s string) {
+ n.Kind = ScalarNode
+ if utf8.ValidString(s) {
+ n.Value = s
+ n.Tag = strTag
+ } else {
+ n.Value = encodeBase64(s)
+ n.Tag = binaryTag
+ }
+ if shouldUseLiteralStyle(n.Value) {
+ n.Style = LiteralStyle
+ }
+}
+
+// --------------------------------------------------------------------------
+// Maintain a mapping of keys to structure field indexes
+
+// The code in this section was copied from mgo/bson.
+
+// structInfo holds details for the serialization of fields of
+// a given struct.
+type structInfo struct {
+ FieldsMap map[string]fieldInfo
+ FieldsList []fieldInfo
+
+ // InlineMap is the number of the field in the struct that
+ // contains an ,inline map, or -1 if there's none.
+ InlineMap int
+
+ // InlineUnmarshalers holds indexes to inlined fields that
+ // contain unmarshaler values.
+ InlineUnmarshalers [][]int
+}
+
+type fieldInfo struct {
+ Key string
+ Num int
+ OmitEmpty bool
+ Flow bool
+ // Id holds the unique field identifier, so we can cheaply
+ // check for field duplicates without maintaining an extra map.
+ Id int
+
+ // Inline holds the field index if the field is part of an inlined struct.
+ Inline []int
+}
+
+var (
+ structMap = make(map[reflect.Type]*structInfo)
+ fieldMapMutex sync.RWMutex
+ unmarshalerType reflect.Type
+)
+
+func init() {
+ var v Unmarshaler
+ unmarshalerType = reflect.ValueOf(&v).Elem().Type()
+}
+
+func getStructInfo(st reflect.Type) (*structInfo, error) {
+ fieldMapMutex.RLock()
+ sinfo, found := structMap[st]
+ fieldMapMutex.RUnlock()
+ if found {
+ return sinfo, nil
+ }
+
+ n := st.NumField()
+ fieldsMap := make(map[string]fieldInfo)
+ fieldsList := make([]fieldInfo, 0, n)
+ inlineMap := -1
+ inlineUnmarshalers := [][]int(nil)
+ for i := 0; i != n; i++ {
+ field := st.Field(i)
+ if field.PkgPath != "" && !field.Anonymous {
+ continue // Private field
+ }
+
+ info := fieldInfo{Num: i}
+
+ tag := field.Tag.Get("yaml")
+ if tag == "" && !strings.Contains(string(field.Tag), ":") {
+ tag = string(field.Tag)
+ }
+ if tag == "-" {
+ continue
+ }
+
+ inline := false
+ fields := strings.Split(tag, ",")
+ if len(fields) > 1 {
+ for _, flag := range fields[1:] {
+ switch flag {
+ case "omitempty":
+ info.OmitEmpty = true
+ case "flow":
+ info.Flow = true
+ case "inline":
+ inline = true
+ default:
+ return nil, fmt.Errorf("unsupported flag %q in tag %q of type %s", flag, tag, st)
+ }
+ }
+ tag = fields[0]
+ }
+
+ if inline {
+ switch field.Type.Kind() {
+ case reflect.Map:
+ if inlineMap >= 0 {
+ return nil, errors.New("multiple ,inline maps in struct " + st.String())
+ }
+ if field.Type.Key() != reflect.TypeOf("") {
+ return nil, errors.New("option ,inline needs a map with string keys in struct " + st.String())
+ }
+ inlineMap = info.Num
+ case reflect.Struct, reflect.Pointer:
+ ftype := field.Type
+ for ftype.Kind() == reflect.Pointer {
+ ftype = ftype.Elem()
+ }
+ if ftype.Kind() != reflect.Struct {
+ return nil, errors.New("option ,inline may only be used on a struct or map field")
+ }
+ if reflect.PointerTo(ftype).Implements(unmarshalerType) {
+ inlineUnmarshalers = append(inlineUnmarshalers, []int{i})
+ } else {
+ sinfo, err := getStructInfo(ftype)
+ if err != nil {
+ return nil, err
+ }
+ for _, index := range sinfo.InlineUnmarshalers {
+ inlineUnmarshalers = append(inlineUnmarshalers, append([]int{i}, index...))
+ }
+ for _, finfo := range sinfo.FieldsList {
+ if _, found := fieldsMap[finfo.Key]; found {
+ msg := "duplicated key '" + finfo.Key + "' in struct " + st.String()
+ return nil, errors.New(msg)
+ }
+ if finfo.Inline == nil {
+ finfo.Inline = []int{i, finfo.Num}
+ } else {
+ finfo.Inline = append([]int{i}, finfo.Inline...)
+ }
+ finfo.Id = len(fieldsList)
+ fieldsMap[finfo.Key] = finfo
+ fieldsList = append(fieldsList, finfo)
+ }
+ }
+ default:
+ return nil, errors.New("option ,inline may only be used on a struct or map field")
+ }
+ continue
+ }
+
+ if tag != "" {
+ info.Key = tag
+ } else {
+ info.Key = strings.ToLower(field.Name)
+ }
+
+ if _, found = fieldsMap[info.Key]; found {
+ msg := "duplicated key '" + info.Key + "' in struct " + st.String()
+ return nil, errors.New(msg)
+ }
+
+ info.Id = len(fieldsList)
+ fieldsList = append(fieldsList, info)
+ fieldsMap[info.Key] = info
+ }
+
+ sinfo = &structInfo{
+ FieldsMap: fieldsMap,
+ FieldsList: fieldsList,
+ InlineMap: inlineMap,
+ InlineUnmarshalers: inlineUnmarshalers,
+ }
+
+ fieldMapMutex.Lock()
+ structMap[st] = sinfo
+ fieldMapMutex.Unlock()
+ return sinfo, nil
+}
+
+// IsZeroer is used to check whether an object is zero to
+// determine whether it should be omitted when marshaling
+// with the omitempty flag. One notable implementation
+// is time.Time.
+type IsZeroer interface {
+ IsZero() bool
+}
+
+func isZero(v reflect.Value) bool {
+ kind := v.Kind()
+ if z, ok := v.Interface().(IsZeroer); ok {
+ if (kind == reflect.Pointer || kind == reflect.Interface) && v.IsNil() {
+ return true
+ }
+ return z.IsZero()
+ }
+ switch kind {
+ case reflect.String:
+ return len(v.String()) == 0
+ case reflect.Interface, reflect.Pointer:
+ return v.IsNil()
+ case reflect.Slice:
+ return v.Len() == 0
+ case reflect.Map:
+ return v.Len() == 0
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return v.Int() == 0
+ case reflect.Float32, reflect.Float64:
+ return v.Float() == 0
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return v.Uint() == 0
+ case reflect.Bool:
+ return !v.Bool()
+ case reflect.Struct:
+ vt := v.Type()
+ for i := v.NumField() - 1; i >= 0; i-- {
+ if vt.Field(i).PkgPath != "" {
+ continue // Private field
+ }
+ if !isZero(v.Field(i)) {
+ return false
+ }
+ }
+ return true
+ }
+ return false
+}
+
+// ParserGetEvents parses the YAML input and returns the generated event stream.
+func ParserGetEvents(in []byte) (string, error) {
+ p := newParser(in)
+ defer p.destroy()
+ var events strings.Builder
+ var event yamlEvent
+ for {
+ if !p.parser.parse(&event) {
+ return "", errors.New(p.parser.problem)
+ }
+ formatted := formatEvent(&event)
+ events.WriteString(formatted)
+ if event.typ == yaml_STREAM_END_EVENT {
+ event.delete()
+ break
+ }
+ event.delete()
+ events.WriteByte('\n')
+ }
+ return events.String(), nil
+}
+
+func formatEvent(e *yamlEvent) string {
+ var b strings.Builder
+ switch e.typ {
+ case yaml_STREAM_START_EVENT:
+ b.WriteString("+STR")
+ case yaml_STREAM_END_EVENT:
+ b.WriteString("-STR")
+ case yaml_DOCUMENT_START_EVENT:
+ b.WriteString("+DOC")
+ if !e.implicit {
+ b.WriteString(" ---")
+ }
+ case yaml_DOCUMENT_END_EVENT:
+ b.WriteString("-DOC")
+ if !e.implicit {
+ b.WriteString(" ...")
+ }
+ case yaml_ALIAS_EVENT:
+ b.WriteString("=ALI *")
+ b.Write(e.anchor)
+ case yaml_SCALAR_EVENT:
+ b.WriteString("=VAL")
+ if len(e.anchor) > 0 {
+ b.WriteString(" &")
+ b.Write(e.anchor)
+ }
+ if len(e.tag) > 0 {
+ b.WriteString(" <")
+ b.Write(e.tag)
+ b.WriteString(">")
+ }
+ switch e.scalarStyle() {
+ case yaml_PLAIN_SCALAR_STYLE:
+ b.WriteString(" :")
+ case yaml_LITERAL_SCALAR_STYLE:
+ b.WriteString(" |")
+ case yaml_FOLDED_SCALAR_STYLE:
+ b.WriteString(" >")
+ case yaml_SINGLE_QUOTED_SCALAR_STYLE:
+ b.WriteString(" '")
+ case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
+ b.WriteString(` "`)
+ }
+ // Escape special characters for consistent event output.
+ val := strings.NewReplacer(
+ `\`, `\\`,
+ "\n", `\n`,
+ "\t", `\t`,
+ ).Replace(string(e.value))
+ b.WriteString(val)
+
+ case yaml_SEQUENCE_START_EVENT:
+ b.WriteString("+SEQ")
+ if len(e.anchor) > 0 {
+ b.WriteString(" &")
+ b.Write(e.anchor)
+ }
+ if len(e.tag) > 0 {
+ b.WriteString(" <")
+ b.Write(e.tag)
+ b.WriteString(">")
+ }
+ if e.sequenceStyle() == yaml_FLOW_SEQUENCE_STYLE {
+ b.WriteString(" []")
+ }
+ case yaml_SEQUENCE_END_EVENT:
+ b.WriteString("-SEQ")
+ case yaml_MAPPING_START_EVENT:
+ b.WriteString("+MAP")
+ if len(e.anchor) > 0 {
+ b.WriteString(" &")
+ b.Write(e.anchor)
+ }
+ if len(e.tag) > 0 {
+ b.WriteString(" <")
+ b.Write(e.tag)
+ b.WriteString(">")
+ }
+ if e.mappingStyle() == yaml_FLOW_MAPPING_STYLE {
+ b.WriteString(" {}")
+ }
+ case yaml_MAPPING_END_EVENT:
+ b.WriteString("-MAP")
+ }
+ return b.String()
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/yamlh.go b/hack/tools/vendor/github.com/itchyny/go-yaml/yamlh.go
new file mode 100644
index 0000000000..8efe560ee2
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/yamlh.go
@@ -0,0 +1,804 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+// Copyright (c) 2006-2010 Kirill Simonov
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+package yaml
+
+import (
+ "fmt"
+ "io"
+)
+
+// The version directive data.
+type yamlVersionDirective struct {
+ major int8 // The major version number.
+ minor int8 // The minor version number.
+}
+
+// The tag directive data.
+type yamlTagDirective struct {
+ handle []byte // The tag handle.
+ prefix []byte // The tag prefix.
+}
+
+type yamlEncoding int
+
+// The stream encoding.
+const (
+ // Let the parser choose the encoding.
+ yaml_ANY_ENCODING yamlEncoding = iota
+
+ yaml_UTF8_ENCODING // The default UTF-8 encoding.
+ yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM.
+ yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM.
+)
+
+type yamlLineBreak int
+
+// Line break types.
+const (
+ // Let the parser choose the break type.
+ yaml_ANY_BREAK yamlLineBreak = iota
+
+ yaml_CR_BREAK // Use CR for line breaks (Mac style).
+ yaml_LN_BREAK // Use LN for line breaks (Unix style).
+ yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style).
+)
+
+type yamlErrorType int
+
+// Many bad things could happen with the parser and emitter.
+const (
+ // No error is produced.
+ yaml_NO_ERROR yamlErrorType = iota
+
+ yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory.
+ yaml_READER_ERROR // Cannot read or decode the input stream.
+ yaml_SCANNER_ERROR // Cannot scan the input stream.
+ yaml_PARSER_ERROR // Cannot parse the input stream.
+ yaml_COMPOSER_ERROR // Cannot compose a YAML document.
+ yaml_WRITER_ERROR // Cannot write to the output stream.
+ yaml_EMITTER_ERROR // Cannot emit a YAML stream.
+)
+
+// The pointer position.
+type yamlMark struct {
+ index int // The position index.
+ line int // The position line.
+ column int // The position column.
+}
+
+// Node Styles
+
+type yamlStyle int8
+
+type yamlScalarStyle yamlStyle
+
+// Scalar styles.
+const (
+ // Let the emitter choose the style.
+ yaml_ANY_SCALAR_STYLE yamlScalarStyle = 0
+
+ yaml_PLAIN_SCALAR_STYLE yamlScalarStyle = 1 << iota // The plain scalar style.
+ yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style.
+ yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style.
+ yaml_LITERAL_SCALAR_STYLE // The literal scalar style.
+ yaml_FOLDED_SCALAR_STYLE // The folded scalar style.
+)
+
+type yamlSequenceStyle yamlStyle
+
+// Sequence styles.
+const (
+ // Let the emitter choose the style.
+ yaml_ANY_SEQUENCE_STYLE yamlSequenceStyle = iota
+
+ yaml_BLOCK_SEQUENCE_STYLE // The block sequence style.
+ yaml_FLOW_SEQUENCE_STYLE // The flow sequence style.
+)
+
+type yamlMappingStyle yamlStyle
+
+// Mapping styles.
+const (
+ // Let the emitter choose the style.
+ yaml_ANY_MAPPING_STYLE yamlMappingStyle = iota
+
+ yaml_BLOCK_MAPPING_STYLE // The block mapping style.
+ yaml_FLOW_MAPPING_STYLE // The flow mapping style.
+)
+
+// Tokens
+
+type yamlTokenType int
+
+// Token types.
+const (
+ // An empty token.
+ yaml_NO_TOKEN yamlTokenType = iota
+
+ yaml_STREAM_START_TOKEN // A STREAM-START token.
+ yaml_STREAM_END_TOKEN // A STREAM-END token.
+
+ yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token.
+ yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token.
+ yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token.
+ yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token.
+
+ yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token.
+ yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token.
+ yaml_BLOCK_END_TOKEN // A BLOCK-END token.
+
+ yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token.
+ yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token.
+ yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token.
+ yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token.
+
+ yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token.
+ yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token.
+ yaml_KEY_TOKEN // A KEY token.
+ yaml_VALUE_TOKEN // A VALUE token.
+
+ yaml_ALIAS_TOKEN // An ALIAS token.
+ yaml_ANCHOR_TOKEN // An ANCHOR token.
+ yaml_TAG_TOKEN // A TAG token.
+ yaml_SCALAR_TOKEN // A SCALAR token.
+)
+
+func (tt yamlTokenType) String() string {
+ switch tt {
+ case yaml_NO_TOKEN:
+ return "yaml_NO_TOKEN"
+ case yaml_STREAM_START_TOKEN:
+ return "yaml_STREAM_START_TOKEN"
+ case yaml_STREAM_END_TOKEN:
+ return "yaml_STREAM_END_TOKEN"
+ case yaml_VERSION_DIRECTIVE_TOKEN:
+ return "yaml_VERSION_DIRECTIVE_TOKEN"
+ case yaml_TAG_DIRECTIVE_TOKEN:
+ return "yaml_TAG_DIRECTIVE_TOKEN"
+ case yaml_DOCUMENT_START_TOKEN:
+ return "yaml_DOCUMENT_START_TOKEN"
+ case yaml_DOCUMENT_END_TOKEN:
+ return "yaml_DOCUMENT_END_TOKEN"
+ case yaml_BLOCK_SEQUENCE_START_TOKEN:
+ return "yaml_BLOCK_SEQUENCE_START_TOKEN"
+ case yaml_BLOCK_MAPPING_START_TOKEN:
+ return "yaml_BLOCK_MAPPING_START_TOKEN"
+ case yaml_BLOCK_END_TOKEN:
+ return "yaml_BLOCK_END_TOKEN"
+ case yaml_FLOW_SEQUENCE_START_TOKEN:
+ return "yaml_FLOW_SEQUENCE_START_TOKEN"
+ case yaml_FLOW_SEQUENCE_END_TOKEN:
+ return "yaml_FLOW_SEQUENCE_END_TOKEN"
+ case yaml_FLOW_MAPPING_START_TOKEN:
+ return "yaml_FLOW_MAPPING_START_TOKEN"
+ case yaml_FLOW_MAPPING_END_TOKEN:
+ return "yaml_FLOW_MAPPING_END_TOKEN"
+ case yaml_BLOCK_ENTRY_TOKEN:
+ return "yaml_BLOCK_ENTRY_TOKEN"
+ case yaml_FLOW_ENTRY_TOKEN:
+ return "yaml_FLOW_ENTRY_TOKEN"
+ case yaml_KEY_TOKEN:
+ return "yaml_KEY_TOKEN"
+ case yaml_VALUE_TOKEN:
+ return "yaml_VALUE_TOKEN"
+ case yaml_ALIAS_TOKEN:
+ return "yaml_ALIAS_TOKEN"
+ case yaml_ANCHOR_TOKEN:
+ return "yaml_ANCHOR_TOKEN"
+ case yaml_TAG_TOKEN:
+ return "yaml_TAG_TOKEN"
+ case yaml_SCALAR_TOKEN:
+ return "yaml_SCALAR_TOKEN"
+ }
+ return ""
+}
+
+// The token structure.
+type yamlToken struct {
+ // The token type.
+ typ yamlTokenType
+
+ // The start/end of the token.
+ start_mark, end_mark yamlMark
+
+ // The stream encoding (for yaml_STREAM_START_TOKEN).
+ encoding yamlEncoding
+
+ // The alias/anchor/scalar value or tag/tag directive handle
+ // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN).
+ value []byte
+
+ // The tag suffix (for yaml_TAG_TOKEN).
+ suffix []byte
+
+ // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN).
+ prefix []byte
+
+ // The scalar style (for yaml_SCALAR_TOKEN).
+ style yamlScalarStyle
+
+ // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN).
+ major, minor int8
+}
+
+// Events
+
+type yamlEventType int8
+
+// Event types.
+const (
+ // An empty event.
+ yaml_NO_EVENT yamlEventType = iota
+
+ yaml_STREAM_START_EVENT // A STREAM-START event.
+ yaml_STREAM_END_EVENT // A STREAM-END event.
+ yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event.
+ yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event.
+ yaml_ALIAS_EVENT // An ALIAS event.
+ yaml_SCALAR_EVENT // A SCALAR event.
+ yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event.
+ yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event.
+ yaml_MAPPING_START_EVENT // A MAPPING-START event.
+ yaml_MAPPING_END_EVENT // A MAPPING-END event.
+ yaml_TAIL_COMMENT_EVENT
+)
+
+var eventStrings = []string{
+ yaml_NO_EVENT: "none",
+ yaml_STREAM_START_EVENT: "stream start",
+ yaml_STREAM_END_EVENT: "stream end",
+ yaml_DOCUMENT_START_EVENT: "document start",
+ yaml_DOCUMENT_END_EVENT: "document end",
+ yaml_ALIAS_EVENT: "alias",
+ yaml_SCALAR_EVENT: "scalar",
+ yaml_SEQUENCE_START_EVENT: "sequence start",
+ yaml_SEQUENCE_END_EVENT: "sequence end",
+ yaml_MAPPING_START_EVENT: "mapping start",
+ yaml_MAPPING_END_EVENT: "mapping end",
+ yaml_TAIL_COMMENT_EVENT: "tail comment",
+}
+
+func (e yamlEventType) String() string {
+ if e < 0 || int(e) >= len(eventStrings) {
+ return fmt.Sprintf("unknown event %d", e)
+ }
+ return eventStrings[e]
+}
+
+// The event structure.
+type yamlEvent struct {
+ // The event type.
+ typ yamlEventType
+
+ // The start and end of the event.
+ start_mark, end_mark yamlMark
+
+ // The document encoding (for yaml_STREAM_START_EVENT).
+ encoding yamlEncoding
+
+ // The version directive (for yaml_DOCUMENT_START_EVENT).
+ version_directive *yamlVersionDirective
+
+ // The list of tag directives (for yaml_DOCUMENT_START_EVENT).
+ tag_directives []yamlTagDirective
+
+ // The comments
+ head_comment []byte
+ line_comment []byte
+ foot_comment []byte
+ tail_comment []byte
+
+ // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT).
+ anchor []byte
+
+ // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
+ tag []byte
+
+ // The scalar value (for yaml_SCALAR_EVENT).
+ value []byte
+
+ // Is the document start/end indicator implicit, or the tag optional?
+ // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT).
+ implicit bool
+
+ // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT).
+ quoted_implicit bool
+
+ // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
+ style yamlStyle
+}
+
+func (e *yamlEvent) scalarStyle() yamlScalarStyle { return yamlScalarStyle(e.style) }
+func (e *yamlEvent) sequenceStyle() yamlSequenceStyle { return yamlSequenceStyle(e.style) }
+func (e *yamlEvent) mappingStyle() yamlMappingStyle { return yamlMappingStyle(e.style) }
+
+// Nodes
+
+const (
+ yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null.
+ yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false.
+ yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values.
+ yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values.
+ yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values.
+ yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values.
+
+ yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences.
+ yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping.
+
+ // Not in original libyaml.
+ yaml_BINARY_TAG = "tag:yaml.org,2002:binary"
+ yaml_MERGE_TAG = "tag:yaml.org,2002:merge"
+
+ yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str.
+ yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq.
+ yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map.
+)
+
+type yamlNodeType int
+
+// Node types.
+const (
+ // An empty node.
+ yaml_NO_NODE yamlNodeType = iota
+
+ yaml_SCALAR_NODE // A scalar node.
+ yaml_SEQUENCE_NODE // A sequence node.
+ yaml_MAPPING_NODE // A mapping node.
+)
+
+// An element of a sequence node.
+type yamlNodeItem int
+
+// An element of a mapping node.
+type yamlNodePair struct {
+ key int // The key of the element.
+ value int // The value of the element.
+}
+
+// The node structure.
+type yamlNode struct {
+ typ yamlNodeType // The node type.
+ tag []byte // The node tag.
+
+ // The node data.
+
+ // The scalar parameters (for yaml_SCALAR_NODE).
+ scalar struct {
+ value []byte // The scalar value.
+ length int // The length of the scalar value.
+ style yamlScalarStyle // The scalar style.
+ }
+
+ // The sequence parameters (for YAML_SEQUENCE_NODE).
+ sequence struct {
+ items_data []yamlNodeItem // The stack of sequence items.
+ style yamlSequenceStyle // The sequence style.
+ }
+
+ // The mapping parameters (for yaml_MAPPING_NODE).
+ mapping struct {
+ pairs_data []yamlNodePair // The stack of mapping pairs (key, value).
+ pairs_start *yamlNodePair // The beginning of the stack.
+ pairs_end *yamlNodePair // The end of the stack.
+ pairs_top *yamlNodePair // The top of the stack.
+ style yamlMappingStyle // The mapping style.
+ }
+
+ start_mark yamlMark // The beginning of the node.
+ end_mark yamlMark // The end of the node.
+}
+
+// The document structure.
+type yamlDocument struct {
+ // The document nodes.
+ nodes []yamlNode
+
+ // The version directive.
+ version_directive *yamlVersionDirective
+
+ // The list of tag directives.
+ tag_directives_data []yamlTagDirective
+ tag_directives_start int // The beginning of the tag directives list.
+ tag_directives_end int // The end of the tag directives list.
+
+ start_implicit int // Is the document start indicator implicit?
+ end_implicit int // Is the document end indicator implicit?
+
+ // The start/end of the document.
+ start_mark, end_mark yamlMark
+}
+
+// The prototype of a read handler.
+//
+// The read handler is called when the parser needs to read more bytes from the
+// source. The handler should write not more than size bytes to the buffer.
+// The number of written bytes should be set to the size_read variable.
+//
+// [in,out] data A pointer to an application data specified by
+//
+// yamlParser.setInput().
+//
+// [out] buffer The buffer to write the data from the source.
+// [in] size The size of the buffer.
+// [out] size_read The actual number of bytes read from the source.
+//
+// On success, the handler should return 1. If the handler failed,
+// the returned value should be 0. On EOF, the handler should set the
+// size_read to 0 and return 1.
+type yamlReadHandler func(parser *yamlParser, buffer []byte) (n int, err error)
+
+// This structure holds information about a potential simple key.
+type yamlSimpleKey struct {
+ possible bool // Is a simple key possible?
+ required bool // Is a simple key required?
+ token_number int // The number of the token.
+ mark yamlMark // The position mark.
+}
+
+// The states of the parser.
+type yamlParserState int
+
+const (
+ yaml_PARSE_STREAM_START_STATE yamlParserState = iota
+
+ yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document.
+ yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START.
+ yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document.
+ yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END.
+ yaml_PARSE_BLOCK_NODE_STATE // Expect a block node.
+ yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence.
+ yaml_PARSE_FLOW_NODE_STATE // Expect a flow node.
+ yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence.
+ yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence.
+ yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence.
+ yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping.
+ yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key.
+ yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value.
+ yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry.
+ yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping.
+ yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping.
+ yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping.
+ yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping.
+ yaml_PARSE_END_STATE // Expect nothing.
+)
+
+func (ps yamlParserState) String() string {
+ switch ps {
+ case yaml_PARSE_STREAM_START_STATE:
+ return "yaml_PARSE_STREAM_START_STATE"
+ case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
+ return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE"
+ case yaml_PARSE_DOCUMENT_START_STATE:
+ return "yaml_PARSE_DOCUMENT_START_STATE"
+ case yaml_PARSE_DOCUMENT_CONTENT_STATE:
+ return "yaml_PARSE_DOCUMENT_CONTENT_STATE"
+ case yaml_PARSE_DOCUMENT_END_STATE:
+ return "yaml_PARSE_DOCUMENT_END_STATE"
+ case yaml_PARSE_BLOCK_NODE_STATE:
+ return "yaml_PARSE_BLOCK_NODE_STATE"
+ case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
+ return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE"
+ case yaml_PARSE_FLOW_NODE_STATE:
+ return "yaml_PARSE_FLOW_NODE_STATE"
+ case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
+ return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE"
+ case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
+ return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE"
+ case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
+ return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE"
+ case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
+ return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE"
+ case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
+ return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE"
+ case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
+ return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE"
+ case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE"
+ case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_KEY_STATE"
+ case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE"
+ case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE"
+ case yaml_PARSE_END_STATE:
+ return "yaml_PARSE_END_STATE"
+ }
+ return ""
+}
+
+// This structure holds aliases data.
+type yamlAliasData struct {
+ anchor []byte // The anchor.
+ index int // The node id.
+ mark yamlMark // The anchor mark.
+}
+
+// The parser structure.
+//
+// All members are internal.
+type yamlParser struct {
+ // Error handling
+
+ error yamlErrorType // Error type.
+
+ problem string // Error description.
+
+ // The byte about which the problem occurred.
+ problem_offset int
+ problem_value int
+ problem_mark yamlMark
+
+ // The error context.
+ context string
+ context_mark yamlMark
+
+ // Reader stuff
+
+ read_handler yamlReadHandler // Read handler.
+
+ input_reader io.Reader // File input data.
+ input []byte // String input data.
+ input_pos int
+
+ eof bool // EOF flag
+
+ buffer []byte // The working buffer.
+ buffer_pos int // The current position of the buffer.
+
+ unread int // The number of unread characters in the buffer.
+
+ newlines int // The number of line breaks since last non-break/non-blank character
+
+ raw_buffer []byte // The raw buffer.
+ raw_buffer_pos int // The current position of the buffer.
+
+ encoding yamlEncoding // The input encoding.
+
+ offset int // The offset of the current position (in bytes).
+ mark yamlMark // The mark of the current position.
+
+ // Comments
+
+ head_comment []byte // The current head comments
+ line_comment []byte // The current line comments
+ foot_comment []byte // The current foot comments
+ tail_comment []byte // Foot comment that happens at the end of a block.
+ stem_comment []byte // Comment in item preceding a nested structure (list inside list item, etc)
+
+ comments []yamlComment // The folded comments for all parsed tokens
+ comments_head int
+
+ // Scanner stuff
+
+ stream_start_produced bool // Have we started to scan the input stream?
+ stream_end_produced bool // Have we reached the end of the input stream?
+
+ flow_level int // The number of unclosed '[' and '{' indicators.
+
+ tokens []yamlToken // The tokens queue.
+ tokens_head int // The head of the tokens queue.
+ tokens_parsed int // The number of tokens fetched from the queue.
+ token_available bool // Does the tokens queue contain a token ready for dequeueing.
+
+ indent int // The current indentation level.
+ indents []int // The indentation levels stack.
+
+ simple_key_allowed bool // May a simple key occur at the current position?
+ simple_keys []yamlSimpleKey // The stack of simple keys.
+ simple_keys_by_tok map[int]int // possible simple_key indexes indexed by token_number
+
+ // Parser stuff
+
+ state yamlParserState // The current parser state.
+ states []yamlParserState // The parser states stack.
+ marks []yamlMark // The stack of marks.
+ tag_directives []yamlTagDirective // The list of TAG directives.
+
+ // Dumper stuff
+
+ aliases []yamlAliasData // The alias data.
+
+ document *yamlDocument // The currently parsed document.
+}
+
+type yamlComment struct {
+ scan_mark yamlMark // Position where scanning for comments started
+ token_mark yamlMark // Position after which tokens will be associated with this comment
+ start_mark yamlMark // Position of '#' comment mark
+ end_mark yamlMark // Position where comment terminated
+
+ head []byte
+ line []byte
+ foot []byte
+}
+
+// Emitter Definitions
+
+// The prototype of a write handler.
+//
+// The write handler is called when the emitter needs to flush the accumulated
+// characters to the output. The handler should write @a size bytes of the
+// @a buffer to the output.
+//
+// @param[in,out] data A pointer to an application data specified by
+//
+// yamlEmitter.setOutput().
+//
+// @param[in] buffer The buffer with bytes to be written.
+// @param[in] size The size of the buffer.
+//
+// @returns On success, the handler should return @c 1. If the handler failed,
+// the returned value should be @c 0.
+type yamlWriteHandler func(emitter *yamlEmitter, buffer []byte) error
+
+type yamlEmitterState int
+
+// The emitter states.
+const (
+ // Expect STREAM-START.
+ yaml_EMIT_STREAM_START_STATE yamlEmitterState = iota
+
+ yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END.
+ yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END.
+ yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document.
+ yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END.
+ yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence.
+ yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE // Expect the next item of a flow sequence, with the comma already written out
+ yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence.
+ yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping.
+ yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE // Expect the next key of a flow mapping, with the comma already written out
+ yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping.
+ yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping.
+ yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping.
+ yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence.
+ yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence.
+ yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping.
+ yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping.
+ yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping.
+ yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping.
+ yaml_EMIT_END_STATE // Expect nothing.
+)
+
+// The emitter structure.
+//
+// All members are internal.
+type yamlEmitter struct {
+ // Error handling
+
+ error yamlErrorType // Error type.
+ problem string // Error description.
+
+ // Writer stuff
+
+ write_handler yamlWriteHandler // Write handler.
+
+ output_buffer *[]byte // String output data.
+ output_writer io.Writer // File output data.
+
+ buffer []byte // The working buffer.
+ buffer_pos int // The current position of the buffer.
+
+ raw_buffer []byte // The raw buffer.
+ raw_buffer_pos int // The current position of the buffer.
+
+ encoding yamlEncoding // The stream encoding.
+
+ // Emitter stuff
+
+ canonical bool // If the output is in the canonical style?
+ best_indent int // The number of indentation spaces.
+ best_width int // The preferred width of the output lines.
+ unicode bool // Allow unescaped non-ASCII characters?
+ line_break yamlLineBreak // The preferred line break.
+
+ state yamlEmitterState // The current emitter state.
+ states []yamlEmitterState // The stack of states.
+
+ events []yamlEvent // The event queue.
+ events_head int // The head of the event queue.
+
+ indents []int // The stack of indentation levels.
+
+ tag_directives []yamlTagDirective // The list of tag directives.
+
+ indent int // The current indentation level.
+
+ compact_sequence_indent bool // Is '- ' is considered part of the indentation for sequence elements?
+
+ flow_level int // The current flow level.
+
+ root_context bool // Is it the document root context?
+ sequence_context bool // Is it a sequence context?
+ mapping_context bool // Is it a mapping context?
+ simple_key_context bool // Is it a simple mapping key context?
+
+ line int // The current line.
+ column int // The current column.
+ whitespace bool // If the last character was a whitespace?
+ indention bool // If the last character was an indentation character (' ', '-', '?', ':')?
+ open_ended bool // If an explicit document end is required?
+
+ space_above bool // Is there's an empty line above?
+ foot_indent int // The indent used to write the foot comment above, or -1 if none.
+
+ // Anchor analysis.
+ anchor_data struct {
+ anchor []byte // The anchor value.
+ alias bool // Is it an alias?
+ }
+
+ // Tag analysis.
+ tag_data struct {
+ handle []byte // The tag handle.
+ suffix []byte // The tag suffix.
+ }
+
+ // Scalar analysis.
+ scalar_data struct {
+ value []byte // The scalar value.
+ multiline bool // Does the scalar contain line breaks?
+ flow_plain_allowed bool // Can the scalar be expressed in the flow plain style?
+ block_plain_allowed bool // Can the scalar be expressed in the block plain style?
+ single_quoted_allowed bool // Can the scalar be expressed in the single quoted style?
+ block_allowed bool // Can the scalar be expressed in the literal or folded styles?
+ style yamlScalarStyle // The output style.
+ }
+
+ // Comments
+ head_comment []byte
+ line_comment []byte
+ foot_comment []byte
+ tail_comment []byte
+
+ key_line_comment []byte
+
+ // Dumper stuff
+
+ opened bool // If the stream was already opened?
+ closed bool // If the stream was already closed?
+
+ // The information associated with the document nodes.
+ anchors *struct {
+ references int // The number of references.
+ anchor int // The anchor id.
+ serialized bool // If the node has been emitted?
+ }
+
+ last_anchor_id int // The last assigned anchor id.
+
+ document *yamlDocument // The currently emitted document.
+}
diff --git a/hack/tools/vendor/github.com/itchyny/go-yaml/yamlprivateh.go b/hack/tools/vendor/github.com/itchyny/go-yaml/yamlprivateh.go
new file mode 100644
index 0000000000..58b9a4ee94
--- /dev/null
+++ b/hack/tools/vendor/github.com/itchyny/go-yaml/yamlprivateh.go
@@ -0,0 +1,224 @@
+//
+// Copyright (c) 2011-2019 Canonical Ltd
+// Copyright (c) 2006-2010 Kirill Simonov
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+// of the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+package yaml
+
+const (
+ // The size of the input raw buffer.
+ input_raw_buffer_size = 512
+
+ // The size of the input buffer.
+ // It should be possible to decode the whole raw buffer.
+ input_buffer_size = input_raw_buffer_size * 3
+
+ // The size of the output buffer.
+ output_buffer_size = 128
+
+ // The size of the output raw buffer.
+ // It should be possible to encode the whole output buffer.
+ output_raw_buffer_size = (output_buffer_size*2 + 2)
+
+ // The size of other stacks and queues.
+ initial_stack_size = 16
+ initial_queue_size = 16
+ initial_string_size = 16
+)
+
+// Check if the character at the specified position is an alphabetical
+// character, a digit, '_', or '-'.
+func isAlpha(b []byte, i int) bool {
+ return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' ||
+ b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-'
+}
+
+// Check if the character at the specified position is a flow indicator as
+// defined by spec production [23] c-flow-indicator ::=
+// c-collect-entry | c-sequence-start | c-sequence-end |
+// c-mapping-start | c-mapping-end
+func isFlowIndicator(b []byte, i int) bool {
+ return b[i] == '[' || b[i] == ']' ||
+ b[i] == '{' || b[i] == '}' || b[i] == ','
+}
+
+// Check if the character at the specified position is valid for anchor names
+// as defined by spec production [102] ns-anchor-char ::= ns-char -
+// c-flow-indicator.
+// This includes all printable characters except: CR, LF, BOM, space, tab, '[',
+// ']', '{', '}', ','.
+// We further limit it to ascii chars only, which is a subset of the spec
+// production but is usually what most people expect.
+func isAnchorChar(b []byte, i int) bool {
+ return isPrintable(b, i) &&
+ !isLineBreak(b, i) &&
+ !isBlank(b, i) &&
+ !isBOM(b, i) &&
+ !isFlowIndicator(b, i) &&
+ isASCII(b, i)
+}
+
+// Check if the character at the specified position is a digit.
+func isDigit(b []byte, i int) bool {
+ return b[i] >= '0' && b[i] <= '9'
+}
+
+// Get the value of a digit.
+func asDigit(b []byte, i int) int {
+ return int(b[i]) - '0'
+}
+
+// Check if the character at the specified position is a hex-digit.
+func isHex(b []byte, i int) bool {
+ return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' ||
+ b[i] >= 'a' && b[i] <= 'f'
+}
+
+// Get the value of a hex-digit.
+func asHex(b []byte, i int) int {
+ bi := b[i]
+ if bi >= 'A' && bi <= 'F' {
+ return int(bi) - 'A' + 10
+ }
+ if bi >= 'a' && bi <= 'f' {
+ return int(bi) - 'a' + 10
+ }
+ return int(bi) - '0'
+}
+
+// Check if the character is ASCII.
+func isASCII(b []byte, i int) bool {
+ return b[i] <= 0x7F
+}
+
+// Check if the character at the start of the buffer can be printed unescaped.
+func isPrintable(b []byte, i int) bool {
+ return ((b[i] == 0x0A) || // . == #x0A
+ (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E
+ (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF
+ (b[i] > 0xC2 && b[i] < 0xED) ||
+ (b[i] == 0xED && b[i+1] < 0xA0) ||
+ (b[i] == 0xEE) ||
+ (b[i] == 0xEF && // #xE000 <= . <= #xFFFD
+ !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF
+ !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF))))
+}
+
+// Check if the character at the specified position is NUL.
+func isZeroChar(b []byte, i int) bool {
+ return b[i] == 0x00
+}
+
+// Check if the beginning of the buffer is a BOM.
+func isBOM(b []byte, i int) bool {
+ return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF
+}
+
+// Check if the character at the specified position is space.
+func isSpace(b []byte, i int) bool {
+ return b[i] == ' '
+}
+
+// Check if the character at the specified position is tab.
+func isTab(b []byte, i int) bool {
+ return b[i] == '\t'
+}
+
+// Check if the character at the specified position is blank (space or tab).
+func isBlank(b []byte, i int) bool {
+ // return isSpace(b, i) || isTab(b, i)
+ return b[i] == ' ' || b[i] == '\t'
+}
+
+// Check if the character at the specified position is a line break.
+func isLineBreak(b []byte, i int) bool {
+ return (b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029)
+}
+
+func isCRLF(b []byte, i int) bool {
+ return b[i] == '\r' && b[i+1] == '\n'
+}
+
+// Check if the character is a line break or NUL.
+func isBreakOrZero(b []byte, i int) bool {
+ // return isLineBreak(b, i) || isZeroChar(b, i)
+ return (
+ // isBreak:
+ b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
+ // isZeroChar:
+ b[i] == 0)
+}
+
+// Check if the character is a line break, space, or NUL.
+func isSpaceOrZero(b []byte, i int) bool {
+ // return isSpace(b, i) || isBreakOrZero(b, i)
+ return (
+ // isSpace:
+ b[i] == ' ' ||
+ // isBreakOrZero:
+ b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
+ b[i] == 0)
+}
+
+// Check if the character is a line break, space, tab, or NUL.
+func isBlankOrZero(b []byte, i int) bool {
+ // return isBlank(b, i) || isBreakOrZero(b, i)
+ return (
+ // isBlank:
+ b[i] == ' ' || b[i] == '\t' ||
+ // isBreakOrZero:
+ b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
+ b[i] == 0)
+}
+
+// Determine the width of the character.
+func width(b byte) int {
+ // Don't replace these by a switch without first
+ // confirming that it is being inlined.
+ if b&0x80 == 0x00 {
+ return 1
+ }
+ if b&0xE0 == 0xC0 {
+ return 2
+ }
+ if b&0xF0 == 0xE0 {
+ return 3
+ }
+ if b&0xF8 == 0xF0 {
+ return 4
+ }
+ return 0
+}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/CHANGELOG.md b/hack/tools/vendor/github.com/itchyny/gojq/CHANGELOG.md
index a10c4858d1..d2acbff08f 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/CHANGELOG.md
+++ b/hack/tools/vendor/github.com/itchyny/gojq/CHANGELOG.md
@@ -1,4 +1,18 @@
# Changelog
+## [v0.12.18](https://github.com/itchyny/gojq/compare/v0.12.17..v0.12.18) (2025-12-02)
+* implement `trimstr/1`, `toboolean/0` function
+* fix `last/1` to be included in `builtins/0`
+* fix `--indent 0` to preserve newlines
+* fix string repetition to emit error when the result is too large
+* increase the array index limit to 536870912 (`2^29`)
+* stop numeric normalization for concurrent execution (see 1ace748d08df)
+* support binding expressions with binary operators (`1 + 2 as $x | -$x`)
+* improve `gojq.NewIter` to be a generic function
+* improve logic for getting file contents on JSON parse error
+* improve JSON parsing to preserve the precision of floating-point numbers
+* improve YAML parsing performance and preserve the precision of large integers
+* improve performance and reduce memory allocation of long-running queries
+
## [v0.12.17](https://github.com/itchyny/gojq/compare/v0.12.16..v0.12.17) (2024-12-01)
* implement `add/1`, `skip/2` functions
* implement `--library-path` option as the alias of `-L` option
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/Dockerfile b/hack/tools/vendor/github.com/itchyny/gojq/Dockerfile
index 96a14e99a5..cf6a9a35b3 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/Dockerfile
+++ b/hack/tools/vendor/github.com/itchyny/gojq/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.23 AS builder
+FROM golang:1.25 AS builder
WORKDIR /app
COPY go.* ./
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/LICENSE b/hack/tools/vendor/github.com/itchyny/gojq/LICENSE
index fe59004071..5eeaeebb62 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/LICENSE
+++ b/hack/tools/vendor/github.com/itchyny/gojq/LICENSE
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2019-2024 itchyny
+Copyright (c) 2019-2025 itchyny
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/Makefile b/hack/tools/vendor/github.com/itchyny/gojq/Makefile
index 15ace7d738..e91f2c6dd2 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/Makefile
+++ b/hack/tools/vendor/github.com/itchyny/gojq/Makefile
@@ -89,9 +89,8 @@ clean:
.PHONY: update
update: export GOPROXY=direct
update:
- go get -u ./... && go mod tidy
- go mod edit -modfile=go.dev.mod -droprequire=github.com/itchyny/{astgen,timefmt}-go
- go get -u -modfile=go.dev.mod github.com/itchyny/{astgen,timefmt}-go && go generate
+ go get -u ./... && go get github.com/itchyny/go-yaml@gojq && go mod tidy
+ rm go.dev.sum && go get -u -modfile=go.dev.mod github.com/itchyny/{astgen,timefmt}-go && go generate
.PHONY: bump
bump: $(GOBIN)/gobump
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/README.md b/hack/tools/vendor/github.com/itchyny/gojq/README.md
index 7b34f93c34..98709ee04f 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/README.md
+++ b/hack/tools/vendor/github.com/itchyny/gojq/README.md
@@ -74,12 +74,11 @@ docker run -i --rm ghcr.io/itchyny/gojq
## Difference to jq
- gojq is purely implemented with Go language and is completely portable. jq depends on the C standard library so the availability of math functions depends on the library. jq also depends on the regular expression library and it makes build scripts complex.
-- gojq implements nice error messages for invalid query and JSON input. The error message of jq is sometimes difficult to tell where to fix the query.
- gojq does not keep the order of object keys. I understand this might cause problems for some scripts but basically, we should not rely on the order of object keys. Due to this limitation, gojq does not have `keys_unsorted` function and `--sort-keys` (`-S`) option. I would implement when ordered map is implemented in the standard library of Go but I'm less motivated.
- gojq supports arbitrary-precision integer calculation while jq does not; jq loses the precision of large integers when calculation is involved. Note that even with gojq, all mathematical functions, including `floor` and `round`, convert integers to floating-point numbers; only addition, subtraction, multiplication, modulo, and division operators (when divisible) keep the integer precision. To calculate floor division of integers without losing the precision, use `def idivide($n): (. - . % $n) / $n;`. To round down floating-point numbers to integers, use `def ifloor: floor | tostring | tonumber;`, but note that this function does not work with large floating-point numbers and also loses the precision of large integers.
-- gojq behaves differently than jq in some features, hoping that jq will fix the behaviors in the future. gojq consistently counts by characters (not by bytes) in `index`, `rindex`, and `indices` functions; `"12345" | .[index("3"):]` results in `"345"` ([jq#1430](https://github.com/jqlang/jq/issues/1430), [jq#1624](https://github.com/jqlang/jq/issues/1624)). gojq supports string indexing; `"abcde"[2]` ([jq#1520](https://github.com/jqlang/jq/issues/1520)). gojq fixes handling files with no newline characters at the end ([jq#2374](https://github.com/jqlang/jq/issues/2374)). gojq consistently truncates down floating-point number indices both in indexing (`[0] | .[0.5]` results in `0`), and slicing (`[0,1,2] | .[0.5:1.5]` results in `[0]`). gojq parses unary operators with higher precedence than variable binding (`[-1 as $x | 1,$x]` results in `[1,-1]` not `[-1,-1]`) ([jq#3053](https://github.com/jqlang/jq/pull/3053)). gojq fixes `@base64d` to allow binary string as the decoded string ([jq#1931](https://github.com/jqlang/jq/issues/1931)). gojq improves time formatting and parsing; deals with `%f` in `strftime` and `strptime` ([jq#1409](https://github.com/jqlang/jq/issues/1409)), parses timezone offsets with `fromdate` and `fromdateiso8601` ([jq#1053](https://github.com/jqlang/jq/issues/1053)), supports timezone name/offset with `%Z`/`%z` in `strptime` ([jq#929](https://github.com/jqlang/jq/issues/929), [jq#2195](https://github.com/jqlang/jq/issues/2195)), and looks up correct timezone during daylight saving time on formatting with `%Z` ([jq#1912](https://github.com/jqlang/jq/issues/1912)). gojq supports nanoseconds in date and time functions.
-- gojq does not support some functions intentionally; `get_jq_origin`, `get_prog_origin`, `get_search_list` (unstable, not listed in jq document), `input_line_number`, `$__loc__` (performance issue). gojq does not support some flags; `--ascii-output, -a` (performance issue), `--seq` (not used commonly), `--sort-keys, -S` (sorts by default because `map[string]any` does not keep the order), `--unbuffered` (unbuffered by default). gojq does not parse JSON extensions supported by jq; `NaN`, `Infinity`, and `[000]`. gojq normalizes floating-point numbers to fit to double-precision floating-point numbers. gojq does not support some regular expression metacharacters, backreferences, look-around assertions, and some flags (regular expression engine differences). gojq does not support BOM (`encoding/json` does not support this). gojq disallows using keywords for function names (`def true: .; true` is a confusing query), and module name prefixes in function declarations (using module prefixes like `def m::f: .;` is undocumented).
-- gojq supports reading from YAML input (`--yaml-input`) while jq does not. gojq also supports YAML output (`--yaml-output`). gojq supports `@urid` format string ([jq#798](https://github.com/jqlang/jq/issues/798), [jq#2261](https://github.com/jqlang/jq/issues/2261)).
+- gojq behaves differently than jq in some features, expecting jq to fix its behavior in the future. gojq supports string indexing; `"abcde"[2]` ([jq#1520](https://github.com/jqlang/jq/issues/1520)). gojq fixes handling files with no newline characters at the end ([jq#2374](https://github.com/jqlang/jq/issues/2374)). gojq fixes `@base64d` to allow binary string as the decoded string ([jq#1931](https://github.com/jqlang/jq/issues/1931)). gojq improves time formatting and parsing; deals with `%f` in `strftime` and `strptime` ([jq#1409](https://github.com/jqlang/jq/issues/1409)), parses timezone offsets with `fromdate` and `fromdateiso8601` ([jq#1053](https://github.com/jqlang/jq/issues/1053)), supports timezone name/offset with `%Z`/`%z` in `strptime` ([jq#929](https://github.com/jqlang/jq/issues/929), [jq#2195](https://github.com/jqlang/jq/issues/2195)). gojq supports nanoseconds in date and time functions.
+- gojq does not support some functions intentionally; `get_jq_origin`, `get_prog_origin`, `get_search_list` (unstable, not listed in jq document), `input_line_number`, `$__loc__` (performance issue). gojq does not support some flags; `--ascii-output, -a` (performance issue), `--seq` (not used commonly), `--sort-keys, -S` (sorts by default because `map[string]any` does not keep the order), `--unbuffered` (unbuffered by default). gojq does not parse JSON extensions supported by jq; `NaN`, `Infinity`, and `[000]`. gojq does not support some regular expression metacharacters, backreferences, look-around assertions, and some flags (regular expression engine differences). gojq does not support BOM (`encoding/json` does not support this). gojq disallows using keywords for function names (`def true: .; true` is a confusing query), and module name prefixes in function declarations (using module prefixes like `def m::f: .;` is undocumented).
+- gojq supports reading from YAML input (`--yaml-input`) while jq does not. gojq also supports YAML output (`--yaml-output`).
### Color configuration
The gojq command automatically disables coloring output when the output is not a tty.
@@ -130,7 +129,7 @@ func main() {
- Use [`gojq.ParseError`](https://pkg.go.dev/github.com/itchyny/gojq#ParseError) to get the error position and token of the parsing error.
- Secondly, get the result iterator
- using [`query.Run`](https://pkg.go.dev/github.com/itchyny/gojq#Query.Run) or [`query.RunWithContext`](https://pkg.go.dev/github.com/itchyny/gojq#Query.RunWithContext)
- - or alternatively, compile the query using [`gojq.Compile`](https://pkg.go.dev/github.com/itchyny/gojq#Compile) and then [`code.Run`](https://pkg.go.dev/github.com/itchyny/gojq#Code.Run) or [`code.RunWithContext`](https://pkg.go.dev/github.com/itchyny/gojq#Code.RunWithContext). You can reuse the `*Code` against multiple inputs to avoid compilation of the same query. But for arguments of `code.Run`, do not give values sharing same data between multiple calls.
+ - or alternatively, compile the query using [`gojq.Compile`](https://pkg.go.dev/github.com/itchyny/gojq#Compile) and then [`code.Run`](https://pkg.go.dev/github.com/itchyny/gojq#Code.Run) or [`code.RunWithContext`](https://pkg.go.dev/github.com/itchyny/gojq#Code.RunWithContext). You can reuse the `*Code` against multiple inputs to avoid compilation of the same query.
- In either case, you cannot use custom type values as the query input. The type should be `[]any` for an array and `map[string]any` for a map (just like decoded to an `any` using the [encoding/json](https://golang.org/pkg/encoding/json/) package). You can't use `[]int` or `map[string]string`, for example. If you want to query your custom struct, marshal to JSON, unmarshal to `any` and use it as the query input.
- Thirdly, iterate through the results using [`iter.Next() (any, bool)`](https://pkg.go.dev/github.com/itchyny/gojq#Iter). The iterator can emit an error so make sure to handle it. The method returns `true` with results, and `false` when the iterator terminates.
- The return type is not `(any, error)` because the iterator may emit multiple errors. The `jq` and `gojq` commands stop the iteration on the first error, but the library user can choose to stop the iteration on errors, or to continue until it terminates.
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/builtin.go b/hack/tools/vendor/github.com/itchyny/gojq/builtin.go
index 8ae4666cba..013448341b 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/builtin.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/builtin.go
@@ -4,67 +4,68 @@ package gojq
func init() {
builtinFuncDefs = map[string][]*FuncDef{
- "IN": {{Name: "IN", Args: []string{"s"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "any", Args: []*Query{{Left: &Query{Func: "s"}, Op: OpEq, Right: &Query{Func: "."}}, {Func: "."}}}}}}, {Name: "IN", Args: []string{"src", "s"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "any", Args: []*Query{{Left: &Query{Func: "src"}, Op: OpEq, Right: &Query{Func: "s"}}, {Func: "."}}}}}}},
- "INDEX": {{Name: "INDEX", Args: []string{"stream", "idx_expr"}, Body: &Query{Term: &Term{Type: TermTypeReduce, Reduce: &Reduce{Query: &Query{Func: "stream"}, Pattern: &Pattern{Name: "$row"}, Start: &Query{Term: &Term{Type: TermTypeObject, Object: &Object{}}}, Update: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Left: &Query{Func: "$row"}, Op: OpPipe, Right: &Query{Left: &Query{Func: "idx_expr"}, Op: OpPipe, Right: &Query{Func: "tostring"}}}}}}, Op: OpAssign, Right: &Query{Func: "$row"}}}}}}, {Name: "INDEX", Args: []string{"idx_expr"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "INDEX", Args: []*Query{{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, {Func: "idx_expr"}}}}}}},
- "JOIN": {{Name: "JOIN", Args: []string{"$idx", "idx_expr"}, Body: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Func: "."}, Op: OpComma, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$idx"}, SuffixList: []*Suffix{{Index: &Index{Start: &Query{Func: "idx_expr"}}}}}}}}}}}}}}}, {Name: "JOIN", Args: []string{"$idx", "stream", "idx_expr"}, Body: &Query{Left: &Query{Func: "stream"}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Func: "."}, Op: OpComma, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$idx"}, SuffixList: []*Suffix{{Index: &Index{Start: &Query{Func: "idx_expr"}}}}}}}}}}}}, {Name: "JOIN", Args: []string{"$idx", "stream", "idx_expr", "join_expr"}, Body: &Query{Left: &Query{Func: "stream"}, Op: OpPipe, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Func: "."}, Op: OpComma, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$idx"}, SuffixList: []*Suffix{{Index: &Index{Start: &Query{Func: "idx_expr"}}}}}}}}}}, Op: OpPipe, Right: &Query{Func: "join_expr"}}}}},
+ "IN": {{Name: "IN", Args: []string{"s"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "any", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "s"}}}, Right: &Query{Term: &Term{Type: TermTypeIdentity}}, Op: OpEq}, {Term: &Term{Type: TermTypeIdentity}}}}}}}, {Name: "IN", Args: []string{"src", "s"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "any", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "src"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "s"}}}, Op: OpEq}, {Term: &Term{Type: TermTypeIdentity}}}}}}}},
+ "INDEX": {{Name: "INDEX", Args: []string{"stream", "idx_expr"}, Body: &Query{Term: &Term{Type: TermTypeReduce, Reduce: &Reduce{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "stream"}}}, Pattern: &Pattern{Name: "$row"}, Start: &Query{Term: &Term{Type: TermTypeObject, Object: &Object{}}}, Update: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$row"}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "idx_expr"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "tostring"}}}, Op: OpPipe}, Op: OpPipe}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$row"}}}, Op: OpAssign}}}}}, {Name: "INDEX", Args: []string{"idx_expr"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "INDEX", Args: []*Query{{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "idx_expr"}}}}}}}}},
+ "JOIN": {{Name: "JOIN", Args: []string{"$idx", "idx_expr"}, Body: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$idx"}, SuffixList: []*Suffix{{Index: &Index{Start: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "idx_expr"}}}}}}}}, Op: OpComma}}}}, Op: OpPipe}}}}}, {Name: "JOIN", Args: []string{"$idx", "stream", "idx_expr"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "stream"}}}, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$idx"}, SuffixList: []*Suffix{{Index: &Index{Start: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "idx_expr"}}}}}}}}, Op: OpComma}}}}, Op: OpPipe}}, {Name: "JOIN", Args: []string{"$idx", "stream", "idx_expr", "join_expr"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "stream"}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$idx"}, SuffixList: []*Suffix{{Index: &Index{Start: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "idx_expr"}}}}}}}}, Op: OpComma}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "join_expr"}}}, Op: OpPipe}, Op: OpPipe}}},
"_assign": {},
+ "_last": {},
"_modify": {},
- "add": {{Name: "add", Args: []string{"f"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Func: "f"}}}}, Op: OpPipe, Right: &Query{Func: "add"}}}},
- "all": {{Name: "all", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "all", Args: []*Query{{Func: "."}}}}}}, {Name: "all", Args: []string{"y"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "all", Args: []*Query{{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, {Func: "y"}}}}}}, {Name: "all", Args: []string{"g", "y"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "isempty", Args: []*Query{{Left: &Query{Func: "g"}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "y"}, Op: OpPipe, Right: &Query{Func: "not"}}}}}}}}}}}}},
- "any": {{Name: "any", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "any", Args: []*Query{{Func: "."}}}}}}, {Name: "any", Args: []string{"y"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "any", Args: []*Query{{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, {Func: "y"}}}}}}, {Name: "any", Args: []string{"g", "y"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "isempty", Args: []*Query{{Left: &Query{Func: "g"}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Func: "y"}}}}}}}}}}, Op: OpPipe, Right: &Query{Func: "not"}}}},
- "arrays": {{Name: "arrays", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "type"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "array"}}}}}}}}}},
- "booleans": {{Name: "booleans", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "type"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "boolean"}}}}}}}}}},
- "capture": {{Name: "capture", Args: []string{"$re"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "capture", Args: []*Query{{Func: "$re"}, {Func: "null"}}}}}}, {Name: "capture", Args: []string{"$re", "$flags"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "match", Args: []*Query{{Func: "$re"}, {Func: "$flags"}}}}}, Op: OpPipe, Right: &Query{Func: "_capture"}}}},
- "combinations": {{Name: "combinations", Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Func: "length"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}, Then: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{}}}, Else: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}, SuffixList: []*Suffix{{Iter: true}, {Bind: &Bind{Patterns: []*Pattern{{Name: "$x"}}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Func: "$x"}}}}, Op: OpAdd, Right: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeNumber, Number: "1"}}, IsSlice: true}}}, Op: OpPipe, Right: &Query{Func: "combinations"}}}}}}}}}}}}}}, {Name: "combinations", Args: []string{"n"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "limit", Args: []*Query{{Func: "n"}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "repeat", Args: []*Query{{Func: "."}}}}}}}}}}}}, Op: OpPipe, Right: &Query{Func: "combinations"}}}},
- "del": {{Name: "del", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "delpaths", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{Func: "f"}}}}}}}}}}}}}},
- "finites": {{Name: "finites", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Func: "isfinite"}}}}}}},
- "first": {{Name: "first", Body: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}}}}, {Name: "first", Args: []string{"g"}, Body: &Query{Term: &Term{Type: TermTypeLabel, Label: &Label{Ident: "$out", Body: &Query{Left: &Query{Func: "g"}, Op: OpPipe, Right: &Query{Left: &Query{Func: "."}, Op: OpComma, Right: &Query{Term: &Term{Type: TermTypeBreak, Break: "$out"}}}}}}}}},
- "fromdate": {{Name: "fromdate", Body: &Query{Func: "fromdateiso8601"}}},
- "fromdateiso8601": {{Name: "fromdateiso8601", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "strptime", Args: []*Query{{Term: &Term{Type: TermTypeString, Str: &String{Str: "%Y-%m-%dT%H:%M:%S%z"}}}}}}}, Op: OpPipe, Right: &Query{Func: "mktime"}}}},
- "fromstream": {{Name: "fromstream", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeForeach, Foreach: &Foreach{Query: &Query{Func: "f"}, Pattern: &Pattern{Name: "$pv"}, Start: &Query{Func: "null"}, Update: &Query{Left: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "e"}}}, Then: &Query{Func: "null"}}}}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$pv"}, SuffixList: []*Suffix{{Bind: &Bind{Patterns: []*Pattern{{Array: []*Pattern{{Name: "$p"}, {Name: "$v"}}}}, Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Func: "$pv"}, Op: OpPipe, Right: &Query{Left: &Query{Func: "length"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "2"}}}}, Then: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "setpath", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "v"}}}}}}, Op: OpAdd, Right: &Query{Func: "$p"}}, {Func: "$v"}}}}}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "setpath", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "e"}}}}}}, {Left: &Query{Func: "$p"}, Op: OpPipe, Right: &Query{Left: &Query{Func: "length"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}}}}}}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "setpath", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "e"}}}}}}, {Left: &Query{Func: "$p"}, Op: OpPipe, Right: &Query{Left: &Query{Func: "length"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "1"}}}}}}}}}}}}}}}}}, Extract: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "e"}}}, Then: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "v"}}}, Else: &Query{Func: "empty"}}}}}}}}},
- "group_by": {{Name: "group_by", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_group_by", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Func: "f"}}}}}}}}}}}}}},
- "gsub": {{Name: "gsub", Args: []string{"$re", "str"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "sub", Args: []*Query{{Func: "$re"}, {Func: "str"}, {Term: &Term{Type: TermTypeString, Str: &String{Str: "g"}}}}}}}}, {Name: "gsub", Args: []string{"$re", "str", "$flags"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "sub", Args: []*Query{{Func: "$re"}, {Func: "str"}, {Left: &Query{Func: "$flags"}, Op: OpAdd, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "g"}}}}}}}}}},
- "in": {{Name: "in", Args: []string{"xs"}, Body: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Bind: &Bind{Patterns: []*Pattern{{Name: "$x"}}, Body: &Query{Left: &Query{Func: "xs"}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "has", Args: []*Query{{Func: "$x"}}}}}}}}}}}}},
- "inputs": {{Name: "inputs", Body: &Query{Term: &Term{Type: TermTypeTry, Try: &Try{Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "repeat", Args: []*Query{{Func: "input"}}}}}, Catch: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Func: "."}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "break"}}}}, Then: &Query{Func: "empty"}, Else: &Query{Func: "error"}}}}}}}}},
- "inside": {{Name: "inside", Args: []string{"xs"}, Body: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Bind: &Bind{Patterns: []*Pattern{{Name: "$x"}}, Body: &Query{Left: &Query{Func: "xs"}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "contains", Args: []*Query{{Func: "$x"}}}}}}}}}}}}},
- "isempty": {{Name: "isempty", Args: []string{"g"}, Body: &Query{Term: &Term{Type: TermTypeLabel, Label: &Label{Ident: "$out", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Func: "g"}, Op: OpPipe, Right: &Query{Left: &Query{Func: "false"}, Op: OpComma, Right: &Query{Term: &Term{Type: TermTypeBreak, Break: "$out"}}}}}}, Op: OpComma, Right: &Query{Func: "true"}}}}}}},
- "iterables": {{Name: "iterables", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "type"}, Op: OpPipe, Right: &Query{Left: &Query{Left: &Query{Func: "."}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "array"}}}}, Op: OpOr, Right: &Query{Left: &Query{Func: "."}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "object"}}}}}}}}}}}},
- "last": {{Name: "last", Body: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeUnary, Unary: &Unary{Op: OpSub, Term: &Term{Type: TermTypeNumber, Number: "1"}}}}}}}}},
- "limit": {{Name: "limit", Args: []string{"$n", "g"}, Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Func: "$n"}, Op: OpGt, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}, Then: &Query{Term: &Term{Type: TermTypeLabel, Label: &Label{Ident: "$out", Body: &Query{Term: &Term{Type: TermTypeForeach, Foreach: &Foreach{Query: &Query{Func: "g"}, Pattern: &Pattern{Name: "$item"}, Start: &Query{Func: "$n"}, Update: &Query{Left: &Query{Func: "."}, Op: OpSub, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "1"}}}, Extract: &Query{Left: &Query{Func: "$item"}, Op: OpComma, Right: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Func: "."}, Op: OpLe, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}, Then: &Query{Term: &Term{Type: TermTypeBreak, Break: "$out"}}, Else: &Query{Func: "empty"}}}}}}}}}}}, Elif: []*IfElif{{Cond: &Query{Left: &Query{Func: "$n"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}, Then: &Query{Func: "empty"}}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "error", Args: []*Query{{Term: &Term{Type: TermTypeString, Str: &String{Str: "limit doesn't support negative count"}}}}}}}}}}}},
- "map": {{Name: "map", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, Op: OpPipe, Right: &Query{Func: "f"}}}}}}},
- "map_values": {{Name: "map_values", Args: []string{"f"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, Op: OpModify, Right: &Query{Func: "f"}}}},
- "match": {{Name: "match", Args: []string{"$re"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "match", Args: []*Query{{Func: "$re"}, {Func: "null"}}}}}}, {Name: "match", Args: []string{"$re", "$flags"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_match", Args: []*Query{{Func: "$re"}, {Func: "$flags"}, {Func: "false"}}}, SuffixList: []*Suffix{{Iter: true}}}}}},
- "max_by": {{Name: "max_by", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_max_by", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Func: "f"}}}}}}}}}}}}}},
- "min_by": {{Name: "min_by", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_min_by", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Func: "f"}}}}}}}}}}}}}},
- "normals": {{Name: "normals", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Func: "isnormal"}}}}}}},
- "not": {{Name: "not", Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Func: "."}, Then: &Query{Func: "false"}, Else: &Query{Func: "true"}}}}}},
- "nth": {{Name: "nth", Args: []string{"$n"}, Body: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Func: "$n"}}}}}, {Name: "nth", Args: []string{"$n", "g"}, Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Func: "$n"}, Op: OpGe, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}, Then: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "first", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "skip", Args: []*Query{{Func: "$n"}, {Func: "g"}}}}}}}}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "error", Args: []*Query{{Term: &Term{Type: TermTypeString, Str: &String{Str: "nth doesn't support negative index"}}}}}}}}}}}},
- "nulls": {{Name: "nulls", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "."}, Op: OpEq, Right: &Query{Func: "null"}}}}}}}},
- "numbers": {{Name: "numbers", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "type"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "number"}}}}}}}}}},
- "objects": {{Name: "objects", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "type"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "object"}}}}}}}}}},
- "paths": {{Name: "paths", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{Func: ".."}}}}}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "."}, Op: OpNe, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{}}}}}}}}}}, {Name: "paths", Args: []string{"f"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{Left: &Query{Func: ".."}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Func: "f"}}}}}}}}}}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "."}, Op: OpNe, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{}}}}}}}}}}},
- "pick": {{Name: "pick", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Bind: &Bind{Patterns: []*Pattern{{Name: "$v"}}, Body: &Query{Term: &Term{Type: TermTypeReduce, Reduce: &Reduce{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{Func: "f"}}}}}, Pattern: &Pattern{Name: "$p"}, Start: &Query{Func: "null"}, Update: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "setpath", Args: []*Query{{Func: "$p"}, {Left: &Query{Func: "$v"}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "getpath", Args: []*Query{{Func: "$p"}}}}}}}}}}}}}}}}}}}},
- "range": {{Name: "range", Args: []string{"$end"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_range", Args: []*Query{{Term: &Term{Type: TermTypeNumber, Number: "0"}}, {Func: "$end"}, {Term: &Term{Type: TermTypeNumber, Number: "1"}}}}}}}, {Name: "range", Args: []string{"$start", "$end"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_range", Args: []*Query{{Func: "$start"}, {Func: "$end"}, {Term: &Term{Type: TermTypeNumber, Number: "1"}}}}}}}, {Name: "range", Args: []string{"$start", "$end", "$step"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_range", Args: []*Query{{Func: "$start"}, {Func: "$end"}, {Func: "$step"}}}}}}},
- "recurse": {{Name: "recurse", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "recurse", Args: []*Query{{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}, {Optional: true}}}}}}}}}, {Name: "recurse", Args: []string{"f"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "r", Body: &Query{Left: &Query{Func: "."}, Op: OpComma, Right: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Func: "f"}, Op: OpPipe, Right: &Query{Func: "r"}}}}}}}, Func: "r"}}, {Name: "recurse", Args: []string{"f", "cond"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "r", Body: &Query{Left: &Query{Func: "."}, Op: OpComma, Right: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Func: "f"}, Op: OpPipe, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Func: "cond"}}}}}, Op: OpPipe, Right: &Query{Func: "r"}}}}}}}}, Func: "r"}}},
- "repeat": {{Name: "repeat", Args: []string{"f"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "_repeat", Body: &Query{Left: &Query{Func: "f"}, Op: OpComma, Right: &Query{Func: "_repeat"}}}}, Func: "_repeat"}}},
- "scalars": {{Name: "scalars", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "type"}, Op: OpPipe, Right: &Query{Left: &Query{Left: &Query{Func: "."}, Op: OpNe, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "array"}}}}, Op: OpAnd, Right: &Query{Left: &Query{Func: "."}, Op: OpNe, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "object"}}}}}}}}}}}},
- "scan": {{Name: "scan", Args: []string{"$re"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "scan", Args: []*Query{{Func: "$re"}, {Func: "null"}}}}}}, {Name: "scan", Args: []string{"$re", "$flags"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "match", Args: []*Query{{Func: "$re"}, {Left: &Query{Func: "$flags"}, Op: OpAdd, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "g"}}}}}}}}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "captures"}}}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{}}}}, Then: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "string"}}}, Else: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "captures"}, SuffixList: []*Suffix{{Iter: true}, {Index: &Index{Name: "string"}}}}}}}}}}}}}},
- "select": {{Name: "select", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Func: "f"}, Then: &Query{Func: "."}, Else: &Query{Func: "empty"}}}}}},
- "skip": {{Name: "skip", Args: []string{"$n", "g"}, Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Func: "$n"}, Op: OpGt, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}, Then: &Query{Term: &Term{Type: TermTypeForeach, Foreach: &Foreach{Query: &Query{Func: "g"}, Pattern: &Pattern{Name: "$item"}, Start: &Query{Func: "$n"}, Update: &Query{Left: &Query{Func: "."}, Op: OpSub, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "1"}}}, Extract: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Func: "."}, Op: OpLt, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}, Then: &Query{Func: "$item"}, Else: &Query{Func: "empty"}}}}}}}, Elif: []*IfElif{{Cond: &Query{Left: &Query{Func: "$n"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}, Then: &Query{Func: "g"}}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "error", Args: []*Query{{Term: &Term{Type: TermTypeString, Str: &String{Str: "skip doesn't support negative count"}}}}}}}}}}}},
- "sort_by": {{Name: "sort_by", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_sort_by", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Func: "f"}}}}}}}}}}}}}},
- "splits": {{Name: "splits", Args: []string{"$re"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "splits", Args: []*Query{{Func: "$re"}, {Func: "null"}}}}}}, {Name: "splits", Args: []string{"$re", "$flags"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "split", Args: []*Query{{Func: "$re"}, {Func: "$flags"}}}, SuffixList: []*Suffix{{Iter: true}}}}}},
- "strings": {{Name: "strings", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "type"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "string"}}}}}}}}}},
- "sub": {{Name: "sub", Args: []string{"$re", "str"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "sub", Args: []*Query{{Func: "$re"}, {Func: "str"}, {Func: "null"}}}}}}, {Name: "sub", Args: []string{"$re", "str", "$flags"}, Body: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Bind: &Bind{Patterns: []*Pattern{{Name: "$str"}}, Body: &Query{FuncDefs: []*FuncDef{{Name: "_sub", Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "matches"}}}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{}}}}, Then: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$str"}, SuffixList: []*Suffix{{Index: &Index{End: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "offset"}}}, IsSlice: true}}}}}, Op: OpAdd, Right: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "string"}}}}, Else: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "matches"}, SuffixList: []*Suffix{{Index: &Index{Start: &Query{Term: &Term{Type: TermTypeUnary, Unary: &Unary{Op: OpSub, Term: &Term{Type: TermTypeNumber, Number: "1"}}}}}}, {Bind: &Bind{Patterns: []*Pattern{{Name: "$r"}}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeObject, Object: &Object{KeyVals: []*ObjectKeyVal{{Key: "string", Val: &Query{Left: &Query{Left: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Func: "$r"}, Op: OpPipe, Right: &Query{Left: &Query{Func: "_capture"}, Op: OpPipe, Right: &Query{Func: "str"}}}}}, Op: OpAdd, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$str"}, SuffixList: []*Suffix{{Index: &Index{Start: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$r"}, SuffixList: []*Suffix{{Index: &Index{Name: "offset"}}}}}, Op: OpAdd, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$r"}, SuffixList: []*Suffix{{Index: &Index{Name: "length"}}}}}}, End: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "offset"}}}, IsSlice: true}}}}}}, Op: OpAdd, Right: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "string"}}}}}, {Key: "offset", Val: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$r"}, SuffixList: []*Suffix{{Index: &Index{Name: "offset"}}}}}}, {Key: "matches", Val: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "matches"}, SuffixList: []*Suffix{{Index: &Index{End: &Query{Term: &Term{Type: TermTypeUnary, Unary: &Unary{Op: OpSub, Term: &Term{Type: TermTypeNumber, Number: "1"}}}}, IsSlice: true}}}}}}}}}}, Op: OpPipe, Right: &Query{Func: "_sub"}}}}}}}}}}}}, Left: &Query{Term: &Term{Type: TermTypeObject, Object: &Object{KeyVals: []*ObjectKeyVal{{Key: "string", Val: &Query{Term: &Term{Type: TermTypeString, Str: &String{}}}}, {Key: "matches", Val: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "match", Args: []*Query{{Func: "$re"}, {Func: "$flags"}}}}}}}}}}}}}, Op: OpPipe, Right: &Query{Func: "_sub"}}}}}}}}},
- "test": {{Name: "test", Args: []string{"$re"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "test", Args: []*Query{{Func: "$re"}, {Func: "null"}}}}}}, {Name: "test", Args: []string{"$re", "$flags"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_match", Args: []*Query{{Func: "$re"}, {Func: "$flags"}, {Func: "true"}}}}}}},
- "todate": {{Name: "todate", Body: &Query{Func: "todateiso8601"}}},
+ "add": {{Name: "add", Args: []string{"f"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "add"}}}, Op: OpPipe}}},
+ "all": {{Name: "all", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "all", Args: []*Query{{Term: &Term{Type: TermTypeIdentity}}}}}}}, {Name: "all", Args: []string{"y"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "all", Args: []*Query{{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "y"}}}}}}}}, {Name: "all", Args: []string{"g", "y"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "isempty", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "g"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "y"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "not"}}}, Op: OpPipe}}}}}, Op: OpPipe}}}}}}},
+ "any": {{Name: "any", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "any", Args: []*Query{{Term: &Term{Type: TermTypeIdentity}}}}}}}, {Name: "any", Args: []string{"y"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "any", Args: []*Query{{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "y"}}}}}}}}, {Name: "any", Args: []string{"g", "y"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "isempty", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "g"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "y"}}}}}}}, Op: OpPipe}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "not"}}}, Op: OpPipe}}},
+ "arrays": {{Name: "arrays", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "type"}}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "array"}}}, Op: OpEq}}}}}}},
+ "booleans": {{Name: "booleans", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "type"}}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "boolean"}}}, Op: OpEq}}}}}}},
+ "capture": {{Name: "capture", Args: []string{"$re"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "capture", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeNull}}}}}}}, {Name: "capture", Args: []string{"$re", "$flags"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "match", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$flags"}}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_capture"}}}, Op: OpPipe}}},
+ "combinations": {{Name: "combinations", Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "length"}}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}, Op: OpEq}, Then: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{}}}, Else: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}, SuffixList: []*Suffix{{Iter: true}}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$x"}}}}}}, Right: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeNumber, Number: "1"}}, IsSlice: true}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "combinations"}}}, Op: OpPipe}}}, Op: OpAdd}, Patterns: []*Pattern{{Name: "$x"}}, Op: OpPipe}}}}}, {Name: "combinations", Args: []string{"n"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "limit", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "n"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "repeat", Args: []*Query{{Term: &Term{Type: TermTypeIdentity}}}}}}}}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "combinations"}}}, Op: OpPipe}}},
+ "del": {{Name: "del", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "delpaths", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}}}}}}}}}}}}}},
+ "finites": {{Name: "finites", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "isfinite"}}}}}}}}},
+ "first": {{Name: "first", Body: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}}}}, {Name: "first", Args: []string{"g"}, Body: &Query{Term: &Term{Type: TermTypeLabel, Label: &Label{Ident: "$out", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "g"}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeBreak, Break: "$out"}}, Op: OpComma}, Op: OpPipe}}}}}},
+ "fromdate": {{Name: "fromdate", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "fromdateiso8601"}}}}},
+ "fromdateiso8601": {{Name: "fromdateiso8601", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "strptime", Args: []*Query{{Term: &Term{Type: TermTypeString, Str: &String{Str: "%Y-%m-%dT%H:%M:%S%z"}}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "mktime"}}}, Op: OpPipe}}},
+ "fromstream": {{Name: "fromstream", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeForeach, Foreach: &Foreach{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}, Pattern: &Pattern{Name: "$pv"}, Start: &Query{Term: &Term{Type: TermTypeNull}}, Update: &Query{Left: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "e"}}}, Then: &Query{Term: &Term{Type: TermTypeNull}}}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$pv"}}}, Right: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$pv"}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "length"}}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "2"}}, Op: OpEq}, Op: OpPipe}, Then: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "setpath", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "v"}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$p"}}}, Op: OpAdd}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$v"}}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "setpath", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "e"}}}}}}, {Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$p"}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "length"}}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}, Op: OpEq}, Op: OpPipe}}}}}, Op: OpPipe}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "setpath", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "e"}}}}}}, {Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$p"}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "length"}}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "1"}}, Op: OpEq}, Op: OpPipe}}}}}}}}, Patterns: []*Pattern{{Array: []*Pattern{{Name: "$p"}, {Name: "$v"}}}}, Op: OpPipe}, Op: OpPipe}, Extract: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "e"}}}, Then: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "v"}}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "empty"}}}}}}}}}}},
+ "group_by": {{Name: "group_by", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_group_by", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}}}}}}}}}}}}}},
+ "gsub": {{Name: "gsub", Args: []string{"$re", "str"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "sub", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "str"}}}, {Term: &Term{Type: TermTypeString, Str: &String{Str: "g"}}}}}}}}, {Name: "gsub", Args: []string{"$re", "str", "$flags"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "sub", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "str"}}}, {Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$flags"}}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "g"}}}, Op: OpAdd}}}}}}},
+ "in": {{Name: "in", Args: []string{"xs"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "xs"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "has", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$x"}}}}}}}, Op: OpPipe}, Patterns: []*Pattern{{Name: "$x"}}, Op: OpPipe}}},
+ "inputs": {{Name: "inputs", Body: &Query{Term: &Term{Type: TermTypeTry, Try: &Try{Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "repeat", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "input"}}}}}}}, Catch: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "break"}}}, Op: OpEq}, Then: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "empty"}}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "error"}}}}}}}}}}},
+ "inside": {{Name: "inside", Args: []string{"xs"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "xs"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "contains", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$x"}}}}}}}, Op: OpPipe}, Patterns: []*Pattern{{Name: "$x"}}, Op: OpPipe}}},
+ "isempty": {{Name: "isempty", Args: []string{"g"}, Body: &Query{Term: &Term{Type: TermTypeLabel, Label: &Label{Ident: "$out", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "g"}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFalse}}, Right: &Query{Term: &Term{Type: TermTypeBreak, Break: "$out"}}, Op: OpComma}, Op: OpPipe}}}, Right: &Query{Term: &Term{Type: TermTypeTrue}}, Op: OpComma}}}}}},
+ "iterables": {{Name: "iterables", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "type"}}}, Right: &Query{Left: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "array"}}}, Op: OpEq}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "object"}}}, Op: OpEq}, Op: OpOr}, Op: OpPipe}}}}}}},
+ "last": {{Name: "last", Body: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeUnary, Unary: &Unary{Op: OpSub, Term: &Term{Type: TermTypeNumber, Number: "1"}}}}}}}}, {Name: "last", Args: []string{"g"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_last", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "g"}}}}}}}}},
+ "limit": {{Name: "limit", Args: []string{"$n", "g"}, Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}, Op: OpGt}, Then: &Query{Term: &Term{Type: TermTypeLabel, Label: &Label{Ident: "$out", Body: &Query{Term: &Term{Type: TermTypeForeach, Foreach: &Foreach{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "g"}}}, Pattern: &Pattern{Name: "$item"}, Start: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}, Update: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "1"}}, Op: OpSub}, Extract: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$item"}}}, Right: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}, Op: OpLe}, Then: &Query{Term: &Term{Type: TermTypeBreak, Break: "$out"}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "empty"}}}}}}, Op: OpComma}}}}}}}, Elif: []*IfElif{{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}, Op: OpEq}, Then: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "empty"}}}}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "error", Args: []*Query{{Term: &Term{Type: TermTypeString, Str: &String{Str: "limit doesn't support negative count"}}}}}}}}}}}},
+ "map": {{Name: "map", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}, Op: OpPipe}}}}}},
+ "map_values": {{Name: "map_values", Args: []string{"f"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}, Op: OpModify}}},
+ "match": {{Name: "match", Args: []string{"$re"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "match", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeNull}}}}}}}, {Name: "match", Args: []string{"$re", "$flags"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_match", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$flags"}}}, {Term: &Term{Type: TermTypeFalse}}}}, SuffixList: []*Suffix{{Iter: true}}}}}},
+ "max_by": {{Name: "max_by", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_max_by", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}}}}}}}}}}}}}},
+ "min_by": {{Name: "min_by", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_min_by", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}}}}}}}}}}}}}},
+ "normals": {{Name: "normals", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "isnormal"}}}}}}}}},
+ "not": {{Name: "not", Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Term: &Term{Type: TermTypeIdentity}}, Then: &Query{Term: &Term{Type: TermTypeFalse}}, Else: &Query{Term: &Term{Type: TermTypeTrue}}}}}}},
+ "nth": {{Name: "nth", Args: []string{"$n"}, Body: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}}}}}, {Name: "nth", Args: []string{"$n", "g"}, Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}, Op: OpGe}, Then: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "first", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "skip", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "g"}}}}}}}}}}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "error", Args: []*Query{{Term: &Term{Type: TermTypeString, Str: &String{Str: "nth doesn't support negative index"}}}}}}}}}}}},
+ "nulls": {{Name: "nulls", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeNull}}, Op: OpEq}}}}}}},
+ "numbers": {{Name: "numbers", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "type"}}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "number"}}}, Op: OpEq}}}}}}},
+ "objects": {{Name: "objects", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "type"}}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "object"}}}, Op: OpEq}}}}}}},
+ "paths": {{Name: "paths", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{Term: &Term{Type: TermTypeRecurse}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{}}}, Op: OpNe}}}}}, Op: OpPipe}}, {Name: "paths", Args: []string{"f"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeRecurse}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}}}}}, Op: OpPipe}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{}}}, Op: OpNe}}}}}, Op: OpPipe}}},
+ "pick": {{Name: "pick", Args: []string{"f"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeReduce, Reduce: &Reduce{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}}}}}, Pattern: &Pattern{Name: "$p"}, Start: &Query{Term: &Term{Type: TermTypeNull}}, Update: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "setpath", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$p"}}}, {Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$v"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "getpath", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$p"}}}}}}}, Op: OpPipe}}}}}}}}, Patterns: []*Pattern{{Name: "$v"}}, Op: OpPipe}}},
+ "range": {{Name: "range", Args: []string{"$end"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_range", Args: []*Query{{Term: &Term{Type: TermTypeNumber, Number: "0"}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$end"}}}, {Term: &Term{Type: TermTypeNumber, Number: "1"}}}}}}}, {Name: "range", Args: []string{"$start", "$end"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_range", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$start"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$end"}}}, {Term: &Term{Type: TermTypeNumber, Number: "1"}}}}}}}, {Name: "range", Args: []string{"$start", "$end", "$step"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_range", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$start"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$end"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$step"}}}}}}}}},
+ "recurse": {{Name: "recurse", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "recurse", Args: []*Query{{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}, {Optional: true}}}}}}}}}, {Name: "recurse", Args: []string{"f"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "r", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "r"}}}, Op: OpPipe}}}, Op: OpComma}}}, Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "r"}}}}, {Name: "recurse", Args: []string{"f", "cond"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "r", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "cond"}}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "r"}}}, Op: OpPipe}, Op: OpPipe}}}, Op: OpComma}}}, Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "r"}}}}},
+ "repeat": {{Name: "repeat", Args: []string{"f"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "_repeat", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_repeat"}}}, Op: OpComma}}}, Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_repeat"}}}}},
+ "scalars": {{Name: "scalars", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "type"}}}, Right: &Query{Left: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "array"}}}, Op: OpNe}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "object"}}}, Op: OpNe}, Op: OpAnd}, Op: OpPipe}}}}}}},
+ "scan": {{Name: "scan", Args: []string{"$re"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "scan", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeNull}}}}}}}, {Name: "scan", Args: []string{"$re", "$flags"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "match", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$flags"}}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "g"}}}, Op: OpAdd}}}}}, Right: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "captures"}}}, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{}}}, Op: OpEq}, Then: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "string"}}}, Else: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "captures"}, SuffixList: []*Suffix{{Iter: true}, {Index: &Index{Name: "string"}}}}}}}}}}}, Op: OpPipe}}},
+ "select": {{Name: "select", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}, Then: &Query{Term: &Term{Type: TermTypeIdentity}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "empty"}}}}}}}},
+ "skip": {{Name: "skip", Args: []string{"$n", "g"}, Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}, Op: OpGt}, Then: &Query{Term: &Term{Type: TermTypeForeach, Foreach: &Foreach{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "g"}}}, Pattern: &Pattern{Name: "$item"}, Start: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}, Update: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "1"}}, Op: OpSub}, Extract: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}, Op: OpLt}, Then: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$item"}}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "empty"}}}}}}}}}, Elif: []*IfElif{{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}, Right: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}, Op: OpEq}, Then: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "g"}}}}}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "error", Args: []*Query{{Term: &Term{Type: TermTypeString, Str: &String{Str: "skip doesn't support negative count"}}}}}}}}}}}},
+ "sort_by": {{Name: "sort_by", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_sort_by", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}}}}}}}}}}}}}},
+ "splits": {{Name: "splits", Args: []string{"$re"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "splits", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeNull}}}}}}}, {Name: "splits", Args: []string{"$re", "$flags"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "split", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$flags"}}}}}, SuffixList: []*Suffix{{Iter: true}}}}}},
+ "strings": {{Name: "strings", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "type"}}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "string"}}}, Op: OpEq}}}}}}},
+ "sub": {{Name: "sub", Args: []string{"$re", "str"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "sub", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "str"}}}, {Term: &Term{Type: TermTypeNull}}}}}}}, {Name: "sub", Args: []string{"$re", "str", "$flags"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{FuncDefs: []*FuncDef{{Name: "_sub", Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "matches"}}}, Right: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{}}}, Op: OpEq}, Then: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$str"}, SuffixList: []*Suffix{{Index: &Index{End: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "offset"}}}, IsSlice: true}}}}}, Right: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "string"}}}, Op: OpAdd}, Else: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "matches"}, SuffixList: []*Suffix{{Index: &Index{Start: &Query{Term: &Term{Type: TermTypeUnary, Unary: &Unary{Op: OpSub, Term: &Term{Type: TermTypeNumber, Number: "1"}}}}}}}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeObject, Object: &Object{KeyVals: []*ObjectKeyVal{{Key: "string", Val: &Query{Left: &Query{Left: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$r"}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_capture"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "str"}}}, Op: OpPipe}, Op: OpPipe}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$str"}, SuffixList: []*Suffix{{Index: &Index{Start: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$r"}, SuffixList: []*Suffix{{Index: &Index{Name: "offset"}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$r"}, SuffixList: []*Suffix{{Index: &Index{Name: "length"}}}}}, Op: OpAdd}, End: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "offset"}}}, IsSlice: true}}}}}, Op: OpAdd}, Right: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "string"}}}, Op: OpAdd}}, {Key: "offset", Val: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$r"}, SuffixList: []*Suffix{{Index: &Index{Name: "offset"}}}}}}, {Key: "matches", Val: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Name: "matches"}, SuffixList: []*Suffix{{Index: &Index{End: &Query{Term: &Term{Type: TermTypeUnary, Unary: &Unary{Op: OpSub, Term: &Term{Type: TermTypeNumber, Number: "1"}}}}, IsSlice: true}}}}}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_sub"}}}, Op: OpPipe}, Patterns: []*Pattern{{Name: "$r"}}, Op: OpPipe}}}}}}, Left: &Query{Term: &Term{Type: TermTypeObject, Object: &Object{KeyVals: []*ObjectKeyVal{{Key: "string", Val: &Query{Term: &Term{Type: TermTypeString, Str: &String{}}}}, {Key: "matches", Val: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "match", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$flags"}}}}}}}}}}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_sub"}}}, Op: OpPipe}, Patterns: []*Pattern{{Name: "$str"}}, Op: OpPipe}}},
+ "test": {{Name: "test", Args: []string{"$re"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "test", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeNull}}}}}}}, {Name: "test", Args: []string{"$re", "$flags"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_match", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$re"}}}, {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$flags"}}}, {Term: &Term{Type: TermTypeTrue}}}}}}}},
+ "todate": {{Name: "todate", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "todateiso8601"}}}}},
"todateiso8601": {{Name: "todateiso8601", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "strftime", Args: []*Query{{Term: &Term{Type: TermTypeString, Str: &String{Str: "%Y-%m-%dT%H:%M:%SZ"}}}}}}}}},
- "tostream": {{Name: "tostream", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{FuncDefs: []*FuncDef{{Name: "r", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}, {Optional: true}}}}, Op: OpPipe, Right: &Query{Func: "r"}}}}, Op: OpComma, Right: &Query{Func: "."}}}}, Func: "r"}}}, SuffixList: []*Suffix{{Bind: &Bind{Patterns: []*Pattern{{Name: "$p"}}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "getpath", Args: []*Query{{Func: "$p"}}}}}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeReduce, Reduce: &Reduce{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}, {Optional: true}}}}}}}}, Pattern: &Pattern{Name: "$q"}, Start: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Func: "$p"}, Op: OpComma, Right: &Query{Func: "."}}}}}, Update: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Func: "$p"}, Op: OpAdd, Right: &Query{Func: "$q"}}}}}}}}}}}}}}}},
- "truncate_stream": {{Name: "truncate_stream", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Bind: &Bind{Patterns: []*Pattern{{Name: "$n"}}, Body: &Query{Left: &Query{Func: "null"}, Op: OpPipe, Right: &Query{Left: &Query{Func: "f"}, Op: OpPipe, Right: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}}}, Op: OpPipe, Right: &Query{Left: &Query{Func: "length"}, Op: OpGt, Right: &Query{Func: "$n"}}}, Then: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}}}, Op: OpModify, Right: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Func: "$n"}, IsSlice: true}}}}, Else: &Query{Func: "empty"}}}}}}}}}}}}},
- "unique_by": {{Name: "unique_by", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_unique_by", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Func: "f"}}}}}}}}}}}}}},
- "until": {{Name: "until", Args: []string{"cond", "next"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "_until", Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Func: "cond"}, Then: &Query{Func: "."}, Else: &Query{Left: &Query{Func: "next"}, Op: OpPipe, Right: &Query{Func: "_until"}}}}}}}, Func: "_until"}}},
- "values": {{Name: "values", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Func: "."}, Op: OpNe, Right: &Query{Func: "null"}}}}}}}},
- "walk": {{Name: "walk", Args: []string{"f"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "_walk", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Func: "type"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "array"}}}}, Then: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Func: "_walk"}}}}}, Elif: []*IfElif{{Cond: &Query{Left: &Query{Func: "type"}, Op: OpEq, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "object"}}}}, Then: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map_values", Args: []*Query{{Func: "_walk"}}}}}}}}}}, Op: OpPipe, Right: &Query{Func: "f"}}}}, Func: "_walk"}}},
- "while": {{Name: "while", Args: []string{"cond", "update"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "_while", Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Func: "cond"}, Then: &Query{Left: &Query{Func: "."}, Op: OpComma, Right: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Func: "update"}, Op: OpPipe, Right: &Query{Func: "_while"}}}}}, Else: &Query{Func: "empty"}}}}}}, Func: "_while"}}},
- "with_entries": {{Name: "with_entries", Args: []string{"f"}, Body: &Query{Left: &Query{Func: "to_entries"}, Op: OpPipe, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Func: "f"}}}}}, Op: OpPipe, Right: &Query{Func: "from_entries"}}}}},
+ "tostream": {{Name: "tostream", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{FuncDefs: []*FuncDef{{Name: "r", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}, {Optional: true}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "r"}}}, Op: OpPipe}}}, Right: &Query{Term: &Term{Type: TermTypeIdentity}}, Op: OpComma}}}, Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "r"}}}}}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "getpath", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$p"}}}}}}}, Right: &Query{Term: &Term{Type: TermTypeReduce, Reduce: &Reduce{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "path", Args: []*Query{{Term: &Term{Type: TermTypeIdentity, SuffixList: []*Suffix{{Iter: true}, {Optional: true}}}}}}}}, Pattern: &Pattern{Name: "$q"}, Start: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$p"}}}, Right: &Query{Term: &Term{Type: TermTypeIdentity}}, Op: OpComma}}}}, Update: &Query{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$p"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$q"}}}, Op: OpAdd}}}}}}}, Op: OpPipe}, Patterns: []*Pattern{{Name: "$p"}}, Op: OpPipe}}},
+ "truncate_stream": {{Name: "truncate_stream", Args: []string{"f"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeNull}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}, Right: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "length"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}, Op: OpGt}, Op: OpPipe}, Then: &Query{Left: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeNumber, Number: "0"}}}}}, Right: &Query{Term: &Term{Type: TermTypeIndex, Index: &Index{Start: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "$n"}}}, IsSlice: true}}}, Op: OpModify}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "empty"}}}}}}, Op: OpPipe}, Op: OpPipe}, Patterns: []*Pattern{{Name: "$n"}}, Op: OpPipe}}},
+ "unique_by": {{Name: "unique_by", Args: []string{"f"}, Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_unique_by", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeArray, Array: &Array{Query: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}}}}}}}}}}}}}},
+ "until": {{Name: "until", Args: []string{"cond", "next"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "_until", Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "cond"}}}, Then: &Query{Term: &Term{Type: TermTypeIdentity}}, Else: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "next"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_until"}}}, Op: OpPipe}}}}}}, Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_until"}}}}},
+ "values": {{Name: "values", Body: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "select", Args: []*Query{{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeNull}}, Op: OpNe}}}}}}},
+ "walk": {{Name: "walk", Args: []string{"f"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "_walk", Body: &Query{Left: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "type"}}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "array"}}}, Op: OpEq}, Then: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_walk"}}}}}}}, Elif: []*IfElif{{Cond: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "type"}}}, Right: &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: "object"}}}, Op: OpEq}, Then: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map_values", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_walk"}}}}}}}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}, Op: OpPipe}}}, Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_walk"}}}}},
+ "while": {{Name: "while", Args: []string{"cond", "update"}, Body: &Query{FuncDefs: []*FuncDef{{Name: "_while", Body: &Query{Term: &Term{Type: TermTypeIf, If: &If{Cond: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "cond"}}}, Then: &Query{Left: &Query{Term: &Term{Type: TermTypeIdentity}}, Right: &Query{Term: &Term{Type: TermTypeQuery, Query: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "update"}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_while"}}}, Op: OpPipe}}}, Op: OpComma}, Else: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "empty"}}}}}}}}, Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "_while"}}}}},
+ "with_entries": {{Name: "with_entries", Args: []string{"f"}, Body: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "to_entries"}}}, Right: &Query{Left: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "map", Args: []*Query{{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "f"}}}}}}}, Right: &Query{Term: &Term{Type: TermTypeFunc, Func: &Func{Name: "from_entries"}}}, Op: OpPipe}, Op: OpPipe}}},
}
}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/builtin.jq b/hack/tools/vendor/github.com/itchyny/gojq/builtin.jq
index 987e419212..a704921611 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/builtin.jq
+++ b/hack/tools/vendor/github.com/itchyny/gojq/builtin.jq
@@ -59,6 +59,7 @@ def walk(f):
def first: .[0];
def first(g): label $out | g | ., break $out;
def last: .[-1];
+def last(g): _last(g);
def isempty(g): label $out | (g | false, break $out), true;
def all: all(.);
def all(y): all(.[]; y);
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/cli/cli.go b/hack/tools/vendor/github.com/itchyny/gojq/cli/cli.go
index 25d67b5651..b945094433 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/cli/cli.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/cli/cli.go
@@ -16,7 +16,7 @@ import (
const name = "gojq"
-const version = "0.12.17"
+const version = "0.12.18"
var revision = "HEAD"
@@ -398,7 +398,7 @@ func (cli *cli) createMarshaler() marshaler {
}
indent := 2
if cli.outputCompact {
- indent = 0
+ indent = -1
} else if cli.outputTab {
indent = 1
} else if i := cli.outputIndent; i != nil {
@@ -412,7 +412,7 @@ func (cli *cli) createMarshaler() marshaler {
}
func (cli *cli) funcDebug(v any, _ []any) any {
- if err := newEncoder(false, 0).
+ if err := newEncoder(false, -1).
marshal([]any{"DEBUG:", v}, cli.errStream); err != nil {
return err
}
@@ -423,7 +423,7 @@ func (cli *cli) funcDebug(v any, _ []any) any {
}
func (cli *cli) funcStderr(v any, _ []any) any {
- if err := (&rawMarshaler{m: newEncoder(false, 0)}).
+ if err := (&rawMarshaler{m: newEncoder(false, -1)}).
marshal(v, cli.errStream); err != nil {
return err
}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/cli/encoder.go b/hack/tools/vendor/github.com/itchyny/gojq/cli/encoder.go
index e0556f9749..f9736178f4 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/cli/encoder.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/cli/encoder.go
@@ -2,6 +2,8 @@ package cli
import (
"bytes"
+ "cmp"
+ "encoding/json"
"fmt"
"io"
"math"
@@ -33,11 +35,7 @@ func (e *encoder) flush() error {
func (e *encoder) marshal(v any, w io.Writer) error {
e.out = w
- err := e.encode(v)
- if ferr := e.flush(); ferr != nil && err == nil {
- err = ferr
- }
- return err
+ return cmp.Or(e.encode(v), e.flush())
}
func (e *encoder) encode(v any) error {
@@ -56,6 +54,8 @@ func (e *encoder) encode(v any) error {
e.encodeFloat64(v)
case *big.Int:
e.write(v.Append(e.buf[:0], 10), numberColor)
+ case json.Number:
+ e.write([]byte(v.String()), numberColor)
case string:
e.encodeString(v, stringColor)
case []any:
@@ -166,7 +166,7 @@ func (e *encoder) encodeArray(vs []any) error {
if i > 0 {
e.writeByte(',', arrayColor)
}
- if e.indent != 0 {
+ if e.indent >= 0 {
e.writeIndent()
}
if err := e.encode(v); err != nil {
@@ -174,7 +174,7 @@ func (e *encoder) encodeArray(vs []any) error {
}
}
e.depth -= e.indent
- if len(vs) > 0 && e.indent != 0 {
+ if len(vs) > 0 && e.indent >= 0 {
e.writeIndent()
}
e.writeByte(']', arrayColor)
@@ -201,12 +201,12 @@ func (e *encoder) encodeObject(vs map[string]any) error {
if i > 0 {
e.writeByte(',', objectColor)
}
- if e.indent != 0 {
+ if e.indent >= 0 {
e.writeIndent()
}
e.encodeString(kv.key, objectKeyColor)
e.writeByte(':', objectColor)
- if e.indent != 0 {
+ if e.indent >= 0 {
e.w.WriteByte(' ')
}
if err := e.encode(kv.val); err != nil {
@@ -214,7 +214,7 @@ func (e *encoder) encodeObject(vs map[string]any) error {
}
}
e.depth -= e.indent
- if len(vs) > 0 && e.indent != 0 {
+ if len(vs) > 0 && e.indent >= 0 {
e.writeIndent()
}
e.writeByte('}', objectColor)
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/cli/error.go b/hack/tools/vendor/github.com/itchyny/gojq/cli/error.go
index bb6d4aa074..da5cdf4cda 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/cli/error.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/cli/error.go
@@ -9,6 +9,7 @@ import (
"strings"
"unicode/utf8"
+ "github.com/itchyny/go-yaml"
"github.com/mattn/go-runewidth"
"github.com/itchyny/gojq"
@@ -121,18 +122,24 @@ type yamlParseError struct {
}
func (err *yamlParseError) Error() string {
- var line int
- msg := strings.TrimPrefix(
- strings.TrimPrefix(err.err.Error(), "yaml: "),
- "unmarshal errors:\n ")
- if _, e := fmt.Sscanf(msg, "line %d: ", &line); e != nil {
- return "invalid yaml: " + err.fname
+ var index int
+ var message string
+ var pe *yaml.ParserError
+ var te *yaml.TypeError
+ if errors.As(err.err, &pe) {
+ index, message = pe.Index, pe.Message
+ } else if errors.As(err.err, &te) {
+ var ue *yaml.UnmarshalError
+ for _, e := range te.Errors {
+ if errors.As(e, &ue) {
+ index, message = ue.Index, ue.Err.Error()
+ break
+ }
+ }
}
- _, msg, _ = strings.Cut(msg, ": ")
- msg, _, _ = strings.Cut(msg, "\n")
- linestr := getLineByLine(err.contents, line)
+ linestr, line, column := getLineByOffset(err.contents, index+1)
return fmt.Sprintf("invalid yaml: %s:%d\n%s %s",
- err.fname, line, formatLineInfo(linestr, line, 0), msg)
+ err.fname, line, formatLineInfo(linestr, line, column), message)
}
func getLineByOffset(str string, offset int) (linestr string, line, column int) {
@@ -166,24 +173,6 @@ func getLineByOffset(str string, offset int) (linestr string, line, column int)
return
}
-func getLineByLine(str string, line int) (linestr string) {
- ss := &stringScanner{str, 0}
- for {
- str, _, ok := ss.next()
- if !ok {
- break
- }
- if line--; line == 0 {
- linestr = str
- break
- }
- }
- if len(linestr) > 64 {
- linestr = trimLastInvalidRune(linestr[:64])
- }
- return
-}
-
func trimLastInvalidRune(s string) string {
for i := len(s) - 1; i >= 0 && i > len(s)-utf8.UTFMax; i-- {
if b := s[i]; b < utf8.RuneSelf {
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/cli/flags.go b/hack/tools/vendor/github.com/itchyny/gojq/cli/flags.go
index 1383c8b86c..8ca51b108b 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/cli/flags.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/cli/flags.go
@@ -14,7 +14,7 @@ func parseFlags(args []string, opts any) ([]string, error) {
longToValue := map[string]reflect.Value{}
longToPositional := map[string]struct{}{}
shortToValue := map[string]reflect.Value{}
- for i, l := 0, val.NumField(); i < l; i++ {
+ for i := range val.NumField() {
if flag, ok := typ.Field(i).Tag.Lookup("long"); ok {
longToValue[flag] = val.Field(i)
if _, ok := typ.Field(i).Tag.Lookup("positional"); ok {
@@ -163,9 +163,9 @@ func formatFlags(opts any) string {
typ := val.Type()
var sb strings.Builder
sb.WriteString("Command Options:\n")
- for i, l := 0, typ.NumField(); i < l; i++ {
+ for i := range typ.NumField() {
tag := typ.Field(i).Tag
- if i == l-1 {
+ if i == typ.NumField()-1 {
sb.WriteString("\nHelp Option:\n")
}
sb.WriteString(" ")
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/cli/inputs.go b/hack/tools/vendor/github.com/itchyny/gojq/cli/inputs.go
index 5cb9015069..20c40aa5e6 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/cli/inputs.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/cli/inputs.go
@@ -8,19 +8,19 @@ import (
"os"
"strings"
- "gopkg.in/yaml.v3"
+ "github.com/itchyny/go-yaml"
"github.com/itchyny/gojq"
)
type inputReader struct {
io.Reader
- file *os.File
- buf *bytes.Buffer
+ rs io.ReadSeeker
+ buf *bytes.Buffer
}
func newInputReader(r io.Reader) *inputReader {
- if r, ok := r.(*os.File); ok {
+ if r, ok := r.(io.ReadSeeker); ok {
if _, err := r.Seek(0, io.SeekCurrent); err == nil {
return &inputReader{r, r, nil}
}
@@ -33,31 +33,29 @@ func (ir *inputReader) getContents(offset *int64, line *int) string {
if buf := ir.buf; buf != nil {
return buf.String()
}
- if current, err := ir.file.Seek(0, io.SeekCurrent); err == nil {
- defer func() { ir.file.Seek(current, io.SeekStart) }()
+ if current, err := ir.rs.Seek(0, io.SeekCurrent); err == nil {
+ defer ir.rs.Seek(current, io.SeekStart)
}
- ir.file.Seek(0, io.SeekStart)
+ _, _ = ir.rs.Seek(0, io.SeekStart)
const bufSize = 16 * 1024
var buf bytes.Buffer // do not use strings.Builder because we need to Reset
- if offset != nil && *offset > bufSize {
- buf.Grow(bufSize)
- for *offset > bufSize {
- n, err := io.Copy(&buf, io.LimitReader(ir.file, bufSize))
- *offset -= int64(n)
- *line += bytes.Count(buf.Bytes(), []byte{'\n'})
- buf.Reset()
- if err != nil || n == 0 {
- break
- }
+ for offset != nil && *offset > bufSize*3/4 {
+ n, err := io.Copy(&buf,
+ io.LimitReader(ir.rs, min(bufSize, *offset-bufSize/4)))
+ *offset -= n
+ *line += bytes.Count(buf.Bytes(), []byte{'\n'})
+ buf.Reset()
+ if err != nil || n == 0 {
+ break
}
}
var r io.Reader
if offset == nil {
- r = ir.file
+ r = ir.rs
} else {
- r = io.LimitReader(ir.file, bufSize*2)
+ r = io.LimitReader(ir.rs, bufSize)
}
- io.Copy(&buf, r)
+ _, _ = io.Copy(&buf, r)
return buf.String()
}
@@ -96,9 +94,13 @@ func (i *jsonInputIter) Next() (any, bool) {
}
var offset *int64
var line *int
- if err, ok := err.(*json.SyntaxError); ok {
- err.Offset -= i.offset
- offset, line = &err.Offset, &i.line
+ if e, ok := err.(*json.SyntaxError); ok {
+ e.Offset -= i.offset
+ offset, line = &e.Offset, &i.line
+ } else if err == io.ErrUnexpectedEOF && i.ir.rs != nil {
+ if pos, err := i.ir.rs.Seek(0, io.SeekEnd); err == nil {
+ offset, line = &pos, &i.line
+ }
}
i.err = &jsonParseError{i.fname, i.ir.getContents(offset, line), i.line, err}
return i.err, true
@@ -287,7 +289,7 @@ func (i *yamlInputIter) Next() (any, bool) {
i.err = &yamlParseError{i.fname, i.ir.getContents(nil, nil), err}
return i.err, true
}
- return normalizeYAML(v), true
+ return v, true
}
func (i *yamlInputIter) Close() error {
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/cli/marshaler.go b/hack/tools/vendor/github.com/itchyny/gojq/cli/marshaler.go
index db09afbbef..5fb8b9404c 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/cli/marshaler.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/cli/marshaler.go
@@ -5,7 +5,7 @@ import (
"io"
"strings"
- "gopkg.in/yaml.v3"
+ "github.com/itchyny/go-yaml"
)
type marshaler interface {
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/cli/stream.go b/hack/tools/vendor/github.com/itchyny/gojq/cli/stream.go
index d9285cc233..353fe35e22 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/cli/stream.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/cli/stream.go
@@ -82,8 +82,6 @@ func (s *jsonStream) next() (any, error) {
}
s.states[len(s.states)-1] = jsonStateObjectEnd
return []any{s.copyPath()}, nil
- default:
- panic(d)
}
} else {
switch s.states[len(s.states)-1] {
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/cli/test.yaml b/hack/tools/vendor/github.com/itchyny/gojq/cli/test.yaml
index e05fdc6159..b733e393b4 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/cli/test.yaml
+++ b/hack/tools/vendor/github.com/itchyny/gojq/cli/test.yaml
@@ -73,9 +73,13 @@
- name: number input
args:
- '.'
- input: '128'
+ input: '128 3.14 10.0 6.02e23 5e1000'
expected: |
128
+ 3.14
+ 10.0
+ 6.02e23
+ 5e1000
- name: number query
args:
@@ -336,6 +340,13 @@
expected: |
4722366482869645213696
+- name: object indexing with floating-point number with trailing zeros
+ args:
+ - '.foo'
+ input: '{"foo": 100.000}'
+ expected: |
+ 100.000
+
- name: object indexing by keywords
args:
- '.and,.or,.try'
@@ -542,6 +553,17 @@
[[],[],[0],[0,1],[],[0],[0,1],[0,1,2]]
[[],[],[],[],[2],[0,1],[],[0],[0,1],[0,1,2],[1],[],[],[1],[1,2],[],[],[],[],[2],[],[],[],[],[]]
+- name: array indexing and slicing by floating-point number
+ args:
+ - -c
+ - '[.[-2.8,-1.2,0.3,1.7,2.2]], [.[0.3,1.7:]], [.[:0.3,1.7]], [.[0.3,1.7,2.2:0.3,1.7,2.2]]'
+ input: '[0, 1, 2]'
+ expected: |
+ [1,2,0,1,2]
+ [[0,1,2],[1,2]]
+ [[0],[0,1]]
+ [[0],[0,1],[0,1,2],[],[1],[1,2],[],[],[2]]
+
- name: array indexing and slicing by large number
args:
- -c
@@ -702,13 +724,28 @@
error: |
expected a number for indexing an array but got: object ({})
-- name: string indexing and slicing
+- name: string indexing
args:
- - -c
- - '[.[-5],.[-1],.[0],.[3],.[4],.[6],.[2:4],.[-4:-2]]'
+ - '.[-5,-1,0,3,4,6]'
+ input: '"12345"'
+ expected: |
+ "1"
+ "5"
+ "1"
+ "4"
+ "5"
+ null
+
+- name: string slicing
+ args:
+ - '.[3:], .[:3], .[2:4], .[-4:-2], .[1.5:3.5]'
input: '"12345"'
expected: |
- ["1","5","1","4","5",null,"34","23"]
+ "45"
+ "123"
+ "34"
+ "23"
+ "234"
- name: string indexing not number error
args:
@@ -892,6 +929,30 @@
-1
]
+- name: unary operator with type function
+ args:
+ - '., -. | type'
+ input: '-100'
+ expected: |
+ "number"
+ "number"
+
+- name: arithmetic operator with variable binding
+ args:
+ - '1 + 2 as $x | -$x'
+ input: 'null'
+ expected: |
+ -3
+
+- name: alternative operator with variable binding
+ args:
+ - 'true // 1 as $x | [$x]'
+ input: 'null'
+ expected: |
+ [
+ true
+ ]
+
- name: object construction
args:
- -c
@@ -1251,7 +1312,7 @@
0
42
42
- 0
+ 0.0
3.14
3.14
4722366482869645213696
@@ -1799,6 +1860,38 @@
"range cannot be applied to: string (\"\")"
"range cannot be applied to: array ([])"
+- name: toboolean function
+ args:
+ - 'toboolean'
+ input: |
+ "true"
+ "false"
+ true
+ false
+ expected: |
+ true
+ false
+ true
+ false
+
+- name: toboolean function error
+ args:
+ - 'try toboolean catch .'
+ input: |
+ null
+ ""
+ " true "
+ "FALSE"
+ []
+ {}
+ expected: |
+ "toboolean cannot be applied to: null"
+ "toboolean cannot be applied to \"\": invalid boolean"
+ "toboolean cannot be applied to \" true \": invalid boolean"
+ "toboolean cannot be applied to \"FALSE\": invalid boolean"
+ "toboolean cannot be applied to: array ([])"
+ "toboolean cannot be applied to: object ({})"
+
- name: tonumber function
args:
- 'tonumber'
@@ -2146,6 +2239,32 @@
"rtrimstr({}) cannot be applied to: string (\"x\")"
"rtrimstr(\"x\") cannot be applied to: number (10)"
+- name: trimstr function
+ args:
+ - 'trimstr("foo")'
+ input: |
+ ""
+ "fo"
+ "foo"
+ "fofoo"
+ "foobarfoo"
+ "foofoofoo"
+ expected: |
+ ""
+ "fo"
+ ""
+ "fo"
+ "bar"
+ "foo"
+
+- name: trimstr function error
+ args:
+ - '("x" | try trimstr({}) catch .), (10 | try trimstr("x") catch .)'
+ input: '0'
+ expected: |
+ "trimstr({}) cannot be applied to: string (\"x\")"
+ "trimstr(\"x\") cannot be applied to: number (10)"
+
- name: ltrim function
args:
- 'ltrim'
@@ -2853,7 +2972,7 @@
- name: multiply strings
args:
- - '[-1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 3.7, 10, 9444732965739290427392 / 4722366482869645213696, 100000000, infinite, -infinite, nan, -1e300, 1e300][] * "abc"'
+ - '(-1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 3.7, 10, nan) * "abc"'
input: 'null'
expected: |
null
@@ -2864,14 +2983,18 @@
"abc"
"abcabcabc"
"abcabcabcabcabcabcabcabcabcabc"
- "abcabc"
- null
- null
- null
- null
- null
null
+- name: multiply strings error
+ args:
+ - -r
+ - '(infinite, 1e300, 720000000) as $n | try ($n * "abc") catch .'
+ input: 'null'
+ expected: |
+ repeat string result too large: "abc" * 1.7976931348623157e+308
+ repeat string result too large: "abc" * 1e+300
+ repeat string result too large: "abc" * 720000000
+
- name: multiply empty string
args:
- '(-9223372036854775808, -1, 0, 0.001, 0.999, 1, 7, 9223372036854775807) * ""'
@@ -2886,6 +3009,16 @@
""
""
+- name: add objects
+ args:
+ - -c
+ - '.[0] + .[]'
+ input: '[{"a": 1}, {"b": 2}, {"a": 3}]'
+ expected: |
+ {"a":1}
+ {"a":1,"b":2}
+ {"a":3}
+
- name: multiply objects
args:
- -c
@@ -2901,17 +3034,24 @@
args:
- -c
- '.[] / .[]'
- input: '["abc", "a", "b"]'
+ input: '["abc", "a", "b", ""]'
expected: |
["",""]
["a"]
["b"]
+ []
["","bc"]
["",""]
["b"]
+ []
["a","c"]
["a"]
["",""]
+ []
+ ["a","b","c"]
+ ["a"]
+ ["b"]
+ []
- name: add and subtract arrays
args:
@@ -5011,10 +5151,10 @@
- name: assignment operator array index limit error
args:
- - '.[200000000] = 1'
+ - '.[999999999] = 1'
input: '[]'
error: |
- array index too large: 200000000
+ array index too large: 999999999
- name: assignment operator with select
args:
@@ -5531,57 +5671,62 @@
- name: gmtime, localtime functions
args:
- -c
- - 'gmtime, localtime'
+ - 'gmtime, localtime | map(. * 1000000 | floor / 1000000)'
input: '1500000000 1567890123.456 1600000000.111'
- expected: | # tested with UTC-7
+ expected: | # UTC-7 (TZ=Etc/GMT+7)
[2017,6,14,2,40,0,5,194]
[2017,6,13,19,40,0,4,193]
- [2019,8,7,21,2,3.4560000889999998,6,249]
- [2019,8,7,14,2,3.4560000889999998,6,249]
- [2020,8,13,12,26,40.111000061,0,256]
- [2020,8,13,5,26,40.111000061,0,256]
+ [2019,8,7,21,2,3.456,6,249]
+ [2019,8,7,14,2,3.456,6,249]
+ [2020,8,13,12,26,40.111,0,256]
+ [2020,8,13,5,26,40.111,0,256]
- name: mktime, strftime, strflocaltime, todate functions
args:
- - -c
- - 'mktime, ((.,mktime) | strftime("%Y-%m-%dT%H:%M:%SZ")), ((.,mktime) | strflocaltime("%Y-%m-%dT%H:%M:%S%z")), todate'
+ - -cr
+ - '(.,mktime | .,strftime("%Y-%m-%dT%H:%M:%SZ"),strflocaltime("%Y-%m-%dT%H:%M:%S%z")), todate'
input: |
[2017,6,14,2,40,0,5,194]
- [2019,8,7,21,2,3.4560000889999998,6,249]
- [2020,8,13,12,26,40.111000061,0,256]
+ [2019,8,7,21,2,3.456,6,249]
+ [2020,8,13,12,26,40.111,0,256]
[2024,7,20]
[2025]
expected: |
+ [2017,6,14,2,40,0,5,194]
+ 2017-07-14T02:40:00Z
+ 2017-07-14T02:40:00-0700
1500000000
- "2017-07-14T02:40:00Z"
- "2017-07-14T02:40:00Z"
- "2017-07-14T02:40:00-0700"
- "2017-07-13T19:40:00-0700"
- "2017-07-14T02:40:00Z"
+ 2017-07-14T02:40:00Z
+ 2017-07-13T19:40:00-0700
+ 2017-07-14T02:40:00Z
+ [2019,8,7,21,2,3.456,6,249]
+ 2019-09-07T21:02:03Z
+ 2019-09-07T21:02:03-0700
1567890123.456
- "2019-09-07T21:02:03Z"
- "2019-09-07T21:02:03Z"
- "2019-09-07T21:02:03-0700"
- "2019-09-07T14:02:03-0700"
- "2019-09-07T21:02:03Z"
+ 2019-09-07T21:02:03Z
+ 2019-09-07T14:02:03-0700
+ 2019-09-07T21:02:03Z
+ [2020,8,13,12,26,40.111,0,256]
+ 2020-09-13T12:26:40Z
+ 2020-09-13T12:26:40-0700
1600000000.111
- "2020-09-13T12:26:40Z"
- "2020-09-13T12:26:40Z"
- "2020-09-13T12:26:40-0700"
- "2020-09-13T05:26:40-0700"
- "2020-09-13T12:26:40Z"
+ 2020-09-13T12:26:40Z
+ 2020-09-13T05:26:40-0700
+ 2020-09-13T12:26:40Z
+ [2024,7,20]
+ 2024-08-20T00:00:00Z
+ 2024-08-20T00:00:00-0700
1724112000
- "2024-08-20T00:00:00Z"
- "2024-08-20T00:00:00Z"
- "2024-08-20T00:00:00-0700"
- "2024-08-19T17:00:00-0700"
- "2024-08-20T00:00:00Z"
+ 2024-08-20T00:00:00Z
+ 2024-08-19T17:00:00-0700
+ 2024-08-20T00:00:00Z
+ [2025]
+ 2024-12-31T00:00:00Z
+ 2024-12-31T00:00:00-0700
1735603200
- "2024-12-31T00:00:00Z"
- "2024-12-31T00:00:00Z"
- "2024-12-31T00:00:00-0700"
- "2024-12-30T17:00:00-0700"
- "2024-12-31T00:00:00Z"
+ 2024-12-31T00:00:00Z
+ 2024-12-30T17:00:00-0700
+ 2024-12-31T00:00:00Z
- name: strptime, fromdate functions
args:
@@ -6851,6 +6996,17 @@
"foo": 42
}
+- name: NO_COLOR environment variable
+ args:
+ - '.'
+ input: '{"foo":42}'
+ env:
+ - NO_COLOR=1
+ expected: |
+ {
+ "foo": 42
+ }
+
- name: NO_COLOR environment variable with color output option
args:
- --color-output
@@ -6884,7 +7040,12 @@
- '.'
input: '{ "foo": ["hello", "world"] }'
expected: |
- {"foo":["hello","world"]}
+ {
+ "foo": [
+ "hello",
+ "world"
+ ]
+ }
- name: indent option with deeply nested array
args:
@@ -7309,12 +7470,12 @@
- '.'
input: |
foo:
- - 42: bar
+ - 42.10: bar
expected: |
{
"foo": [
{
- "42": "bar"
+ "42.10": "bar"
}
]
}
@@ -7327,13 +7488,36 @@
foo: 2021-01-02
bar: 2021-01-02t10:11:12Z
baz: "2021-01-02"
- expected: | # it is impossible to keep the original timestamp strings
+ qux: !!timestamp 2021-01-02
+ expected: |
{
- "bar": "2021-01-02T10:11:12Z",
+ "bar": "2021-01-02t10:11:12Z",
"baz": "2021-01-02",
- "foo": "2021-01-02T00:00:00Z"
+ "foo": "2021-01-02",
+ "qux": "2021-01-02"
}
+- name: yaml input option with large numbers
+ args:
+ - --yaml-input
+ - '.[] + 1'
+ input: |
+ - 9223372036854775807
+ - 18446744073709551615
+ - 18446744073709551616
+ - 99999999999999999999999
+ - 0b111111111111111111111111111111111111111111111111111111111111111
+ - 0o777777777777777777777
+ - 0x7FFFFFFFFFFFFFFF
+ expected: |
+ 9223372036854775808
+ 18446744073709551616
+ 18446744073709551617
+ 100000000000000000000000
+ 9223372036854775808
+ 9223372036854775808
+ 9223372036854775808
+
- name: yaml input option with slurp option
args:
- --yaml-input
@@ -7390,6 +7574,19 @@
2 | 10
^ could not find expected ':'
+- name: yaml input option error
+ args:
+ - --yaml-input
+ - '.'
+ input: |
+ foo: 10
+ bar: ]
+ baz:
+ error: |
+ invalid yaml: :2
+ 2 | bar: ]
+ ^ did not find expected node content
+
- name: yaml input option multiple errors
args:
- --yaml-input
@@ -7398,6 +7595,7 @@
foo: 1
bar: 2
foo: 3
+ bar: 4
error: |
invalid yaml: :3
3 | foo: 3
@@ -7411,7 +7609,7 @@
error: |
invalid yaml: testdata/2.yaml:5
5 | a: b: c
- ^ mapping values are not allowed in this context
+ ^ mapping values are not allowed in this context
- name: yaml file input error in dos format
args:
@@ -7421,7 +7619,7 @@
error: |
invalid yaml: testdata/3.yaml:5
5 | a: b: c
- ^ mapping values are not allowed in this context
+ ^ mapping values are not allowed in this context
- name: yaml file input error in mac format
args:
@@ -7431,7 +7629,7 @@
error: |
invalid yaml: testdata/4.yaml:5
5 | a: b: c
- ^ mapping values are not allowed in this context
+ ^ mapping values are not allowed in this context
- name: yaml output option
args:
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/cli/yaml.go b/hack/tools/vendor/github.com/itchyny/gojq/cli/yaml.go
deleted file mode 100644
index 652bdb2c50..0000000000
--- a/hack/tools/vendor/github.com/itchyny/gojq/cli/yaml.go
+++ /dev/null
@@ -1,39 +0,0 @@
-package cli
-
-import (
- "fmt"
- "time"
-)
-
-// Workaround for https://github.com/go-yaml/yaml/issues/139
-func normalizeYAML(v any) any {
- switch v := v.(type) {
- case map[any]any:
- w := make(map[string]any, len(v))
- for k, v := range v {
- w[fmt.Sprint(k)] = normalizeYAML(v)
- }
- return w
-
- case map[string]any:
- w := make(map[string]any, len(v))
- for k, v := range v {
- w[k] = normalizeYAML(v)
- }
- return w
-
- case []any:
- for i, w := range v {
- v[i] = normalizeYAML(w)
- }
- return v
-
- // go-yaml unmarshals timestamp string to time.Time but gojq cannot handle it.
- // It is impossible to keep the original timestamp strings.
- case time.Time:
- return v.Format(time.RFC3339)
-
- default:
- return v
- }
-}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/compare.go b/hack/tools/vendor/github.com/itchyny/gojq/compare.go
index 9791e9dc1c..533c9760c1 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/compare.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/compare.go
@@ -1,6 +1,8 @@
package gojq
import (
+ "cmp"
+ "encoding/json"
"math"
"math/big"
)
@@ -10,8 +12,8 @@ import (
// This comparison is used by built-in operators and functions.
func Compare(l, r any) int {
return binopTypeSwitch(l, r,
- compareInt,
- func(l, r float64) any {
+ cmp.Compare,
+ func(l, r float64) int {
switch {
case l < r || math.IsNaN(l):
return -1
@@ -21,28 +23,17 @@ func Compare(l, r any) int {
return 1
}
},
- func(l, r *big.Int) any {
- return l.Cmp(r)
- },
- func(l, r string) any {
- switch {
- case l < r:
- return -1
- case l == r:
- return 0
- default:
- return 1
- }
- },
- func(l, r []any) any {
- for i, n := 0, min(len(l), len(r)); i < n; i++ {
+ (*big.Int).Cmp,
+ cmp.Compare,
+ func(l, r []any) int {
+ for i := range min(len(l), len(r)) {
if cmp := Compare(l[i], r[i]); cmp != 0 {
return cmp
}
}
- return compareInt(len(l), len(r))
+ return cmp.Compare(len(l), len(r))
},
- func(l, r map[string]any) any {
+ func(l, r map[string]any) int {
lk, rk := funcKeys(l), funcKeys(r)
if cmp := Compare(lk, rk); cmp != 0 {
return cmp
@@ -54,21 +45,10 @@ func Compare(l, r any) int {
}
return 0
},
- func(l, r any) any {
- return compareInt(typeIndex(l), typeIndex(r))
+ func(l, r any) int {
+ return cmp.Compare(typeIndex(l), typeIndex(r))
},
- ).(int)
-}
-
-func compareInt(l, r int) any {
- switch {
- case l < r:
- return -1
- case l == r:
- return 0
- default:
- return 1
- }
+ )
}
func typeIndex(v any) int {
@@ -80,7 +60,7 @@ func typeIndex(v any) int {
return 1
}
return 2
- case int, float64, *big.Int:
+ case int, float64, *big.Int, json.Number:
return 3
case string:
return 4
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/compiler.go b/hack/tools/vendor/github.com/itchyny/gojq/compiler.go
index cea452e3f1..3a193848b8 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/compiler.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/compiler.go
@@ -34,7 +34,6 @@ type Code struct {
// a result iterator.
//
// It is safe to call this method in goroutines, to reuse a compiled [*Code].
-// But for arguments, do not give values sharing same data between goroutines.
func (c *Code) Run(v any, values ...any) Iter {
return c.RunWithContext(context.Background(), v, values...)
}
@@ -46,10 +45,7 @@ func (c *Code) RunWithContext(ctx context.Context, v any, values ...any) Iter {
} else if len(values) < len(c.variables) {
return NewIter(&expectedVariableError{c.variables[len(values)]})
}
- for i, v := range values {
- values[i] = normalizeNumbers(v)
- }
- return newEnv(ctx).execute(c, normalizeNumbers(v), values...)
+ return newEnv(ctx).execute(c, v, values...)
}
type scopeinfo struct {
@@ -160,7 +156,6 @@ func (c *compiler) compileImport(i *Import) error {
} else {
return fmt.Errorf("module not found: %q", path)
}
- vals = normalizeNumbers(vals)
c.append(&code{op: oppush, v: vals})
c.append(&code{op: opstore, v: c.pushVariable(alias)})
c.append(&code{op: oppush, v: vals})
@@ -379,28 +374,16 @@ func (c *compiler) compileQuery(e *Query) error {
return err
}
}
- if e.Func != "" {
- switch e.Func {
- case ".":
- return c.compileTerm(&Term{Type: TermTypeIdentity})
- case "..":
- return c.compileTerm(&Term{Type: TermTypeRecurse})
- case "null":
- return c.compileTerm(&Term{Type: TermTypeNull})
- case "true":
- return c.compileTerm(&Term{Type: TermTypeTrue})
- case "false":
- return c.compileTerm(&Term{Type: TermTypeFalse})
- default:
- return c.compileFunc(&Func{Name: e.Func})
- }
- } else if e.Term != nil {
+ if e.Term != nil {
return c.compileTerm(e.Term)
}
switch e.Op {
case Operator(0):
return errors.New(`missing query (try ".")`)
case OpPipe:
+ if len(e.Patterns) > 0 {
+ return c.compileBind(e.Left, e.Right, e.Patterns)
+ }
if err := c.compileQuery(e.Left); err != nil {
return err
}
@@ -529,7 +512,7 @@ func (c *compiler) compileQueryUpdate(l, r *Query, op Operator) error {
Name: op.getFunc(),
Args: []*Query{
{Term: &Term{Type: TermTypeIdentity}},
- {Func: name},
+ {Term: &Term{Type: TermTypeFunc, Func: &Func{Name: name}}},
},
},
}},
@@ -539,19 +522,19 @@ func (c *compiler) compileQueryUpdate(l, r *Query, op Operator) error {
}
}
-func (c *compiler) compileBind(e *Term, b *Bind) error {
+func (c *compiler) compileBind(l, r *Query, patterns []*Pattern) error {
defer c.newScopeDepth()()
c.append(&code{op: opdup})
c.append(&code{op: opexpbegin})
- if err := c.compileTerm(e); err != nil {
+ if err := c.compileQuery(l); err != nil {
return err
}
var pc int
var vs [][2]int
- for i, p := range b.Patterns {
+ for i, p := range patterns {
var pcc int
var err error
- if i < len(b.Patterns)-1 {
+ if i < len(patterns)-1 {
defer c.lazy(func() *code {
return &code{op: opforkalt, v: pcc}
})()
@@ -565,22 +548,22 @@ func (c *compiler) compileBind(e *Term, b *Bind) error {
if vs, err = c.compilePattern(vs[:0], p); err != nil {
return err
}
- if i < len(b.Patterns)-1 {
+ if i < len(patterns)-1 {
defer c.lazy(func() *code {
return &code{op: opjump, v: pc}
})()
pcc = len(c.codes)
}
}
- if len(b.Patterns) > 1 {
+ if len(patterns) > 1 {
pc = len(c.codes)
}
- if len(b.Patterns) == 1 && c.codes[len(c.codes)-2].op == opexpbegin {
+ if len(patterns) == 1 && c.codes[len(c.codes)-2].op == opexpbegin {
c.codes[len(c.codes)-2].op = opnop
} else {
c.append(&code{op: opexpend})
}
- return c.compileQuery(b.Body)
+ return c.compileQuery(r)
}
func (c *compiler) compilePattern(vs [][2]int, p *Pattern) ([][2]int, error) {
@@ -953,7 +936,7 @@ func (c *compiler) compileFunc(e *Func) error {
c.compileAssign()
case "_modify":
c.compileModify()
- case "last":
+ case "_last":
c.compileLast()
}
}
@@ -1145,7 +1128,7 @@ func (c *compiler) compileModify() {
// Appends the compiled code for the `last/1` function to
// maximize performance avoiding unnecessary boxing.
func (c *compiler) compileLast() {
- defer c.appendBuiltin("last", 1)()
+ defer c.appendBuiltin("_last", 1)()
scope := c.newScope()
v, g, x := [2]int{scope.id, 0}, [2]int{scope.id, 1}, [2]int{scope.id, 2}
c.appends(
@@ -1218,7 +1201,7 @@ func (c *compiler) funcInput(any, []any) any {
if !ok {
return errors.New("break")
}
- return normalizeNumbers(v)
+ return v
}
func (c *compiler) funcModulemeta(v any, _ []any) any {
@@ -1317,7 +1300,7 @@ func (c *compiler) compileObject(e *Object) error {
if pc+l*3+1 != len(c.codes) {
return nil
}
- for i := 0; i < l; i++ {
+ for i := range l {
if c.codes[pc+i*3].op != oppush ||
c.codes[pc+i*3+1].op != opload ||
c.codes[pc+i*3+2].op != opconst {
@@ -1325,7 +1308,7 @@ func (c *compiler) compileObject(e *Object) error {
}
}
w := make(map[string]any, l)
- for i := 0; i < l; i++ {
+ for i := range l {
w[c.codes[pc+i*3].v.(string)] = c.codes[pc+i*3+2].v
}
c.codes[pc-1] = &code{op: opconst, v: w}
@@ -1417,7 +1400,7 @@ func (c *compiler) compileArray(e *Array) error {
return nil
}
l := (len(c.codes) - pc - 3) / 3
- for i := 0; i < l; i++ {
+ for i := range l {
if c.codes[pc+i].op != opfork ||
c.codes[pc+i*2+l].op != opconst ||
(i < l-1 && c.codes[pc+i*2+l+1].op != opjump) {
@@ -1425,7 +1408,7 @@ func (c *compiler) compileArray(e *Array) error {
}
}
v := make([]any, l)
- for i := 0; i < l; i++ {
+ for i := range l {
v[i] = c.codes[pc+i*2+l].v
}
c.codes[pc-2] = &code{op: opconst, v: v}
@@ -1536,8 +1519,6 @@ func (c *compiler) compileTermSuffix(e *Term, s *Suffix) error {
}
}
return c.compileTry(&Try{Body: &Query{Term: e}})
- } else if s.Bind != nil {
- return c.compileBind(e, s.Bind)
} else {
return fmt.Errorf("invalid suffix: %s", s)
}
@@ -1656,33 +1637,33 @@ func (c *compiler) optimizeTailRec() {
var pcs []int
scopes := map[int]bool{}
L:
- for i, l := 0, len(c.codes); i < l; i++ {
- switch c.codes[i].op {
+ for i, code := range c.codes {
+ switch code.op {
case opscope:
pcs = append(pcs, i)
- if v := c.codes[i].v.([3]int); v[2] == 0 {
+ if v := code.v.([3]int); v[2] == 0 {
scopes[i] = v[1] == 0
}
case opcall:
var canjump bool
- if j, ok := c.codes[i].v.(int); !ok ||
+ if j, ok := code.v.(int); !ok ||
len(pcs) == 0 || pcs[len(pcs)-1] != j {
break
} else if canjump, ok = scopes[j]; !ok {
break
}
- for j := i + 1; j < l; {
+ for j := i + 1; j < len(c.codes); {
switch c.codes[j].op {
case opjump:
j = c.codes[j].v.(int)
case opret:
if canjump {
- c.codes[i].op = opjump
- c.codes[i].v = pcs[len(pcs)-1] + 1
+ code.op = opjump
+ code.v = pcs[len(pcs)-1] + 1
} else {
- c.codes[i].op = opcallrec
+ code.op = opcallrec
}
- continue L
+ fallthrough
default:
continue L
}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/encoder.go b/hack/tools/vendor/github.com/itchyny/gojq/encoder.go
index 518904d71c..cc44c95b43 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/encoder.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/encoder.go
@@ -2,6 +2,7 @@ package gojq
import (
"bytes"
+ "encoding/json"
"fmt"
"io"
"math"
@@ -15,12 +16,12 @@ import (
// Marshal returns the jq-flavored JSON encoding of v.
//
// This method accepts only limited types (nil, bool, int, float64, *big.Int,
-// string, []any, and map[string]any) because these are the possible types a
-// gojq iterator can emit. This method marshals NaN to null, truncates
-// infinities to (+|-) math.MaxFloat64, uses \b and \f in strings, and does not
-// escape '<', '>', '&', '\u2028', and '\u2029'. These behaviors are based on
-// the marshaler of jq command, and different from json.Marshal in the Go
-// standard library. Note that the result is not safe to embed in HTML.
+// json.Number, string, []any, and map[string]any) because these are the
+// possible types a gojq iterator can emit. This method marshals NaN to null,
+// truncates infinities to (+|-) math.MaxFloat64, uses \b and \f in strings,
+// and does not escape '<', '>', '&', '\u2028', and '\u2029'. These behaviors
+// are based on the marshaler of jq command, and different from json.Marshal in
+// the Go standard library. Note that the result is not safe to embed in HTML.
func Marshal(v any) ([]byte, error) {
var b bytes.Buffer
(&encoder{w: &b}).encode(v)
@@ -62,6 +63,8 @@ func (e *encoder) encode(v any) {
e.encodeFloat64(v)
case *big.Int:
e.w.Write(v.Append(e.buf[:0], 10))
+ case json.Number:
+ e.w.WriteString(v.String())
case string:
e.encodeString(v)
case []any:
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/env.go b/hack/tools/vendor/github.com/itchyny/gojq/env.go
index bf058eda83..3ba44ad1d5 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/env.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/env.go
@@ -44,5 +44,6 @@ type fork struct {
scopelimit int
pathindex int
pathlimit int
+ offset int
expdepth int
}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/error.go b/hack/tools/vendor/github.com/itchyny/gojq/error.go
index 18b06b1ccf..743fa9f638 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/error.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/error.go
@@ -51,6 +51,15 @@ func (err *arrayIndexTooLargeError) Error() string {
return "array index too large: " + Preview(err.v)
}
+type repeatStringTooLargeError struct {
+ s string
+ n float64
+}
+
+func (err *repeatStringTooLargeError) Error() string {
+ return "repeat string result too large: " + Preview(err.s) + " * " + Preview(err.n)
+}
+
type objectKeyNotStringError struct {
v any
}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/execute.go b/hack/tools/vendor/github.com/itchyny/gojq/execute.go
index 344d8a3c57..3b7eab2b78 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/execute.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/execute.go
@@ -59,7 +59,7 @@ loop:
}
n := code.v.(int)
m := make(map[string]any, n)
- for i := 0; i < n; i++ {
+ for range n {
v, k := env.pop(), env.pop()
s, ok := k.(string)
if !ok {
@@ -180,7 +180,7 @@ loop:
case [3]any:
argcnt := v[1].(int)
x, args := env.pop(), env.args[:argcnt]
- for i := 0; i < argcnt; i++ {
+ for i := range argcnt {
args[i] = env.pop()
}
w := v[0].(func(any, []any) any)(x, args)
@@ -238,8 +238,7 @@ loop:
callpc, saveindex = env.popscope()
}
} else {
- saveindex, _ = env.scopes.save()
- env.scopes.index = index
+ saveindex = env.scopes.index
}
if outerindex = index; outerindex >= 0 {
if s := env.scopes.data[outerindex].value; s.id == xs[0] {
@@ -377,7 +376,7 @@ func (env *env) popscope() (int, int) {
}
func (env *env) pushfork(pc int) {
- f := fork{pc: pc, expdepth: env.expdepth}
+ f := fork{pc: pc, offset: env.offset, expdepth: env.expdepth}
f.stackindex, f.stacklimit = env.stack.save()
f.scopeindex, f.scopelimit = env.scopes.save()
f.pathindex, f.pathlimit = env.paths.save()
@@ -388,7 +387,8 @@ func (env *env) pushfork(pc int) {
func (env *env) popfork() int {
f := env.forks[len(env.forks)-1]
env.debugForks(f.pc, "<<<")
- env.forks, env.expdepth = env.forks[:len(env.forks)-1], f.expdepth
+ env.forks, env.offset, env.expdepth =
+ env.forks[:len(env.forks)-1], f.offset, f.expdepth
env.stack.restore(f.stackindex, f.stacklimit)
env.scopes.restore(f.scopeindex, f.scopelimit)
env.paths.restore(f.pathindex, f.pathlimit)
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/func.go b/hack/tools/vendor/github.com/itchyny/gojq/func.go
index dcfaa5d505..b7d7a34665 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/func.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/func.go
@@ -6,6 +6,7 @@ import (
"errors"
"fmt"
"io"
+ "maps"
"math"
"math/big"
"net/url"
@@ -60,6 +61,7 @@ func init() {
"to_entries": argFunc0(funcToEntries),
"from_entries": argFunc0(funcFromEntries),
"add": argFunc0(funcAdd),
+ "toboolean": argFunc0(funcToBoolean),
"tonumber": argFunc0(funcToNumber),
"tostring": argFunc0(funcToString),
"type": argFunc0(funcType),
@@ -72,6 +74,7 @@ func init() {
"endswith": argFunc1(funcEndsWith),
"ltrimstr": argFunc1(funcLtrimstr),
"rtrimstr": argFunc1(funcRtrimstr),
+ "trimstr": argFunc1(funcTrimstr),
"ltrim": argFunc0(funcLtrim),
"rtrim": argFunc0(funcRtrim),
"trim": argFunc0(funcTrim),
@@ -293,6 +296,11 @@ func funcAbs(v any) any {
return v
}
return new(big.Int).Abs(v)
+ case json.Number:
+ if !strings.HasPrefix(v.String(), "-") {
+ return v
+ }
+ return v[1:]
default:
return &func0TypeError{"abs", v}
}
@@ -314,6 +322,11 @@ func funcLength(v any) any {
return v
}
return new(big.Int).Abs(v)
+ case json.Number:
+ if !strings.HasPrefix(v.String(), "-") {
+ return v
+ }
+ return v[1:]
case string:
return len([]rune(v))
case []any:
@@ -487,16 +500,10 @@ func funcAdd(v any) any {
case map[string]any:
switch w := v.(type) {
case nil:
- m := make(map[string]any, len(x))
- for k, e := range x {
- m[k] = e
- }
- v = m
+ v = maps.Clone(x)
continue
case map[string]any:
- for k, e := range x {
- w[k] = e
- }
+ maps.Copy(w, x)
continue
}
}
@@ -514,9 +521,27 @@ func funcAdd(v any) any {
return v
}
+func funcToBoolean(v any) any {
+ switch v := v.(type) {
+ case bool:
+ return v
+ case string:
+ switch v {
+ case "true":
+ return true
+ case "false":
+ return false
+ default:
+ return &func0WrapError{"toboolean", v, errors.New("invalid boolean")}
+ }
+ default:
+ return &func0TypeError{"toboolean", v}
+ }
+}
+
func funcToNumber(v any) any {
switch v := v.(type) {
- case int, float64, *big.Int:
+ case int, float64, *big.Int, json.Number:
return v
case string:
if !newLexer(v).validNumber() {
@@ -529,7 +554,7 @@ func funcToNumber(v any) any {
}
func toNumber(v string) any {
- return normalizeNumber(json.Number(v))
+ return parseNumber(json.Number(v))
}
func funcToString(v any) any {
@@ -602,7 +627,7 @@ func indices(vs, xs []any) any {
if len(xs) == 0 {
return rs
}
- for i := 0; i <= len(vs)-len(xs); i++ {
+ for i := range len(vs) - len(xs) + 1 {
if Compare(vs[i:i+len(xs)], xs) == 0 {
rs = append(rs, i)
}
@@ -615,7 +640,7 @@ func funcIndex(v, x any) any {
if len(xs) == 0 {
return nil
}
- for i := 0; i <= len(vs)-len(xs); i++ {
+ for i := range len(vs) - len(xs) + 1 {
if Compare(vs[i:i+len(xs)], xs) == 0 {
return i
}
@@ -707,6 +732,18 @@ func funcRtrimstr(v, x any) any {
return strings.TrimSuffix(s, t)
}
+func funcTrimstr(v, x any) any {
+ s, ok := v.(string)
+ if !ok {
+ return &func1TypeError{"trimstr", v, x}
+ }
+ t, ok := x.(string)
+ if !ok {
+ return &func1TypeError{"trimstr", v, x}
+ }
+ return strings.TrimSuffix(strings.TrimPrefix(s, t), t)
+}
+
func funcLtrim(v any) any {
s, ok := v.(string)
if !ok {
@@ -848,7 +885,7 @@ func funcFromJSON(v any) any {
if _, err := dec.Token(); err != io.EOF {
return &func0TypeError{"fromjson", v}
}
- return normalizeNumbers(w)
+ return w
}
func funcFormat(v, x any) any {
@@ -997,7 +1034,7 @@ func funcIndex2(_, v, x any) any {
default:
return &expectedObjectError{v}
}
- case int, float64, *big.Int:
+ case int, float64, *big.Int, json.Number:
i, _ := toInt(x)
switch v := v.(type) {
case nil:
@@ -1087,7 +1124,7 @@ func slice(vs []any, e, s any) any {
}
}
if e != nil {
- if i, ok := toInt(e); ok {
+ if i, ok := toIntCeil(e); ok {
end = clampIndex(i, start, len(vs))
} else {
return &arrayIndexNotNumberError{e}
@@ -1109,7 +1146,7 @@ func sliceString(v string, e, s any) any {
}
}
if e != nil {
- if i, ok := toInt(e); ok {
+ if i, ok := toIntCeil(e); ok {
end = clampIndex(i, start, l)
} else {
return &stringIndexNotNumberError{e}
@@ -1140,16 +1177,16 @@ func sliceString(v string, e, s any) any {
return v[start:end]
}
-func clampIndex(i, min, max int) int {
+func clampIndex(i, minimum, maximum int) int {
if i < 0 {
- i += max
+ i += maximum
}
- if i < min {
- return min
- } else if i < max {
+ if i < minimum {
+ return minimum
+ } else if i < maximum {
return i
} else {
- return max
+ return maximum
}
}
@@ -1200,7 +1237,7 @@ func (iter *rangeIter) Next() (any, bool) {
func funcRange(_ any, xs []any) any {
for _, x := range xs {
switch x.(type) {
- case int, float64, *big.Int:
+ case int, float64, *big.Int, json.Number:
default:
return &func0TypeError{"range", x}
}
@@ -1380,7 +1417,7 @@ func funcJoin(v, x any) any {
} else {
ss[i] = "false"
}
- case int, float64, *big.Int:
+ case int, float64, *big.Int, json.Number:
ss[i] = jsonMarshal(v)
default:
return &joinTypeError{v}
@@ -1585,7 +1622,7 @@ func update(v any, path []any, n any, a allocator) (any, error) {
default:
return nil, &expectedObjectError{v}
}
- case int, float64, *big.Int:
+ case int, float64, *big.Int, json.Number:
i, _ := toInt(p)
switch v := v.(type) {
case nil:
@@ -1632,9 +1669,7 @@ func updateObject(v map[string]any, k string, path []any, n any, a allocator) (a
return v, nil
}
w := a.makeObject(len(v) + 1)
- for k, v := range v {
- w[k] = v
- }
+ maps.Copy(w, v)
w[k] = u
return w, nil
}
@@ -1653,7 +1688,7 @@ func updateArrayIndex(v []any, i int, path []any, n any, a allocator) (any, erro
if n == struct{}{} {
return v, nil
}
- if i >= 0x8000000 {
+ if i >= 0x20000000 {
return nil, &arrayIndexTooLargeError{i}
}
}
@@ -2043,7 +2078,6 @@ func compileRegexp(re, flags string) (*regexp.Regexp, error) {
}) >= 0 {
return nil, fmt.Errorf("unsupported regular expression flag: %q", flags)
}
- re = strings.ReplaceAll(re, "(?<", "(?P<")
if strings.ContainsRune(flags, 'i') {
re = "(?i)" + re
}
@@ -2116,11 +2150,20 @@ func toInt(x any) (int, bool) {
return math.MaxInt, true
}
return math.MinInt, true
+ case json.Number:
+ return toInt(parseNumber(x))
default:
return 0, false
}
}
+func toIntCeil(x any) (int, bool) {
+ if f, ok := x.(float64); ok {
+ x = math.Ceil(f)
+ }
+ return toInt(x)
+}
+
func floatToInt(x float64) int {
if math.MinInt <= x && x <= math.MaxInt {
return int(x)
@@ -2139,6 +2182,9 @@ func toFloat(x any) (float64, bool) {
return x, true
case *big.Int:
return bigToFloat(x), true
+ case json.Number:
+ v, err := x.Float64()
+ return v, err == nil
default:
return 0.0, false
}
@@ -2153,3 +2199,21 @@ func bigToFloat(x *big.Int) float64 {
}
return math.Inf(x.Sign())
}
+
+func parseNumber(v json.Number) any {
+ if i, err := v.Int64(); err == nil && math.MinInt <= i && i <= math.MaxInt {
+ return int(i)
+ }
+ if strings.ContainsAny(v.String(), ".eE") {
+ if f, err := v.Float64(); err == nil {
+ return f
+ }
+ }
+ if bi, ok := new(big.Int).SetString(v.String(), 10); ok {
+ return bi
+ }
+ if strings.HasPrefix(v.String(), "-") {
+ return math.Inf(-1)
+ }
+ return math.Inf(1)
+}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/go.dev.mod b/hack/tools/vendor/github.com/itchyny/gojq/go.dev.mod
index bdc69df6f0..dbf537856e 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/go.dev.mod
+++ b/hack/tools/vendor/github.com/itchyny/gojq/go.dev.mod
@@ -1,8 +1,8 @@
module github.com/itchyny/gojq
-go 1.21
+go 1.24.0
require (
- github.com/itchyny/astgen-go v0.0.0-20231113225122-e1c22b9aaf7b // indirect
- github.com/itchyny/timefmt-go v0.1.6 // indirect
+ github.com/itchyny/astgen-go v0.0.0-20250520171007-4331c963041e // indirect
+ github.com/itchyny/timefmt-go v0.1.7 // indirect
)
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/go.dev.sum b/hack/tools/vendor/github.com/itchyny/gojq/go.dev.sum
index e8691b822f..e66f41739d 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/go.dev.sum
+++ b/hack/tools/vendor/github.com/itchyny/gojq/go.dev.sum
@@ -1,4 +1,4 @@
-github.com/itchyny/astgen-go v0.0.0-20231113225122-e1c22b9aaf7b h1:72fDU7wad+r3iQObaxhlXVIpAIMRUIUMrNa3go1vb8s=
-github.com/itchyny/astgen-go v0.0.0-20231113225122-e1c22b9aaf7b/go.mod h1:Zp6xzEWVc2pQ/ObfLD6t/M6gDegsJWKdGKJSiT7qlu0=
-github.com/itchyny/timefmt-go v0.1.6 h1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q=
-github.com/itchyny/timefmt-go v0.1.6/go.mod h1:RRDZYC5s9ErkjQvTvvU7keJjxUYzIISJGxm9/mAERQg=
+github.com/itchyny/astgen-go v0.0.0-20250520171007-4331c963041e h1:Pu7Ev38D+75aWdsHzULyVZfMP3WrgIHNUaAUH81CTqE=
+github.com/itchyny/astgen-go v0.0.0-20250520171007-4331c963041e/go.mod h1:8EXgnGrgW1p0qVnOF1A/4ORQEUAi8TvxQdIR+zJfKxM=
+github.com/itchyny/timefmt-go v0.1.7 h1:xyftit9Tbw+Dc/huSSPJaEmX1TVL8lw5vxjJLK4GMMA=
+github.com/itchyny/timefmt-go v0.1.7/go.mod h1:5E46Q+zj7vbTgWY8o5YkMeYb4I6GeWLFnetPy5oBrAI=
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/iter.go b/hack/tools/vendor/github.com/itchyny/gojq/iter.go
index d0bed96063..fb8a8ffe83 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/iter.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/iter.go
@@ -6,14 +6,14 @@ type Iter interface {
}
// NewIter creates a new [Iter] from values.
-func NewIter(values ...any) Iter {
+func NewIter[T any](values ...T) Iter {
switch len(values) {
case 0:
return emptyIter{}
case 1:
return &unitIter{value: values[0]}
default:
- iter := sliceIter(values)
+ iter := sliceIter[T](values)
return &iter
}
}
@@ -37,9 +37,9 @@ func (iter *unitIter) Next() (any, bool) {
return iter.value, true
}
-type sliceIter []any
+type sliceIter[T any] []T
-func (iter *sliceIter) Next() (any, bool) {
+func (iter *sliceIter[T]) Next() (any, bool) {
if len(*iter) == 0 {
return nil, false
}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/lexer.go b/hack/tools/vendor/github.com/itchyny/gojq/lexer.go
index 0c2efd122c..82aeef31aa 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/lexer.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/lexer.go
@@ -507,7 +507,7 @@ func quoteAndEscape(src string, quote bool, controls int) []byte {
buf[len(buf)-1] = '"'
j++
}
- for i := 0; i < len(src); i++ {
+ for i := range len(src) {
if ch := src[i]; ch < ' ' {
const hex = "0123456789abcdef"
copy(buf[j:], `\u00`)
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/normalize.go b/hack/tools/vendor/github.com/itchyny/gojq/normalize.go
deleted file mode 100644
index 2bfcd21569..0000000000
--- a/hack/tools/vendor/github.com/itchyny/gojq/normalize.go
+++ /dev/null
@@ -1,84 +0,0 @@
-package gojq
-
-import (
- "encoding/json"
- "math"
- "math/big"
- "strings"
-)
-
-func normalizeNumber(v json.Number) any {
- if i, err := v.Int64(); err == nil && math.MinInt <= i && i <= math.MaxInt {
- return int(i)
- }
- if strings.ContainsAny(v.String(), ".eE") {
- if f, err := v.Float64(); err == nil {
- return f
- }
- }
- if bi, ok := new(big.Int).SetString(v.String(), 10); ok {
- return bi
- }
- if strings.HasPrefix(v.String(), "-") {
- return math.Inf(-1)
- }
- return math.Inf(1)
-}
-
-func normalizeNumbers(v any) any {
- switch v := v.(type) {
- case json.Number:
- return normalizeNumber(v)
- case *big.Int:
- if v.IsInt64() {
- if i := v.Int64(); math.MinInt <= i && i <= math.MaxInt {
- return int(i)
- }
- }
- return v
- case int64:
- if math.MinInt <= v && v <= math.MaxInt {
- return int(v)
- }
- return big.NewInt(v)
- case int32:
- return int(v)
- case int16:
- return int(v)
- case int8:
- return int(v)
- case uint:
- if v <= math.MaxInt {
- return int(v)
- }
- return new(big.Int).SetUint64(uint64(v))
- case uint64:
- if v <= math.MaxInt {
- return int(v)
- }
- return new(big.Int).SetUint64(v)
- case uint32:
- if uint64(v) <= math.MaxInt {
- return int(v)
- }
- return new(big.Int).SetUint64(uint64(v))
- case uint16:
- return int(v)
- case uint8:
- return int(v)
- case float32:
- return float64(v)
- case []any:
- for i, x := range v {
- v[i] = normalizeNumbers(x)
- }
- return v
- case map[string]any:
- for k, x := range v {
- v[k] = normalizeNumbers(x)
- }
- return v
- default:
- return v
- }
-}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/operator.go b/hack/tools/vendor/github.com/itchyny/gojq/operator.go
index 64b74b7805..a49e84f277 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/operator.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/operator.go
@@ -1,6 +1,8 @@
package gojq
import (
+ "encoding/json"
+ "maps"
"math"
"math/big"
"strings"
@@ -154,19 +156,15 @@ func (op Operator) GoString() (str string) {
func (op Operator) getFunc() string {
switch op {
- case OpPipe:
- panic("unreachable")
- case OpComma:
- panic("unreachable")
- case OpAdd:
+ case OpAdd, OpUpdateAdd:
return "_add"
- case OpSub:
+ case OpSub, OpUpdateSub:
return "_subtract"
- case OpMul:
+ case OpMul, OpUpdateMul:
return "_multiply"
- case OpDiv:
+ case OpDiv, OpUpdateDiv:
return "_divide"
- case OpMod:
+ case OpMod, OpUpdateMod:
return "_modulo"
case OpEq:
return "_equal"
@@ -180,26 +178,10 @@ func (op Operator) getFunc() string {
return "_greatereq"
case OpLe:
return "_lesseq"
- case OpAnd:
- panic("unreachable")
- case OpOr:
- panic("unreachable")
- case OpAlt:
- panic("unreachable")
case OpAssign:
return "_assign"
case OpModify:
return "_modify"
- case OpUpdateAdd:
- return "_add"
- case OpUpdateSub:
- return "_subtract"
- case OpUpdateMul:
- return "_multiply"
- case OpUpdateDiv:
- return "_divide"
- case OpUpdateMod:
- return "_modulo"
case OpUpdateAlt:
return "_alternative"
default:
@@ -207,15 +189,21 @@ func (op Operator) getFunc() string {
}
}
-func binopTypeSwitch(
+func binopTypeSwitch[T any](
l, r any,
- callbackInts func(_, _ int) any,
- callbackFloats func(_, _ float64) any,
- callbackBigInts func(_, _ *big.Int) any,
- callbackStrings func(_, _ string) any,
- callbackArrays func(_, _ []any) any,
- callbackMaps func(_, _ map[string]any) any,
- fallback func(_, _ any) any) any {
+ callbackInts func(_, _ int) T,
+ callbackFloats func(_, _ float64) T,
+ callbackBigInts func(_, _ *big.Int) T,
+ callbackStrings func(_, _ string) T,
+ callbackArrays func(_, _ []any) T,
+ callbackMaps func(_, _ map[string]any) T,
+ fallback func(_, _ any) T) T {
+ if n, ok := l.(json.Number); ok {
+ l = parseNumber(n)
+ }
+ if n, ok := r.(json.Number); ok {
+ r = parseNumber(n)
+ }
switch l := l.(type) {
case int:
switch r := r.(type) {
@@ -284,6 +272,8 @@ func funcOpPlus(v any) any {
return v
case *big.Int:
return v
+ case json.Number:
+ return v
default:
return &unaryTypeError{"plus", v}
}
@@ -297,6 +287,11 @@ func funcOpNegate(v any) any {
return -v
case *big.Int:
return new(big.Int).Neg(v)
+ case json.Number:
+ if strings.HasPrefix(v.String(), "-") {
+ return v[1:]
+ }
+ return "-" + v
default:
return &unaryTypeError{"negate", v}
}
@@ -334,12 +329,8 @@ func funcOpAdd(_, l, r any) any {
return l
}
m := make(map[string]any, len(l)+len(r))
- for k, v := range l {
- m[k] = v
- }
- for k, v := range r {
- m[k] = v
- }
+ maps.Copy(m, l)
+ maps.Copy(m, r)
return m
},
func(l, r any) any {
@@ -416,9 +407,7 @@ func funcOpMul(_, l, r any) any {
func deepMergeObjects(l, r map[string]any) any {
m := make(map[string]any, len(l)+len(r))
- for k, v := range l {
- m[k] = v
- }
+ maps.Copy(m, l)
for k, v := range r {
if mk, ok := m[k]; ok {
if mk, ok := mk.(map[string]any); ok {
@@ -433,12 +422,15 @@ func deepMergeObjects(l, r map[string]any) any {
}
func repeatString(s string, n float64) any {
- if n < 0.0 || len(s) > 0 && n > float64(0x10000000/len(s)) || math.IsNaN(n) {
+ if n < 0.0 || math.IsNaN(n) {
return nil
}
if s == "" {
return ""
}
+ if n >= float64(math.MaxInt32/len(s)) {
+ return &repeatStringTooLargeError{s, n}
+ }
return strings.Repeat(s, int(n))
}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/option.go b/hack/tools/vendor/github.com/itchyny/gojq/option.go
index f1a110fae3..801e9a999a 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/option.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/option.go
@@ -33,7 +33,7 @@ func WithVariables(variables []string) CompilerOption {
// WithFunction is a compiler option for adding a custom internal function.
// Specify the minimum and maximum count of the function arguments. These
// values should satisfy 0 <= minarity <= maxarity <= 30, otherwise panics.
-// On handling numbers, you should take account to int, float64 and *big.Int.
+// On handling numbers, take account of int, float64, *big.Int, and json.Number.
// These are the number types you are allowed to return, so do not return int64.
// Refer to [ValueError] to return a value error just like built-in error
// function. If you want to emit multiple values, call the empty function,
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/parser.go b/hack/tools/vendor/github.com/itchyny/gojq/parser.go
index 5a0dfdc776..277bd3ee0c 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/parser.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/parser.go
@@ -147,147 +147,147 @@ const yyEofCode = 1
const yyErrCode = 2
const yyInitialStackSize = 16
-//line parser.go.y:671
+//line parser.go.y:669
//line yacctab:1
var yyExca = [...]int16{
-1, 1,
1, -1,
-2, 0,
- -1, 145,
+ -1, 138,
5, 0,
-2, 27,
- -1, 148,
+ -1, 141,
7, 0,
-2, 30,
- -1, 199,
+ -1, 198,
59, 114,
-2, 49,
}
const yyPrivate = 57344
-const yyLast = 782
+const yyLast = 781
var yyAct = [...]int16{
- 78, 134, 186, 102, 103, 10, 175, 195, 32, 211,
- 48, 108, 81, 176, 131, 6, 229, 5, 50, 73,
- 74, 159, 14, 180, 181, 182, 124, 98, 110, 135,
- 280, 97, 228, 279, 115, 104, 16, 158, 265, 121,
- 114, 178, 123, 179, 244, 73, 74, 180, 181, 182,
- 73, 74, 112, 113, 154, 155, 136, 117, 117, 117,
- 254, 243, 137, 183, 282, 178, 255, 179, 220, 6,
- 247, 116, 118, 119, 128, 129, 73, 74, 99, 73,
- 74, 227, 73, 74, 246, 141, 238, 183, 201, 237,
- 132, 200, 139, 6, 235, 226, 138, 163, 208, 80,
- 157, 207, 241, 231, 230, 161, 162, 73, 74, 117,
- 117, 117, 117, 117, 117, 117, 117, 117, 117, 83,
- 82, 278, 84, 144, 145, 146, 147, 148, 149, 150,
- 151, 152, 153, 184, 185, 174, 50, 160, 193, 73,
- 74, 127, 196, 202, 203, 126, 197, 73, 74, 125,
- 73, 74, 248, 253, 189, 204, 45, 240, 206, 73,
- 74, 245, 143, 210, 214, 215, 73, 74, 104, 217,
- 218, 213, 79, 219, 86, 87, 76, 90, 88, 89,
- 169, 43, 44, 117, 117, 73, 74, 75, 166, 117,
- 222, 224, 80, 225, 73, 74, 273, 212, 212, 232,
- 132, 223, 234, 216, 120, 271, 73, 74, 191, 239,
- 43, 44, 83, 82, 85, 84, 274, 270, 96, 91,
- 92, 93, 94, 95, 73, 74, 93, 94, 95, 249,
- 84, 164, 251, 252, 196, 236, 267, 250, 197, 130,
- 25, 256, 73, 74, 262, 263, 187, 188, 3, 190,
- 257, 258, 260, 261, 264, 24, 266, 73, 74, 9,
- 221, 268, 269, 117, 117, 111, 171, 272, 172, 170,
- 13, 275, 276, 77, 90, 277, 89, 212, 212, 13,
- 177, 281, 52, 53, 54, 55, 56, 57, 58, 59,
- 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
- 70, 71, 72, 106, 107, 91, 92, 93, 94, 95,
- 47, 43, 44, 101, 165, 259, 91, 92, 93, 94,
- 95, 242, 156, 122, 194, 17, 192, 15, 37, 21,
- 22, 23, 33, 133, 105, 205, 7, 34, 209, 35,
- 36, 39, 41, 40, 42, 19, 20, 28, 31, 43,
- 44, 8, 4, 2, 86, 87, 1, 90, 88, 89,
- 0, 29, 30, 0, 168, 90, 18, 0, 0, 27,
- 0, 142, 38, 0, 140, 26, 52, 53, 54, 55,
- 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
- 66, 67, 68, 69, 70, 71, 72, 106, 107, 91,
- 92, 93, 94, 95, 0, 43, 44, 91, 92, 93,
- 94, 95, 0, 0, 0, 0, 0, 11, 12, 17,
- 0, 15, 37, 21, 22, 23, 33, 0, 105, 0,
- 0, 34, 100, 35, 36, 39, 41, 40, 42, 19,
- 20, 28, 31, 43, 44, 0, 0, 0, 0, 86,
- 87, 0, 90, 88, 89, 29, 30, 0, 0, 167,
- 18, 0, 0, 27, 0, 0, 38, 0, 17, 26,
+ 78, 133, 174, 185, 103, 10, 210, 194, 175, 130,
+ 108, 102, 5, 134, 48, 228, 158, 50, 73, 74,
+ 123, 6, 32, 93, 73, 74, 243, 14, 110, 246,
+ 204, 227, 157, 203, 115, 279, 122, 264, 278, 120,
+ 135, 98, 97, 245, 148, 149, 136, 73, 74, 104,
+ 179, 180, 181, 226, 114, 242, 73, 74, 179, 180,
+ 181, 281, 116, 117, 118, 73, 74, 225, 177, 253,
+ 178, 255, 73, 74, 127, 128, 177, 99, 178, 234,
+ 237, 207, 233, 240, 206, 131, 230, 162, 229, 160,
+ 182, 73, 74, 73, 74, 219, 6, 153, 182, 159,
+ 156, 126, 125, 247, 6, 277, 161, 252, 137, 138,
+ 139, 140, 141, 142, 143, 144, 145, 146, 151, 150,
+ 124, 73, 74, 188, 45, 73, 74, 239, 183, 184,
+ 73, 74, 73, 74, 50, 244, 147, 192, 173, 213,
+ 91, 195, 92, 272, 168, 73, 74, 76, 199, 200,
+ 73, 74, 75, 202, 119, 205, 270, 90, 84, 196,
+ 83, 269, 95, 94, 214, 96, 165, 212, 216, 217,
+ 209, 190, 218, 80, 81, 129, 84, 82, 83, 43,
+ 44, 104, 266, 167, 25, 221, 3, 211, 211, 24,
+ 223, 220, 224, 215, 131, 222, 73, 74, 231, 96,
+ 85, 86, 87, 88, 89, 236, 176, 232, 238, 47,
+ 80, 81, 189, 84, 82, 83, 43, 44, 85, 86,
+ 87, 88, 89, 85, 86, 87, 88, 89, 248, 73,
+ 74, 250, 251, 195, 186, 187, 249, 101, 254, 87,
+ 88, 89, 164, 261, 262, 258, 256, 257, 241, 263,
+ 273, 196, 163, 155, 265, 85, 86, 87, 88, 89,
+ 267, 268, 84, 82, 83, 121, 271, 211, 211, 193,
+ 274, 275, 84, 191, 276, 132, 73, 74, 73, 74,
+ 280, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ 71, 72, 106, 107, 85, 86, 87, 88, 89, 9,
+ 43, 44, 259, 260, 85, 86, 87, 88, 89, 170,
+ 17, 171, 169, 77, 16, 201, 15, 37, 21, 22,
+ 23, 33, 7, 105, 8, 4, 34, 208, 35, 36,
+ 39, 41, 40, 42, 19, 20, 28, 31, 43, 44,
+ 112, 113, 2, 80, 81, 1, 84, 82, 83, 0,
+ 29, 30, 0, 166, 0, 18, 0, 0, 27, 0,
+ 154, 38, 0, 152, 26, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
+ 67, 68, 69, 70, 71, 72, 106, 107, 85, 86,
+ 87, 88, 89, 0, 43, 44, 0, 0, 0, 0,
+ 0, 0, 0, 0, 111, 0, 11, 12, 16, 13,
+ 15, 37, 21, 22, 23, 33, 0, 105, 13, 0,
+ 34, 100, 35, 36, 39, 41, 40, 42, 19, 20,
+ 28, 31, 43, 44, 0, 0, 0, 0, 80, 81,
+ 0, 84, 82, 83, 29, 30, 0, 0, 79, 18,
+ 0, 0, 27, 0, 0, 38, 0, 16, 26, 15,
+ 37, 21, 22, 23, 33, 0, 0, 0, 0, 34,
+ 0, 35, 36, 39, 41, 40, 42, 19, 20, 28,
+ 31, 43, 44, 85, 86, 87, 88, 89, 0, 0,
+ 0, 0, 0, 29, 30, 0, 0, 0, 18, 0,
+ 0, 27, 0, 0, 38, 0, 235, 26, 16, 0,
15, 37, 21, 22, 23, 33, 0, 0, 0, 0,
34, 0, 35, 36, 39, 41, 40, 42, 19, 20,
- 28, 31, 43, 44, 91, 92, 93, 94, 95, 0,
- 0, 0, 0, 0, 29, 30, 90, 88, 89, 18,
- 0, 0, 27, 0, 0, 38, 0, 233, 26, 17,
+ 28, 31, 43, 44, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 29, 30, 0, 0, 0, 18,
+ 0, 0, 27, 0, 0, 38, 0, 109, 26, 16,
0, 15, 37, 21, 22, 23, 33, 0, 0, 0,
0, 34, 0, 35, 36, 39, 41, 40, 42, 19,
- 20, 28, 31, 43, 44, 0, 0, 0, 91, 92,
- 93, 94, 95, 0, 0, 29, 30, 0, 0, 0,
- 18, 0, 0, 27, 0, 0, 38, 0, 109, 26,
- 17, 0, 15, 37, 21, 22, 23, 33, 0, 0,
- 0, 0, 34, 0, 35, 36, 39, 41, 40, 42,
- 19, 20, 28, 31, 43, 44, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 29, 30, 0, 0,
- 0, 18, 0, 0, 27, 0, 0, 38, 0, 0,
- 26, 52, 53, 54, 55, 56, 57, 58, 59, 60,
- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
- 71, 72, 49, 0, 0, 0, 0, 0, 0, 0,
- 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
- 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
- 71, 72, 49, 0, 0, 0, 0, 173, 0, 0,
- 51, 37, 21, 22, 23, 33, 0, 0, 0, 0,
- 34, 0, 35, 36, 39, 41, 40, 42, 19, 20,
- 28, 31, 43, 44, 0, 0, 0, 46, 0, 0,
- 0, 0, 0, 0, 29, 30, 0, 0, 0, 18,
- 0, 0, 27, 0, 0, 38, 0, 0, 26, 52,
- 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
- 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
- 106, 199, 0, 0, 0, 0, 0, 0, 43, 44,
+ 20, 28, 31, 43, 44, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 29, 30, 0, 0, 0,
+ 18, 0, 0, 27, 0, 0, 38, 0, 0, 26,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
+ 72, 49, 0, 0, 0, 0, 0, 0, 0, 51,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
+ 72, 49, 0, 0, 0, 0, 172, 0, 0, 51,
+ 37, 21, 22, 23, 33, 0, 0, 0, 0, 34,
+ 0, 35, 36, 39, 41, 40, 42, 19, 20, 28,
+ 31, 43, 44, 0, 0, 0, 46, 0, 0, 0,
+ 0, 0, 0, 29, 30, 0, 0, 0, 18, 0,
+ 0, 27, 0, 0, 38, 0, 0, 26, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 106,
+ 198, 0, 0, 0, 0, 0, 0, 43, 44, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 198,
+ 197,
}
var yyPact = [...]int16{
- 238, -1000, -1000, -48, 406, 98, 643, -1000, -1000, -1000,
- 112, 150, 139, 557, 158, 184, 170, 189, 173, -1000,
- -1000, -1000, -1000, -1000, 18, -1000, 368, 506, -1000, 665,
- 665, 144, -1000, 557, 665, 665, 665, 174, 557, -1000,
- -1000, -1000, -1000, -1000, -1000, -1000, -1000, -22, -1000, 90,
- 86, 82, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
+ 176, -1000, -1000, -42, 405, 66, 642, -1000, -1000, -1000,
+ 182, 115, 110, 556, 444, 127, 111, 108, 142, -1000,
+ -1000, -1000, -1000, -1000, 17, -1000, 367, 505, -1000, 664,
+ 664, 179, -1000, 556, 664, 664, 664, 124, 556, -1000,
+ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -28, -1000, 61,
+ 43, 42, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- -1000, -1000, -1000, 557, 557, 225, -48, -1000, 112, -1,
- -1000, -1000, -1000, 173, 312, 115, 665, 665, 665, 665,
- 665, 665, 665, 665, 665, 665, -5, -1000, -1000, 557,
- -1000, -27, -1000, 78, 46, 557, -1000, -1000, -1000, -1000,
- 35, 557, 65, 65, -1000, 210, 162, 65, 445, 350,
- -1000, 119, 229, -1000, 613, 30, 30, 30, 112, -1000,
- 217, 96, -1000, 202, -1000, -1000, -1, 721, -1000, -1000,
- -1000, 29, 557, 557, 170, 499, 267, 358, 256, 175,
- 175, -1000, -1000, -1000, 557, 217, 40, 112, -1000, 274,
- 665, 665, 103, -1000, 557, -1000, 665, -1, -1, -1000,
- -1000, -1000, 557, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
- -1000, -1000, -1000, 6, -1000, -1000, -48, -1000, -1000, -1000,
- 557, -1, 33, -1000, -32, -1000, 45, 44, 557, -1000,
- -1000, 455, 32, 112, 177, 28, -1000, -1000, 557, -1000,
- -1000, 110, 170, 110, 43, 112, -1000, 1, -16, 100,
- -1000, 22, -1000, 94, 112, -1000, -1000, -1, -1000, 721,
- -1, -1, 92, -1000, -2, -1000, -1000, 7, 217, 112,
- 665, 665, 230, 557, 557, -1000, -1000, 30, -1000, -1000,
- -1000, -1000, -1000, -21, -1000, 557, -1000, 110, 110, 212,
- 557, 557, 159, 147, -1000, -1, 138, -1000, 195, 112,
- 557, 557, -1000, -1000, 557, 60, -28, 112, -1000, -1000,
- 557, 3, -1000,
+ -1000, -1000, -1000, 556, 556, 161, -42, -1000, 182, -17,
+ 664, 664, 664, 664, 664, 664, 664, 664, 664, 664,
+ 89, -15, -1000, -1000, -1000, 142, 311, -1000, -1000, 556,
+ -1000, -32, -1000, 40, 30, 556, -1000, -1000, -1000, -1000,
+ 25, 556, 108, 108, -1000, 231, 140, 349, 169, -1000,
+ 83, 282, -1000, 612, 41, 41, 41, 182, -1000, 205,
+ 65, -1000, 165, -1000, -1000, -17, 720, 206, 255, 151,
+ 265, 174, 188, 188, -1000, -1000, -1000, 556, 556, 205,
+ -1000, -1000, -1000, -29, 556, 23, 182, -1000, 273, 664,
+ 664, 78, -1000, 556, -1000, 664, -17, -17, -1000, -1000,
+ -1000, 556, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000,
+ -1000, -1000, 33, -1000, -1000, -42, -1000, -1000, -1000, 556,
+ -17, 5, -1000, -33, -1000, 29, 27, 556, -1000, 182,
+ 149, 21, -1000, -1000, 454, 18, -1000, 556, -1000, -1000,
+ 80, 206, 80, 24, 182, -1000, -5, -34, 74, -1000,
+ -19, -1000, 45, 182, -1000, -1000, -17, -1000, 720, -17,
+ -17, 46, -1000, 10, 205, -1000, 9, -1000, 182, 664,
+ 664, 290, 556, 556, -1000, -1000, 41, -1000, -1000, -1000,
+ -1000, -1000, -22, 556, -1000, -1000, 80, 80, 158, 556,
+ 556, 103, 98, -1000, -17, 85, -1000, 229, 182, 556,
+ 556, -1000, -1000, 556, 44, -23, 182, -1000, -1000, 556,
+ 0, -1000,
}
var yyPgo = [...]int16{
- 0, 356, 353, 352, 351, 14, 336, 259, 265, 335,
- 0, 333, 1, 326, 324, 7, 36, 22, 8, 323,
- 12, 322, 321, 315, 314, 313, 3, 9, 6, 13,
- 310, 10, 280, 260, 2, 255, 240, 11, 4,
+ 0, 355, 352, 335, 334, 9, 332, 309, 414, 325,
+ 0, 275, 1, 273, 269, 7, 27, 320, 22, 265,
+ 23, 253, 248, 245, 242, 237, 11, 6, 2, 8,
+ 209, 14, 206, 191, 3, 189, 184, 10, 4,
}
var yyR1 = [...]int8{
@@ -330,66 +330,66 @@ var yyR2 = [...]int8{
var yyChk = [...]int16{
-1000, -1, -2, 10, -3, -29, 63, -6, -4, -7,
- -10, 11, 12, -8, -17, 15, -16, 13, 54, 33,
+ -10, 11, 12, -8, -16, 15, 13, -17, 54, 33,
34, 17, 18, 19, -35, -36, 63, 57, 35, 49,
50, 36, -18, 20, 25, 27, 28, 16, 60, 29,
31, 30, 32, 37, 38, 58, 64, -30, -31, 29,
-37, 37, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 47, 48, 37, 37, -7, -10, 14,
- 34, -20, 55, 54, 57, 30, 4, 5, 8, 9,
- 7, 49, 50, 51, 52, 53, 29, -20, -18, 60,
+ 4, 5, 8, 9, 7, 49, 50, 51, 52, 53,
+ 30, 29, 34, -20, 55, 54, 57, -20, -18, 60,
64, -25, -26, -38, -18, 60, 29, 30, -37, 62,
- -10, -8, -17, -17, -18, -10, -16, -17, -16, -16,
- 30, -10, -19, 64, 48, 59, 59, 59, -10, -10,
- 14, -5, -29, -11, -12, 30, 57, 63, -20, -18,
- 62, -10, 59, 47, -16, -16, -16, -16, -16, -16,
- -16, -16, -16, -16, 59, 60, -21, -10, 64, 48,
- 59, 59, -10, 62, 21, -24, 26, 14, 14, 61,
- 40, 37, 39, 64, -31, -28, -29, -32, 35, 37,
- 17, 18, 19, 57, -28, -28, -34, 29, 30, 58,
- 47, 6, -13, -12, -14, -15, -38, -18, 60, 30,
- 62, 59, -10, -10, -10, -9, -34, 61, 58, 64,
- -26, -27, -16, -27, 61, -10, -16, -12, -12, -10,
- 62, -33, -28, -5, -10, -12, 62, 48, 64, 48,
- 59, 59, -10, 62, -10, 62, 58, 61, 58, -10,
- 47, 59, -22, 60, 60, 61, 62, 48, 58, -12,
- -15, -12, -12, 61, 62, 59, -34, -27, -27, -23,
- 22, 23, -10, -10, -28, 59, -10, 24, -10, -10,
- 58, 58, -12, 58, 21, -10, -10, -10, 61, 61,
- 58, -10, 61,
+ -10, -8, -17, -17, -18, -10, -16, -16, -16, 30,
+ -10, -19, 64, 48, 59, 59, 59, -10, -10, 14,
+ -5, -29, -11, -12, 30, 57, 63, -16, -16, -16,
+ -16, -16, -16, -16, -16, -16, -16, 47, 59, 60,
+ -20, -18, 62, -10, 59, -21, -10, 64, 48, 59,
+ 59, -10, 62, 21, -24, 26, 14, 14, 61, 40,
+ 37, 39, 64, -31, -28, -29, -32, 35, 37, 17,
+ 18, 19, 57, -28, -28, -34, 29, 30, 58, 47,
+ 6, -13, -12, -14, -15, -38, -18, 60, 30, -10,
+ -10, -9, -34, 62, 59, -10, 61, 58, 64, -26,
+ -27, -16, -27, 61, -10, -16, -12, -12, -10, 62,
+ -33, -28, -5, -10, -12, 62, 48, 64, 48, 59,
+ 59, -10, 58, 61, 58, 62, -10, 62, -10, 47,
+ 59, -22, 60, 60, 61, 62, 48, 58, -12, -15,
+ -12, -12, 61, 59, -34, 62, -27, -27, -23, 22,
+ 23, -10, -10, -28, 59, -10, 24, -10, -10, 58,
+ 58, -12, 58, 21, -10, -10, -10, 61, 61, 58,
+ -10, 61,
}
var yyDef = [...]int16{
2, -2, 4, 0, 12, 0, 0, 1, 5, 10,
- 11, 0, 0, 12, 36, 0, 25, 0, 50, 51,
+ 11, 0, 0, 12, 25, 0, 0, 36, 50, 51,
52, 55, 56, 57, 58, 60, 0, 0, 66, 0,
0, 69, 71, 0, 0, 0, 0, 0, 0, 89,
90, 91, 92, 84, 86, 3, 125, 0, 128, 0,
0, 0, 137, 138, 139, 140, 141, 142, 143, 144,
145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
155, 156, 157, 0, 0, 0, 8, 13, 20, 0,
- 79, 80, 81, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 53, 54, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 79, 80, 81, 0, 0, 53, 54, 0,
61, 0, 106, 111, 112, 0, 113, 114, 115, 64,
- 0, 0, 67, 68, 70, 0, 104, 36, 0, 0,
- 77, 0, 0, 126, 0, 0, 0, 0, 21, 24,
- 0, 0, 9, 0, 37, 39, 0, 0, 82, 83,
- 93, 0, 0, 0, 26, -2, 28, 29, -2, 31,
- 32, 33, 34, 35, 0, 0, 0, 98, 62, 0,
- 0, 0, 0, 65, 0, 73, 0, 0, 0, 78,
- 85, 87, 0, 127, 129, 130, 118, 119, 120, 121,
- 122, 123, 124, 0, 131, 132, 8, 18, 19, 7,
- 0, 0, 0, 42, 0, 44, 0, 0, 0, -2,
- 94, 0, 0, 23, 0, 0, 16, 59, 0, 63,
- 107, 108, 117, 109, 0, 100, 105, 0, 0, 0,
- 133, 0, 135, 0, 22, 38, 40, 0, 41, 0,
- 0, 0, 0, 95, 0, 96, 14, 0, 0, 99,
- 0, 0, 102, 0, 0, 88, 134, 0, 6, 43,
- 45, 46, 47, 0, 97, 0, 17, 116, 110, 0,
- 0, 0, 0, 0, 136, 0, 0, 72, 0, 103,
- 0, 0, 48, 15, 0, 0, 0, 101, 74, 75,
- 0, 0, 76,
+ 0, 0, 67, 68, 70, 0, 104, 0, 0, 77,
+ 0, 0, 126, 0, 0, 0, 0, 21, 24, 0,
+ 0, 9, 0, 37, 39, 0, 0, 26, -2, 28,
+ 29, -2, 31, 32, 33, 34, 35, 0, 0, 0,
+ 82, 83, 93, 0, 0, 0, 98, 62, 0, 0,
+ 0, 0, 65, 0, 73, 0, 0, 0, 78, 85,
+ 87, 0, 127, 129, 130, 118, 119, 120, 121, 122,
+ 123, 124, 0, 131, 132, 8, 18, 19, 7, 0,
+ 0, 0, 42, 0, 44, 0, 0, 0, -2, 23,
+ 0, 0, 16, 94, 0, 0, 59, 0, 63, 107,
+ 108, 117, 109, 0, 100, 105, 0, 0, 0, 133,
+ 0, 135, 0, 22, 38, 40, 0, 41, 0, 0,
+ 0, 0, 14, 0, 0, 95, 0, 96, 99, 0,
+ 0, 102, 0, 0, 88, 134, 0, 6, 43, 45,
+ 46, 47, 0, 0, 17, 97, 116, 110, 0, 0,
+ 0, 0, 0, 136, 0, 0, 72, 0, 103, 0,
+ 0, 48, 15, 0, 0, 0, 101, 74, 75, 0,
+ 0, 76,
}
var yyTok1 = [...]int8{
@@ -868,187 +868,185 @@ yydefault:
yyDollar = yyS[yypt-5 : yypt+1]
//line parser.go.y:155
{
- term := yyDollar[1].value.(*Term)
- term.SuffixList = append(term.SuffixList, &Suffix{Bind: &Bind{yyDollar[3].value.([]*Pattern), yyDollar[5].value.(*Query)}})
- yyVAL.value = &Query{Term: term}
+ yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: OpPipe, Right: yyDollar[5].value.(*Query), Patterns: yyDollar[3].value.([]*Pattern)}
}
case 23:
yyDollar = yyS[yypt-4 : yypt+1]
-//line parser.go.y:161
+//line parser.go.y:159
{
yyVAL.value = &Query{Term: &Term{Type: TermTypeLabel, Label: &Label{yyDollar[2].token, yyDollar[4].value.(*Query)}}}
}
case 24:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:165
+//line parser.go.y:163
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: OpComma, Right: yyDollar[3].value.(*Query)}
}
case 26:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:172
+//line parser.go.y:170
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: yyDollar[2].operator, Right: yyDollar[3].value.(*Query)}
}
case 27:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:176
+//line parser.go.y:174
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: yyDollar[2].operator, Right: yyDollar[3].value.(*Query)}
}
case 28:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:180
+//line parser.go.y:178
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: OpOr, Right: yyDollar[3].value.(*Query)}
}
case 29:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:184
+//line parser.go.y:182
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: OpAnd, Right: yyDollar[3].value.(*Query)}
}
case 30:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:188
+//line parser.go.y:186
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: yyDollar[2].operator, Right: yyDollar[3].value.(*Query)}
}
case 31:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:192
+//line parser.go.y:190
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: OpAdd, Right: yyDollar[3].value.(*Query)}
}
case 32:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:196
+//line parser.go.y:194
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: OpSub, Right: yyDollar[3].value.(*Query)}
}
case 33:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:200
+//line parser.go.y:198
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: OpMul, Right: yyDollar[3].value.(*Query)}
}
case 34:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:204
+//line parser.go.y:202
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: OpDiv, Right: yyDollar[3].value.(*Query)}
}
case 35:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:208
+//line parser.go.y:206
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: OpMod, Right: yyDollar[3].value.(*Query)}
}
case 36:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:212
+//line parser.go.y:210
{
yyVAL.value = &Query{Term: yyDollar[1].value.(*Term)}
}
case 37:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:218
+//line parser.go.y:216
{
yyVAL.value = []*Pattern{yyDollar[1].value.(*Pattern)}
}
case 38:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:222
+//line parser.go.y:220
{
yyVAL.value = append(yyDollar[1].value.([]*Pattern), yyDollar[3].value.(*Pattern))
}
case 39:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:228
+//line parser.go.y:226
{
yyVAL.value = &Pattern{Name: yyDollar[1].token}
}
case 40:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:232
+//line parser.go.y:230
{
yyVAL.value = &Pattern{Array: yyDollar[2].value.([]*Pattern)}
}
case 41:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:236
+//line parser.go.y:234
{
yyVAL.value = &Pattern{Object: yyDollar[2].value.([]*PatternObject)}
}
case 42:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:242
+//line parser.go.y:240
{
yyVAL.value = []*Pattern{yyDollar[1].value.(*Pattern)}
}
case 43:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:246
+//line parser.go.y:244
{
yyVAL.value = append(yyDollar[1].value.([]*Pattern), yyDollar[3].value.(*Pattern))
}
case 44:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:252
+//line parser.go.y:250
{
yyVAL.value = []*PatternObject{yyDollar[1].value.(*PatternObject)}
}
case 45:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:256
+//line parser.go.y:254
{
yyVAL.value = append(yyDollar[1].value.([]*PatternObject), yyDollar[3].value.(*PatternObject))
}
case 46:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:262
+//line parser.go.y:260
{
yyVAL.value = &PatternObject{Key: yyDollar[1].token, Val: yyDollar[3].value.(*Pattern)}
}
case 47:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:266
+//line parser.go.y:264
{
yyVAL.value = &PatternObject{KeyString: yyDollar[1].value.(*String), Val: yyDollar[3].value.(*Pattern)}
}
case 48:
yyDollar = yyS[yypt-5 : yypt+1]
-//line parser.go.y:270
+//line parser.go.y:268
{
yyVAL.value = &PatternObject{KeyQuery: yyDollar[2].value.(*Query), Val: yyDollar[5].value.(*Pattern)}
}
case 49:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:274
+//line parser.go.y:272
{
yyVAL.value = &PatternObject{Key: yyDollar[1].token}
}
case 50:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:280
+//line parser.go.y:278
{
yyVAL.value = &Term{Type: TermTypeIdentity}
}
case 51:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:284
+//line parser.go.y:282
{
yyVAL.value = &Term{Type: TermTypeRecurse}
}
case 52:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:288
+//line parser.go.y:286
{
yyVAL.value = &Term{Type: TermTypeIndex, Index: &Index{Name: yyDollar[1].token}}
}
case 53:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:292
+//line parser.go.y:290
{
suffix := yyDollar[2].value.(*Suffix)
if suffix.Iter {
@@ -1059,452 +1057,452 @@ yydefault:
}
case 54:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:301
+//line parser.go.y:299
{
yyVAL.value = &Term{Type: TermTypeIndex, Index: &Index{Str: yyDollar[2].value.(*String)}}
}
case 55:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:305
+//line parser.go.y:303
{
yyVAL.value = &Term{Type: TermTypeNull}
}
case 56:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:309
+//line parser.go.y:307
{
yyVAL.value = &Term{Type: TermTypeTrue}
}
case 57:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:313
+//line parser.go.y:311
{
yyVAL.value = &Term{Type: TermTypeFalse}
}
case 58:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:317
+//line parser.go.y:315
{
yyVAL.value = &Term{Type: TermTypeFunc, Func: &Func{Name: yyDollar[1].token}}
}
case 59:
yyDollar = yyS[yypt-4 : yypt+1]
-//line parser.go.y:321
+//line parser.go.y:319
{
yyVAL.value = &Term{Type: TermTypeFunc, Func: &Func{Name: yyDollar[1].token, Args: yyDollar[3].value.([]*Query)}}
}
case 60:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:325
+//line parser.go.y:323
{
yyVAL.value = &Term{Type: TermTypeFunc, Func: &Func{Name: yyDollar[1].token}}
}
case 61:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:329
+//line parser.go.y:327
{
yyVAL.value = &Term{Type: TermTypeObject, Object: &Object{}}
}
case 62:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:333
+//line parser.go.y:331
{
yyVAL.value = &Term{Type: TermTypeObject, Object: &Object{yyDollar[2].value.([]*ObjectKeyVal)}}
}
case 63:
yyDollar = yyS[yypt-4 : yypt+1]
-//line parser.go.y:337
+//line parser.go.y:335
{
yyVAL.value = &Term{Type: TermTypeObject, Object: &Object{yyDollar[2].value.([]*ObjectKeyVal)}}
}
case 64:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:341
+//line parser.go.y:339
{
yyVAL.value = &Term{Type: TermTypeArray, Array: &Array{}}
}
case 65:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:345
+//line parser.go.y:343
{
yyVAL.value = &Term{Type: TermTypeArray, Array: &Array{yyDollar[2].value.(*Query)}}
}
case 66:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:349
+//line parser.go.y:347
{
yyVAL.value = &Term{Type: TermTypeNumber, Number: yyDollar[1].token}
}
case 67:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:353
+//line parser.go.y:351
{
yyVAL.value = &Term{Type: TermTypeUnary, Unary: &Unary{OpAdd, yyDollar[2].value.(*Term)}}
}
case 68:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:357
+//line parser.go.y:355
{
yyVAL.value = &Term{Type: TermTypeUnary, Unary: &Unary{OpSub, yyDollar[2].value.(*Term)}}
}
case 69:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:361
+//line parser.go.y:359
{
yyVAL.value = &Term{Type: TermTypeFormat, Format: yyDollar[1].token}
}
case 70:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:365
+//line parser.go.y:363
{
yyVAL.value = &Term{Type: TermTypeFormat, Format: yyDollar[1].token, Str: yyDollar[2].value.(*String)}
}
case 71:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:369
+//line parser.go.y:367
{
yyVAL.value = &Term{Type: TermTypeString, Str: yyDollar[1].value.(*String)}
}
case 72:
yyDollar = yyS[yypt-7 : yypt+1]
-//line parser.go.y:373
+//line parser.go.y:371
{
yyVAL.value = &Term{Type: TermTypeIf, If: &If{yyDollar[2].value.(*Query), yyDollar[4].value.(*Query), yyDollar[5].value.([]*IfElif), yyDollar[6].value.(*Query)}}
}
case 73:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:377
+//line parser.go.y:375
{
yyVAL.value = &Term{Type: TermTypeTry, Try: &Try{yyDollar[2].value.(*Query), yyDollar[3].value.(*Query)}}
}
case 74:
yyDollar = yyS[yypt-9 : yypt+1]
-//line parser.go.y:381
+//line parser.go.y:379
{
yyVAL.value = &Term{Type: TermTypeReduce, Reduce: &Reduce{yyDollar[2].value.(*Query), yyDollar[4].value.(*Pattern), yyDollar[6].value.(*Query), yyDollar[8].value.(*Query)}}
}
case 75:
yyDollar = yyS[yypt-9 : yypt+1]
-//line parser.go.y:385
+//line parser.go.y:383
{
yyVAL.value = &Term{Type: TermTypeForeach, Foreach: &Foreach{yyDollar[2].value.(*Query), yyDollar[4].value.(*Pattern), yyDollar[6].value.(*Query), yyDollar[8].value.(*Query), nil}}
}
case 76:
yyDollar = yyS[yypt-11 : yypt+1]
-//line parser.go.y:389
+//line parser.go.y:387
{
yyVAL.value = &Term{Type: TermTypeForeach, Foreach: &Foreach{yyDollar[2].value.(*Query), yyDollar[4].value.(*Pattern), yyDollar[6].value.(*Query), yyDollar[8].value.(*Query), yyDollar[10].value.(*Query)}}
}
case 77:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:393
+//line parser.go.y:391
{
yyVAL.value = &Term{Type: TermTypeBreak, Break: yyDollar[2].token}
}
case 78:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:397
+//line parser.go.y:395
{
yyVAL.value = &Term{Type: TermTypeQuery, Query: yyDollar[2].value.(*Query)}
}
case 79:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:401
+//line parser.go.y:399
{
yyDollar[1].value.(*Term).SuffixList = append(yyDollar[1].value.(*Term).SuffixList, &Suffix{Index: &Index{Name: yyDollar[2].token}})
}
case 80:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:405
+//line parser.go.y:403
{
yyDollar[1].value.(*Term).SuffixList = append(yyDollar[1].value.(*Term).SuffixList, yyDollar[2].value.(*Suffix))
}
case 81:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:409
+//line parser.go.y:407
{
yyDollar[1].value.(*Term).SuffixList = append(yyDollar[1].value.(*Term).SuffixList, &Suffix{Optional: true})
}
case 82:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:413
+//line parser.go.y:411
{
yyDollar[1].value.(*Term).SuffixList = append(yyDollar[1].value.(*Term).SuffixList, yyDollar[3].value.(*Suffix))
}
case 83:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:417
+//line parser.go.y:415
{
yyDollar[1].value.(*Term).SuffixList = append(yyDollar[1].value.(*Term).SuffixList, &Suffix{Index: &Index{Str: yyDollar[3].value.(*String)}})
}
case 84:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:423
+//line parser.go.y:421
{
yyVAL.value = &String{Str: yyDollar[1].token}
}
case 85:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:427
+//line parser.go.y:425
{
yyVAL.value = &String{Queries: yyDollar[2].value.([]*Query)}
}
case 86:
yyDollar = yyS[yypt-0 : yypt+1]
-//line parser.go.y:433
+//line parser.go.y:431
{
yyVAL.value = []*Query{}
}
case 87:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:437
+//line parser.go.y:435
{
yyVAL.value = append(yyDollar[1].value.([]*Query), &Query{Term: &Term{Type: TermTypeString, Str: &String{Str: yyDollar[2].token}}})
}
case 88:
yyDollar = yyS[yypt-4 : yypt+1]
-//line parser.go.y:441
+//line parser.go.y:439
{
yylex.(*lexer).inString = true
yyVAL.value = append(yyDollar[1].value.([]*Query), &Query{Term: &Term{Type: TermTypeQuery, Query: yyDollar[3].value.(*Query)}})
}
case 93:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:456
+//line parser.go.y:454
{
yyVAL.value = &Suffix{Iter: true}
}
case 94:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:460
+//line parser.go.y:458
{
yyVAL.value = &Suffix{Index: &Index{Start: yyDollar[2].value.(*Query)}}
}
case 95:
yyDollar = yyS[yypt-4 : yypt+1]
-//line parser.go.y:464
+//line parser.go.y:462
{
yyVAL.value = &Suffix{Index: &Index{Start: yyDollar[2].value.(*Query), IsSlice: true}}
}
case 96:
yyDollar = yyS[yypt-4 : yypt+1]
-//line parser.go.y:468
+//line parser.go.y:466
{
yyVAL.value = &Suffix{Index: &Index{End: yyDollar[3].value.(*Query), IsSlice: true}}
}
case 97:
yyDollar = yyS[yypt-5 : yypt+1]
-//line parser.go.y:472
+//line parser.go.y:470
{
yyVAL.value = &Suffix{Index: &Index{Start: yyDollar[2].value.(*Query), End: yyDollar[4].value.(*Query), IsSlice: true}}
}
case 98:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:478
+//line parser.go.y:476
{
yyVAL.value = []*Query{yyDollar[1].value.(*Query)}
}
case 99:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:482
+//line parser.go.y:480
{
yyVAL.value = append(yyDollar[1].value.([]*Query), yyDollar[3].value.(*Query))
}
case 100:
yyDollar = yyS[yypt-0 : yypt+1]
-//line parser.go.y:488
+//line parser.go.y:486
{
yyVAL.value = []*IfElif(nil)
}
case 101:
yyDollar = yyS[yypt-5 : yypt+1]
-//line parser.go.y:492
+//line parser.go.y:490
{
yyVAL.value = append(yyDollar[1].value.([]*IfElif), &IfElif{yyDollar[3].value.(*Query), yyDollar[5].value.(*Query)})
}
case 102:
yyDollar = yyS[yypt-0 : yypt+1]
-//line parser.go.y:498
+//line parser.go.y:496
{
yyVAL.value = (*Query)(nil)
}
case 103:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:502
+//line parser.go.y:500
{
yyVAL.value = yyDollar[2].value
}
case 104:
yyDollar = yyS[yypt-0 : yypt+1]
-//line parser.go.y:508
+//line parser.go.y:506
{
yyVAL.value = (*Query)(nil)
}
case 105:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:512
+//line parser.go.y:510
{
yyVAL.value = yyDollar[2].value
}
case 106:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:518
+//line parser.go.y:516
{
yyVAL.value = []*ObjectKeyVal{yyDollar[1].value.(*ObjectKeyVal)}
}
case 107:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:522
+//line parser.go.y:520
{
yyVAL.value = append(yyDollar[1].value.([]*ObjectKeyVal), yyDollar[3].value.(*ObjectKeyVal))
}
case 108:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:528
+//line parser.go.y:526
{
yyVAL.value = &ObjectKeyVal{Key: yyDollar[1].token, Val: yyDollar[3].value.(*Query)}
}
case 109:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:532
+//line parser.go.y:530
{
yyVAL.value = &ObjectKeyVal{KeyString: yyDollar[1].value.(*String), Val: yyDollar[3].value.(*Query)}
}
case 110:
yyDollar = yyS[yypt-5 : yypt+1]
-//line parser.go.y:536
+//line parser.go.y:534
{
yyVAL.value = &ObjectKeyVal{KeyQuery: yyDollar[2].value.(*Query), Val: yyDollar[5].value.(*Query)}
}
case 111:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:540
+//line parser.go.y:538
{
yyVAL.value = &ObjectKeyVal{Key: yyDollar[1].token}
}
case 112:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:544
+//line parser.go.y:542
{
yyVAL.value = &ObjectKeyVal{KeyString: yyDollar[1].value.(*String)}
}
case 116:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:555
+//line parser.go.y:553
{
yyVAL.value = &Query{Left: yyDollar[1].value.(*Query), Op: OpPipe, Right: yyDollar[3].value.(*Query)}
}
case 118:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:562
+//line parser.go.y:560
{
yyVAL.value = &ConstTerm{Object: yyDollar[1].value.(*ConstObject)}
}
case 119:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:566
+//line parser.go.y:564
{
yyVAL.value = &ConstTerm{Array: yyDollar[1].value.(*ConstArray)}
}
case 120:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:570
+//line parser.go.y:568
{
yyVAL.value = &ConstTerm{Number: yyDollar[1].token}
}
case 121:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:574
+//line parser.go.y:572
{
yyVAL.value = &ConstTerm{Str: yyDollar[1].token}
}
case 122:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:578
+//line parser.go.y:576
{
yyVAL.value = &ConstTerm{Null: true}
}
case 123:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:582
+//line parser.go.y:580
{
yyVAL.value = &ConstTerm{True: true}
}
case 124:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:586
+//line parser.go.y:584
{
yyVAL.value = &ConstTerm{False: true}
}
case 125:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:592
+//line parser.go.y:590
{
yyVAL.value = &ConstObject{}
}
case 126:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:596
+//line parser.go.y:594
{
yyVAL.value = &ConstObject{yyDollar[2].value.([]*ConstObjectKeyVal)}
}
case 127:
yyDollar = yyS[yypt-4 : yypt+1]
-//line parser.go.y:600
+//line parser.go.y:598
{
yyVAL.value = &ConstObject{yyDollar[2].value.([]*ConstObjectKeyVal)}
}
case 128:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:606
+//line parser.go.y:604
{
yyVAL.value = []*ConstObjectKeyVal{yyDollar[1].value.(*ConstObjectKeyVal)}
}
case 129:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:610
+//line parser.go.y:608
{
yyVAL.value = append(yyDollar[1].value.([]*ConstObjectKeyVal), yyDollar[3].value.(*ConstObjectKeyVal))
}
case 130:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:616
+//line parser.go.y:614
{
yyVAL.value = &ConstObjectKeyVal{Key: yyDollar[1].token, Val: yyDollar[3].value.(*ConstTerm)}
}
case 131:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:620
+//line parser.go.y:618
{
yyVAL.value = &ConstObjectKeyVal{Key: yyDollar[1].token, Val: yyDollar[3].value.(*ConstTerm)}
}
case 132:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:624
+//line parser.go.y:622
{
yyVAL.value = &ConstObjectKeyVal{KeyString: yyDollar[1].token, Val: yyDollar[3].value.(*ConstTerm)}
}
case 133:
yyDollar = yyS[yypt-2 : yypt+1]
-//line parser.go.y:630
+//line parser.go.y:628
{
yyVAL.value = &ConstArray{}
}
case 134:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:634
+//line parser.go.y:632
{
yyVAL.value = &ConstArray{yyDollar[2].value.([]*ConstTerm)}
}
case 135:
yyDollar = yyS[yypt-1 : yypt+1]
-//line parser.go.y:640
+//line parser.go.y:638
{
yyVAL.value = []*ConstTerm{yyDollar[1].value.(*ConstTerm)}
}
case 136:
yyDollar = yyS[yypt-3 : yypt+1]
-//line parser.go.y:644
+//line parser.go.y:642
{
yyVAL.value = append(yyDollar[1].value.([]*ConstTerm), yyDollar[3].value.(*ConstTerm))
}
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/parser.go.y b/hack/tools/vendor/github.com/itchyny/gojq/parser.go.y
index 5481e21140..5f9df778e8 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/parser.go.y
+++ b/hack/tools/vendor/github.com/itchyny/gojq/parser.go.y
@@ -151,11 +151,9 @@ query
{
$$ = &Query{Left: $1.(*Query), Op: OpPipe, Right: $3.(*Query)}
}
- | term tokAs bindpatterns '|' query
+ | query tokAs bindpatterns '|' query
{
- term := $1.(*Term)
- term.SuffixList = append(term.SuffixList, &Suffix{Bind: &Bind{$3.([]*Pattern), $5.(*Query)}})
- $$ = &Query{Term: term}
+ $$ = &Query{Left: $1.(*Query), Op: OpPipe, Right: $5.(*Query), Patterns: $3.([]*Pattern)}
}
| tokLabel tokVariable '|' query
{
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/preview.go b/hack/tools/vendor/github.com/itchyny/gojq/preview.go
index e082eb5619..92f1a54a3d 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/preview.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/preview.go
@@ -7,9 +7,9 @@ import "unicode/utf8"
// by 30 bytes, and more efficient than truncating the result of [Marshal].
//
// This method is used by error messages of built-in operators and functions,
-// and accepts only limited types (nil, bool, int, float64, *big.Int, string,
-// []any, and map[string]any). Note that the maximum width and trailing strings
-// on truncation may be changed in the future.
+// and accepts only limited types (nil, bool, int, float64, *big.Int,
+// json.Number, string, []any, and map[string]any). Note that the maximum width
+// and trailing strings on truncation may be changed in the future.
func Preview(v any) string {
bs := jsonLimitedMarshal(v, 32)
if l := 30; len(bs) > l {
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/query.go b/hack/tools/vendor/github.com/itchyny/gojq/query.go
index e7cf778908..512fa80dd6 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/query.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/query.go
@@ -26,15 +26,14 @@ type Query struct {
FuncDefs []*FuncDef
Term *Term
Left *Query
- Op Operator
Right *Query
- Func string
+ Patterns []*Pattern
+ Op Operator
}
// Run the query.
//
// It is safe to call this method in goroutines, to reuse a parsed [*Query].
-// But for arguments, do not give values sharing same data between goroutines.
func (e *Query) Run(v any) Iter {
return e.RunWithContext(context.Background(), v)
}
@@ -67,40 +66,28 @@ func (e *Query) writeTo(s *strings.Builder) {
fd.writeTo(s)
s.WriteByte(' ')
}
- if e.Func != "" {
- s.WriteString(e.Func)
- } else if e.Term != nil {
+ if e.Term != nil {
e.Term.writeTo(s)
} else if e.Right != nil {
e.Left.writeTo(s)
- if e.Op == OpComma {
- s.WriteString(", ")
- } else {
+ if e.Op != OpComma {
s.WriteByte(' ')
- s.WriteString(e.Op.String())
+ }
+ for i, p := range e.Patterns {
+ if i == 0 {
+ s.WriteString("as ")
+ } else {
+ s.WriteString("?// ")
+ }
+ p.writeTo(s)
s.WriteByte(' ')
}
+ s.WriteString(e.Op.String())
+ s.WriteByte(' ')
e.Right.writeTo(s)
}
}
-func (e *Query) minify() {
- for _, e := range e.FuncDefs {
- e.Minify()
- }
- if e.Term != nil {
- if name := e.Term.toFunc(); name != "" {
- e.Term = nil
- e.Func = name
- } else {
- e.Term.minify()
- }
- } else if e.Right != nil {
- e.Left.minify()
- e.Right.minify()
- }
-}
-
func (e *Query) toIndexKey() any {
if e.Term == nil {
return nil
@@ -177,11 +164,6 @@ func (e *FuncDef) writeTo(s *strings.Builder) {
s.WriteByte(';')
}
-// Minify ...
-func (e *FuncDef) Minify() {
- e.Body.minify()
-}
-
// Term ...
type Term struct {
Type TermType
@@ -264,65 +246,6 @@ func (e *Term) writeTo(s *strings.Builder) {
}
}
-func (e *Term) minify() {
- switch e.Type {
- case TermTypeIndex:
- e.Index.minify()
- case TermTypeFunc:
- e.Func.minify()
- case TermTypeObject:
- e.Object.minify()
- case TermTypeArray:
- e.Array.minify()
- case TermTypeUnary:
- e.Unary.minify()
- case TermTypeFormat:
- if e.Str != nil {
- e.Str.minify()
- }
- case TermTypeString:
- e.Str.minify()
- case TermTypeIf:
- e.If.minify()
- case TermTypeTry:
- e.Try.minify()
- case TermTypeReduce:
- e.Reduce.minify()
- case TermTypeForeach:
- e.Foreach.minify()
- case TermTypeLabel:
- e.Label.minify()
- case TermTypeQuery:
- e.Query.minify()
- }
- for _, e := range e.SuffixList {
- e.minify()
- }
-}
-
-func (e *Term) toFunc() string {
- if len(e.SuffixList) != 0 {
- return ""
- }
- // ref: compiler#compileQuery
- switch e.Type {
- case TermTypeIdentity:
- return "."
- case TermTypeRecurse:
- return ".."
- case TermTypeNull:
- return "null"
- case TermTypeTrue:
- return "true"
- case TermTypeFalse:
- return "false"
- case TermTypeFunc:
- return e.Func.toFunc()
- default:
- return ""
- }
-}
-
func (e *Term) toIndexKey() any {
switch e.Type {
case TermTypeNumber:
@@ -384,10 +307,6 @@ func (e *Unary) writeTo(s *strings.Builder) {
e.Term.writeTo(s)
}
-func (e *Unary) minify() {
- e.Term.minify()
-}
-
func (e *Unary) toNumber() any {
v := e.Term.toNumber()
if v != nil && e.Op == OpSub {
@@ -511,18 +430,6 @@ func (e *Index) writeSuffixTo(s *strings.Builder) {
}
}
-func (e *Index) minify() {
- if e.Str != nil {
- e.Str.minify()
- }
- if e.Start != nil {
- e.Start.minify()
- }
- if e.End != nil {
- e.End.minify()
- }
-}
-
func (e *Index) toIndexKey() any {
if e.Name != "" {
return e.Name
@@ -583,19 +490,6 @@ func (e *Func) writeTo(s *strings.Builder) {
}
}
-func (e *Func) minify() {
- for _, x := range e.Args {
- x.minify()
- }
-}
-
-func (e *Func) toFunc() string {
- if len(e.Args) != 0 {
- return ""
- }
- return e.Name
-}
-
// String ...
type String struct {
Str string
@@ -626,12 +520,6 @@ func (e *String) writeTo(s *strings.Builder) {
s.WriteByte('"')
}
-func (e *String) minify() {
- for _, e := range e.Queries {
- e.minify()
- }
-}
-
// Object ...
type Object struct {
KeyVals []*ObjectKeyVal
@@ -658,12 +546,6 @@ func (e *Object) writeTo(s *strings.Builder) {
s.WriteString(" }")
}
-func (e *Object) minify() {
- for _, e := range e.KeyVals {
- e.minify()
- }
-}
-
// ObjectKeyVal ...
type ObjectKeyVal struct {
Key string
@@ -694,17 +576,6 @@ func (e *ObjectKeyVal) writeTo(s *strings.Builder) {
}
}
-func (e *ObjectKeyVal) minify() {
- if e.KeyString != nil {
- e.KeyString.minify()
- } else if e.KeyQuery != nil {
- e.KeyQuery.minify()
- }
- if e.Val != nil {
- e.Val.minify()
- }
-}
-
// Array ...
type Array struct {
Query *Query
@@ -724,18 +595,11 @@ func (e *Array) writeTo(s *strings.Builder) {
s.WriteByte(']')
}
-func (e *Array) minify() {
- if e.Query != nil {
- e.Query.minify()
- }
-}
-
// Suffix ...
type Suffix struct {
Index *Index
Iter bool
Optional bool
- Bind *Bind
}
func (e *Suffix) String() string {
@@ -755,16 +619,6 @@ func (e *Suffix) writeTo(s *strings.Builder) {
s.WriteString("[]")
} else if e.Optional {
s.WriteByte('?')
- } else if e.Bind != nil {
- e.Bind.writeTo(s)
- }
-}
-
-func (e *Suffix) minify() {
- if e.Index != nil {
- e.Index.minify()
- } else if e.Bind != nil {
- e.Bind.minify()
}
}
@@ -785,38 +639,6 @@ func (e *Suffix) toIndices(xs []any) []any {
return e.Index.toIndices(xs)
}
-// Bind ...
-type Bind struct {
- Patterns []*Pattern
- Body *Query
-}
-
-func (e *Bind) String() string {
- var s strings.Builder
- e.writeTo(&s)
- return s.String()
-}
-
-func (e *Bind) writeTo(s *strings.Builder) {
- for i, p := range e.Patterns {
- if i == 0 {
- s.WriteString(" as ")
- p.writeTo(s)
- s.WriteByte(' ')
- } else {
- s.WriteString("?// ")
- p.writeTo(s)
- s.WriteByte(' ')
- }
- }
- s.WriteString("| ")
- e.Body.writeTo(s)
-}
-
-func (e *Bind) minify() {
- e.Body.minify()
-}
-
// If ...
type If struct {
Cond *Query
@@ -847,17 +669,6 @@ func (e *If) writeTo(s *strings.Builder) {
s.WriteString(" end")
}
-func (e *If) minify() {
- e.Cond.minify()
- e.Then.minify()
- for _, x := range e.Elif {
- x.minify()
- }
- if e.Else != nil {
- e.Else.minify()
- }
-}
-
// IfElif ...
type IfElif struct {
Cond *Query
@@ -877,11 +688,6 @@ func (e *IfElif) writeTo(s *strings.Builder) {
e.Then.writeTo(s)
}
-func (e *IfElif) minify() {
- e.Cond.minify()
- e.Then.minify()
-}
-
// Try ...
type Try struct {
Body *Query
@@ -903,13 +709,6 @@ func (e *Try) writeTo(s *strings.Builder) {
}
}
-func (e *Try) minify() {
- e.Body.minify()
- if e.Catch != nil {
- e.Catch.minify()
- }
-}
-
// Reduce ...
type Reduce struct {
Query *Query
@@ -936,12 +735,6 @@ func (e *Reduce) writeTo(s *strings.Builder) {
s.WriteByte(')')
}
-func (e *Reduce) minify() {
- e.Query.minify()
- e.Start.minify()
- e.Update.minify()
-}
-
// Foreach ...
type Foreach struct {
Query *Query
@@ -973,15 +766,6 @@ func (e *Foreach) writeTo(s *strings.Builder) {
s.WriteByte(')')
}
-func (e *Foreach) minify() {
- e.Query.minify()
- e.Start.minify()
- e.Update.minify()
- if e.Extract != nil {
- e.Extract.minify()
- }
-}
-
// Label ...
type Label struct {
Ident string
@@ -1001,10 +785,6 @@ func (e *Label) writeTo(s *strings.Builder) {
e.Body.writeTo(s)
}
-func (e *Label) minify() {
- e.Body.minify()
-}
-
// ConstTerm ...
type ConstTerm struct {
Object *ConstObject
diff --git a/hack/tools/vendor/github.com/itchyny/gojq/type.go b/hack/tools/vendor/github.com/itchyny/gojq/type.go
index bb388e20e4..89ccda0e36 100644
--- a/hack/tools/vendor/github.com/itchyny/gojq/type.go
+++ b/hack/tools/vendor/github.com/itchyny/gojq/type.go
@@ -1,6 +1,7 @@
package gojq
import (
+ "encoding/json"
"fmt"
"math/big"
)
@@ -8,14 +9,15 @@ import (
// TypeOf returns the jq-flavored type name of v.
//
// This method is used by built-in type/0 function, and accepts only limited
-// types (nil, bool, int, float64, *big.Int, string, []any, and map[string]any).
+// types (nil, bool, int, float64, *big.Int, json.Number, string, []any, and
+// map[string]any).
func TypeOf(v any) string {
switch v.(type) {
case nil:
return "null"
case bool:
return "boolean"
- case int, float64, *big.Int:
+ case int, float64, *big.Int, json.Number:
return "number"
case string:
return "string"
diff --git a/hack/tools/vendor/github.com/itchyny/timefmt-go/CHANGELOG.md b/hack/tools/vendor/github.com/itchyny/timefmt-go/CHANGELOG.md
index d863ac3bea..72f3ad1d43 100644
--- a/hack/tools/vendor/github.com/itchyny/timefmt-go/CHANGELOG.md
+++ b/hack/tools/vendor/github.com/itchyny/timefmt-go/CHANGELOG.md
@@ -1,4 +1,7 @@
# Changelog
+## [v0.1.7](https://github.com/itchyny/timefmt-go/compare/v0.1.6..v0.1.7) (2025-10-01)
+* refactor code using built-in `min` and `max` functions
+
## [v0.1.6](https://github.com/itchyny/timefmt-go/compare/v0.1.5..v0.1.6) (2024-06-01)
* support parsing week directives (`%A`, `%a`, `%w`, `%u`, `%V`, `%U`, `%W`)
* validate range of values on parsing directives
diff --git a/hack/tools/vendor/github.com/itchyny/timefmt-go/LICENSE b/hack/tools/vendor/github.com/itchyny/timefmt-go/LICENSE
index 84d6cb0339..de520bb31a 100644
--- a/hack/tools/vendor/github.com/itchyny/timefmt-go/LICENSE
+++ b/hack/tools/vendor/github.com/itchyny/timefmt-go/LICENSE
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2020-2022 itchyny
+Copyright (c) 2020-2025 itchyny
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/hack/tools/vendor/github.com/itchyny/timefmt-go/format.go b/hack/tools/vendor/github.com/itchyny/timefmt-go/format.go
index b38202dff0..dc09ef9002 100644
--- a/hack/tools/vendor/github.com/itchyny/timefmt-go/format.go
+++ b/hack/tools/vendor/github.com/itchyny/timefmt-go/format.go
@@ -1,7 +1,6 @@
package timefmt
import (
- "math"
"strconv"
"time"
)
@@ -14,7 +13,7 @@ func Format(t time.Time, format string) string {
// AppendFormat appends formatted time string to the buffer.
func AppendFormat(buf []byte, t time.Time, format string) []byte {
year, month, day := t.Date()
- hour, min, sec := t.Clock()
+ hour, minute, second := t.Clock()
var width, colons int
var padding byte
var pending string
@@ -69,21 +68,13 @@ func AppendFormat(buf []byte, t time.Time, format string) []byte {
goto L
case '1', '2', '3', '4', '5', '6', '7', '8', '9':
width = int(b & 0x0F)
- const maxWidth = 1024
for i++; i < len(format); i++ {
- b = format[i]
- if b <= '9' && '0' <= b {
- width = width*10 + int(b&0x0F)
- if width >= math.MaxInt/10 {
- width = maxWidth
- }
+ if b = format[i]; b <= '9' && '0' <= b {
+ width = min(width*10+int(b&0x0F), 1024)
} else {
break
}
}
- if width > maxWidth {
- width = maxWidth
- }
if padding == ^paddingMask {
padding = ' ' | ^paddingMask
}
@@ -92,37 +83,19 @@ func AppendFormat(buf []byte, t time.Time, format string) []byte {
}
goto L
case 'Y':
- if width == 0 {
- width = 4
- }
- buf = appendInt(buf, year, width, padding)
+ buf = appendInt(buf, year, or(width, 4), padding)
case 'y':
- if width < 2 {
- width = 2
- }
- buf = appendInt(buf, year%100, width, padding)
+ buf = appendInt(buf, year%100, max(width, 2), padding)
case 'C':
- if width < 2 {
- width = 2
- }
- buf = appendInt(buf, year/100, width, padding)
+ buf = appendInt(buf, year/100, max(width, 2), padding)
case 'g':
- if width < 2 {
- width = 2
- }
year, _ := t.ISOWeek()
- buf = appendInt(buf, year%100, width, padding)
+ buf = appendInt(buf, year%100, max(width, 2), padding)
case 'G':
- if width == 0 {
- width = 4
- }
year, _ := t.ISOWeek()
- buf = appendInt(buf, year, width, padding)
+ buf = appendInt(buf, year, or(width, 4), padding)
case 'm':
- if width < 2 {
- width = 2
- }
- buf = appendInt(buf, int(month), width, padding)
+ buf = appendInt(buf, int(month), max(width, 2), padding)
case 'B':
buf = appendString(buf, longMonthNames[month-1], width, padding, upper, swap)
case 'b', 'h':
@@ -134,74 +107,43 @@ func AppendFormat(buf []byte, t time.Time, format string) []byte {
case 'w':
buf = appendInt(buf, int(t.Weekday()), width, padding)
case 'u':
- w := int(t.Weekday())
- if w == 0 {
- w = 7
- }
- buf = appendInt(buf, w, width, padding)
+ buf = appendInt(buf, or(int(t.Weekday()), 7), width, padding)
case 'V':
- if width < 2 {
- width = 2
- }
_, week := t.ISOWeek()
- buf = appendInt(buf, week, width, padding)
+ buf = appendInt(buf, week, max(width, 2), padding)
case 'U':
- if width < 2 {
- width = 2
- }
week := (t.YearDay() + 6 - int(t.Weekday())) / 7
- buf = appendInt(buf, week, width, padding)
+ buf = appendInt(buf, week, max(width, 2), padding)
case 'W':
- if width < 2 {
- width = 2
- }
week := t.YearDay()
if int(t.Weekday()) > 0 {
week -= int(t.Weekday()) - 7
}
week /= 7
- buf = appendInt(buf, week, width, padding)
+ buf = appendInt(buf, week, max(width, 2), padding)
case 'e':
if padding < ^paddingMask {
padding = ' '
}
fallthrough
case 'd':
- if width < 2 {
- width = 2
- }
- buf = appendInt(buf, day, width, padding)
+ buf = appendInt(buf, day, max(width, 2), padding)
case 'j':
- if width < 3 {
- width = 3
- }
- buf = appendInt(buf, t.YearDay(), width, padding)
+ buf = appendInt(buf, t.YearDay(), max(width, 3), padding)
case 'k':
if padding < ^paddingMask {
padding = ' '
}
fallthrough
case 'H':
- if width < 2 {
- width = 2
- }
- buf = appendInt(buf, hour, width, padding)
+ buf = appendInt(buf, hour, max(width, 2), padding)
case 'l':
if padding < ^paddingMask {
padding = ' '
}
fallthrough
case 'I':
- if width < 2 {
- width = 2
- }
- h := hour
- if h > 12 {
- h -= 12
- } else if h == 0 {
- h = 12
- }
- buf = appendInt(buf, h, width, padding)
+ buf = appendInt(buf, or(hour%12, 12), max(width, 2), padding)
case 'P':
swap = !(upper || swap)
fallthrough
@@ -212,25 +154,16 @@ func AppendFormat(buf []byte, t time.Time, format string) []byte {
buf = appendString(buf, "PM", width, padding, upper, swap)
}
case 'M':
- if width < 2 {
- width = 2
- }
- buf = appendInt(buf, min, width, padding)
+ buf = appendInt(buf, minute, max(width, 2), padding)
case 'S':
- if width < 2 {
- width = 2
- }
- buf = appendInt(buf, sec, width, padding)
+ buf = appendInt(buf, second, max(width, 2), padding)
case 's':
if padding < ^paddingMask {
padding = ' '
}
buf = appendInt(buf, int(t.Unix()), width, padding)
case 'f':
- if width == 0 {
- width = 6
- }
- buf = appendInt(buf, t.Nanosecond()/1000, width, padding)
+ buf = appendInt(buf, t.Nanosecond()/1000, or(width, 6), padding)
case 'Z', 'z':
name, offset := t.Zone()
if b == 'Z' && name != "" {
@@ -266,19 +199,11 @@ func AppendFormat(buf []byte, t time.Time, format string) []byte {
}
}
colons = 0
- if i != j {
- l := len(buf)
- k = j + 1 - (l - j)
- if k < i {
- l = j + 1 + i - k
- k = i
- } else {
- l = j + 1
- }
- copy(buf[k:], buf[j:])
- buf = buf[:l]
+ if k = min(len(buf)-j-1, j-i); k > 0 {
+ copy(buf[j-k:], buf[j:])
+ buf = buf[:len(buf)-k]
if padding&paddingMask == '0' {
- buf[i], buf[k] = buf[k], buf[i]
+ buf[i], buf[j-k] = buf[j-k], buf[i]
}
}
case ':':
@@ -373,19 +298,11 @@ func appendInt(buf []byte, num, width int, padding byte) []byte {
}
j := len(buf)
buf = strconv.AppendInt(buf, int64(num), 10)
- l := len(buf)
- if j+1 == l || i == j {
- return buf
- }
- k := j + 1 - (l - j)
- if k < i {
- l = j + 1 + i - k
- k = i
- } else {
- l = j + 1
+ if k := min(len(buf)-j-1, j-i); k > 0 {
+ copy(buf[j-k:], buf[j:])
+ buf = buf[:len(buf)-k]
}
- copy(buf[k:], buf[j:])
- return buf[:l]
+ return buf
}
}
if num < 100 {
@@ -453,6 +370,13 @@ func appendLast(buf []byte, format string, width int, padding byte) []byte {
return buf
}
+func or(x, y int) int {
+ if x != 0 {
+ return x
+ }
+ return y
+}
+
const paddingMask byte = 0x7F
var longMonthNames = []string{
diff --git a/hack/tools/vendor/github.com/itchyny/timefmt-go/parse.go b/hack/tools/vendor/github.com/itchyny/timefmt-go/parse.go
index 26ae0f0c25..34a22990a8 100644
--- a/hack/tools/vendor/github.com/itchyny/timefmt-go/parse.go
+++ b/hack/tools/vendor/github.com/itchyny/timefmt-go/parse.go
@@ -19,7 +19,7 @@ func ParseInLocation(source, format string, loc *time.Location) (t time.Time, er
}
func parse(source, format string, loc, base *time.Location) (t time.Time, err error) {
- year, month, day, hour, min, sec, nsec := 1900, 1, 0, 0, 0, 0, 0
+ year, month, day, hour, minute, second, nanosecond := 1900, 1, 0, 0, 0, 0, 0
defer func() {
if err != nil {
err = fmt.Errorf("failed to parse %q with %q: %w", source, format, err)
@@ -102,25 +102,19 @@ func parse(source, format string, loc, base *time.Location) (t time.Time, err er
return
}
weekstart = time.Thursday
- if weekday == 0 {
- weekday = 2
- }
+ weekday = or(weekday, 2)
case 'U':
if week, j, err = parseNumber(source, j, 2, 0, 53, b); err != nil {
return
}
weekstart = time.Sunday
- if weekday == 0 {
- weekday = 1
- }
+ weekday = or(weekday, 1)
case 'W':
if week, j, err = parseNumber(source, j, 2, 0, 53, b); err != nil {
return
}
weekstart = time.Monday
- if weekday == 0 {
- weekday = 2
- }
+ weekday = or(weekday, 2)
case 'e':
if j < l && source[j] == ' ' {
j++
@@ -162,11 +156,11 @@ func parse(source, format string, loc, base *time.Location) (t time.Time, err er
}
pm = ampm == 2
case 'M':
- if min, j, err = parseNumber(source, j, 2, 0, 59, 'M'); err != nil {
+ if minute, j, err = parseNumber(source, j, 2, 0, 59, 'M'); err != nil {
return
}
case 'S':
- if sec, j, err = parseNumber(source, j, 2, 0, 60, 'S'); err != nil {
+ if second, j, err = parseNumber(source, j, 2, 0, 60, 'S'); err != nil {
return
}
case 's':
@@ -177,17 +171,17 @@ func parse(source, format string, loc, base *time.Location) (t time.Time, err er
t = time.Unix(int64(unix), 0).In(time.UTC)
var mon time.Month
year, mon, day = t.Date()
- hour, min, sec = t.Clock()
+ hour, minute, second = t.Clock()
month = int(mon)
case 'f':
- usec, i := 0, j
- if usec, j, err = parseNumber(source, j, 6, 0, 999999, 'f'); err != nil {
+ microsecond, i := 0, j
+ if microsecond, j, err = parseNumber(source, j, 6, 0, 999999, 'f'); err != nil {
return
}
for i = j - i; i < 6; i++ {
- usec *= 10
+ microsecond *= 10
}
- nsec = usec * 1000
+ nanosecond = microsecond * 1000
case 'Z':
i := j
for ; j < l; j++ {
@@ -219,7 +213,7 @@ func parse(source, format string, loc, base *time.Location) (t time.Time, err er
sign = -1
fallthrough
case '+':
- hour, min, sec, i := 0, 0, 0, j
+ hour, minute, second, i := 0, 0, 0, j
if hour, j, _ = parseNumber(source, j+1, 2, 0, 23, 'z'); j != i+3 {
err = parseZFormatError(colons)
return
@@ -233,7 +227,7 @@ func parse(source, format string, loc, base *time.Location) (t time.Time, err er
colons = 4
}
i = j
- if min, j, _ = parseNumber(source, j, 2, 0, 59, 'z'); j != i+2 {
+ if minute, j, _ = parseNumber(source, j, 2, 0, 59, 'z'); j != i+2 {
if colons > 0 {
err = parseZFormatError(colons & 3)
return
@@ -247,7 +241,7 @@ func parse(source, format string, loc, base *time.Location) (t time.Time, err er
}
} else {
i = j
- if sec, j, _ = parseNumber(source, j+1, 2, 0, 59, 'z'); j != i+3 {
+ if second, j, _ = parseNumber(source, j+1, 2, 0, 59, 'z'); j != i+3 {
if colons == 2 {
err = parseZFormatError(colons)
return
@@ -260,7 +254,7 @@ func parse(source, format string, loc, base *time.Location) (t time.Time, err er
if hasZoneName {
name, _ = locationZone(loc)
}
- loc, colons = time.FixedZone(name, sign*((hour*60+min)*60+sec)), 0
+ loc, colons = time.FixedZone(name, sign*((hour*60+minute)*60+second)), 0
hasZoneOffset = true
case 'Z':
loc, colons, j = time.UTC, 0, j+1
@@ -350,7 +344,7 @@ func parse(source, format string, loc, base *time.Location) (t time.Time, err er
err = errors.New(`use "%Y" to parse non-ISO year for "%j"`)
return
}
- return time.Date(year, time.January, yday, hour, min, sec, nsec, loc), nil
+ return time.Date(year, time.January, yday, hour, minute, second, nanosecond, loc), nil
}
if weekstart >= time.Sunday {
if weekstart == time.Thursday {
@@ -365,12 +359,12 @@ func parse(source, format string, loc, base *time.Location) (t time.Time, err er
if weekstart > time.Sunday && weekday == 1 {
week++
}
- t := time.Date(year, time.January, -int(weekstart), hour, min, sec, nsec, loc)
+ t := time.Date(year, time.January, -int(weekstart), hour, minute, second, nanosecond, loc)
return t.AddDate(0, 0, week*7-int(t.Weekday())+weekday-1), nil
}
day = 1
}
- return time.Date(year, time.Month(month), day, hour, min, sec, nsec, loc), nil
+ return time.Date(year, time.Month(month), day, hour, minute, second, nanosecond, loc), nil
}
func locationZone(loc *time.Location) (name string, offset int) {
@@ -407,22 +401,17 @@ func (err expectedZAfterColonError) Error() string {
return `expected 'z' after "%` + `::"`[2-err:]
}
-func parseNumber(source string, index, size, min, max int, format byte) (int, int, error) {
+func parseNumber(source string, index, size, minimum, maximum int, format byte) (int, int, error) {
var value int
- if l := len(source); index+size > l {
- size = l
- } else {
- size += index
- }
i := index
- for ; i < size; i++ {
+ for size = min(i+size, len(source)); i < size; i++ {
if b := source[i]; '0' <= b && b <= '9' {
value = value*10 + int(b&0x0F)
} else {
break
}
}
- if i == index || value < min || max < value {
+ if i == index || value < minimum || maximum < value {
return 0, 0, parseFormatError(format)
}
return value, i, nil
diff --git a/hack/tools/vendor/github.com/kulti/thelper/pkg/analyzer/analyzer.go b/hack/tools/vendor/github.com/kulti/thelper/pkg/analyzer/analyzer.go
index a22fd6aca6..5a2d0f89d9 100644
--- a/hack/tools/vendor/github.com/kulti/thelper/pkg/analyzer/analyzer.go
+++ b/hack/tools/vendor/github.com/kulti/thelper/pkg/analyzer/analyzer.go
@@ -1,3 +1,4 @@
+// Package analyzer implements the thelper linter logic.
package analyzer
import (
@@ -9,14 +10,14 @@ import (
"sort"
"strings"
- "github.com/gostaticanalysis/analysisutil"
"golang.org/x/tools/go/analysis"
"golang.org/x/tools/go/analysis/passes/inspect"
"golang.org/x/tools/go/ast/inspector"
)
const (
- doc = "thelper detects tests helpers which is not start with t.Helper() method."
+ doc = "thelper detects tests helpers which do not start with the t.Helper() method."
+
checksDoc = `coma separated list of enabled checks
Available checks
@@ -45,7 +46,9 @@ func (m enabledChecksValue) String() string {
for s := range m {
ss = append(ss, s)
}
+
sort.Strings(ss)
+
return strings.Join(ss, ",")
}
@@ -58,6 +61,7 @@ func (m enabledChecksValue) Set(s string) error {
for k := range m {
delete(m, k)
}
+
for _, v := range ss {
switch v {
case checkTBegin, checkTFirst, checkTName,
@@ -69,6 +73,7 @@ func (m enabledChecksValue) Set(s string) error {
return fmt.Errorf("unknown check name %q (see help for full list)", v)
}
}
+
return nil
}
@@ -125,6 +130,7 @@ func NewAnalyzer() *analysis.Analyzer {
return a
}
+//nolint:funlen // The function is easier to grok this way.
func (t thelper) run(pass *analysis.Pass) (interface{}, error) {
tCheckOpts, fCheckOpts, bCheckOpts, tbCheckOpts, ok := t.buildCheckFuncOpts(pass)
if !ok {
@@ -137,6 +143,7 @@ func (t thelper) run(pass *analysis.Pass) (interface{}, error) {
}
var reports reports
+
nodeFilter := []ast.Node{
(*ast.FuncDecl)(nil),
(*ast.FuncLit)(nil),
@@ -144,6 +151,7 @@ func (t thelper) run(pass *analysis.Pass) (interface{}, error) {
}
inspect.Preorder(nodeFilter, func(node ast.Node) {
var fd funcDecl
+
switch n := node.(type) {
case *ast.FuncLit:
fd.Pos = n.Pos()
@@ -157,13 +165,19 @@ func (t thelper) run(pass *analysis.Pass) (interface{}, error) {
fd.Name = n.Name
case *ast.CallExpr:
runSubtestExprs := extractSubtestExp(pass, n, tCheckOpts.subRun, tCheckOpts.subTestFuncType)
+
if len(runSubtestExprs) == 0 {
runSubtestExprs = extractSubtestExp(pass, n, bCheckOpts.subRun, bCheckOpts.subTestFuncType)
}
+
if len(runSubtestExprs) == 0 {
runSubtestExprs = extractSubtestFuzzExp(pass, n, fCheckOpts.subRun)
}
+ if len(runSubtestExprs) == 0 {
+ runSubtestExprs = extractSynctestExp(pass, n, tCheckOpts.subTestFuncType)
+ }
+
if len(runSubtestExprs) > 0 {
for _, expr := range runSubtestExprs {
reports.Filter(funcDefPosition(pass, expr))
@@ -171,6 +185,7 @@ func (t thelper) run(pass *analysis.Pass) (interface{}, error) {
} else {
reports.NoFilter(funcDefPosition(pass, n.Fun))
}
+
return
default:
return
@@ -202,7 +217,8 @@ type checkFuncOpts struct {
func (t thelper) buildCheckFuncOpts(pass *analysis.Pass) (checkFuncOpts, checkFuncOpts, checkFuncOpts, checkFuncOpts, bool) {
var ctxType types.Type
- ctxObj := analysisutil.ObjectOf(pass, "context", "Context")
+
+ ctxObj := findTypeObject(pass, "context.Context")
if ctxObj != nil {
ctxType = ctxObj.Type()
}
@@ -231,7 +247,7 @@ func (t thelper) buildCheckFuncOpts(pass *analysis.Pass) (checkFuncOpts, checkFu
}
func (t thelper) buildTestCheckFuncOpts(pass *analysis.Pass, ctxType types.Type) (checkFuncOpts, bool) {
- tObj := analysisutil.ObjectOf(pass, "testing", "T")
+ tObj := findTypeObject(pass, "testing.T")
if tObj == nil {
return checkFuncOpts{}, false
}
@@ -248,13 +264,14 @@ func (t thelper) buildTestCheckFuncOpts(pass *analysis.Pass, ctxType types.Type)
tType := types.NewPointer(tObj.Type())
tVar := types.NewVar(token.NoPos, nil, "t", tType)
+
return checkFuncOpts{
skipPrefix: "Test",
varName: "t",
fnHelper: tHelper,
subRun: tRun,
hpType: tType,
- subTestFuncType: types.NewSignature(nil, types.NewTuple(tVar), nil, false),
+ subTestFuncType: types.NewSignatureType(nil, nil, nil, types.NewTuple(tVar), nil, false),
ctxType: ctxType,
checkBegin: t.enabledChecks.Enabled(checkTBegin),
checkFirst: t.enabledChecks.Enabled(checkTFirst),
@@ -263,7 +280,7 @@ func (t thelper) buildTestCheckFuncOpts(pass *analysis.Pass, ctxType types.Type)
}
func (t thelper) buildFuzzCheckFuncOpts(pass *analysis.Pass, ctxType types.Type) (checkFuncOpts, bool) {
- fObj := analysisutil.ObjectOf(pass, "testing", "F")
+ fObj := findTypeObject(pass, "testing.F")
if fObj == nil {
return checkFuncOpts{}, true // fuzzing supports since go1.18, it's ok, that testig.F is missed.
}
@@ -292,7 +309,7 @@ func (t thelper) buildFuzzCheckFuncOpts(pass *analysis.Pass, ctxType types.Type)
}
func (t thelper) buildBenchmarkCheckFuncOpts(pass *analysis.Pass, ctxType types.Type) (checkFuncOpts, bool) {
- bObj := analysisutil.ObjectOf(pass, "testing", "B")
+ bObj := findTypeObject(pass, "testing.B")
if bObj == nil {
return checkFuncOpts{}, false
}
@@ -309,13 +326,14 @@ func (t thelper) buildBenchmarkCheckFuncOpts(pass *analysis.Pass, ctxType types.
bType := types.NewPointer(bObj.Type())
bVar := types.NewVar(token.NoPos, nil, "b", bType)
+
return checkFuncOpts{
skipPrefix: "Benchmark",
varName: "b",
fnHelper: bHelper,
subRun: bRun,
hpType: types.NewPointer(bObj.Type()),
- subTestFuncType: types.NewSignature(nil, types.NewTuple(bVar), nil, false),
+ subTestFuncType: types.NewSignatureType(nil, nil, nil, types.NewTuple(bVar), nil, false),
ctxType: ctxType,
checkBegin: t.enabledChecks.Enabled(checkBBegin),
checkFirst: t.enabledChecks.Enabled(checkBFirst),
@@ -324,7 +342,7 @@ func (t thelper) buildBenchmarkCheckFuncOpts(pass *analysis.Pass, ctxType types.
}
func (t thelper) buildTBCheckFuncOpts(pass *analysis.Pass, ctxType types.Type) (checkFuncOpts, bool) {
- tbObj := analysisutil.ObjectOf(pass, "testing", "TB")
+ tbObj := findTypeObject(pass, "testing.TB")
if tbObj == nil {
return checkFuncOpts{}, false
}
@@ -370,6 +388,7 @@ func checkFunc(pass *analysis.Pass, reports *reports, funcDecl funcDecl, opts ch
if opts.checkFirst {
if pos != 0 {
checkFirstPassed := false
+
if pos == 1 && opts.ctxType != nil {
_, pos, ok := searchFuncParam(pass, funcDecl, opts.ctxType)
checkFirstPassed = ok && (pos == 0)
@@ -404,6 +423,7 @@ func searchFuncParam(pass *analysis.Pass, f funcDecl, p types.Type) (*ast.Field,
return f, i, true
}
}
+
return nil, 0, false
}
@@ -473,6 +493,44 @@ func extractSubtestFuzzExp(
return []ast.Expr{e.Args[0]}
}
+// extractSynctestExp analyzes that call expression 'e' is synctest.Test
+// and returns the test function.
+func extractSynctestExp(
+ pass *analysis.Pass, e *ast.CallExpr, testFuncType types.Type,
+) []ast.Expr {
+ // Check if this is a call to synctest.Test
+ selExpr, ok := e.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return nil
+ }
+
+ // Check if the selector is "Test"
+ if selExpr.Sel.Name != "Test" {
+ return nil
+ }
+
+ // Check if the package is synctest by looking at the identifier
+ ident, ok := selExpr.X.(*ast.Ident)
+ if !ok {
+ return nil
+ }
+
+ if !isIdentPackageName(pass, ident, "testing/synctest") {
+ return nil
+ }
+
+ // synctest.Test takes 2 arguments: t *testing.T, f func(*testing.T)
+ if len(e.Args) != 2 {
+ return nil
+ }
+
+ if funcs := unwrapTestingFunctionBuilding(pass, e.Args[1], testFuncType); funcs != nil {
+ return funcs
+ }
+
+ return []ast.Expr{e.Args[1]}
+}
+
// unwrapTestingFunctionConstruction checks that expresion is build testing functions
// and returns the result of building.
func unwrapTestingFunctionBuilding(pass *analysis.Pass, expr ast.Expr, testFuncType types.Type) []ast.Expr {
@@ -482,6 +540,7 @@ func unwrapTestingFunctionBuilding(pass *analysis.Pass, expr ast.Expr, testFuncT
}
var funcDecl funcDecl
+
switch f := callExpr.Fun.(type) {
case *ast.FuncLit:
funcDecl.Body = f.Body
@@ -512,6 +571,7 @@ func unwrapTestingFunctionBuilding(pass *analysis.Pass, expr ast.Expr, testFuncT
}
var funcs []ast.Expr
+
ast.Inspect(funcDecl.Body, func(n ast.Node) bool {
if n == nil {
return false
@@ -522,6 +582,7 @@ func unwrapTestingFunctionBuilding(pass *analysis.Pass, expr ast.Expr, testFuncT
funcs = append(funcs, retStmt.Results[0])
}
}
+
return true
})
@@ -542,6 +603,7 @@ func funcDefPosition(pass *analysis.Pass, e ast.Expr) token.Pos {
if !ok {
return token.NoPos
}
+
funIdent = selExpr.Sel
}
@@ -574,6 +636,21 @@ func isExprHasType(pass *analysis.Pass, expr ast.Expr, expType types.Type) bool
return types.Identical(typeInfo.Type, expType)
}
+// isIdentPackageName returns true if ident refers to the specified package.
+func isIdentPackageName(pass *analysis.Pass, ident *ast.Ident, pkgName string) bool {
+ obj := pass.TypesInfo.Uses[ident]
+ if obj == nil {
+ return false
+ }
+
+ pkgObj, ok := obj.(*types.PkgName)
+ if !ok {
+ return false
+ }
+
+ return pkgObj.Imported().Path() == pkgName
+}
+
// findSelectorDeclaration returns function declaration called by selector expression.
func findSelectorDeclaration(pass *analysis.Pass, expr *ast.SelectorExpr) *ast.FuncDecl {
xsel, ok := pass.TypesInfo.Selections[expr]
@@ -637,3 +714,22 @@ func findFunctionDeclaration(pass *analysis.Pass, ident *ast.Ident) *ast.FuncDec
return nil
}
+
+func findTypeObject(pass *analysis.Pass, typeName string) types.Object {
+ parts := strings.Split(typeName, ".")
+ pkgName := parts[0]
+ typeName = parts[1]
+
+ for _, pkg := range pass.Pkg.Imports() {
+ if pkg.Name() != pkgName {
+ continue
+ }
+
+ obj := pkg.Scope().Lookup(typeName)
+ if obj != nil {
+ return obj
+ }
+ }
+
+ return nil
+}
diff --git a/hack/tools/vendor/github.com/kulti/thelper/pkg/analyzer/report.go b/hack/tools/vendor/github.com/kulti/thelper/pkg/analyzer/report.go
index 4a23e36d50..3ee3327428 100644
--- a/hack/tools/vendor/github.com/kulti/thelper/pkg/analyzer/report.go
+++ b/hack/tools/vendor/github.com/kulti/thelper/pkg/analyzer/report.go
@@ -31,6 +31,7 @@ func (rr *reports) Filter(pos token.Pos) {
if rr.filter == nil {
rr.filter = make(map[token.Pos]struct{})
}
+
rr.filter[pos] = struct{}{}
}
}
@@ -40,17 +41,19 @@ func (rr *reports) NoFilter(pos token.Pos) {
if rr.nofilter == nil {
rr.nofilter = make(map[token.Pos]struct{})
}
+
rr.nofilter[pos] = struct{}{}
}
}
-func (rr reports) Flush(pass *analysis.Pass) {
+func (rr *reports) Flush(pass *analysis.Pass) {
for _, r := range rr.reports {
if _, ok := rr.filter[r.pos]; ok {
if _, ok := rr.nofilter[r.pos]; !ok {
continue
}
}
+
pass.Reportf(r.pos, r.format, r.args...)
}
}
diff --git a/hack/tools/vendor/github.com/kunwardeep/paralleltest/pkg/paralleltest/paralleltest.go b/hack/tools/vendor/github.com/kunwardeep/paralleltest/pkg/paralleltest/paralleltest.go
index aebbe70eac..6f59e8408b 100644
--- a/hack/tools/vendor/github.com/kunwardeep/paralleltest/pkg/paralleltest/paralleltest.go
+++ b/hack/tools/vendor/github.com/kunwardeep/paralleltest/pkg/paralleltest/paralleltest.go
@@ -13,7 +13,8 @@ import (
const Doc = `check that tests use t.Parallel() method
It also checks that the t.Parallel is used if multiple tests cases are run as part of single test.
As part of ensuring parallel tests works as expected it checks for reinitializing of the range value
-over the test cases.(https://tinyurl.com/y6555cy6)`
+over the test cases.(https://tinyurl.com/y6555cy6)
+With the -checkcleanup flag, it also checks that defer is not used with t.Parallel (use t.Cleanup instead).`
func NewAnalyzer() *analysis.Analyzer {
return newParallelAnalyzer().analyzer
@@ -27,6 +28,7 @@ type parallelAnalyzer struct {
ignoreMissing bool
ignoreMissingSubtests bool
ignoreLoopVar bool
+ checkCleanup bool
}
func newParallelAnalyzer() *parallelAnalyzer {
@@ -36,6 +38,7 @@ func newParallelAnalyzer() *parallelAnalyzer {
flags.BoolVar(&a.ignoreMissing, "i", false, "ignore missing calls to t.Parallel")
flags.BoolVar(&a.ignoreMissingSubtests, "ignoremissingsubtests", false, "ignore missing calls to t.Parallel in subtests")
flags.BoolVar(&a.ignoreLoopVar, "ignoreloopVar", false, "ignore loop variable detection")
+ flags.BoolVar(&a.checkCleanup, "checkcleanup", false, "check that defer is not used with t.Parallel (use t.Cleanup instead)")
a.analyzer = &analysis.Analyzer{
Name: "paralleltest",
@@ -51,11 +54,13 @@ type testFunctionAnalysis struct {
funcCantParallelMethod,
rangeStatementOverTestCasesExists,
rangeStatementHasParallelMethod,
- rangeStatementCantParallelMethod bool
+ rangeStatementCantParallelMethod,
+ funcHasDeferStatement bool
loopVariableUsedInRun *string
numberOfTestRun int
positionOfTestRunNode []ast.Node
rangeNode ast.Node
+ deferStatements []ast.Node
}
type testRunAnalysis struct {
@@ -84,6 +89,7 @@ func (a *parallelAnalyzer) analyzeTestRun(pass *analysis.Pass, n ast.Node, testV
return true
})
} else if ident, ok := callExpr.Args[1].(*ast.Ident); ok {
+ // Case 2: Direct function identifier: t.Run("name", myFunc)
foundFunc := false
for _, file := range pass.Files {
for _, decl := range file.Decls {
@@ -104,6 +110,9 @@ func (a *parallelAnalyzer) analyzeTestRun(pass *analysis.Pass, n ast.Node, testV
if !foundFunc {
analysis.hasParallel = false
}
+ } else if builderCall, ok := callExpr.Args[1].(*ast.CallExpr); ok {
+ // Case 3: Function call that returns a function: t.Run("name", builder())
+ analysis.hasParallel = a.checkBuilderFunctionForParallel(pass, builderCall)
}
}
@@ -126,6 +135,12 @@ func (a *parallelAnalyzer) analyzeTestFunction(pass *analysis.Pass, funcDecl *as
for _, l := range funcDecl.Body.List {
switch v := l.(type) {
+ case *ast.DeferStmt:
+ if a.checkCleanup {
+ analysis.funcHasDeferStatement = true
+ analysis.deferStatements = append(analysis.deferStatements, v)
+ }
+
case *ast.ExprStmt:
ast.Inspect(v, func(n ast.Node) bool {
if !analysis.funcHasParallelMethod {
@@ -211,6 +226,89 @@ func (a *parallelAnalyzer) analyzeTestFunction(pass *analysis.Pass, funcDecl *as
}
}
}
+
+ if a.checkCleanup && analysis.funcHasParallelMethod && analysis.funcHasDeferStatement {
+ for _, deferStmt := range analysis.deferStatements {
+ pass.Reportf(deferStmt.Pos(), "Function %s uses defer with t.Parallel, use t.Cleanup instead to ensure cleanup runs after parallel subtests complete", funcDecl.Name.Name)
+ }
+ }
+}
+
+// checkBuilderFunctionForParallel analyzes a function call that returns a test function
+// to see if the returned function contains t.Parallel()
+func (a *parallelAnalyzer) checkBuilderFunctionForParallel(pass *analysis.Pass, builderCall *ast.CallExpr) bool {
+ // Get the name of the builder function being called
+ var builderFuncName string
+ switch fun := builderCall.Fun.(type) {
+ case *ast.Ident:
+ builderFuncName = fun.Name
+ case *ast.SelectorExpr:
+ // Handle method calls like obj.Builder()
+ builderFuncName = fun.Sel.Name
+ default:
+ return false
+ }
+
+ if builderFuncName == "" {
+ return false
+ }
+
+ // Find the builder function declaration
+ for _, file := range pass.Files {
+ for _, decl := range file.Decls {
+ funcDecl, ok := decl.(*ast.FuncDecl)
+ if !ok || funcDecl.Name.Name != builderFuncName {
+ continue
+ }
+
+ // Found the builder function, analyze it and return immediately
+ hasParallel := false
+ ast.Inspect(funcDecl, func(n ast.Node) bool {
+ // Look for return statements
+ returnStmt, ok := n.(*ast.ReturnStmt)
+ if !ok || len(returnStmt.Results) == 0 {
+ return true
+ }
+
+ // Check if the return value is a function literal
+ for _, result := range returnStmt.Results {
+ if funcLit, ok := result.(*ast.FuncLit); ok {
+ // Get the parameter name from the returned function
+ var paramName string
+ if funcLit.Type != nil && funcLit.Type.Params != nil && len(funcLit.Type.Params.List) > 0 {
+ param := funcLit.Type.Params.List[0]
+ if len(param.Names) > 0 {
+ paramName = param.Names[0].Name
+ }
+ }
+
+ // Inspect the returned function for t.Parallel()
+ if paramName != "" {
+ ast.Inspect(funcLit, func(p ast.Node) bool {
+ if methodParallelIsCalledInTestFunction(p, paramName) {
+ hasParallel = true
+ return false
+ }
+ return true
+ })
+
+ // Exit inspection immediately if we found t.Parallel()
+ if hasParallel {
+ return false
+ }
+ }
+ }
+ }
+ // Continue to next return statement if t.Parallel() not found yet
+ return true
+ })
+
+ // Return immediately after processing the matching function
+ return hasParallel
+ }
+ }
+
+ return false
}
func (a *parallelAnalyzer) run(pass *analysis.Pass) (interface{}, error) {
diff --git a/hack/tools/vendor/github.com/ldez/exptostd/.golangci.yml b/hack/tools/vendor/github.com/ldez/exptostd/.golangci.yml
index e45135c609..2675c2863e 100644
--- a/hack/tools/vendor/github.com/ldez/exptostd/.golangci.yml
+++ b/hack/tools/vendor/github.com/ldez/exptostd/.golangci.yml
@@ -27,6 +27,7 @@ linters:
- testpackage
- tparallel
- varnamelen
+ - wsl # deprecated
settings:
depguard:
rules:
diff --git a/hack/tools/vendor/github.com/ldez/exptostd/exptostd.go b/hack/tools/vendor/github.com/ldez/exptostd/exptostd.go
index 7205816b85..aa5dc5ada1 100644
--- a/hack/tools/vendor/github.com/ldez/exptostd/exptostd.go
+++ b/hack/tools/vendor/github.com/ldez/exptostd/exptostd.go
@@ -267,46 +267,54 @@ func (a *analyzer) detectPackageUsage(pass *analysis.Pass,
}
func (a *analyzer) detectConstraintsUsage(pass *analysis.Pass, expr ast.Expr, result *Result, goVersion int) {
- selExpr, ok := expr.(*ast.SelectorExpr)
- if !ok {
- return
- }
-
- ident, ok := selExpr.X.(*ast.Ident)
- if !ok {
- return
- }
+ switch selExpr := expr.(type) {
+ case *ast.SelectorExpr:
+ ident, ok := selExpr.X.(*ast.Ident)
+ if !ok {
+ return
+ }
- if !isPackageUsed(pass, ident, pkgExpConstraints) {
- return
- }
+ if !isPackageUsed(pass, ident, pkgExpConstraints) {
+ return
+ }
- rp, ok := a.constraintsPkgReplacements[selExpr.Sel.Name]
- if !ok {
- result.shouldKeepImport = true
- return
- }
+ rp, ok := a.constraintsPkgReplacements[selExpr.Sel.Name]
+ if !ok {
+ result.shouldKeepImport = true
+ return
+ }
- if !a.skipGoVersionDetection && rp.MinGo > goVersion {
- result.shouldKeepImport = true
- return
- }
+ if !a.skipGoVersionDetection && rp.MinGo > goVersion {
+ result.shouldKeepImport = true
+ return
+ }
- diagnostic := analysis.Diagnostic{
- Pos: selExpr.Pos(),
- Message: fmt.Sprintf("%s.%s can be replaced by %s", pkgExpConstraints, selExpr.Sel.Name, rp.Text),
- }
+ diagnostic := analysis.Diagnostic{
+ Pos: selExpr.Pos(),
+ Message: fmt.Sprintf("%s.%s can be replaced by %s", pkgExpConstraints, selExpr.Sel.Name, rp.Text),
+ }
- if rp.Suggested != nil {
- fix, err := rp.Suggested(selExpr)
- if err != nil {
- diagnostic.Message = fmt.Sprintf("Suggested fix error: %v", err)
- } else {
- diagnostic.SuggestedFixes = append(diagnostic.SuggestedFixes, fix)
+ if rp.Suggested != nil {
+ fix, err := rp.Suggested(selExpr)
+ if err != nil {
+ diagnostic.Message = fmt.Sprintf("Suggested fix error: %v", err)
+ } else {
+ diagnostic.SuggestedFixes = append(diagnostic.SuggestedFixes, fix)
+ }
}
- }
- pass.Report(diagnostic)
+ pass.Report(diagnostic)
+
+ case *ast.BinaryExpr:
+ a.detectConstraintsUsage(pass, selExpr.X, result, goVersion)
+ a.detectConstraintsUsage(pass, selExpr.Y, result, goVersion)
+
+ case *ast.UnaryExpr:
+ a.detectConstraintsUsage(pass, selExpr.X, result, goVersion)
+
+ default:
+ return
+ }
}
func (a *analyzer) suggestReplaceImport(pass *analysis.Pass, imports map[string]*ast.ImportSpec, shouldKeep bool, importPath, stdPackage string) {
@@ -320,7 +328,7 @@ func (a *analyzer) suggestReplaceImport(pass *analysis.Pass, imports map[string]
pass.Report(analysis.Diagnostic{
Pos: imp.Pos(),
End: imp.End(),
- Message: fmt.Sprintf("Import statement '%s' can be replaced by '%s'", src, stdPackage),
+ Message: fmt.Sprintf("Import statement '%s' may be replaced by '%s'", src, stdPackage),
SuggestedFixes: []analysis.SuggestedFix{{
TextEdits: []analysis.TextEdit{{
Pos: imp.Path.Pos(),
diff --git a/hack/tools/vendor/github.com/ldez/gomoddirectives/.golangci.yml b/hack/tools/vendor/github.com/ldez/gomoddirectives/.golangci.yml
index 880eb12c80..8eb11ff019 100644
--- a/hack/tools/vendor/github.com/ldez/gomoddirectives/.golangci.yml
+++ b/hack/tools/vendor/github.com/ldez/gomoddirectives/.golangci.yml
@@ -28,6 +28,7 @@ linters:
- tparallel
- varnamelen
- wrapcheck
+ - wsl # deprecated
settings:
depguard:
diff --git a/hack/tools/vendor/github.com/ldez/gomoddirectives/readme.md b/hack/tools/vendor/github.com/ldez/gomoddirectives/readme.md
index 355472f6a5..054af46259 100644
--- a/hack/tools/vendor/github.com/ldez/gomoddirectives/readme.md
+++ b/hack/tools/vendor/github.com/ldez/gomoddirectives/readme.md
@@ -35,9 +35,9 @@ linters:
# Default: false
exclude-forbidden: true
- # Forbid the use of the `ignore` directives.
+ # Forbid the use of the `ignore` directives (go >= 1.25).
# Default: false
- exclude-ignore: true
+ ignore-forbidden: true
# Forbid the use of the `toolchain` directive.
# Default: false
diff --git a/hack/tools/vendor/github.com/ldez/grignotin/LICENSE b/hack/tools/vendor/github.com/ldez/grignotin/LICENSE
new file mode 100644
index 0000000000..79f380e5c8
--- /dev/null
+++ b/hack/tools/vendor/github.com/ldez/grignotin/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2024 Fernandez Ludovic
+
+ 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.
diff --git a/hack/tools/vendor/github.com/ldez/tagliatelle/.golangci.yml b/hack/tools/vendor/github.com/ldez/tagliatelle/.golangci.yml
index 01c76dca99..371822b51f 100644
--- a/hack/tools/vendor/github.com/ldez/tagliatelle/.golangci.yml
+++ b/hack/tools/vendor/github.com/ldez/tagliatelle/.golangci.yml
@@ -1,77 +1,83 @@
+version: "2"
+
+formatters:
+ enable:
+ - gci
+ - gofumpt
+ settings:
+ gofumpt:
+ extra-rules: true
+
linters:
- enable-all: true
+ default: all
disable:
- - exportloopref # deprecated
- - sqlclosecheck # not relevant (SQL)
- - rowserrcheck # not relevant (SQL)
- cyclop # duplicate of gocyclo
- - lll
- dupl
- - wsl
- - nlreturn
- - mnd
- err113
- - wrapcheck
+ - errchkjson
- exhaustive
- exhaustruct
- - testpackage
- - tparallel
- - paralleltest
- - prealloc
- forcetypeassert
- - varnamelen
+ - lll
+ - mnd
- nilnil
- - errchkjson
+ - nlreturn
- nonamedreturns
+ - paralleltest
+ - prealloc
+ - rowserrcheck # not relevant (SQL)
+ - sqlclosecheck # not relevant (SQL)
+ - testpackage
+ - tparallel
+ - varnamelen
+ - wrapcheck
+ - wsl # Deprecated
+
+ settings:
+ depguard:
+ rules:
+ main:
+ deny:
+ - pkg: github.com/instana/testify
+ desc: not allowed
+ - pkg: github.com/pkg/errors
+ desc: Should be replaced by standard lib errors package
+ funlen:
+ lines: -1
+ statements: 40
+ goconst:
+ min-len: 5
+ min-occurrences: 3
+ gocritic:
+ disabled-checks:
+ - sloppyReassign
+ - rangeValCopy
+ - octalLiteral
+ - paramTypeCombine # already handle by gofumpt.extra-rules
+ enabled-tags:
+ - diagnostic
+ - style
+ - performance
+ settings:
+ hugeParam:
+ sizeThreshold: 100
+ gocyclo:
+ min-complexity: 20
+ godox:
+ keywords:
+ - FIXME
+ govet:
+ disable:
+ - fieldalignment
+ enable-all: true
+ misspell:
+ locale: US
-linters-settings:
- govet:
- enable-all: true
- disable:
- - fieldalignment
- gocyclo:
- min-complexity: 20
- goconst:
- min-len: 5
- min-occurrences: 3
- misspell:
- locale: US
- funlen:
- lines: -1
- statements: 40
- godox:
- keywords:
- - FIXME
- gofumpt:
- extra-rules: true
- depguard:
- rules:
- main:
- deny:
- - pkg: "github.com/instana/testify"
- desc: not allowed
- - pkg: "github.com/pkg/errors"
- desc: Should be replaced by standard lib errors package
- gocritic:
- enabled-tags:
- - diagnostic
- - style
- - performance
- disabled-checks:
- - sloppyReassign
- - rangeValCopy
- - octalLiteral
- - paramTypeCombine # already handle by gofumpt.extra-rules
- settings:
- hugeParam:
- sizeThreshold: 100
+ exclusions:
+ warn-unused: true
+ presets:
+ - comments
issues:
- exclude-use-default: false
max-issues-per-linter: 0
max-same-issues: 0
- exclude:
- - 'package-comments: should have a package comment'
-
-run:
- timeout: 5m
diff --git a/hack/tools/vendor/github.com/ldez/tagliatelle/converter.go b/hack/tools/vendor/github.com/ldez/tagliatelle/converter.go
index 6005f5b755..97bcf369c3 100644
--- a/hack/tools/vendor/github.com/ldez/tagliatelle/converter.go
+++ b/hack/tools/vendor/github.com/ldez/tagliatelle/converter.go
@@ -2,6 +2,7 @@ package tagliatelle
import (
"fmt"
+ "maps"
"strings"
"github.com/ettle/strcase"
@@ -63,17 +64,19 @@ func toHeader(s string) string {
}
func ruleToConverter(rule ExtendedRule) (Converter, error) {
+ initialismOverrides := maps.Clone(rule.InitialismOverrides)
+
if rule.ExtraInitialisms {
for k, v := range staticcheckInitialisms {
- if _, found := rule.InitialismOverrides[k]; found {
+ if _, found := initialismOverrides[k]; found {
continue
}
- rule.InitialismOverrides[k] = v
+ initialismOverrides[k] = v
}
}
- caser := strcase.NewCaser(strings.HasPrefix(rule.Case, "go"), rule.InitialismOverrides, nil)
+ caser := strcase.NewCaser(strings.HasPrefix(rule.Case, "go"), initialismOverrides, nil)
switch strings.ToLower(strings.TrimPrefix(rule.Case, "go")) {
case "camel":
diff --git a/hack/tools/vendor/github.com/ldez/tagliatelle/readme.md b/hack/tools/vendor/github.com/ldez/tagliatelle/readme.md
index 52d10304b1..77dd416ca6 100644
--- a/hack/tools/vendor/github.com/ldez/tagliatelle/readme.md
+++ b/hack/tools/vendor/github.com/ldez/tagliatelle/readme.md
@@ -99,10 +99,10 @@ type Foo struct {
## What this linter is about
-This linter is about validating tags according to rules you define.
-The linter also allows to fix tags according to the rules you defined.
+This linter is about validating tags according to the rules you define.
+The linter also allows you to fix tags according to the rules you defined.
-This linter is not intended to validate the fact a tag in valid or not.
+This linter is not intended to validate the fact a tag is valid or not.
## How to use the linter
@@ -111,100 +111,103 @@ This linter is not intended to validate the fact a tag in valid or not.
Define the rules, you want via your [golangci-lint](https://golangci-lint.run) configuration file:
```yaml
-linters-settings:
- tagliatelle:
- # Checks the struct tag name case.
- case:
- # Defines the association between tag name and case.
- # Any struct tag name can be used.
- # Supported string cases:
- # - `camel`
- # - `pascal`
- # - `kebab`
- # - `snake`
- # - `upperSnake`
- # - `goCamel`
- # - `goPascal`
- # - `goKebab`
- # - `goSnake`
- # - `upper`
- # - `lower`
- # - `header`
- rules:
- json: camel
- yaml: camel
- xml: camel
- toml: camel
- bson: camel
- avro: snake
- mapstructure: kebab
- env: upperSnake
- envconfig: upperSnake
- whatever: snake
- # Defines the association between tag name and case.
- # Important: the `extended-rules` overrides `rules`.
- # Default: empty
- extended-rules:
- json:
- # Supported string cases:
- # - `camel`
- # - `pascal`
- # - `kebab`
- # - `snake`
- # - `upperSnake`
- # - `goCamel`
- # - `goPascal`
- # - `goKebab`
- # - `goSnake`
- # - `header`
- # - `lower`
- # - `header`
- #
- # Required
- case: camel
- # Adds 'AMQP', 'DB', 'GID', 'RTP', 'SIP', 'TS' to initialisms,
- # and removes 'LHS', 'RHS' from initialisms.
- # Default: false
- extra-initialisms: true
- # Defines initialism additions and overrides.
- # Default: empty
- initialism-overrides:
- DB: true # add a new initialism
- LHS: false # disable a default initialism.
- # ...
- # Uses the struct field name to check the name of the struct tag.
- # Default: false
- use-field-name: true
- # The field names to ignore.
- # Default: []
- ignored-fields:
- - Bar
- - Foo
- # Overrides the default/root configuration.
- # Default: []
- overrides:
- -
- # The package path (uses `/` only as a separator).
- # Required
- pkg: foo/bar
- # Default: empty or the same as the default/root configuration.
- rules:
- json: snake
- xml: pascal
- # Default: empty or the same as the default/root configuration.
- extended-rules:
- # same options as the base `extended-rules`.
- # Default: false (WARNING: it doesn't follow the default/root configuration)
- use-field-name: true
- # The field names to ignore.
- # Default: [] or the same as the default/root configuration.
- ignored-fields:
- - Bar
- - Foo
- # Ignore the package (takes precedence over all other configurations).
- # Default: false
- ignore: true
-
+linters:
+ enable:
+ - tagliatelle
+
+ settings:
+ tagliatelle:
+ # Checks the struct tag name case.
+ case:
+ # Defines the association between tag name and case.
+ # Any struct tag name can be used.
+ # Supported string cases:
+ # - `camel`
+ # - `pascal`
+ # - `kebab`
+ # - `snake`
+ # - `upperSnake`
+ # - `goCamel`
+ # - `goPascal`
+ # - `goKebab`
+ # - `goSnake`
+ # - `upper`
+ # - `lower`
+ # - `header`
+ rules:
+ json: camel
+ yaml: camel
+ xml: camel
+ toml: camel
+ bson: camel
+ avro: snake
+ mapstructure: kebab
+ env: upperSnake
+ envconfig: upperSnake
+ whatever: snake
+ # Defines the association between tag name and case.
+ # Important: the `extended-rules` overrides `rules`.
+ # Default: empty
+ extended-rules:
+ json:
+ # Supported string cases:
+ # - `camel`
+ # - `pascal`
+ # - `kebab`
+ # - `snake`
+ # - `upperSnake`
+ # - `goCamel`
+ # - `goPascal`
+ # - `goKebab`
+ # - `goSnake`
+ # - `header`
+ # - `lower`
+ # - `header`
+ #
+ # Required
+ case: camel
+ # Adds 'AMQP', 'DB', 'GID', 'RTP', 'SIP', 'TS' to initialisms,
+ # and removes 'LHS', 'RHS' from initialisms.
+ # Default: false
+ extra-initialisms: true
+ # Defines initialism additions and overrides.
+ # Default: empty
+ initialism-overrides:
+ DB: true # add a new initialism
+ LHS: false # disable a default initialism.
+ # ...
+ # Uses the struct field name to check the name of the struct tag.
+ # Default: false
+ use-field-name: true
+ # The field names to ignore.
+ # Default: []
+ ignored-fields:
+ - Bar
+ - Foo
+ # Overrides the default/root configuration.
+ # Default: []
+ overrides:
+ -
+ # The package path (uses `/` only as a separator).
+ # Required
+ pkg: foo/bar
+ # Default: empty or the same as the default/root configuration.
+ rules:
+ json: snake
+ xml: pascal
+ # Default: empty or the same as the default/root configuration.
+ extended-rules:
+ # same options as the base `extended-rules`.
+ # Default: false (WARNING: it doesn't follow the default/root configuration)
+ use-field-name: true
+ # The field names to ignore.
+ # Default: [] or the same as the default/root configuration.
+ ignored-fields:
+ - Bar
+ - Foo
+ # Ignore the package (takes precedence over all other configurations).
+ # Default: false
+ ignore: true
```
#### Examples
@@ -212,50 +215,53 @@ linters-settings:
Overrides case rules for the package `foo/bar`:
```yaml
-linters-settings:
- tagliatelle:
- case:
- rules:
- json: camel
- yaml: camel
- xml: camel
- overrides:
- - pkg: foo/bar
- rules:
- json: snake
- xml: pascal
+linters:
+ settings:
+ tagliatelle:
+ case:
+ rules:
+ json: camel
+ yaml: camel
+ xml: camel
+ overrides:
+ - pkg: foo/bar
+ rules:
+ json: snake
+ xml: pascal
```
Ignore fields inside the package `foo/bar`:
```yaml
-linters-settings:
- tagliatelle:
- case:
- rules:
- json: camel
- yaml: camel
- xml: camel
- overrides:
- - pkg: foo/bar
- ignored-fields:
- - Bar
- - Foo
+linters:
+ settings:
+ tagliatelle:
+ case:
+ rules:
+ json: camel
+ yaml: camel
+ xml: camel
+ overrides:
+ - pkg: foo/bar
+ ignored-fields:
+ - Bar
+ - Foo
```
Ignore the package `foo/bar`:
```yaml
-linters-settings:
- tagliatelle:
- case:
- rules:
- json: camel
- yaml: camel
- xml: camel
- overrides:
- - pkg: foo/bar
- ignore: true
+linters:
+ settings:
+ tagliatelle:
+ case:
+ rules:
+ json: camel
+ yaml: camel
+ xml: camel
+ overrides:
+ - pkg: foo/bar
+ ignore: true
```
More information here https://golangci-lint.run/usage/linters/#tagliatelle
@@ -272,7 +278,7 @@ then launch it manually.
## Rules
-Here are the default rules for the well known and used tags, when using tagliatelle as a binary or [golangci-lint linter](https://golangci-lint.run/usage/linters/#tagliatelle):
+Here are the default rules for the well-known and used tags, when using tagliatelle as a binary or [golangci-lint linter](https://golangci-lint.run/usage/linters/#tagliatelle):
- `json`: `camel`
- `yaml`: `camel`
@@ -292,19 +298,20 @@ You can add your own tag, for example `whatever` and tells the linter you want t
This option is only available via [golangci-lint](https://golangci-lint.run).
```yaml
-linters-settings:
- tagliatelle:
- # Check the struck tag name case.
- case:
- rules:
- # Any struct tag type can be used.
- # Support string case: `camel`, `pascal`, `kebab`, `snake`, `goCamel`, `goPascal`, `goKebab`, `goSnake`, `upper`, `lower`
- json: camel
- yaml: camel
- xml: camel
- toml: camel
- whatever: kebab
- # Use the struct field name to check the name of the struct tag.
- # Default: false
- use-field-name: true
+linters:
+ settings:
+ tagliatelle:
+ # Check the struck tag name case.
+ case:
+ rules:
+ # Any struct tag type can be used.
+ # Support string case: `camel`, `pascal`, `kebab`, `snake`, `goCamel`, `goPascal`, `goKebab`, `goSnake`, `upper`, `lower`
+ json: camel
+ yaml: camel
+ xml: camel
+ toml: camel
+ whatever: kebab
+ # Use the struct field name to check the name of the struct tag.
+ # Default: false
+ use-field-name: true
```
diff --git a/hack/tools/vendor/github.com/ldez/tagliatelle/tagliatelle.go b/hack/tools/vendor/github.com/ldez/tagliatelle/tagliatelle.go
index 99c7da2d04..ccd1b63e60 100644
--- a/hack/tools/vendor/github.com/ldez/tagliatelle/tagliatelle.go
+++ b/hack/tools/vendor/github.com/ldez/tagliatelle/tagliatelle.go
@@ -22,12 +22,14 @@ import (
// Config the tagliatelle configuration.
type Config struct {
Base
+
Overrides []Overrides
}
// Overrides applies configuration overrides by package.
type Overrides struct {
Base
+
Package string
}
@@ -74,6 +76,7 @@ func run(pass *analysis.Pass, config Config) (any, error) {
}
cfg := config.Base
+
if pass.Module != nil {
radixTree := createRadixTree(config, pass.Module.Path)
_, cfg, _ = radixTree.Root().LongestPrefix([]byte(pass.Pkg.Path()))
@@ -160,7 +163,7 @@ func report(pass *analysis.Pass, config Base, key, convName, fieldName string, n
// This is an exception because of a bug.
// https://github.com/ldez/tagliatelle/issues/8
// For now, tagliatelle should try to remain neutral in terms of format.
- if hasTagFlag(flags, "inline") {
+ if slices.Contains(flags, "inline") {
// skip for inline children (no name to lint)
return
}
@@ -187,6 +190,7 @@ func report(pass *analysis.Pass, config Base, key, convName, fieldName string, n
func getFieldName(field *ast.Field) (string, error) {
var name string
+
for _, n := range field.Names {
if n.Name != "" {
name = n.Name
@@ -231,16 +235,6 @@ func lookupTagValue(tag *ast.BasicLit, key string) (name string, flags []string,
return values[0], values[1:], true
}
-func hasTagFlag(flags []string, query string) bool {
- for _, flag := range flags {
- if flag == query {
- return true
- }
- }
-
- return false
-}
-
func createRadixTree(config Config, modPath string) *iradix.Tree[Base] {
r := iradix.New[Base]()
@@ -261,7 +255,7 @@ func createRadixTree(config Config, modPath string) *iradix.Tree[Base] {
Ignore: override.Ignore,
}
- // If there is an override the base configuration is ignored.
+ // If there is an override, the base configuration is ignored.
if len(override.IgnoredFields) == 0 {
c.IgnoredFields = append(c.IgnoredFields, config.IgnoredFields...)
} else {
diff --git a/hack/tools/vendor/github.com/manuelarte/embeddedstructfieldcheck/analyzer/analyzer.go b/hack/tools/vendor/github.com/manuelarte/embeddedstructfieldcheck/analyzer/analyzer.go
index d1b56c47eb..dc137d71e6 100644
--- a/hack/tools/vendor/github.com/manuelarte/embeddedstructfieldcheck/analyzer/analyzer.go
+++ b/hack/tools/vendor/github.com/manuelarte/embeddedstructfieldcheck/analyzer/analyzer.go
@@ -10,10 +10,16 @@ import (
"github.com/manuelarte/embeddedstructfieldcheck/internal"
)
-const ForbidMutexName = "forbid-mutex"
+const (
+ EmptyLineCheck = "empty-line"
+ ForbidMutexCheck = "forbid-mutex"
+)
func NewAnalyzer() *analysis.Analyzer {
- var forbidMutex bool
+ var (
+ emptyLine bool
+ forbidMutex bool
+ )
a := &analysis.Analyzer{
Name: "embeddedstructfieldcheck",
@@ -21,7 +27,7 @@ func NewAnalyzer() *analysis.Analyzer {
"and there must be an empty line separating embedded fields from regular fields.",
URL: "https://github.com/manuelarte/embeddedstructfieldcheck",
Run: func(pass *analysis.Pass) (any, error) {
- run(pass, forbidMutex)
+ run(pass, emptyLine, forbidMutex)
//nolint:nilnil // impossible case.
return nil, nil
@@ -29,12 +35,15 @@ func NewAnalyzer() *analysis.Analyzer {
Requires: []*analysis.Analyzer{inspect.Analyzer},
}
- a.Flags.BoolVar(&forbidMutex, ForbidMutexName, false, "Checks that sync.Mutex is not used as an embedded field.")
+ a.Flags.BoolVar(&emptyLine, EmptyLineCheck, true,
+ "Checks that there is an empty space between the embedded fields and regular fields.")
+ a.Flags.BoolVar(&forbidMutex, ForbidMutexCheck, false,
+ "Checks that sync.Mutex and sync.RWMutex are not used as an embedded fields.")
return a
}
-func run(pass *analysis.Pass, forbidMutex bool) {
+func run(pass *analysis.Pass, emptyLine, forbidMutex bool) {
insp, found := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
if !found {
return
@@ -50,6 +59,6 @@ func run(pass *analysis.Pass, forbidMutex bool) {
return
}
- internal.Analyze(pass, node, forbidMutex)
+ internal.Analyze(pass, node, emptyLine, forbidMutex)
})
}
diff --git a/hack/tools/vendor/github.com/manuelarte/embeddedstructfieldcheck/internal/structanalyzer.go b/hack/tools/vendor/github.com/manuelarte/embeddedstructfieldcheck/internal/structanalyzer.go
index 834da5de05..2df53692a4 100644
--- a/hack/tools/vendor/github.com/manuelarte/embeddedstructfieldcheck/internal/structanalyzer.go
+++ b/hack/tools/vendor/github.com/manuelarte/embeddedstructfieldcheck/internal/structanalyzer.go
@@ -6,7 +6,7 @@ import (
"golang.org/x/tools/go/analysis"
)
-func Analyze(pass *analysis.Pass, st *ast.StructType, forbidMutex bool) {
+func Analyze(pass *analysis.Pass, st *ast.StructType, emptyLine, forbidMutex bool) {
var firstEmbeddedField *ast.Field
var lastEmbeddedField *ast.Field
@@ -34,7 +34,9 @@ func Analyze(pass *analysis.Pass, st *ast.StructType, forbidMutex bool) {
}
}
- checkMissingSpace(pass, lastEmbeddedField, firstNotEmbeddedField)
+ if emptyLine {
+ checkMissingSpace(pass, lastEmbeddedField, firstNotEmbeddedField)
+ }
}
func checkForbiddenEmbeddedField(pass *analysis.Pass, field *ast.Field, forbidMutex bool) {
diff --git a/hack/tools/vendor/github.com/maratori/testableexamples/pkg/testableexamples/testableexamples.go b/hack/tools/vendor/github.com/maratori/testableexamples/pkg/testableexamples/testableexamples.go
index 26d22c703a..91a8509d2a 100644
--- a/hack/tools/vendor/github.com/maratori/testableexamples/pkg/testableexamples/testableexamples.go
+++ b/hack/tools/vendor/github.com/maratori/testableexamples/pkg/testableexamples/testableexamples.go
@@ -13,7 +13,7 @@ func NewAnalyzer() *analysis.Analyzer {
return &analysis.Analyzer{
Name: "testableexamples",
Doc: "linter checks if examples are testable (have an expected output)",
- Run: func(pass *analysis.Pass) (interface{}, error) {
+ Run: func(pass *analysis.Pass) (any, error) {
testFiles := make([]*ast.File, 0, len(pass.Files))
for _, file := range pass.Files {
fileName := pass.Fset.File(file.Pos()).Name()
diff --git a/hack/tools/vendor/github.com/maratori/testpackage/pkg/testpackage/testpackage.go b/hack/tools/vendor/github.com/maratori/testpackage/pkg/testpackage/testpackage.go
index 2e05729728..6eebabc2db 100644
--- a/hack/tools/vendor/github.com/maratori/testpackage/pkg/testpackage/testpackage.go
+++ b/hack/tools/vendor/github.com/maratori/testpackage/pkg/testpackage/testpackage.go
@@ -2,11 +2,11 @@ package testpackage
import (
"flag"
+ "go/ast"
"regexp"
+ "slices"
"strings"
- "go/ast"
-
"golang.org/x/tools/go/analysis"
)
@@ -25,10 +25,8 @@ const (
func processTestFile(pass *analysis.Pass, f *ast.File, allowedPackages []string) {
packageName := f.Name.Name
- for _, p := range allowedPackages {
- if p == packageName {
- return
- }
+ if slices.Contains(allowedPackages, packageName) {
+ return
}
if !strings.HasSuffix(packageName, "_test") {
@@ -51,7 +49,7 @@ func NewAnalyzer() *analysis.Analyzer {
Name: "testpackage",
Doc: "linter that makes you use a separate _test package",
Flags: fs,
- Run: func(pass *analysis.Pass) (interface{}, error) {
+ Run: func(pass *analysis.Pass) (any, error) {
allowedPackages := strings.Split(allowPackagesStr, ",")
skipFile, err := regexp.Compile(skipFileRegexp)
if err != nil {
diff --git a/hack/tools/vendor/github.com/mattn/go-runewidth/benchstat.txt b/hack/tools/vendor/github.com/mattn/go-runewidth/benchstat.txt
new file mode 100644
index 0000000000..a9efdbde37
--- /dev/null
+++ b/hack/tools/vendor/github.com/mattn/go-runewidth/benchstat.txt
@@ -0,0 +1,43 @@
+goos: darwin
+goarch: arm64
+pkg: github.com/mattn/go-runewidth
+cpu: Apple M2
+ │ old.txt │ new.txt │
+ │ sec/op │ sec/op vs base │
+String1WidthAll/regular-8 108.92m ± 0% 35.09m ± 3% -67.78% (p=0.002 n=6)
+String1WidthAll/lut-8 93.97m ± 0% 18.70m ± 0% -80.10% (p=0.002 n=6)
+String1Width768/regular-8 60.62µ ± 1% 11.54µ ± 0% -80.97% (p=0.002 n=6)
+String1Width768/lut-8 60.66µ ± 1% 11.43µ ± 0% -81.16% (p=0.002 n=6)
+String1WidthAllEastAsian/regular-8 115.13m ± 1% 40.79m ± 8% -64.57% (p=0.002 n=6)
+String1WidthAllEastAsian/lut-8 93.65m ± 0% 18.70m ± 2% -80.03% (p=0.002 n=6)
+String1Width768EastAsian/regular-8 75.32µ ± 0% 23.49µ ± 0% -68.82% (p=0.002 n=6)
+String1Width768EastAsian/lut-8 60.76µ ± 0% 11.50µ ± 0% -81.07% (p=0.002 n=6)
+geomean 2.562m 604.5µ -76.41%
+
+ │ old.txt │ new.txt │
+ │ B/op │ B/op vs base │
+String1WidthAll/regular-8 106.3Mi ± 0% 0.0Mi ± 0% -100.00% (p=0.002 n=6)
+String1WidthAll/lut-8 106.3Mi ± 0% 0.0Mi ± 0% -100.00% (p=0.002 n=6)
+String1Width768/regular-8 75.00Ki ± 0% 0.00Ki ± 0% -100.00% (p=0.002 n=6)
+String1Width768/lut-8 75.00Ki ± 0% 0.00Ki ± 0% -100.00% (p=0.002 n=6)
+String1WidthAllEastAsian/regular-8 106.3Mi ± 0% 0.0Mi ± 0% -100.00% (p=0.002 n=6)
+String1WidthAllEastAsian/lut-8 106.3Mi ± 0% 0.0Mi ± 0% -100.00% (p=0.002 n=6)
+String1Width768EastAsian/regular-8 75.00Ki ± 0% 0.00Ki ± 0% -100.00% (p=0.002 n=6)
+String1Width768EastAsian/lut-8 75.00Ki ± 0% 0.00Ki ± 0% -100.00% (p=0.002 n=6)
+geomean 2.790Mi ? ¹ ²
+¹ summaries must be >0 to compute geomean
+² ratios must be >0 to compute geomean
+
+ │ old.txt │ new.txt │
+ │ allocs/op │ allocs/op vs base │
+String1WidthAll/regular-8 3.342M ± 0% 0.000M ± 0% -100.00% (p=0.002 n=6)
+String1WidthAll/lut-8 3.342M ± 0% 0.000M ± 0% -100.00% (p=0.002 n=6)
+String1Width768/regular-8 2.304k ± 0% 0.000k ± 0% -100.00% (p=0.002 n=6)
+String1Width768/lut-8 2.304k ± 0% 0.000k ± 0% -100.00% (p=0.002 n=6)
+String1WidthAllEastAsian/regular-8 3.342M ± 0% 0.000M ± 0% -100.00% (p=0.002 n=6)
+String1WidthAllEastAsian/lut-8 3.342M ± 0% 0.000M ± 0% -100.00% (p=0.002 n=6)
+String1Width768EastAsian/regular-8 2.304k ± 0% 0.000k ± 0% -100.00% (p=0.002 n=6)
+String1Width768EastAsian/lut-8 2.304k ± 0% 0.000k ± 0% -100.00% (p=0.002 n=6)
+geomean 87.75k ? ¹ ²
+¹ summaries must be >0 to compute geomean
+² ratios must be >0 to compute geomean
diff --git a/hack/tools/vendor/github.com/mattn/go-runewidth/new.txt b/hack/tools/vendor/github.com/mattn/go-runewidth/new.txt
new file mode 100644
index 0000000000..8890712562
--- /dev/null
+++ b/hack/tools/vendor/github.com/mattn/go-runewidth/new.txt
@@ -0,0 +1,54 @@
+goos: darwin
+goarch: arm64
+pkg: github.com/mattn/go-runewidth
+cpu: Apple M2
+BenchmarkString1WidthAll/regular-8 33 35033923 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/regular-8 33 34965112 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/regular-8 33 36307234 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/regular-8 33 35007705 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/regular-8 33 35154182 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/regular-8 34 35155400 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/lut-8 63 18688500 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/lut-8 63 18712474 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/lut-8 63 18700211 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/lut-8 62 18694179 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/lut-8 62 18708392 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAll/lut-8 63 18770608 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/regular-8 104137 11526 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/regular-8 103986 11540 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/regular-8 104079 11552 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/regular-8 103963 11530 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/regular-8 103714 11538 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/regular-8 104181 11537 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/lut-8 105150 11420 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/lut-8 104778 11423 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/lut-8 105069 11422 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/lut-8 105127 11475 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/lut-8 104742 11433 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768/lut-8 105163 11432 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 28 40723347 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 28 40790299 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 28 40801338 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 28 40798216 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 28 44135253 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 28 40779546 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 62 18694165 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 62 18685047 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 62 18689273 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 62 19150346 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 63 19126154 ns/op 0 B/op 0 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 62 18712619 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 50775 23595 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 51061 23563 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 51057 23492 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 51138 23445 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 51195 23469 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 51087 23482 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 104559 11549 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 104508 11483 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 104296 11503 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 104606 11485 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 104588 11495 ns/op 0 B/op 0 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 104602 11518 ns/op 0 B/op 0 allocs/op
+PASS
+ok github.com/mattn/go-runewidth 64.455s
diff --git a/hack/tools/vendor/github.com/mattn/go-runewidth/old.txt b/hack/tools/vendor/github.com/mattn/go-runewidth/old.txt
new file mode 100644
index 0000000000..5b9ac16468
--- /dev/null
+++ b/hack/tools/vendor/github.com/mattn/go-runewidth/old.txt
@@ -0,0 +1,54 @@
+goos: darwin
+goarch: arm64
+pkg: github.com/mattn/go-runewidth
+cpu: Apple M2
+BenchmarkString1WidthAll/regular-8 10 108559258 ns/op 111412145 B/op 3342342 allocs/op
+BenchmarkString1WidthAll/regular-8 10 108968079 ns/op 111412364 B/op 3342343 allocs/op
+BenchmarkString1WidthAll/regular-8 10 108890338 ns/op 111412388 B/op 3342344 allocs/op
+BenchmarkString1WidthAll/regular-8 10 108940704 ns/op 111412584 B/op 3342346 allocs/op
+BenchmarkString1WidthAll/regular-8 10 108632796 ns/op 111412348 B/op 3342343 allocs/op
+BenchmarkString1WidthAll/regular-8 10 109354546 ns/op 111412777 B/op 3342343 allocs/op
+BenchmarkString1WidthAll/lut-8 12 93844406 ns/op 111412569 B/op 3342345 allocs/op
+BenchmarkString1WidthAll/lut-8 12 93991080 ns/op 111412512 B/op 3342344 allocs/op
+BenchmarkString1WidthAll/lut-8 12 93980632 ns/op 111412413 B/op 3342343 allocs/op
+BenchmarkString1WidthAll/lut-8 12 94004083 ns/op 111412396 B/op 3342343 allocs/op
+BenchmarkString1WidthAll/lut-8 12 93959795 ns/op 111412445 B/op 3342343 allocs/op
+BenchmarkString1WidthAll/lut-8 12 93846198 ns/op 111412556 B/op 3342345 allocs/op
+BenchmarkString1Width768/regular-8 19785 60696 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768/regular-8 19824 60520 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768/regular-8 19832 60547 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768/regular-8 19778 60543 ns/op 76800 B/op 2304 allocs/op
+BenchmarkString1Width768/regular-8 19842 61142 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768/regular-8 19780 60696 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768/lut-8 19598 61161 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768/lut-8 19731 60707 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768/lut-8 19738 60626 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768/lut-8 19764 60670 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768/lut-8 19797 60642 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768/lut-8 19738 60608 ns/op 76800 B/op 2304 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 9 115080431 ns/op 111412458 B/op 3342345 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 9 114908880 ns/op 111412476 B/op 3342345 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 9 115077134 ns/op 111412540 B/op 3342345 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 9 115175292 ns/op 111412467 B/op 3342345 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 9 115792653 ns/op 111412362 B/op 3342344 allocs/op
+BenchmarkString1WidthAllEastAsian/regular-8 9 115255417 ns/op 111412572 B/op 3342346 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 12 93761542 ns/op 111412538 B/op 3342345 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 12 94089990 ns/op 111412440 B/op 3342343 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 12 93721410 ns/op 111412514 B/op 3342344 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 12 93572951 ns/op 111412329 B/op 3342342 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 12 93536052 ns/op 111412206 B/op 3342341 allocs/op
+BenchmarkString1WidthAllEastAsian/lut-8 12 93532365 ns/op 111412412 B/op 3342343 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 15904 75401 ns/op 76800 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 15932 75449 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 15944 75181 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 15963 75311 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 15879 75292 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/regular-8 15955 75334 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 19692 60692 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 19712 60699 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 19741 60819 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 19771 60653 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 19737 61027 ns/op 76801 B/op 2304 allocs/op
+BenchmarkString1Width768EastAsian/lut-8 19657 60820 ns/op 76801 B/op 2304 allocs/op
+PASS
+ok github.com/mattn/go-runewidth 76.165s
diff --git a/hack/tools/vendor/github.com/mattn/go-runewidth/runewidth.go b/hack/tools/vendor/github.com/mattn/go-runewidth/runewidth.go
index 7dfbb3be91..0edabac394 100644
--- a/hack/tools/vendor/github.com/mattn/go-runewidth/runewidth.go
+++ b/hack/tools/vendor/github.com/mattn/go-runewidth/runewidth.go
@@ -4,7 +4,7 @@ import (
"os"
"strings"
- "github.com/rivo/uniseg"
+ "github.com/clipperhouse/uax29/v2/graphemes"
)
//go:generate go run script/generate.go
@@ -64,6 +64,9 @@ func inTable(r rune, t table) bool {
if r < t[0].first {
return false
}
+ if r > t[len(t)-1].last {
+ return false
+ }
bot := 0
top := len(t) - 1
@@ -175,10 +178,10 @@ func (c *Condition) CreateLUT() {
// StringWidth return width as you can see
func (c *Condition) StringWidth(s string) (width int) {
- g := uniseg.NewGraphemes(s)
+ g := graphemes.FromString(s)
for g.Next() {
var chWidth int
- for _, r := range g.Runes() {
+ for _, r := range g.Value() {
chWidth = c.RuneWidth(r)
if chWidth > 0 {
break // Our best guess at this point is to use the width of the first non-zero-width rune.
@@ -197,17 +200,17 @@ func (c *Condition) Truncate(s string, w int, tail string) string {
w -= c.StringWidth(tail)
var width int
pos := len(s)
- g := uniseg.NewGraphemes(s)
+ g := graphemes.FromString(s)
for g.Next() {
var chWidth int
- for _, r := range g.Runes() {
+ for _, r := range g.Value() {
chWidth = c.RuneWidth(r)
if chWidth > 0 {
break // See StringWidth() for details.
}
}
if width+chWidth > w {
- pos, _ = g.Positions()
+ pos = g.Start()
break
}
width += chWidth
@@ -224,10 +227,10 @@ func (c *Condition) TruncateLeft(s string, w int, prefix string) string {
var width int
pos := len(s)
- g := uniseg.NewGraphemes(s)
+ g := graphemes.FromString(s)
for g.Next() {
var chWidth int
- for _, r := range g.Runes() {
+ for _, r := range g.Value() {
chWidth = c.RuneWidth(r)
if chWidth > 0 {
break // See StringWidth() for details.
@@ -236,10 +239,10 @@ func (c *Condition) TruncateLeft(s string, w int, prefix string) string {
if width+chWidth > w {
if width < w {
- _, pos = g.Positions()
+ pos = g.End()
prefix += strings.Repeat(" ", width+chWidth-w)
} else {
- pos, _ = g.Positions()
+ pos = g.Start()
}
break
diff --git a/hack/tools/vendor/github.com/mattn/go-runewidth/runewidth_windows.go b/hack/tools/vendor/github.com/mattn/go-runewidth/runewidth_windows.go
index 5f987a310f..951500a24d 100644
--- a/hack/tools/vendor/github.com/mattn/go-runewidth/runewidth_windows.go
+++ b/hack/tools/vendor/github.com/mattn/go-runewidth/runewidth_windows.go
@@ -4,6 +4,7 @@
package runewidth
import (
+ "os"
"syscall"
)
@@ -14,6 +15,11 @@ var (
// IsEastAsian return true if the current locale is CJK
func IsEastAsian() bool {
+ if os.Getenv("WT_SESSION") != "" {
+ // Windows Terminal always not use East Asian Ambiguous Width(s).
+ return false
+ }
+
r1, _, _ := procGetConsoleOutputCP.Call()
if r1 == 0 {
return false
diff --git a/hack/tools/vendor/github.com/mgechev/revive/config/config.go b/hack/tools/vendor/github.com/mgechev/revive/config/config.go
index cc86766d84..2246444795 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/config/config.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/config/config.go
@@ -105,6 +105,17 @@ var allRules = append([]lint.Rule{
&rule.UnnecessaryFormatRule{},
&rule.UseFmtPrintRule{},
&rule.EnforceSwitchStyleRule{},
+ &rule.IdenticalSwitchConditionsRule{},
+ &rule.IdenticalIfElseIfConditionsRule{},
+ &rule.IdenticalIfElseIfBranchesRule{},
+ &rule.IdenticalSwitchBranchesRule{},
+ &rule.UselessFallthroughRule{},
+ &rule.PackageDirectoryMismatchRule{},
+ &rule.UseWaitGroupGoRule{},
+ &rule.UnsecureURLSchemeRule{},
+ &rule.InefficientMapLookupRule{},
+ &rule.ForbiddenCallInWgGoRule{},
+ &rule.UnnecessaryIfRule{},
}, defaultRules...)
// allFormatters is a list of all available formatters to output the linting results.
@@ -199,19 +210,22 @@ func normalizeConfig(config *lint.Config) {
if len(config.Rules) == 0 {
config.Rules = map[string]lint.RuleConfig{}
}
- if config.EnableAllRules {
- // Add to the configuration all rules not yet present in it
- for _, r := range allRules {
+
+ addRules := func(config *lint.Config, rules []lint.Rule) {
+ for _, r := range rules {
ruleName := r.Name()
- _, alreadyInConf := config.Rules[ruleName]
- if alreadyInConf {
- continue
+ if _, ok := config.Rules[ruleName]; !ok {
+ config.Rules[ruleName] = lint.RuleConfig{}
}
- // Add the rule with an empty conf for
- config.Rules[ruleName] = lint.RuleConfig{}
}
}
+ if config.EnableAllRules {
+ addRules(config, allRules)
+ } else if config.EnableDefaultRules {
+ addRules(config, defaultRules)
+ }
+
severity := config.Severity
if severity != "" {
for k, v := range config.Rules {
diff --git a/hack/tools/vendor/github.com/mgechev/revive/formatter/default.go b/hack/tools/vendor/github.com/mgechev/revive/formatter/default.go
index 79f04c4056..ffb9d5f3f3 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/formatter/default.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/formatter/default.go
@@ -21,8 +21,10 @@ func (*Default) Name() string {
// Format formats the failures gotten from the lint.
func (*Default) Format(failures <-chan lint.Failure, _ lint.Config) (string, error) {
var buf bytes.Buffer
+ prefix := ""
for failure := range failures {
- fmt.Fprintf(&buf, "%v: %s\n", failure.Position.Start, failure.Failure)
+ fmt.Fprintf(&buf, "%s%v: %s", prefix, failure.Position.Start, failure.Failure)
+ prefix = "\n"
}
return buf.String(), nil
}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/formatter/friendly.go b/hack/tools/vendor/github.com/mgechev/revive/formatter/friendly.go
index 5b626e13ba..de24df887d 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/formatter/friendly.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/formatter/friendly.go
@@ -10,6 +10,7 @@ import (
"text/tabwriter"
"github.com/fatih/color"
+
"github.com/mgechev/revive/lint"
)
diff --git a/hack/tools/vendor/github.com/mgechev/revive/formatter/json.go b/hack/tools/vendor/github.com/mgechev/revive/formatter/json.go
index c7144e146b..292c06b36d 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/formatter/json.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/formatter/json.go
@@ -19,7 +19,7 @@ func (*JSON) Name() string {
// jsonObject defines a JSON object of an failure.
type jsonObject struct {
- Severity lint.Severity
+ Severity lint.Severity `json:"Severity"`
lint.Failure `json:",inline"`
}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/formatter/sarif.go b/hack/tools/vendor/github.com/mgechev/revive/formatter/sarif.go
index 158d2c5685..c177649026 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/formatter/sarif.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/formatter/sarif.go
@@ -6,6 +6,7 @@ import (
"strings"
"codeberg.org/chavacava/garif"
+
"github.com/mgechev/revive/lint"
)
diff --git a/hack/tools/vendor/github.com/mgechev/revive/formatter/stylish.go b/hack/tools/vendor/github.com/mgechev/revive/formatter/stylish.go
index f1472cc9a6..8185e8b8a5 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/formatter/stylish.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/formatter/stylish.go
@@ -4,6 +4,7 @@ import (
"fmt"
"github.com/fatih/color"
+
"github.com/mgechev/revive/lint"
)
diff --git a/hack/tools/vendor/github.com/mgechev/revive/internal/astutils/ast_utils.go b/hack/tools/vendor/github.com/mgechev/revive/internal/astutils/ast_utils.go
index 1f51d6460b..fca3ee5a90 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/internal/astutils/ast_utils.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/internal/astutils/ast_utils.go
@@ -3,6 +3,8 @@ package astutils
import (
"bytes"
+ "crypto/md5"
+ "encoding/hex"
"fmt"
"go/ast"
"go/printer"
@@ -150,6 +152,49 @@ func (p picker) Visit(node ast.Node) ast.Visitor {
return p
}
+// SeekNode yields the first node selected by the given selector function in the AST subtree with root n.
+// The function returns nil if no matching node is found in the subtree.
+func SeekNode[T ast.Node](n ast.Node, selector func(n ast.Node) bool) T {
+ var result T
+
+ if n == nil {
+ return result
+ }
+
+ if selector == nil {
+ return result
+ }
+
+ onSelect := func(n ast.Node) {
+ result, _ = n.(T)
+ }
+
+ p := &seeker{selector: selector, onSelect: onSelect, found: false}
+ ast.Walk(p, n)
+
+ return result
+}
+
+type seeker struct {
+ selector func(n ast.Node) bool
+ onSelect func(n ast.Node)
+ found bool
+}
+
+func (s *seeker) Visit(node ast.Node) ast.Visitor {
+ if s.found {
+ return nil // stop visiting subtree
+ }
+
+ if s.selector(node) {
+ s.onSelect(node)
+ s.found = true
+ return nil // skip visiting node children
+ }
+
+ return s
+}
+
var gofmtConfig = &printer.Config{Tabwidth: 8}
// GoFmt returns a string representation of an AST subtree.
@@ -159,3 +204,13 @@ func GoFmt(x any) string {
gofmtConfig.Fprint(&buf, fs, x)
return buf.String()
}
+
+// NodeHash yields the MD5 hash of the given AST node.
+func NodeHash(node ast.Node) string {
+ hasher := func(in string) string {
+ binHash := md5.Sum([]byte(in))
+ return hex.EncodeToString(binHash[:])
+ }
+ str := GoFmt(node)
+ return hasher(str)
+}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/internal/ifelse/branch_kind.go b/hack/tools/vendor/github.com/mgechev/revive/internal/ifelse/branch_kind.go
index 27c7fda963..3f6c769961 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/internal/ifelse/branch_kind.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/internal/ifelse/branch_kind.go
@@ -54,9 +54,7 @@ func (k BranchKind) Branch() Branch { return Branch{BranchKind: k} }
// String returns a brief string representation.
func (k BranchKind) String() string {
switch k {
- case Empty:
- return ""
- case Regular:
+ case Empty, Regular:
return ""
case Return:
return "return"
diff --git a/hack/tools/vendor/github.com/mgechev/revive/lint/config.go b/hack/tools/vendor/github.com/mgechev/revive/lint/config.go
index a305a74fa8..3047fd29de 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/lint/config.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/lint/config.go
@@ -56,10 +56,11 @@ type DirectivesConfig = map[string]DirectiveConfig
// Config defines the config of the linter.
type Config struct {
- IgnoreGeneratedHeader bool `toml:"ignoreGeneratedHeader"`
- Confidence float64
- Severity Severity
+ IgnoreGeneratedHeader bool `toml:"ignoreGeneratedHeader"`
+ Confidence float64 `toml:"confidence"`
+ Severity Severity `toml:"severity"`
EnableAllRules bool `toml:"enableAllRules"`
+ EnableDefaultRules bool `toml:"enableDefaultRules"`
Rules RulesConfig `toml:"rule"`
ErrorCode int `toml:"errorCode"`
WarningCode int `toml:"warningCode"`
@@ -67,5 +68,5 @@ type Config struct {
Exclude []string `toml:"exclude"`
// If set, overrides the go language version specified in go.mod of
// packages being linted, and assumes this specific language version.
- GoVersion *goversion.Version
+ GoVersion *goversion.Version `toml:"goVersion"`
}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/lint/failure.go b/hack/tools/vendor/github.com/mgechev/revive/lint/failure.go
index 9ad17c3e04..c25df4836b 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/lint/failure.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/lint/failure.go
@@ -11,6 +11,8 @@ const (
// FailureCategoryBadPractice indicates bad practice issues.
FailureCategoryBadPractice FailureCategory = "bad practice"
// FailureCategoryCodeStyle indicates code style issues.
+ //
+ // Deprecated: use FailureCategoryStyle instead.
FailureCategoryCodeStyle FailureCategory = "code-style"
// FailureCategoryComments indicates comment issues.
FailureCategoryComments FailureCategory = "comments"
@@ -64,20 +66,20 @@ type Severity string
// FailurePosition returns the failure position.
type FailurePosition struct {
- Start token.Position
- End token.Position
+ Start token.Position `json:"Start"`
+ End token.Position `json:"End"`
}
// Failure defines a struct for a linting failure.
type Failure struct {
- Failure string
- RuleName string
- Category FailureCategory
- Position FailurePosition
- Node ast.Node `json:"-"`
- Confidence float64
+ Failure string `json:"Failure"`
+ RuleName string `json:"RuleName"`
+ Category FailureCategory `json:"Category"`
+ Position FailurePosition `json:"Position"`
+ Node ast.Node `json:"-"`
+ Confidence float64 `json:"Confidence"`
// For future use
- ReplacementLine string
+ ReplacementLine string `json:"ReplacementLine"`
}
// GetFilename returns the filename.
diff --git a/hack/tools/vendor/github.com/mgechev/revive/lint/package.go b/hack/tools/vendor/github.com/mgechev/revive/lint/package.go
index 34bd5d2bcc..cb78cb452d 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/lint/package.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/lint/package.go
@@ -42,6 +42,8 @@ var (
Go122 = goversion.Must(goversion.NewVersion("1.22"))
// Go124 is a constant representing the Go version 1.24.
Go124 = goversion.Must(goversion.NewVersion("1.24"))
+ // Go125 is a constant representing the Go version 1.25.
+ Go125 = goversion.Must(goversion.NewVersion("1.25"))
)
// Files return package's files.
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/cognitive_complexity.go b/hack/tools/vendor/github.com/mgechev/revive/rule/cognitive_complexity.go
index 53aeae1957..901fc60bef 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/cognitive_complexity.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/cognitive_complexity.go
@@ -5,8 +5,9 @@ import (
"go/ast"
"go/token"
- "github.com/mgechev/revive/lint"
"golang.org/x/tools/go/ast/astutil"
+
+ "github.com/mgechev/revive/lint"
)
// CognitiveComplexityRule sets restriction for maximum cognitive complexity.
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/confusing_naming.go b/hack/tools/vendor/github.com/mgechev/revive/rule/confusing_naming.go
index 774eb04ee1..83f53a5965 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/confusing_naming.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/confusing_naming.go
@@ -167,6 +167,11 @@ func checkStructFields(fields *ast.FieldList, structName string, w *lintConfusin
bl := make(map[string]bool, len(fields.List))
for _, f := range fields.List {
for _, id := range f.Names {
+ // Skip blank identifiers
+ if id.Name == "_" {
+ continue
+ }
+
normName := strings.ToUpper(id.Name)
if bl[normName] {
w.onFailure(lint.Failure{
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/datarace.go b/hack/tools/vendor/github.com/mgechev/revive/rule/datarace.go
index 54c77ff694..de63c068de 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/datarace.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/datarace.go
@@ -8,6 +8,9 @@ import (
"github.com/mgechev/revive/lint"
)
+//nolint:staticcheck // TODO: ast.Object is deprecated
+type nodeUID *ast.Object // type of the unique id for AST nodes
+
// DataRaceRule lints assignments to value method-receivers.
type DataRaceRule struct{}
@@ -23,8 +26,7 @@ func (r *DataRaceRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure {
funcResults := funcDecl.Type.Results
- //nolint:staticcheck // TODO: ast.Object is deprecated
- returnIDs := map[*ast.Object]struct{}{}
+ returnIDs := map[nodeUID]struct{}{}
if funcResults != nil {
returnIDs = r.extractReturnIDs(funcResults.List)
}
@@ -36,7 +38,7 @@ func (r *DataRaceRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure {
fl := &lintFunctionForDataRaces{
onFailure: onFailure,
returnIDs: returnIDs,
- rangeIDs: map[*ast.Object]struct{}{}, //nolint:staticcheck // TODO: ast.Object is deprecated
+ rangeIDs: map[nodeUID]struct{}{},
go122for: isGo122,
}
@@ -51,9 +53,8 @@ func (*DataRaceRule) Name() string {
return "datarace"
}
-//nolint:staticcheck // TODO: ast.Object is deprecated
-func (*DataRaceRule) extractReturnIDs(fields []*ast.Field) map[*ast.Object]struct{} {
- r := map[*ast.Object]struct{}{}
+func (*DataRaceRule) extractReturnIDs(fields []*ast.Field) map[nodeUID]struct{} {
+ r := map[nodeUID]struct{}{}
for _, f := range fields {
for _, id := range f.Names {
r[id.Obj] = struct{}{}
@@ -66,8 +67,8 @@ func (*DataRaceRule) extractReturnIDs(fields []*ast.Field) map[*ast.Object]struc
type lintFunctionForDataRaces struct {
_ struct{}
onFailure func(failure lint.Failure)
- returnIDs map[*ast.Object]struct{} //nolint:staticcheck // TODO: ast.Object is deprecated
- rangeIDs map[*ast.Object]struct{} //nolint:staticcheck // TODO: ast.Object is deprecated
+ returnIDs map[nodeUID]struct{}
+ rangeIDs map[nodeUID]struct{}
go122for bool
}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/deep_exit.go b/hack/tools/vendor/github.com/mgechev/revive/rule/deep_exit.go
index 6f7acd305f..ed3e34b53a 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/deep_exit.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/deep_exit.go
@@ -7,6 +7,7 @@ import (
"unicode"
"unicode/utf8"
+ "github.com/mgechev/revive/internal/astutils"
"github.com/mgechev/revive/lint"
)
@@ -64,12 +65,18 @@ func (w *lintDeepExit) Visit(node ast.Node) ast.Visitor {
pkg := id.Name
fn := fc.Sel.Name
- if isCallToExitFunction(pkg, fn) {
+ if isCallToExitFunction(pkg, fn, ce.Args) {
+ msg := fmt.Sprintf("calls to %s.%s only in main() or init() functions", pkg, fn)
+
+ if pkg == "flag" && fn == "NewFlagSet" &&
+ len(ce.Args) == 2 && astutils.IsPkgDotName(ce.Args[1], "flag", "ExitOnError") {
+ msg = "calls to flag.NewFlagSet with flag.ExitOnError only in main() or init() functions"
+ }
w.onFailure(lint.Failure{
Confidence: 1,
Node: ce,
Category: lint.FailureCategoryBadPractice,
- Failure: fmt.Sprintf("calls to %s.%s only in main() or init() functions", pkg, fn),
+ Failure: msg,
})
}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/defer.go b/hack/tools/vendor/github.com/mgechev/revive/rule/defer.go
index 9cab004aee..a85336846c 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/defer.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/defer.go
@@ -87,7 +87,7 @@ type lintDeferRule struct {
onFailure func(lint.Failure)
inALoop bool
inADefer bool
- inAFuncLit bool
+ inAFuncLit byte // 0 = not in func lit, 1 = in top-level func lit, >1 = nested func lit
allow map[string]bool
}
@@ -100,10 +100,10 @@ func (w lintDeferRule) Visit(node ast.Node) ast.Visitor {
w.visitSubtree(n.Body, w.inADefer, true, w.inAFuncLit)
return nil
case *ast.FuncLit:
- w.visitSubtree(n.Body, w.inADefer, false, true)
+ w.visitSubtree(n.Body, w.inADefer, false, w.inAFuncLit+1)
return nil
case *ast.ReturnStmt:
- if len(n.Results) != 0 && w.inADefer && w.inAFuncLit {
+ if len(n.Results) != 0 && w.inADefer && w.inAFuncLit == 1 {
w.newFailure("return in a defer function has no effect", n, 1.0, lint.FailureCategoryLogic, deferOptionReturn)
}
case *ast.CallExpr:
@@ -114,7 +114,7 @@ func (w lintDeferRule) Visit(node ast.Node) ast.Visitor {
//
// confidence is not 1 because recover can be in a function that is deferred elsewhere
w.newFailure("recover must be called inside a deferred function", n, 0.8, lint.FailureCategoryLogic, deferOptionRecover)
- case w.inADefer && !w.inAFuncLit && isCallToRecover:
+ case w.inADefer && w.inAFuncLit == 0 && isCallToRecover:
// defer helper(recover())
//
// confidence is not truly 1 because this could be in a correctly-deferred func,
@@ -130,13 +130,13 @@ func (w lintDeferRule) Visit(node ast.Node) ast.Visitor {
// but normally this doesn't suppress a panic, and even if it did it would silently discard the value.
w.newFailure("recover must be called inside a deferred function, this is executing recover immediately", n, 1, lint.FailureCategoryLogic, deferOptionImmediateRecover)
}
- w.visitSubtree(n.Call.Fun, true, false, false)
+ w.visitSubtree(n.Call.Fun, true, false, 0)
for _, a := range n.Call.Args {
switch a.(type) {
case *ast.FuncLit:
continue // too hard to analyze deferred calls with func literals args
default:
- w.visitSubtree(a, true, false, false) // check arguments, they should not contain recover()
+ w.visitSubtree(a, true, false, 0) // check arguments, they should not contain recover()
}
}
@@ -162,7 +162,7 @@ func (w lintDeferRule) Visit(node ast.Node) ast.Visitor {
return w
}
-func (w lintDeferRule) visitSubtree(n ast.Node, inADefer, inALoop, inAFuncLit bool) {
+func (w lintDeferRule) visitSubtree(n ast.Node, inADefer, inALoop bool, inAFuncLit byte) {
nw := lintDeferRule{
onFailure: w.onFailure,
inADefer: inADefer,
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/enforce_switch_style.go b/hack/tools/vendor/github.com/mgechev/revive/rule/enforce_switch_style.go
index 3c5901e5e6..96093d6203 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/enforce_switch_style.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/enforce_switch_style.go
@@ -3,6 +3,7 @@ package rule
import (
"fmt"
"go/ast"
+ "go/token"
"github.com/mgechev/revive/lint"
)
@@ -58,12 +59,14 @@ func (r *EnforceSwitchStyleRule) Apply(file *lint.File, _ lint.Arguments) []lint
if !hasDefault && !r.allowNoDefault {
// switch without default
- failures = append(failures, lint.Failure{
- Confidence: 1,
- Node: switchNode,
- Category: lint.FailureCategoryStyle,
- Failure: "switch must have a default case clause",
- })
+ if !r.allBranchesEndWithJumpStmt(switchNode) {
+ failures = append(failures, lint.Failure{
+ Confidence: 1,
+ Node: switchNode,
+ Category: lint.FailureCategoryStyle,
+ Failure: "switch must have a default case clause",
+ })
+ }
return true
}
@@ -100,6 +103,31 @@ func (*EnforceSwitchStyleRule) seekDefaultCase(body *ast.BlockStmt) (defaultClau
return defaultClause, defaultClause == last
}
+func (*EnforceSwitchStyleRule) allBranchesEndWithJumpStmt(switchStmt *ast.SwitchStmt) bool {
+ for _, stmt := range switchStmt.Body.List {
+ caseClause := stmt.(*ast.CaseClause) // safe to assume stmt is a case clause
+
+ caseBody := caseClause.Body
+ if caseBody == nil {
+ return false
+ }
+
+ lastStmt := caseBody[len(caseBody)-1]
+
+ if _, ok := lastStmt.(*ast.ReturnStmt); ok {
+ continue
+ }
+
+ if jump, ok := lastStmt.(*ast.BranchStmt); ok && jump.Tok == token.BREAK {
+ continue
+ }
+
+ return false
+ }
+
+ return true
+}
+
// Name returns the rule name.
func (*EnforceSwitchStyleRule) Name() string {
return "enforce-switch-style"
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/exported.go b/hack/tools/vendor/github.com/mgechev/revive/rule/exported.go
index 1ec40769ee..eb351cf4d3 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/exported.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/exported.go
@@ -165,21 +165,36 @@ func (w *lintExported) lintFuncDoc(fn *ast.FuncDecl) {
return
}
- firstCommentLine := firstCommentLine(fn.Doc)
-
- if firstCommentLine == "" {
- w.addFailuref(fn, 1, lint.FailureCategoryComments,
+ status := w.checkGoDocStatus(fn.Doc, fn.Name.Name)
+ switch status {
+ case exportedGoDocStatusOK:
+ return // comment is fine
+ case exportedGoDocStatusMissing:
+ w.addFailuref(fn, status.Confidence(), lint.FailureCategoryComments,
"exported %s %s should have comment or be unexported", kind, name,
)
return
}
- prefix := fn.Name.Name + " "
- if !strings.HasPrefix(firstCommentLine, prefix) {
- w.addFailuref(fn.Doc, 0.8, lint.FailureCategoryComments,
- `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix,
- )
+ firstCommentLine := w.firstCommentLine(fn.Doc)
+ w.addFailuref(fn.Doc, status.Confidence(), lint.FailureCategoryComments,
+ `comment on exported %s %s should be of the form "%s ..."%s`, kind, name, fn.Name.Name, status.CorrectionHint(firstCommentLine),
+ )
+}
+
+func (*lintExported) hasPrefixInsensitive(s, prefix string) bool {
+ return strings.HasPrefix(strings.ToLower(s), strings.ToLower(prefix))
+}
+
+func (*lintExported) stripFirstRune(s string) string {
+ // Decode the first rune to handle multi-byte characters.
+ firstRune, size := utf8.DecodeRuneInString(s)
+ if firstRune == utf8.RuneError {
+ return s // no valid first rune found
}
+
+ // Return the string without the first rune.
+ return s[size:]
}
func (w *lintExported) checkRepetitiveNames(id *ast.Ident, thing string) {
@@ -233,24 +248,24 @@ func (w *lintExported) lintTypeDoc(t *ast.TypeSpec, doc *ast.CommentGroup, first
return
}
+ expectedPrefix := typeName
for _, a := range articles {
if typeName == a {
continue
}
var found bool
if firstCommentLine, found = strings.CutPrefix(firstCommentLine, a+" "); found {
+ expectedPrefix = a + " " + typeName
break
}
}
- // if comment starts with name of type and has some text after - it's ok
- expectedPrefix := typeName + " "
- if strings.HasPrefix(firstCommentLine, expectedPrefix) {
+ status := w.checkGoDocStatus(doc, expectedPrefix)
+ if status == exportedGoDocStatusOK {
return
}
-
- w.addFailuref(doc, 1, lint.FailureCategoryComments,
- `comment on exported type %v should be of the form "%s..." (with optional leading article)`, t.Name, expectedPrefix,
+ w.addFailuref(doc, status.Confidence(), lint.FailureCategoryComments,
+ `comment on exported type %v should be of the form "%s ..." (with optional leading article)%s`, t.Name, typeName, status.CorrectionHint(firstCommentLine),
)
}
@@ -272,6 +287,7 @@ func (w *lintExported) checkValueNames(names []*ast.Ident, nodeToBlame ast.Node,
return true
}
+
func (w *lintExported) lintValueSpecDoc(vs *ast.ValueSpec, gd *ast.GenDecl, genDeclMissingComments map[*ast.GenDecl]bool) {
kind := "var"
if gd.Tok == token.CONST {
@@ -292,8 +308,8 @@ func (w *lintExported) lintValueSpecDoc(vs *ast.ValueSpec, gd *ast.GenDecl, genD
return
}
- vsFirstCommentLine := firstCommentLine(vs.Doc)
- gdFirstCommentLine := firstCommentLine(gd.Doc)
+ vsFirstCommentLine := w.firstCommentLine(vs.Doc)
+ gdFirstCommentLine := w.firstCommentLine(gd.Doc)
if vsFirstCommentLine == "" && gdFirstCommentLine == "" {
if genDeclMissingComments[gd] {
return
@@ -325,20 +341,77 @@ func (w *lintExported) lintValueSpecDoc(vs *ast.ValueSpec, gd *ast.GenDecl, genD
default:
doc = gd.Doc
}
+ firstCommentLine := w.firstCommentLine(doc)
- prefix := name + " "
- if !strings.HasPrefix(firstCommentLine(doc), prefix) {
- w.addFailuref(doc, 1, lint.FailureCategoryComments,
- `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix,
- )
+ status := w.checkGoDocStatus(doc, name)
+ if status == exportedGoDocStatusOK {
+ return
+ }
+ w.addFailuref(doc, status.Confidence(), lint.FailureCategoryComments,
+ `comment on exported %s %s should be of the form "%s ..."%s`, kind, name, name, status.CorrectionHint(firstCommentLine),
+ )
+}
+
+type exportedGoDocStatus int
+
+const (
+ exportedGoDocStatusOK exportedGoDocStatus = iota
+ exportedGoDocStatusMissing
+ exportedGoDocStatusCaseMismatch
+ exportedGoDocStatusFirstLetterMismatch
+ exportedGoDocStatusUnexpected
+)
+
+func (gds exportedGoDocStatus) Confidence() float64 {
+ if gds == exportedGoDocStatusUnexpected {
+ return 0.8
}
+ return 1
+}
+
+func (gds exportedGoDocStatus) CorrectionHint(firstCommentLine string) string {
+ firstWord := strings.Split(firstCommentLine, " ")[0]
+ switch gds {
+ case exportedGoDocStatusCaseMismatch:
+ return ` by using its correct casing, not "` + firstWord + ` ..."`
+ case exportedGoDocStatusFirstLetterMismatch:
+ return ` to match its exported status, not "` + firstWord + ` ..."`
+ }
+
+ return ""
+}
+
+func (w *lintExported) checkGoDocStatus(comment *ast.CommentGroup, name string) exportedGoDocStatus {
+ firstCommentLine := w.firstCommentLine(comment)
+ if firstCommentLine == "" {
+ return exportedGoDocStatusMissing
+ }
+
+ name = strings.TrimSpace(name)
+ // Make sure the expected prefix has a space at the end.
+ expectedPrefix := name + " "
+ if strings.HasPrefix(firstCommentLine, expectedPrefix) {
+ return exportedGoDocStatusOK
+ }
+
+ if !w.hasPrefixInsensitive(firstCommentLine, expectedPrefix) {
+ return exportedGoDocStatusUnexpected
+ }
+
+ if strings.HasPrefix(w.stripFirstRune(firstCommentLine), w.stripFirstRune(expectedPrefix)) {
+ // Only the first character differs, such as "sendJSON" became "SendJSON".
+ // so we consider the scope has changed.
+ return exportedGoDocStatusFirstLetterMismatch
+ }
+
+ return exportedGoDocStatusCaseMismatch
}
// firstCommentLine yields the first line of interest in comment group or "" if there is nothing of interest.
// An "interesting line" is a comment line that is neither a directive (e.g. //go:...) or a deprecation comment
// (lines from the first line with a prefix // Deprecated: to the end of the comment group)
// Empty or spaces-only lines are discarded.
-func firstCommentLine(comment *ast.CommentGroup) (result string) {
+func (lintExported) firstCommentLine(comment *ast.CommentGroup) (result string) {
if comment == nil {
return ""
}
@@ -384,10 +457,10 @@ func (w *lintExported) Visit(n ast.Node) ast.Visitor {
// inside a GenDecl, which usually has the doc
doc := v.Doc
- fcl := firstCommentLine(doc)
+ fcl := w.firstCommentLine(doc)
if fcl == "" {
doc = w.lastGenDecl.Doc
- fcl = firstCommentLine(doc)
+ fcl = w.firstCommentLine(doc)
}
w.lintTypeDoc(v, doc, fcl)
w.checkRepetitiveNames(v.Name, "type")
@@ -421,21 +494,23 @@ func (w *lintExported) lintInterfaceMethod(typeName string, m *ast.Field) {
if !ast.IsExported(m.Names[0].Name) {
return
}
+
name := m.Names[0].Name
- firstCommentLine := firstCommentLine(m.Doc)
- if firstCommentLine == "" {
- w.addFailuref(m, 1, lint.FailureCategoryComments,
+ status := w.checkGoDocStatus(m.Doc, name)
+ switch status {
+ case exportedGoDocStatusOK:
+ return // comment is fine
+ case exportedGoDocStatusMissing:
+ w.addFailuref(m, status.Confidence(), lint.FailureCategoryComments,
"public interface method %s.%s should be commented", typeName, name,
)
return
}
- expectedPrefix := m.Names[0].Name + " "
- if !strings.HasPrefix(firstCommentLine, expectedPrefix) {
- w.addFailuref(m.Doc, 0.8, lint.FailureCategoryComments,
- `comment on exported interface method %s.%s should be of the form "%s..."`, typeName, name, expectedPrefix,
- )
- }
+ firstCommentLine := w.firstCommentLine(m.Doc)
+ w.addFailuref(m.Doc, status.Confidence(), lint.FailureCategoryComments,
+ `comment on exported interface method %s.%s should be of the form "%s ..."%s`, typeName, name, name, status.CorrectionHint(firstCommentLine),
+ )
}
// mustCheckMethod returns true if the method must be checked by this rule, false otherwise.
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/file_length_limit.go b/hack/tools/vendor/github.com/mgechev/revive/rule/file_length_limit.go
index a9b4e8da93..c24db43535 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/file_length_limit.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/file_length_limit.go
@@ -57,7 +57,7 @@ func (r *FileLengthLimitRule) Apply(file *lint.File, _ lint.Arguments) []lint.Fa
return []lint.Failure{
{
- Category: lint.FailureCategoryCodeStyle,
+ Category: lint.FailureCategoryStyle,
Confidence: 1,
Position: lint.FailurePosition{
Start: token.Position{
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/flag_param.go b/hack/tools/vendor/github.com/mgechev/revive/rule/flag_param.go
index 9fd15853b7..54edcadc62 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/flag_param.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/flag_param.go
@@ -78,9 +78,8 @@ func (w conditionVisitor) Visit(node ast.Node) ast.Visitor {
return w.idents[ident.Name] == struct{}{}
}
- uses := astutils.PickNodes(ifStmt.Cond, findUsesOfIdents)
-
- if len(uses) < 1 {
+ uses := astutils.SeekNode[*ast.Ident](ifStmt.Cond, findUsesOfIdents)
+ if uses == nil {
return w
}
@@ -88,7 +87,7 @@ func (w conditionVisitor) Visit(node ast.Node) ast.Visitor {
Confidence: 1,
Node: w.fd.Type.Params,
Category: lint.FailureCategoryBadPractice,
- Failure: fmt.Sprintf("parameter '%s' seems to be a control flag, avoid control coupling", uses[0]),
+ Failure: fmt.Sprintf("parameter '%s' seems to be a control flag, avoid control coupling", uses.Name),
})
return nil
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/forbidden_call_in_wg_go.go b/hack/tools/vendor/github.com/mgechev/revive/rule/forbidden_call_in_wg_go.go
new file mode 100644
index 0000000000..63088e554e
--- /dev/null
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/forbidden_call_in_wg_go.go
@@ -0,0 +1,113 @@
+package rule
+
+import (
+ "fmt"
+ "go/ast"
+ "strings"
+
+ "github.com/mgechev/revive/internal/astutils"
+ "github.com/mgechev/revive/lint"
+)
+
+// ForbiddenCallInWgGoRule spots calls to panic or wg.Done when using WaitGroup.Go.
+type ForbiddenCallInWgGoRule struct{}
+
+// Apply applies the rule to given file.
+func (*ForbiddenCallInWgGoRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure {
+ if !file.Pkg.IsAtLeastGoVersion(lint.Go125) {
+ return nil // skip analysis if Go version < 1.25
+ }
+
+ var failures []lint.Failure
+
+ onFailure := func(failure lint.Failure) {
+ failures = append(failures, failure)
+ }
+
+ w := &lintForbiddenCallInWgGo{
+ onFailure: onFailure,
+ }
+
+ // Iterate over declarations looking for function declarations
+ for _, decl := range file.AST.Decls {
+ fn, ok := decl.(*ast.FuncDecl)
+ if !ok {
+ continue // not a function
+ }
+
+ if fn.Body == nil {
+ continue // external (no-Go) function
+ }
+
+ // Analyze the function body
+ ast.Walk(w, fn.Body)
+ }
+
+ return failures
+}
+
+// Name returns the rule name.
+func (*ForbiddenCallInWgGoRule) Name() string {
+ return "forbidden-call-in-wg-go"
+}
+
+type lintForbiddenCallInWgGo struct {
+ onFailure func(lint.Failure)
+}
+
+func (w *lintForbiddenCallInWgGo) Visit(node ast.Node) ast.Visitor {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return w // not a call of statements
+ }
+
+ if !astutils.IsPkgDotName(call.Fun, "wg", "Go") {
+ return w // not a call to wg.Go
+ }
+
+ if len(call.Args) != 1 {
+ return nil // no argument (impossible)
+ }
+
+ funcLit, ok := call.Args[0].(*ast.FuncLit)
+ if !ok {
+ return nil // the argument is not a function literal
+ }
+
+ var callee string
+
+ forbiddenCallPicker := func(n ast.Node) bool {
+ call, ok := n.(*ast.CallExpr)
+ if !ok {
+ return false
+ }
+
+ if astutils.IsPkgDotName(call.Fun, "wg", "Done") ||
+ astutils.IsIdent(call.Fun, "panic") ||
+ astutils.IsPkgDotName(call.Fun, "log", "Panic") ||
+ astutils.IsPkgDotName(call.Fun, "log", "Panicf") ||
+ astutils.IsPkgDotName(call.Fun, "log", "Panicln") {
+ callee = astutils.GoFmt(n)
+ callee, _, _ = strings.Cut(callee, "(")
+ return true
+ }
+
+ return false
+ }
+
+ // search a forbidden call in the body of the function literal
+ forbiddenCall := astutils.SeekNode[*ast.CallExpr](funcLit.Body, forbiddenCallPicker)
+ if forbiddenCall == nil {
+ return nil // there is no forbidden call in the call to wg.Go
+ }
+
+ msg := fmt.Sprintf("do not call %s inside wg.Go", callee)
+ w.onFailure(lint.Failure{
+ Confidence: 1,
+ Node: forbiddenCall,
+ Category: lint.FailureCategoryErrors,
+ Failure: msg,
+ })
+
+ return nil
+}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/identical_branches.go b/hack/tools/vendor/github.com/mgechev/revive/rule/identical_branches.go
index c0d4d1981d..22895cde65 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/identical_branches.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/identical_branches.go
@@ -7,7 +7,7 @@ import (
"github.com/mgechev/revive/lint"
)
-// IdenticalBranchesRule warns on constant logical expressions.
+// IdenticalBranchesRule warns on if...else statements with both branches being the same.
type IdenticalBranchesRule struct{}
// Apply applies the rule to given file.
@@ -18,9 +18,16 @@ func (*IdenticalBranchesRule) Apply(file *lint.File, _ lint.Arguments) []lint.Fa
failures = append(failures, failure)
}
- astFile := file.AST
- w := &lintIdenticalBranches{astFile, onFailure}
- ast.Walk(w, astFile)
+ w := &lintIdenticalBranches{onFailure: onFailure}
+ for _, decl := range file.AST.Decls {
+ fn, ok := decl.(*ast.FuncDecl)
+ if !ok || fn.Body == nil {
+ continue
+ }
+
+ ast.Walk(w, fn.Body)
+ }
+
return failures
}
@@ -30,59 +37,45 @@ func (*IdenticalBranchesRule) Name() string {
}
type lintIdenticalBranches struct {
- file *ast.File
onFailure func(lint.Failure)
}
func (w *lintIdenticalBranches) Visit(node ast.Node) ast.Visitor {
- n, ok := node.(*ast.IfStmt)
+ ifStmt, ok := node.(*ast.IfStmt)
if !ok {
return w
}
- noElseBranch := n.Else == nil
- if noElseBranch {
- return w
+ if ifStmt.Else == nil {
+ return w // if without else
}
- branches := []*ast.BlockStmt{n.Body}
-
- elseBranch, ok := n.Else.(*ast.BlockStmt)
- if !ok { // if-else-if construction
+ elseBranch, ok := ifStmt.Else.(*ast.BlockStmt)
+ if !ok { // if-else-if construction, the rule only copes with single if...else statements
return w
}
- branches = append(branches, elseBranch)
- if w.identicalBranches(branches) {
- w.newFailure(n, "both branches of the if are identical")
+ if w.identicalBranches(ifStmt.Body, elseBranch) {
+ w.onFailure(lint.Failure{
+ Confidence: 1.0,
+ Node: ifStmt,
+ Category: lint.FailureCategoryLogic,
+ Failure: "both branches of the if are identical",
+ })
}
- return w
+ ast.Walk(w, ifStmt.Body)
+ ast.Walk(w, ifStmt.Else)
+ return nil
}
-func (*lintIdenticalBranches) identicalBranches(branches []*ast.BlockStmt) bool {
- if len(branches) < 2 {
- return false // only one branch to compare thus we return
+func (*lintIdenticalBranches) identicalBranches(body, elseBranch *ast.BlockStmt) bool {
+ if len(body.List) != len(elseBranch.List) {
+ return false // branches don't have the same number of statements
}
- referenceBranch := astutils.GoFmt(branches[0])
- referenceBranchSize := len(branches[0].List)
- for i := 1; i < len(branches); i++ {
- currentBranch := branches[i]
- currentBranchSize := len(currentBranch.List)
- if currentBranchSize != referenceBranchSize || astutils.GoFmt(currentBranch) != referenceBranch {
- return false
- }
- }
-
- return true
-}
+ bodyStr := astutils.GoFmt(body)
+ elseStr := astutils.GoFmt(elseBranch)
-func (w *lintIdenticalBranches) newFailure(node ast.Node, msg string) {
- w.onFailure(lint.Failure{
- Confidence: 1,
- Node: node,
- Category: lint.FailureCategoryLogic,
- Failure: msg,
- })
+ return bodyStr == elseStr
}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/identical_ifelseif_branches.go b/hack/tools/vendor/github.com/mgechev/revive/rule/identical_ifelseif_branches.go
new file mode 100644
index 0000000000..b661e44f83
--- /dev/null
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/identical_ifelseif_branches.go
@@ -0,0 +1,186 @@
+package rule
+
+import (
+ "fmt"
+ "go/ast"
+
+ "github.com/mgechev/revive/internal/astutils"
+ "github.com/mgechev/revive/lint"
+)
+
+// IdenticalIfElseIfBranchesRule warns on if...else if chains with identical branches.
+type IdenticalIfElseIfBranchesRule struct{}
+
+// Apply applies the rule to given file.
+func (*IdenticalIfElseIfBranchesRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure {
+ var failures []lint.Failure
+
+ onFailure := func(failure lint.Failure) {
+ failures = append(failures, failure)
+ }
+
+ getStmtLine := func(s ast.Stmt) int {
+ return file.ToPosition(s.Pos()).Line
+ }
+
+ w := &rootWalkerIfElseIfIdenticalBranches{getStmtLine: getStmtLine, onFailure: onFailure}
+ for _, decl := range file.AST.Decls {
+ fn, ok := decl.(*ast.FuncDecl)
+ if !ok || fn.Body == nil {
+ continue
+ }
+
+ ast.Walk(w, fn.Body)
+ }
+
+ return failures
+}
+
+// Name returns the rule name.
+func (*IdenticalIfElseIfBranchesRule) Name() string {
+ return "identical-ifelseif-branches"
+}
+
+type rootWalkerIfElseIfIdenticalBranches struct {
+ getStmtLine func(ast.Stmt) int
+ onFailure func(lint.Failure)
+}
+
+func (w *rootWalkerIfElseIfIdenticalBranches) Visit(node ast.Node) ast.Visitor {
+ n, ok := node.(*ast.IfStmt)
+ if !ok {
+ return w
+ }
+
+ _, isIfElseIf := n.Else.(*ast.IfStmt)
+ if isIfElseIf {
+ walker := &lintIfChainIdenticalBranches{
+ onFailure: w.onFailure,
+ getStmtLine: w.getStmtLine,
+ rootWalker: w,
+ }
+
+ ast.Walk(walker, n)
+ return nil // the walker already analyzed inner branches
+ }
+
+ return w
+}
+
+// walkBranch analyzes the given branch.
+func (w *rootWalkerIfElseIfIdenticalBranches) walkBranch(branch ast.Stmt) {
+ if branch == nil {
+ return
+ }
+
+ walker := &rootWalkerIfElseIfIdenticalBranches{
+ onFailure: w.onFailure,
+ getStmtLine: w.getStmtLine,
+ }
+
+ ast.Walk(walker, branch)
+}
+
+type lintIfChainIdenticalBranches struct {
+ getStmtLine func(ast.Stmt) int
+ onFailure func(lint.Failure)
+ branches []ast.Stmt // hold branches to compare
+ rootWalker *rootWalkerIfElseIfIdenticalBranches // the walker to use to recursively analyze inner branches
+ hasComplexCondition bool // indicates if one of the if conditions is "complex"
+}
+
+// addBranch adds a branch to the list of branches to be compared.
+func (w *lintIfChainIdenticalBranches) addBranch(branch ast.Stmt) {
+ if branch == nil {
+ return
+ }
+
+ if w.branches == nil {
+ w.resetBranches()
+ }
+
+ w.branches = append(w.branches, branch)
+}
+
+// resetBranches resets (clears) the list of branches to compare.
+func (w *lintIfChainIdenticalBranches) resetBranches() {
+ w.branches = []ast.Stmt{}
+ w.hasComplexCondition = false
+}
+
+func (w *lintIfChainIdenticalBranches) Visit(node ast.Node) ast.Visitor {
+ n, ok := node.(*ast.IfStmt)
+ if !ok {
+ return w
+ }
+
+ // recursively analyze the then-branch
+ w.rootWalker.walkBranch(n.Body)
+
+ if n.Init == nil { // only check if without initialization to avoid false positives
+ w.addBranch(n.Body)
+ }
+
+ if w.isComplexCondition(n.Cond) {
+ w.hasComplexCondition = true
+ }
+
+ if n.Else != nil {
+ if chainedIf, ok := n.Else.(*ast.IfStmt); ok {
+ w.Visit(chainedIf)
+ } else {
+ w.addBranch(n.Else)
+ w.rootWalker.walkBranch(n.Else)
+ }
+ }
+
+ identicalBranches := w.identicalBranches(w.branches)
+ for _, branchPair := range identicalBranches {
+ msg := fmt.Sprintf(`"if...else if" chain with identical branches (lines %d and %d)`, branchPair[0], branchPair[1])
+ confidence := 1.0
+ if w.hasComplexCondition {
+ confidence = 0.8
+ }
+ w.onFailure(lint.Failure{
+ Confidence: confidence,
+ Node: w.branches[0],
+ Category: lint.FailureCategoryLogic,
+ Failure: msg,
+ })
+ }
+
+ w.resetBranches()
+ return nil
+}
+
+// isComplexCondition returns true if the given expression is "complex", false otherwise.
+// An expression is considered complex if it has a function call.
+func (*lintIfChainIdenticalBranches) isComplexCondition(expr ast.Expr) bool {
+ call := astutils.SeekNode[*ast.CallExpr](expr, func(n ast.Node) bool {
+ _, ok := n.(*ast.CallExpr)
+ return ok
+ })
+
+ return call != nil
+}
+
+// identicalBranches yields pairs of (line numbers) of identical branches from the given branches.
+func (w *lintIfChainIdenticalBranches) identicalBranches(branches []ast.Stmt) [][]int {
+ result := [][]int{}
+ if len(branches) < 2 {
+ return result // no other branch to compare thus we return
+ }
+
+ hashes := map[string]int{} // branch code hash -> branch line
+ for _, branch := range branches {
+ hash := astutils.NodeHash(branch)
+ branchLine := w.getStmtLine(branch)
+ if match, ok := hashes[hash]; ok {
+ result = append(result, []int{match, branchLine})
+ }
+
+ hashes[hash] = branchLine
+ }
+
+ return result
+}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/identical_ifelseif_condition.go b/hack/tools/vendor/github.com/mgechev/revive/rule/identical_ifelseif_condition.go
new file mode 100644
index 0000000000..0ba9d68c93
--- /dev/null
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/identical_ifelseif_condition.go
@@ -0,0 +1,148 @@
+package rule
+
+import (
+ "fmt"
+ "go/ast"
+
+ "github.com/mgechev/revive/internal/astutils"
+ "github.com/mgechev/revive/lint"
+)
+
+// IdenticalIfElseIfConditionsRule warns on if...else if chains with identical conditions.
+type IdenticalIfElseIfConditionsRule struct{}
+
+// Apply applies the rule to given file.
+func (*IdenticalIfElseIfConditionsRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure {
+ var failures []lint.Failure
+
+ onFailure := func(failure lint.Failure) {
+ failures = append(failures, failure)
+ }
+
+ getStmtLine := func(s ast.Stmt) int {
+ return file.ToPosition(s.Pos()).Line
+ }
+
+ w := &rootWalkerIfElseIfIdenticalConditions{getStmtLine: getStmtLine, onFailure: onFailure}
+ for _, decl := range file.AST.Decls {
+ fn, ok := decl.(*ast.FuncDecl)
+ if !ok || fn.Body == nil {
+ continue
+ }
+
+ ast.Walk(w, fn.Body)
+ }
+
+ return failures
+}
+
+// Name returns the rule name.
+func (*IdenticalIfElseIfConditionsRule) Name() string {
+ return "identical-ifelseif-conditions"
+}
+
+type rootWalkerIfElseIfIdenticalConditions struct {
+ getStmtLine func(ast.Stmt) int
+ onFailure func(lint.Failure)
+}
+
+func (w *rootWalkerIfElseIfIdenticalConditions) Visit(node ast.Node) ast.Visitor {
+ n, ok := node.(*ast.IfStmt)
+ if !ok {
+ return w
+ }
+
+ _, isIfElseIf := n.Else.(*ast.IfStmt)
+ if isIfElseIf {
+ walker := &lintIfChainIdenticalConditions{
+ onFailure: w.onFailure,
+ getStmtLine: w.getStmtLine,
+ rootWalker: w,
+ }
+
+ ast.Walk(walker, n)
+ return nil // the walker already analyzed inner branches
+ }
+
+ return w
+}
+
+// walkBranch analyzes the given branch.
+func (w *rootWalkerIfElseIfIdenticalConditions) walkBranch(branch ast.Stmt) {
+ if branch == nil {
+ return
+ }
+
+ walker := &rootWalkerIfElseIfIdenticalConditions{
+ onFailure: w.onFailure,
+ getStmtLine: w.getStmtLine,
+ }
+
+ ast.Walk(walker, branch)
+}
+
+type lintIfChainIdenticalConditions struct {
+ getStmtLine func(ast.Stmt) int
+ onFailure func(lint.Failure)
+ conditions map[string]int // condition hash -> line of the condition
+ rootWalker *rootWalkerIfElseIfIdenticalConditions // the walker to use to recursively analyze inner branches
+}
+
+// addCondition adds a condition to the set of if...else if conditions.
+// If the set already contains the same condition it returns the line number of the identical condition.
+func (w *lintIfChainIdenticalConditions) addCondition(condition ast.Expr, conditionLine int) (line int, match bool) {
+ if condition == nil {
+ return 0, false
+ }
+
+ if w.conditions == nil {
+ w.resetConditions()
+ }
+
+ hash := astutils.NodeHash(condition)
+ identical, ok := w.conditions[hash]
+ if ok {
+ return identical, true
+ }
+
+ w.conditions[hash] = conditionLine
+ return 0, false
+}
+
+func (w *lintIfChainIdenticalConditions) resetConditions() {
+ w.conditions = map[string]int{}
+}
+
+func (w *lintIfChainIdenticalConditions) Visit(node ast.Node) ast.Visitor {
+ n, ok := node.(*ast.IfStmt)
+ if !ok {
+ return w
+ }
+
+ // recursively analyze the then-branch
+ w.rootWalker.walkBranch(n.Body)
+
+ if n.Init == nil { // only check if without initialization to avoid false positives
+ currentCondLine := w.rootWalker.getStmtLine(n)
+ identicalCondLine, match := w.addCondition(n.Cond, currentCondLine)
+ if match {
+ w.onFailure(lint.Failure{
+ Confidence: 1.0,
+ Node: n,
+ Category: lint.FailureCategoryLogic,
+ Failure: fmt.Sprintf(`"if...else if" chain with identical conditions (lines %d and %d)`, identicalCondLine, currentCondLine),
+ })
+ }
+ }
+
+ if n.Else != nil {
+ if chainedIf, ok := n.Else.(*ast.IfStmt); ok {
+ w.Visit(chainedIf)
+ } else {
+ w.rootWalker.walkBranch(n.Else)
+ }
+ }
+
+ w.resetConditions()
+ return nil
+}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/identical_switch_branches.go b/hack/tools/vendor/github.com/mgechev/revive/rule/identical_switch_branches.go
new file mode 100644
index 0000000000..fc1d620b36
--- /dev/null
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/identical_switch_branches.go
@@ -0,0 +1,94 @@
+package rule
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+
+ "github.com/mgechev/revive/internal/astutils"
+ "github.com/mgechev/revive/lint"
+)
+
+// IdenticalSwitchBranchesRule warns on identical switch branches.
+type IdenticalSwitchBranchesRule struct{}
+
+// Apply applies the rule to given file.
+func (*IdenticalSwitchBranchesRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure {
+ var failures []lint.Failure
+
+ onFailure := func(failure lint.Failure) {
+ failures = append(failures, failure)
+ }
+
+ getStmtLine := func(s ast.Stmt) int {
+ return file.ToPosition(s.Pos()).Line
+ }
+
+ w := &lintIdenticalSwitchBranches{getStmtLine: getStmtLine, onFailure: onFailure}
+ for _, decl := range file.AST.Decls {
+ fn, ok := decl.(*ast.FuncDecl)
+ if !ok || fn.Body == nil {
+ continue
+ }
+
+ ast.Walk(w, fn.Body)
+ }
+
+ return failures
+}
+
+// Name returns the rule name.
+func (*IdenticalSwitchBranchesRule) Name() string {
+ return "identical-switch-branches"
+}
+
+type lintIdenticalSwitchBranches struct {
+ getStmtLine func(ast.Stmt) int
+ onFailure func(lint.Failure)
+}
+
+func (w *lintIdenticalSwitchBranches) Visit(node ast.Node) ast.Visitor {
+ switchStmt, ok := node.(*ast.SwitchStmt)
+ if !ok {
+ return w
+ }
+
+ if switchStmt.Tag == nil {
+ return w // do not lint untagged switches (order of case evaluation might be important)
+ }
+
+ doesFallthrough := func(stmts []ast.Stmt) bool {
+ if len(stmts) == 0 {
+ return false
+ }
+
+ ft, ok := stmts[len(stmts)-1].(*ast.BranchStmt)
+ return ok && ft.Tok == token.FALLTHROUGH
+ }
+
+ hashes := map[string]int{} // map hash(branch code) -> branch line
+ for _, cc := range switchStmt.Body.List {
+ caseClause := cc.(*ast.CaseClause)
+ if doesFallthrough(caseClause.Body) {
+ continue // skip fallthrough branches
+ }
+ branch := &ast.BlockStmt{
+ List: caseClause.Body,
+ }
+ hash := astutils.NodeHash(branch)
+ branchLine := w.getStmtLine(caseClause)
+ if matchLine, ok := hashes[hash]; ok {
+ w.onFailure(lint.Failure{
+ Confidence: 1.0,
+ Node: node,
+ Category: lint.FailureCategoryLogic,
+ Failure: fmt.Sprintf(`"switch" with identical branches (lines %d and %d)`, matchLine, branchLine),
+ })
+ }
+
+ hashes[hash] = branchLine
+ ast.Walk(w, branch)
+ }
+
+ return nil // switch branches already analyzed
+}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/identical_switch_conditions.go b/hack/tools/vendor/github.com/mgechev/revive/rule/identical_switch_conditions.go
new file mode 100644
index 0000000000..15826d9b07
--- /dev/null
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/identical_switch_conditions.go
@@ -0,0 +1,78 @@
+package rule
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+
+ "github.com/mgechev/revive/internal/astutils"
+ "github.com/mgechev/revive/lint"
+)
+
+// IdenticalSwitchConditionsRule warns on switch case clauses with identical conditions.
+type IdenticalSwitchConditionsRule struct{}
+
+// Apply applies the rule to given file.
+func (*IdenticalSwitchConditionsRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure {
+ var failures []lint.Failure
+
+ onFailure := func(failure lint.Failure) {
+ failures = append(failures, failure)
+ }
+
+ w := &lintIdenticalSwitchConditions{toPosition: file.ToPosition, onFailure: onFailure}
+ for _, decl := range file.AST.Decls {
+ fn, ok := decl.(*ast.FuncDecl)
+ if !ok || fn.Body == nil {
+ continue
+ }
+
+ ast.Walk(w, fn.Body)
+ }
+
+ return failures
+}
+
+// Name returns the rule name.
+func (*IdenticalSwitchConditionsRule) Name() string {
+ return "identical-switch-conditions"
+}
+
+type lintIdenticalSwitchConditions struct {
+ toPosition func(token.Pos) token.Position
+ onFailure func(lint.Failure)
+}
+
+func (w *lintIdenticalSwitchConditions) Visit(node ast.Node) ast.Visitor {
+ switchStmt, ok := node.(*ast.SwitchStmt)
+ if !ok { // not a switch statement, keep walking the AST
+ return w
+ }
+
+ if switchStmt.Tag != nil {
+ return w // Not interested in tagged switches
+ }
+
+ hashes := map[string]int{} // map hash(condition code) -> condition line
+ for _, cc := range switchStmt.Body.List {
+ caseClause := cc.(*ast.CaseClause)
+ caseClauseLine := w.toPosition(caseClause.Pos()).Line
+ for _, expr := range caseClause.List {
+ hash := astutils.NodeHash(expr)
+ if matchLine, ok := hashes[hash]; ok {
+ w.onFailure(lint.Failure{
+ Confidence: 1.0,
+ Node: caseClause,
+ Category: lint.FailureCategoryLogic,
+ Failure: fmt.Sprintf(`case clause at line %d has the same condition`, matchLine),
+ })
+ }
+
+ hashes[hash] = caseClauseLine
+ }
+
+ ast.Walk(w, caseClause)
+ }
+
+ return nil // switch branches already analyzed
+}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/import_shadowing.go b/hack/tools/vendor/github.com/mgechev/revive/rule/import_shadowing.go
index 09520785c0..0028d96737 100644
--- a/hack/tools/vendor/github.com/mgechev/revive/rule/import_shadowing.go
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/import_shadowing.go
@@ -13,12 +13,12 @@ import (
type ImportShadowingRule struct{}
// Apply applies the rule to given file.
-func (*ImportShadowingRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure {
+func (r *ImportShadowingRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure {
var failures []lint.Failure
importNames := map[string]struct{}{}
for _, imp := range file.AST.Imports {
- importNames[getName(imp)] = struct{}{}
+ importNames[r.getName(imp)] = struct{}{}
}
fileAst := file.AST
@@ -42,20 +42,23 @@ func (*ImportShadowingRule) Name() string {
return "import-shadowing"
}
-func getName(imp *ast.ImportSpec) string {
+func (r *ImportShadowingRule) getName(imp *ast.ImportSpec) string {
const pathSep = "/"
const strDelim = `"`
if imp.Name != nil {
return imp.Name.Name
}
- path := imp.Path.Value
- i := strings.LastIndex(path, pathSep)
- if i == -1 {
- return strings.Trim(path, strDelim)
+ path := strings.Trim(imp.Path.Value, strDelim)
+ parts := strings.Split(path, pathSep)
+
+ lastSegment := parts[len(parts)-1]
+ if r.isVersion(lastSegment) && len(parts) >= 2 {
+ // Use the previous segment when current is a version (v1, v2, etc.).
+ return parts[len(parts)-2]
}
- return strings.Trim(path[i+1:], strDelim)
+ return lastSegment
}
type importShadowing struct {
@@ -113,3 +116,17 @@ func (w importShadowing) Visit(n ast.Node) ast.Visitor {
return w
}
+
+func (*ImportShadowingRule) isVersion(name string) bool {
+ if len(name) < 2 || (name[0] != 'v' && name[0] != 'V') {
+ return false
+ }
+
+ for i := 1; i < len(name); i++ {
+ if name[i] < '0' || name[i] > '9' {
+ return false
+ }
+ }
+
+ return true
+}
diff --git a/hack/tools/vendor/github.com/mgechev/revive/rule/inefficient_map_lookup.go b/hack/tools/vendor/github.com/mgechev/revive/rule/inefficient_map_lookup.go
new file mode 100644
index 0000000000..b6e4bf9216
--- /dev/null
+++ b/hack/tools/vendor/github.com/mgechev/revive/rule/inefficient_map_lookup.go
@@ -0,0 +1,169 @@
+package rule
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "strings"
+
+ "github.com/mgechev/revive/internal/astutils"
+ "github.com/mgechev/revive/lint"
+)
+
+// InefficientMapLookupRule spots potential inefficient map lookups.
+type InefficientMapLookupRule struct{}
+
+// Apply applies the rule to given file.
+func (*InefficientMapLookupRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure {
+ var failures []lint.Failure
+
+ onFailure := func(failure lint.Failure) {
+ failures = append(failures, failure)
+ }
+
+ w := &lintInefficientMapLookup{
+ file: file,
+ onFailure: onFailure,
+ }
+
+ if err := file.Pkg.TypeCheck(); err != nil {
+ return []lint.Failure{
+ lint.NewInternalFailure(fmt.Sprintf("Unable to type check file %q: %v", file.Name, err)),
+ }
+ }
+
+ // Iterate over declarations looking for function declarations
+ for _, decl := range file.AST.Decls {
+ fn, ok := decl.(*ast.FuncDecl)
+ if !ok {
+ continue // not a function
+ }
+
+ if fn.Body == nil {
+ continue // external (no-Go) function
+ }
+
+ // Analyze the function body
+ ast.Walk(w, fn.Body)
+ }
+
+ return failures
+}
+
+// Name returns the rule name.
+func (*InefficientMapLookupRule) Name() string {
+ return "inefficient-map-lookup"
+}
+
+type lintInefficientMapLookup struct {
+ file *lint.File
+ onFailure func(lint.Failure)
+}
+
+func (w *lintInefficientMapLookup) Visit(node ast.Node) ast.Visitor {
+ // Only interested in blocks of statements
+ block, ok := node.(*ast.BlockStmt)
+ if !ok {
+ return w // not a block of statements
+ }
+
+ w.analyzeBlock(block)
+
+ return w
+}
+
+// analyzeBlock searches AST subtrees with the following form
+//
+// for := range