From b9738f245795f2c7f8dcc4735618179f01fd8b18 Mon Sep 17 00:00:00 2001 From: bzsuni Date: Sun, 4 Feb 2024 19:56:50 +0800 Subject: [PATCH 01/34] fix 'Failed to combine cover profiles' Signed-off-by: bzsuni --- pkg/agent/route/route_test.go | 34 ++-- pkg/agent/vxlan/vxlan_test.go | 66 +++---- pkg/config/config_test.go | 8 +- .../egress_cluster_info_test.go | 175 +++++++++++------- .../endpoint/cluster_endpoint_slice_test.go | 55 +++--- .../endpoint/endpoint_slice_test.go | 44 ++--- pkg/markallocator/allocator_test.go | 64 +++---- 7 files changed, 213 insertions(+), 233 deletions(-) diff --git a/pkg/agent/route/route_test.go b/pkg/agent/route/route_test.go index f4225ecdf..d077fea69 100644 --- a/pkg/agent/route/route_test.go +++ b/pkg/agent/route/route_test.go @@ -60,11 +60,6 @@ func TestPurgeStaleRules(t *testing.T) { if tc.prepare != nil { patchess := tc.prepare() patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } if tc.expErr { err = ruleRoute.PurgeStaleRules(marks, baseMark) @@ -73,6 +68,9 @@ func TestPurgeStaleRules(t *testing.T) { err = ruleRoute.PurgeStaleRules(marks, baseMark) assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -124,11 +122,6 @@ func TestEnsure(t *testing.T) { if tc.makePatch != nil { patchess := tc.makePatch(ruleRoute) patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } name, ipv4, ipv6, table, mark := tc.prepare() @@ -139,6 +132,10 @@ func TestEnsure(t *testing.T) { err = ruleRoute.Ensure(name, ipv4, ipv6, table, mark) assert.NoError(t, err) } + + for _, p := range patches { + p.Reset() + } }) } } @@ -183,11 +180,6 @@ func TestEnsureRoute(t *testing.T) { if tc.makePatch != nil { patchess := tc.makePatch() patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } name, ip, family, table, log := tc.prepare() @@ -198,6 +190,10 @@ func TestEnsureRoute(t *testing.T) { err = ruleRoute.EnsureRoute(name, ip, family, table, log) assert.NoError(t, err) } + + for _, p := range patches { + p.Reset() + } }) } } @@ -246,11 +242,6 @@ func TestEnsureRule(t *testing.T) { if tc.makePatch != nil { patchess := tc.makePatch() patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } family, table, mark, log := tc.prepare() @@ -261,6 +252,9 @@ func TestEnsureRule(t *testing.T) { err = ruleRoute.EnsureRule(family, table, mark, log) assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } diff --git a/pkg/agent/vxlan/vxlan_test.go b/pkg/agent/vxlan/vxlan_test.go index 19bdac504..c8f9f43af 100644 --- a/pkg/agent/vxlan/vxlan_test.go +++ b/pkg/agent/vxlan/vxlan_test.go @@ -217,11 +217,6 @@ func Test_EnsureLink(t *testing.T) { if tc.patchFunc != nil { patchess := tc.patchFunc(dev) patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } name, vni, port, mac, mtu, ipv4, ipv6, disableChecksumOffload := tc.prepare() @@ -231,6 +226,9 @@ func Test_EnsureLink(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -285,11 +283,6 @@ func Test_ensureLink(t *testing.T) { if tc.patchFunc != nil { patchess := tc.patchFunc() patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } _, err = dev.ensureLink(vxlan) @@ -298,6 +291,10 @@ func Test_ensureLink(t *testing.T) { } else { assert.NoError(t, err) } + + for _, p := range patches { + p.Reset() + } }) } } @@ -339,11 +336,6 @@ func Test_ListNeigh(t *testing.T) { if tc.patchFunc != nil { patchess := tc.patchFunc(dev) patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } _, err = dev.ListNeigh() @@ -352,6 +344,9 @@ func Test_ListNeigh(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -402,11 +397,6 @@ func Test_Add(t *testing.T) { if tc.patchFunc != nil { patchess := tc.patchFunc(dev) patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } err = dev.Add(peer) @@ -415,6 +405,9 @@ func Test_Add(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -450,11 +443,6 @@ func Test_add(t *testing.T) { if tc.patchFunc != nil { patchess := tc.patchFunc(dev) patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } err = dev.add(mac, ip) @@ -463,6 +451,10 @@ func Test_add(t *testing.T) { } else { assert.NoError(t, err) } + + for _, p := range patches { + p.Reset() + } }) } } @@ -500,11 +492,6 @@ func Test_Del(t *testing.T) { if tc.patchFunc != nil { patchess := tc.patchFunc(dev) patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } err = dev.Del(neigh) @@ -513,6 +500,9 @@ func Test_Del(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -567,11 +557,6 @@ func Test_ensureAddr(t *testing.T) { if tc.patchFunc != nil { patchess := tc.patchFunc() patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } err = dev.ensureAddr(ipn, link, family) @@ -580,6 +565,9 @@ func Test_ensureAddr(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -626,11 +614,6 @@ func Test_writeProcSys(t *testing.T) { if tc.patchFunc != nil { patchess := tc.patchFunc() patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() } err = writeProcSys(path, value) @@ -639,6 +622,9 @@ func Test_writeProcSys(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 051dfa2bb..2f0e48372 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -179,11 +179,6 @@ func Test_LoadConfig(t *testing.T) { patchess := tc.patchFunc() patches = append(patches, patchess...) - defer func() { - for _, p := range patches { - p.Reset() - } - }() _, err := LoadConfig(tc.setParams()) if tc.expErr { @@ -191,6 +186,9 @@ func Test_LoadConfig(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } diff --git a/pkg/controller/egress_cluster_info/egress_cluster_info_test.go b/pkg/controller/egress_cluster_info/egress_cluster_info_test.go index 92eb9f7a8..603b0365a 100644 --- a/pkg/controller/egress_cluster_info/egress_cluster_info_test.go +++ b/pkg/controller/egress_cluster_info/egress_cluster_info_test.go @@ -203,13 +203,9 @@ func Test_eciReconciler_reconcileEgressClusterInfo(t *testing.T) { tc.setReconciler(r) } + patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { - patches := tc.patchFunc(r) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFunc(r) } ctx := context.TODO() @@ -220,6 +216,10 @@ func Test_eciReconciler_reconcileEgressClusterInfo(t *testing.T) { } else { assert.NoError(t, err) } + + for _, p := range patches { + p.Reset() + } }) } @@ -280,13 +280,9 @@ func Test_eciReconciler_reconcileCalicoIPPool(t *testing.T) { tc.setReconciler(r) } + patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { - patches := tc.patchFunc(r) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFunc(r) } ctx := context.TODO() @@ -297,6 +293,9 @@ func Test_eciReconciler_reconcileCalicoIPPool(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -356,13 +355,9 @@ func Test_eciReconciler_reconcileNode(t *testing.T) { tc.setReconciler(r) } + patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { - patches := tc.patchFunc(r) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFunc(r) } ctx := context.TODO() @@ -373,6 +368,9 @@ func Test_eciReconciler_reconcileNode(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -454,13 +452,9 @@ func Test_eciReconciler_listCalicoIPPools(t *testing.T) { tc.setReconciler(r) } + patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { - patches := tc.patchFunc(r) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFunc(r) } ctx := context.TODO() @@ -471,6 +465,10 @@ func Test_eciReconciler_listCalicoIPPools(t *testing.T) { } else { assert.NoError(t, err) } + + for _, p := range patches { + p.Reset() + } }) } } @@ -535,13 +533,9 @@ func Test_eciReconciler_getCalicoIPPools(t *testing.T) { tc.setReconciler(r) } + patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { - patches := tc.patchFunc(r) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFunc(r) } ctx := context.TODO() @@ -552,6 +546,9 @@ func Test_eciReconciler_getCalicoIPPools(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -601,13 +598,9 @@ func Test_eciReconciler_listNodeIPs(t *testing.T) { tc.setReconciler(r) } + patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { - patches := tc.patchFunc(r) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFunc(r) } ctx := context.TODO() @@ -618,6 +611,10 @@ func Test_eciReconciler_listNodeIPs(t *testing.T) { } else { assert.NoError(t, err) } + + for _, p := range patches { + p.Reset() + } }) } } @@ -667,13 +664,9 @@ func Test_eciReconciler_getNodeIPs(t *testing.T) { tc.setReconciler(r) } + patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { - patches := tc.patchFunc(r) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFunc(r) } ctx := context.TODO() @@ -684,6 +677,9 @@ func Test_eciReconciler_getNodeIPs(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -737,6 +733,8 @@ func Test_eciReconciler_checkCalicoExists(t *testing.T) { }) time.Sleep(time.Second * 3) + patch1.Reset() + patch2 := gomonkey.ApplyPrivateMethod(r, "listCalicoIPPools", func(_ *eciReconciler) (map[string]egressv1.IPListPair, error) { return nil, nil }) @@ -745,7 +743,6 @@ func Test_eciReconciler_checkCalicoExists(t *testing.T) { patch3 := gomonkey.ApplyFuncReturn(watchSource, nil) patches = append(patches, *patch3) - patch1.Reset() }() time.Sleep(time.Second) @@ -754,37 +751,72 @@ func Test_eciReconciler_checkCalicoExists(t *testing.T) { }) - t.Run("failed listCalicoIPPools", func(t *testing.T) { + t.Run("failed watchSource", func(t *testing.T) { + calicoIPPoolV4 := &calicov1.IPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-ippool-v4", + }, + Spec: calicov1.IPPoolSpec{ + // CIDR: "xxx", + CIDR: "10.10.0.0/18", + }, + } + calicoIPPoolV6 := &calicov1.IPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-ippool-v6", + }, + Spec: calicov1.IPPoolSpec{ + CIDR: "fdee:120::/120", + }, + } + + var objs []client.Object + + builder := fake.NewClientBuilder() + builder.WithScheme(schema.GetScheme()) + objs = append(objs, calicoIPPoolV4, calicoIPPoolV6) + builder.WithObjects(objs...) + builder.WithStatusSubresource(objs...) + cli := builder.Build() + + mgrOpts := manager.Options{ + Scheme: schema.GetScheme(), + NewClient: func(config *rest.Config, options client.Options) (client.Client, error) { + return cli, nil + }, + } + + mgr, _ := ctrl.NewManager(&rest.Config{}, mgrOpts) + + r := &eciReconciler{ + mgr: mgr, + eci: new(egressv1.EgressClusterInfo), + log: logr.Logger{}, + k8sPodCidr: make(map[string]egressv1.IPListPair), + v4ClusterCidr: make([]string, 0), + v6ClusterCidr: make([]string, 0), + client: cli, + } + c, _ := controller.New("egressClusterInfo", mgr, + controller.Options{Reconciler: r}) + r.c = c + r.isWatchCalico.Store(true) var patches []gomonkey.Patches - defer func() { - for _, p := range patches { - p.Reset() - } - }() - - go func() { - patch1 := gomonkey.ApplyPrivateMethod(r, "listCalicoIPPools", func(_ *eciReconciler) (map[string]egressv1.IPListPair, error) { - return nil, nil - }) - patches = append(patches, *patch1) - - patch2 := gomonkey.ApplyFuncReturn(watchSource, ErrForMock) - time.Sleep(time.Second * 3) - - patch3 := gomonkey.ApplyFuncReturn(watchSource, nil) - patches = append(patches, *patch3) - - patch2.Reset() - }() - time.Sleep(time.Second) + patch2 := gomonkey.ApplyFuncSeq(watchSource, []gomonkey.OutputCell{ + {Values: gomonkey.Params{ErrForMock}, Times: 3}, + {Values: gomonkey.Params{nil}, Times: 3}, + }) + patches = append(patches, *patch2) r.checkCalicoExists() + for _, p := range patches { + p.Reset() + } }) - } func Test_eciReconciler_getServiceClusterIPRange(t *testing.T) { @@ -885,13 +917,9 @@ func Test_eciReconciler_checkSomeCniExists(t *testing.T) { tc.setReconciler(r) } + patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { - patches := tc.patchFunc(r) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFunc(r) } err := r.checkSomeCniExists() @@ -900,6 +928,9 @@ func Test_eciReconciler_checkSomeCniExists(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } diff --git a/pkg/controller/endpoint/cluster_endpoint_slice_test.go b/pkg/controller/endpoint/cluster_endpoint_slice_test.go index a3cb44be9..15d4bc0e9 100644 --- a/pkg/controller/endpoint/cluster_endpoint_slice_test.go +++ b/pkg/controller/endpoint/cluster_endpoint_slice_test.go @@ -675,13 +675,9 @@ func Test_NewEgressClusterEpSliceController(t *testing.T) { } // patch + patches := make([]gomonkey.Patches, 0) if tc.patchFun != nil { - patches := tc.patchFun(t, r, mgr, log) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFun(t, r, mgr, log) } err = NewEgressClusterEpSliceController(mgr, log, cfg) @@ -689,6 +685,9 @@ func Test_NewEgressClusterEpSliceController(t *testing.T) { if tc.expErr { assert.Error(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -816,13 +815,9 @@ func Test_Reconcile(t *testing.T) { } // patch + patches := make([]gomonkey.Patches, 0) if tc.patchFun != nil { - patches := tc.patchFun(t, r, mgr, log) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFun(t, r, mgr, log) } _, err = r.Reconcile(context.TODO(), req) @@ -830,6 +825,9 @@ func Test_Reconcile(t *testing.T) { if tc.expErr { assert.Error(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -891,13 +889,9 @@ func Test_listPodsByClusterPolicy(t *testing.T) { cli := builder.Build() // patch + patches := make([]gomonkey.Patches, 0) if tc.patchFun != nil { - patches := tc.patchFun(cli) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFun(cli) } policy := tc.setParams() @@ -906,6 +900,9 @@ func Test_listPodsByClusterPolicy(t *testing.T) { if tc.expErr { assert.Error(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -1031,13 +1028,9 @@ func Test_enqueueNS(t *testing.T) { cli := builder.Build() // patch + patches := make([]gomonkey.Patches, 0) if tc.patchFun != nil { - patches := tc.patchFun(cli) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFun(cli) } resF := enqueueNS(cli) @@ -1046,6 +1039,9 @@ func Test_enqueueNS(t *testing.T) { if tc.expErr { assert.Nil(t, res) } + for _, p := range patches { + p.Reset() + } }) } } @@ -1266,13 +1262,9 @@ func Test_enqueueEGCP(t *testing.T) { cli := builder.Build() // patch + patches := make([]gomonkey.Patches, 0) if tc.patchFun != nil { - patches := tc.patchFun(cli) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFun(cli) } resF := enqueueEGCP(cli) @@ -1281,6 +1273,9 @@ func Test_enqueueEGCP(t *testing.T) { if tc.expErr { assert.Nil(t, res) } + for _, p := range patches { + p.Reset() + } }) } } diff --git a/pkg/controller/endpoint/endpoint_slice_test.go b/pkg/controller/endpoint/endpoint_slice_test.go index c616249b2..29ca1d4fa 100644 --- a/pkg/controller/endpoint/endpoint_slice_test.go +++ b/pkg/controller/endpoint/endpoint_slice_test.go @@ -708,13 +708,9 @@ func Test_NewEgressEndpointSliceController(t *testing.T) { } // patch + patches := make([]gomonkey.Patches, 0) if tc.patchFun != nil { - patches := tc.patchFun(t, r, mgr, log) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFun(t, r, mgr, log) } err = NewEgressEndpointSliceController(mgr, log, cfg) @@ -722,6 +718,9 @@ func Test_NewEgressEndpointSliceController(t *testing.T) { if tc.expErr { assert.Error(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -850,13 +849,9 @@ func Test_endpointReconciler_Reconcile(t *testing.T) { } // patch + patches := make([]gomonkey.Patches, 0) if tc.patchFun != nil { - patches := tc.patchFun(t, r, mgr, log) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFun(t, r, mgr, log) } _, err = r.Reconcile(context.TODO(), req) @@ -864,6 +859,9 @@ func Test_endpointReconciler_Reconcile(t *testing.T) { if tc.expErr { assert.Error(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -1004,13 +1002,9 @@ func Test_listPodsByPolicy(t *testing.T) { cli := builder.Build() // patch + patches := make([]gomonkey.Patches, 0) if tc.patchFun != nil { - patches := tc.patchFun(cli) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFun(cli) } policy := tc.setParams() @@ -1019,6 +1013,9 @@ func Test_listPodsByPolicy(t *testing.T) { if tc.expErr { assert.Error(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -1159,13 +1156,9 @@ func Test_enqueuePod(t *testing.T) { cli := builder.Build() // patch + patches := make([]gomonkey.Patches, 0) if tc.patchFun != nil { - patches := tc.patchFun(cli) - defer func() { - for _, p := range patches { - p.Reset() - } - }() + patches = tc.patchFun(cli) } resF := enqueuePod(cli) @@ -1174,6 +1167,9 @@ func Test_enqueuePod(t *testing.T) { if tc.expErr { assert.Nil(t, res) } + for _, p := range patches { + p.Reset() + } }) } } diff --git a/pkg/markallocator/allocator_test.go b/pkg/markallocator/allocator_test.go index 4144544ad..8142b356f 100644 --- a/pkg/markallocator/allocator_test.go +++ b/pkg/markallocator/allocator_test.go @@ -52,12 +52,6 @@ func Test_NewAllocatorMarkRange(t *testing.T) { patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { patches = tc.patchFunc() - - defer func() { - for _, p := range patches { - p.Reset() - } - }() } _, err := NewAllocatorMarkRange(mark) @@ -66,6 +60,10 @@ func Test_NewAllocatorMarkRange(t *testing.T) { } else { assert.NoError(t, err) } + + for _, p := range patches { + p.Reset() + } }) } } @@ -102,12 +100,6 @@ func Test_RangeSize(t *testing.T) { patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { patches = tc.patchFunc() - - defer func() { - for _, p := range patches { - p.Reset() - } - }() } _, _, err := RangeSize(mark) @@ -116,6 +108,9 @@ func Test_RangeSize(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -149,12 +144,6 @@ func Test_Range_Allocate(t *testing.T) { patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { patches = tc.patchFunc(&r) - - defer func() { - for _, p := range patches { - p.Reset() - } - }() } err := r.Allocate(mark) @@ -163,6 +152,9 @@ func Test_Range_Allocate(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -191,12 +183,6 @@ func Test_Range_AllocateNext(t *testing.T) { patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { patches = tc.patchFunc(&r) - - defer func() { - for _, p := range patches { - p.Reset() - } - }() } _, err := r.AllocateNext() @@ -205,6 +191,9 @@ func Test_Range_AllocateNext(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -230,12 +219,6 @@ func Test_Range_Release(t *testing.T) { patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { patches = tc.patchFunc(&r) - - defer func() { - for _, p := range patches { - p.Reset() - } - }() } err := r.Release(mark) @@ -244,6 +227,9 @@ func Test_Range_Release(t *testing.T) { } else { assert.NoError(t, err) } + for _, p := range patches { + p.Reset() + } }) } } @@ -269,18 +255,15 @@ func Test_Range_Has(t *testing.T) { patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { patches = tc.patchFunc(&r) - - defer func() { - for _, p := range patches { - p.Reset() - } - }() } b := r.Has(mark) if tc.expOK { assert.False(t, b) } + for _, p := range patches { + p.Reset() + } }) } } @@ -302,18 +285,15 @@ func Test_Range_contains(t *testing.T) { patches := make([]gomonkey.Patches, 0) if tc.patchFunc != nil { patches = tc.patchFunc(&r) - - defer func() { - for _, p := range patches { - p.Reset() - } - }() } b, _ := r.contains(mark) if tc.expOK { assert.False(t, b) } + for _, p := range patches { + p.Reset() + } }) } } From 59071d2058ea0050799c80ce38969c1267d6fa2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 10:13:38 +0000 Subject: [PATCH 02/34] build(deps): bump nick-invision/retry from 2 to 3 Bumps [nick-invision/retry](https://github.com/nick-invision/retry) from 2 to 3. - [Release notes](https://github.com/nick-invision/retry/releases) - [Changelog](https://github.com/nick-fields/retry/blob/master/.releaserc.js) - [Commits](https://github.com/nick-invision/retry/compare/v2...v3) --- updated-dependencies: - dependency-name: nick-invision/retry dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/call-e2e.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/call-e2e.yaml b/.github/workflows/call-e2e.yaml index 0c9af2eb5..e3044fe73 100644 --- a/.github/workflows/call-e2e.yaml +++ b/.github/workflows/call-e2e.yaml @@ -122,7 +122,7 @@ jobs: # test against commit version - name: Setup Kind Cluster - uses: nick-invision/retry@v2 + uses: nick-invision/retry@v3 with: timeout_minutes: 10 max_attempts: 1 From 4b7c267d58fe5ef1605cc66b2a219b62a4a60c9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 10:27:53 +0000 Subject: [PATCH 03/34] build(deps): bump github.com/go-faker/faker/v4 from 4.2.0 to 4.3.0 Bumps [github.com/go-faker/faker/v4](https://github.com/go-faker/faker) from 4.2.0 to 4.3.0. - [Release notes](https://github.com/go-faker/faker/releases) - [Commits](https://github.com/go-faker/faker/compare/v4.2.0...v4.3.0) --- updated-dependencies: - dependency-name: github.com/go-faker/faker/v4 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 +- vendor/github.com/go-faker/faker/v4/blood.go | 54 +++++++++++++++++++ vendor/github.com/go-faker/faker/v4/faker.go | 17 +++++- .../faker/v4/misc/addresses-us-1000.min.json | 2 +- vendor/modules.txt | 2 +- 6 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 vendor/github.com/go-faker/faker/v4/blood.go diff --git a/go.mod b/go.mod index f9fd6a0c1..74974e9a1 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/agiledragon/gomonkey/v2 v2.11.0 github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 github.com/cilium/ipam v0.0.0-20220824141044-46ef3d556735 - github.com/go-faker/faker/v4 v4.2.0 + github.com/go-faker/faker/v4 v4.3.0 github.com/go-logr/logr v1.4.1 github.com/go-swagger/go-swagger v0.30.4 github.com/google/gops v0.3.27 diff --git a/go.sum b/go.sum index ed117169e..c884cd9da 100644 --- a/go.sum +++ b/go.sum @@ -114,8 +114,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-faker/faker/v4 v4.2.0 h1:dGebOupKwssrODV51E0zbMrv5e2gO9VWSLNC1WDCpWg= -github.com/go-faker/faker/v4 v4.2.0/go.mod h1:F/bBy8GH9NxOxMInug5Gx4WYeG6fHJZ8Ol/dhcpRub4= +github.com/go-faker/faker/v4 v4.3.0 h1:UXOW7kn/Mwd0u6MR30JjUKVzguT20EB/hBOddAAO+DY= +github.com/go-faker/faker/v4 v4.3.0/go.mod h1:F/bBy8GH9NxOxMInug5Gx4WYeG6fHJZ8Ol/dhcpRub4= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= diff --git a/vendor/github.com/go-faker/faker/v4/blood.go b/vendor/github.com/go-faker/faker/v4/blood.go new file mode 100644 index 000000000..feb80ec8e --- /dev/null +++ b/vendor/github.com/go-faker/faker/v4/blood.go @@ -0,0 +1,54 @@ +package faker + +import ( + "fmt" + "reflect" + + "github.com/go-faker/faker/v4/pkg/options" +) + +var bloodTypes = []string{"O", "A", "B", "AB"} +var bloodRhFactors = []string{"+", "-"} + +func GetBlood(opts ...options.OptionFunc) Blooder { + opt := options.BuildOptions(opts) + db := &Blood{ + fakerOption: *opt, + } + return db +} + +type Blooder interface { + BloodType(v reflect.Value) (interface{}, error) + BloodRHFactor(v reflect.Value) (interface{}, error) + BloodGroup(v reflect.Value) (interface{}, error) +} + +// Internet struct +type Blood struct { + fakerOption options.Options +} + +func (b Blood) bloodType() string { + return randomElementFromSliceString(bloodTypes) +} + +func (b Blood) BloodType(v reflect.Value) (interface{}, error) { + return b.bloodType(), nil +} + +func (b Blood) bloodRhFactor() string { + return randomElementFromSliceString(bloodRhFactors) +} + +func (b Blood) BloodRHFactor(v reflect.Value) (interface{}, error) { + return b.bloodRhFactor(), nil +} + +func (b Blood) bloodGroup() string { + return fmt.Sprintf("%s%s", b.bloodType(), b.bloodRhFactor()) +} + +func (b Blood) BloodGroup(v reflect.Value) (interface{}, error) { + return b.bloodGroup(), nil +} diff --git a/vendor/github.com/go-faker/faker/v4/faker.go b/vendor/github.com/go-faker/faker/v4/faker.go index d7a2a184f..837da2280 100644 --- a/vendor/github.com/go-faker/faker/v4/faker.go +++ b/vendor/github.com/go-faker/faker/v4/faker.go @@ -94,6 +94,7 @@ const ( RussianLastNameMaleTag = "russian_last_name_male" RussianFirstNameFemaleTag = "russian_first_name_female" RussianLastNameFemaleTag = "russian_last_name_female" + BloodTypeTag = "blood_type" ) // PriorityTags define the priority order of the tag @@ -102,7 +103,7 @@ var PriorityTags = []string{ID, HyphenatedID, EmailTag, MacAddressTag, DomainNam E164PhoneNumberTag, TitleMaleTag, TitleFemaleTag, FirstNameTag, FirstNameMaleTag, FirstNameFemaleTag, LastNameTag, NAME, ChineseFirstNameTag, ChineseLastNameTag, ChineseNameTag, GENDER, UnixTimeTag, DATE, TIME, MonthNameTag, YEAR, DayOfWeekTag, DayOfMonthTag, TIMESTAMP, CENTURY, TIMEZONE, TimePeriodTag, WORD, SENTENCE, PARAGRAPH, - CurrencyTag, AmountTag, AmountWithCurrencyTag, SKIP, Length, SliceLength, Language, BoundaryStart, BoundaryEnd, ONEOF, + CurrencyTag, AmountTag, AmountWithCurrencyTag, SKIP, Length, SliceLength, Language, BoundaryStart, BoundaryEnd, ONEOF, BloodTypeTag, } type mapperTagCustom struct { @@ -132,6 +133,7 @@ func (m *mapperTagCustom) Store(key string, taggedFunc interfaces.TaggedFunction var defaultTag = sync.Map{} func initDefaultTag() { + defaultTag.Store(BloodTypeTag, BloodTypeTag) defaultTag.Store(EmailTag, EmailTag) defaultTag.Store(MacAddressTag, MacAddressTag) defaultTag.Store(DomainNameTag, DomainNameTag) @@ -230,6 +232,7 @@ func initMappertTagDefault() { mapperTag.Store(RussianFirstNameFemaleTag, GetPerson().RussianFirstNameFemale) mapperTag.Store(RussianLastNameMaleTag, GetPerson().RussianLastNameMale) mapperTag.Store(RussianLastNameFemaleTag, GetPerson().RussianLastNameFemale) + mapperTag.Store(BloodTypeTag, GetBlood().BloodGroup) } // Compiled regexp @@ -880,6 +883,18 @@ func userDefinedArray(v reflect.Value, tag string, opt options.Options) error { tag = findSliceLenReg.ReplaceAllString(tag, "") array := reflect.MakeSlice(v.Type(), sliceLen, sliceLen) for i := 0; i < array.Len(); i++ { + k := v.Type().Elem().Kind() + if k == reflect.Pointer || k == reflect.Struct { + res, err := getFakedValue(array.Index(i).Interface(), &opt) + if err != nil { + return err + } + if res.Kind() == reflect.Invalid { + return fmt.Errorf("got invalid reflect value") + } + array.Index(i).Set(res) + continue + } if tag == "" { res, err := getValueWithNoTag(v.Type().Elem(), opt) if err != nil { diff --git a/vendor/github.com/go-faker/faker/v4/misc/addresses-us-1000.min.json b/vendor/github.com/go-faker/faker/v4/misc/addresses-us-1000.min.json index 5ebf6c3c8..07ada599e 100644 --- a/vendor/github.com/go-faker/faker/v4/misc/addresses-us-1000.min.json +++ b/vendor/github.com/go-faker/faker/v4/misc/addresses-us-1000.min.json @@ -1 +1 @@ -{"addresses":[{"address1":"1745 T Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20020","coordinates":{"lat":38.867033,"lng":-76.979235}},{"address1":"6007 Applegate Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40219","coordinates":{"lat":38.1343013,"lng":-85.6498512}},{"address1":"560 Penstock Drive","address2":"","city":"Grass Valley","state":"CA","postalCode":"95945","coordinates":{"lat":39.213076,"lng":-121.077583}},{"address1":"150 Carter Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.76556000000001,"lng":-72.473091}},{"address1":"2721 Lindsay Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40206","coordinates":{"lat":38.263793,"lng":-85.700243}},{"address1":"18 Densmore Drive","address2":"","city":"Essex","state":"VT","postalCode":"05452","coordinates":{"lat":44.492953,"lng":-73.101883}},{"address1":"637 Britannia Drive","address2":"","city":"Vallejo","state":"CA","postalCode":"94591","coordinates":{"lat":38.10476999999999,"lng":-122.193849}},{"address1":"5601 West Crocus Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.6152469,"lng":-112.179737}},{"address1":"5403 Illinois Avenue","address2":"","city":"Nashville","state":"TN","postalCode":"37209","coordinates":{"lat":36.157077,"lng":-86.853827}},{"address1":"8821 West Myrtle Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85305","coordinates":{"lat":33.5404296,"lng":-112.2488391}},{"address1":"2203 7th Street Road","address2":"","city":"Louisville","state":"KY","postalCode":"40208","coordinates":{"lat":38.218107,"lng":-85.779006}},{"address1":"6463 Vrain Street","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.814056,"lng":-105.046913}},{"address1":"87 Horseshoe Drive","address2":"","city":"West Windsor","state":"VT","postalCode":"05037","coordinates":{"lat":43.4731793,"lng":-72.4967532}},{"address1":"60 Desousa Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7409259,"lng":-72.5619104}},{"address1":"4 Old Colony Way","address2":"","city":"Yarmouth","state":"MA","postalCode":"02664","coordinates":{"lat":41.697168,"lng":-70.189992}},{"address1":"314 South 17th Street","address2":"","city":"Nashville","state":"TN","postalCode":"37206","coordinates":{"lat":36.1719075,"lng":-86.740228}},{"address1":"1649 Timberridge Court","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.084563,"lng":-94.206082}},{"address1":"5461 West Shades Valley Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.296422,"lng":-86.34280299999999}},{"address1":"629 Debbie Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37076","coordinates":{"lat":36.208114,"lng":-86.58621199999999}},{"address1":"22572 Toreador Drive","address2":"","city":"Salinas","state":"CA","postalCode":"93908","coordinates":{"lat":36.602449,"lng":-121.699071}},{"address1":"3034 Mica Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0807929,"lng":-94.2066449}},{"address1":"3729 East Mission Boulevard","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0919353,"lng":-94.10654219999999}},{"address1":"5114 Greentree Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.0618539,"lng":-86.738508}},{"address1":"3466 Southview Avenue","address2":"","city":"Montgomery","state":"AL","postalCode":"36111","coordinates":{"lat":32.341227,"lng":-86.2846859}},{"address1":"1513 Cathy Street","address2":"","city":"Savannah","state":"GA","postalCode":"31415","coordinates":{"lat":32.067416,"lng":-81.125331}},{"address1":"600 West 19th Avenue","address2":"APT B","city":"Anchorage","state":"AK","postalCode":"99503","coordinates":{"lat":61.203115,"lng":-149.894107}},{"address1":"1208 Elkader Court North","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.080049,"lng":-86.60116099999999}},{"address1":"210 Green Road","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.7909099,"lng":-72.51195129999999}},{"address1":"49548 Road 200","address2":"","city":"O'Neals","state":"CA","postalCode":"93645","coordinates":{"lat":37.153463,"lng":-119.648192}},{"address1":"81 Seaton Place Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.9149499,"lng":-77.01170259999999}},{"address1":"1267 Martin Street","address2":"#203","city":"Nashville","state":"TN","postalCode":"37203","coordinates":{"lat":36.1404897,"lng":-86.7695179}},{"address1":"7431 Candace Way","address2":"#1","city":"Louisville","state":"KY","postalCode":"40214","coordinates":{"lat":38.142768,"lng":-85.7717132}},{"address1":"1407 Walden Court","address2":"","city":"Crofton","state":"MD","postalCode":"21114","coordinates":{"lat":39.019306,"lng":-76.660653}},{"address1":"5906 Milton Avenue","address2":"","city":"Deale","state":"MD","postalCode":"20751","coordinates":{"lat":38.784451,"lng":-76.54125499999999}},{"address1":"74 Springfield Street","address2":"B","city":"Agawam","state":"MA","postalCode":"01001","coordinates":{"lat":42.0894922,"lng":-72.6297558}},{"address1":"2905 Stonebridge Court","address2":"","city":"Norman","state":"OK","postalCode":"73071","coordinates":{"lat":35.183319,"lng":-97.40210499999999}},{"address1":"20930 Todd Valley Road","address2":"","city":"Foresthill","state":"CA","postalCode":"95631","coordinates":{"lat":38.989466,"lng":-120.883108}},{"address1":"5928 West Mauna Loa Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.6204899,"lng":-112.18702}},{"address1":"802 Madison Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.9582381,"lng":-77.0244287}},{"address1":"2811 Battery Place Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20016","coordinates":{"lat":38.9256252,"lng":-77.0982646}},{"address1":"210 Lacross Lane","address2":"","city":"Westmore","state":"VT","postalCode":"05860","coordinates":{"lat":44.771005,"lng":-72.048664}},{"address1":"2010 Rising Hill Drive","address2":"","city":"Norman","state":"OK","postalCode":"73071","coordinates":{"lat":35.177281,"lng":-97.411869}},{"address1":"388 East Main Street","address2":"","state":"VT","postalCode":"05753","coordinates":{"lat":43.9727945,"lng":-73.1023187}},{"address1":"450 Kinhawk Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.030927,"lng":-86.71949099999999}},{"address1":"131 Westerly Street","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.7906813,"lng":-72.53559729999999}},{"address1":"308 Woodleaf Court","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21061","coordinates":{"lat":39.1425931,"lng":-76.6238441}},{"address1":"8502 Madrone Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40258","coordinates":{"lat":38.1286407,"lng":-85.8678042}},{"address1":"23 Sable Run Lane","address2":"","city":"Methuen","state":"MA","postalCode":"01844","coordinates":{"lat":42.759847,"lng":-71.157721}},{"address1":"716 Waller Road","address2":"","city":"Brentwood","state":"TN","postalCode":"37027","coordinates":{"lat":35.998892,"lng":-86.696529}},{"address1":"416 McIver Street","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.10436,"lng":-86.74411599999999}},{"address1":"1508 Massachusetts Avenue Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20003","coordinates":{"lat":38.887255,"lng":-76.98318499999999}},{"address1":"5615 West Villa Maria Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.650988,"lng":-112.180624}},{"address1":"3162 Martin Luther King Junior Boulevard","address2":"#2","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.05233310000001,"lng":-94.2056987}},{"address1":"5306 Ritchie Highway","address2":"","city":"Baltimore","state":"MD","postalCode":"21225","coordinates":{"lat":39.221978,"lng":-76.614183}},{"address1":"109 Summit Street","address2":"","city":"Burlington","state":"VT","postalCode":"05401","coordinates":{"lat":44.4729749,"lng":-73.2026566}},{"address1":"816 West 19th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99503","coordinates":{"lat":61.203221,"lng":-149.898655}},{"address1":"172 Alburg Springs Road","address2":"","city":"Alburgh","state":"VT","postalCode":"05440","coordinates":{"lat":44.995827,"lng":-73.2201539}},{"address1":"159 Downey Drive","address2":"A","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7800126,"lng":-72.5754309}},{"address1":"125 John Street","address2":"","city":"Santa Cruz","state":"CA","postalCode":"95060","coordinates":{"lat":36.950901,"lng":-122.046881}},{"address1":"1101 Lotus Avenue","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21061","coordinates":{"lat":39.191982,"lng":-76.6525659}},{"address1":"8376 Albacore Drive","address2":"","city":"Pasadena","state":"MD","postalCode":"21122","coordinates":{"lat":39.110409,"lng":-76.46565799999999}},{"address1":"491 Arabian Way","address2":"","city":"Grand Junction","state":"CO","postalCode":"81504","coordinates":{"lat":39.07548999999999,"lng":-108.474785}},{"address1":"12245 West 71st Place","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8267078,"lng":-105.1366798}},{"address1":"80 North East Street","address2":"#4","city":"Holyoke","state":"MA","postalCode":"01040","coordinates":{"lat":42.2041219,"lng":-72.5977704}},{"address1":"4695 East Huntsville Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0471975,"lng":-94.0946286}},{"address1":"310 Timrod Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.756758,"lng":-72.493501}},{"address1":"1364 Capri Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.2207276,"lng":-85.6808795}},{"address1":"132 Laurel Green Court","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":32.0243075,"lng":-81.2468102}},{"address1":"6657 West Rose Garden Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.676018,"lng":-112.201658}},{"address1":"519 West 75th Avenue","address2":"#APT 000003","city":"Anchorage","state":"AK","postalCode":"99518","coordinates":{"lat":61.15288690000001,"lng":-149.889133}},{"address1":"31353 Santa Elena Way","address2":"","city":"Union City","state":"CA","postalCode":"94587","coordinates":{"lat":37.593981,"lng":-122.059762}},{"address1":"8398 West Denton Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85305","coordinates":{"lat":33.515353,"lng":-112.240812}},{"address1":"700 Winston Place","address2":"","city":"Anchorage","state":"AK","postalCode":"99504","coordinates":{"lat":61.215882,"lng":-149.737337}},{"address1":"232 Maine Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.1527033,"lng":-85.63207129999999}},{"address1":"1 Kempf Drive","address2":"","city":"Easton","state":"MA","postalCode":"02375","coordinates":{"lat":42.0505989,"lng":-71.08029379999999}},{"address1":"5811 Crossings Boulevard","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.0370847,"lng":-86.6413728}},{"address1":"5108 Franklin Street","address2":"","city":"Savannah","state":"GA","postalCode":"31405","coordinates":{"lat":32.034987,"lng":-81.121928}},{"address1":"913 Fallview Trail","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.02419100000001,"lng":-86.718305}},{"address1":"270 Chrissy's Court","address2":"","state":"VT","postalCode":"05443","coordinates":{"lat":44.1710043,"lng":-73.1065617}},{"address1":"130 Old Route 103","address2":"","city":"Chester","state":"VT","postalCode":"05143","coordinates":{"lat":43.224335,"lng":-72.54227399999999}},{"address1":"10826 Pointe Royal Drive","address2":"","city":"Bakersfield","state":"CA","postalCode":"93311","coordinates":{"lat":35.2930007,"lng":-119.1225908}},{"address1":"74 Ranch Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.383322,"lng":-86.235124}},{"address1":"6601 West Ocotillo Road","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.53433,"lng":-112.2011246}},{"address1":"19416 Barclay Road","address2":"","city":"Castro Valley","state":"CA","postalCode":"94546","coordinates":{"lat":37.70382,"lng":-122.091054}},{"address1":"1347 Blackwalnut Court","address2":"","city":"Annapolis","state":"MD","postalCode":"21403","coordinates":{"lat":38.936881,"lng":-76.475823}},{"address1":"1770 Colony Way","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0867,"lng":-94.229754}},{"address1":"165 Saint John Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7762171,"lng":-72.5410548}},{"address1":"2409 Research Boulevard","address2":"","city":"Fort Collins","state":"CO","postalCode":"80526","coordinates":{"lat":40.554586,"lng":-105.087852}},{"address1":"1903 Bashford Manor Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40218","coordinates":{"lat":38.1977059,"lng":-85.675288}},{"address1":"8315 Surf Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32408","coordinates":{"lat":30.163458,"lng":-85.785449}},{"address1":"3301 Old Muldoon Road","address2":"","city":"Anchorage","state":"AK","postalCode":"99504","coordinates":{"lat":61.1908348,"lng":-149.7340096}},{"address1":"8800 Cordell Circle","address2":"#APT 000003","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.1409305,"lng":-149.9437822}},{"address1":"117 East Cook Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.230336,"lng":-149.883795}},{"address1":"6231 North 67th Avenue","address2":"#241","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5279666,"lng":-112.2022551}},{"address1":"8505 Waters Avenue","address2":"#66","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":31.9901877,"lng":-81.1070672}},{"address1":"7 Underwood Place Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20012","coordinates":{"lat":38.969351,"lng":-77.009722}},{"address1":"21950 Arnold Center Road","address2":"","city":"Carson","state":"CA","postalCode":"90810","coordinates":{"lat":33.8272706,"lng":-118.2302826}},{"address1":"1427 South Carolina Avenue Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20003","coordinates":{"lat":38.886615,"lng":-76.9845349}},{"address1":"1420 Turtleback Trail","address2":"","city":"Panama City","state":"FL","postalCode":"32413","coordinates":{"lat":30.281084,"lng":-85.9677169}},{"address1":"6990 Pierson Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.824425,"lng":-105.122103}},{"address1":"376 North Williams Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.067997,"lng":-94.142563}},{"address1":"3617 Menlo Court","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.307397,"lng":-86.26001099999999}},{"address1":"711 Parker Street","address2":"","city":"East Longmeadow","state":"MA","postalCode":"01028","coordinates":{"lat":42.082262,"lng":-72.488113}},{"address1":"8521 Crystal Street","address2":"","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.143426,"lng":-149.94665}},{"address1":"1622 Edgar D Nixon Avenue","address2":"","city":"Montgomery","state":"AL","postalCode":"36104","coordinates":{"lat":32.356384,"lng":-86.3128909}},{"address1":"1608 Gales Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.8985542,"lng":-76.9813444}},{"address1":"122 East Hayes Street","address2":"","city":"Norman","state":"OK","postalCode":"73069","coordinates":{"lat":35.232121,"lng":-97.445053}},{"address1":"5144 Cattail Court","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.041153,"lng":-94.087419}},{"address1":"131 Kent Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.803084,"lng":-72.492786}},{"address1":"2313 Vegas Avenue","address2":"","city":"Castro Valley","state":"CA","postalCode":"94546","coordinates":{"lat":37.689189,"lng":-122.076775}},{"address1":"5420 Sunset Avenue","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32408","coordinates":{"lat":30.145603,"lng":-85.755095}},{"address1":"242 North Ash Street","address2":"","city":"Fruita","state":"CO","postalCode":"81521","coordinates":{"lat":39.161544,"lng":-108.725378}},{"address1":"38676 Greenwich Circle","address2":"","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.562256,"lng":-121.976451}},{"address1":"2426 East Onyx Trail","address2":"#6","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.065707,"lng":-94.1276125}},{"address1":"110 Seaton Place Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.9146701,"lng":-77.01264680000001}},{"address1":"5385 Iris Street","address2":"","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.794498,"lng":-105.106056}},{"address1":"5628 West Tonopah Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6710947,"lng":-112.1810955}},{"address1":"65 Bay Drive","address2":"","city":"Annapolis","state":"MD","postalCode":"21403","coordinates":{"lat":38.937493,"lng":-76.45638699999999}},{"address1":"7401 North 61st Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5450005,"lng":-112.191417}},{"address1":"8 Watkins Road","address2":"","state":"VT","postalCode":"05468","coordinates":{"lat":44.6028809,"lng":-73.17689299999999}},{"address1":"2209 June Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37214","coordinates":{"lat":36.16848,"lng":-86.695241}},{"address1":"1840 Nobel Place","address2":"","city":"Louisville","state":"KY","postalCode":"40216","coordinates":{"lat":38.198892,"lng":-85.8090129}},{"address1":"2622 Martin Luther King Junior Boulevard","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.053922,"lng":-94.1973008}},{"address1":"4 Glen Circle","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21060","coordinates":{"lat":39.157751,"lng":-76.60633399999999}},{"address1":"7529 West 72nd Avenue","address2":"#4","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8276128,"lng":-105.0799305}},{"address1":"10996 Largo Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.99178,"lng":-81.14366799999999}},{"address1":"2027 North Shannon Drive","address2":"#5","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0892622,"lng":-94.17333020000001}},{"address1":"154 Boca Lagoon Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32408","coordinates":{"lat":30.171012,"lng":-85.77501099999999}},{"address1":"3311 Wiley Post Loop","address2":"","city":"Anchorage","state":"AK","postalCode":"99517","coordinates":{"lat":61.18686499999999,"lng":-149.946288}},{"address1":"5055 West 58th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.8024171,"lng":-105.0505121}},{"address1":"3228 Chettenham Drive","address2":"","city":"Rancho Cordova","state":"CA","postalCode":"95670","coordinates":{"lat":38.577813,"lng":-121.301333}},{"address1":"1901 North Midwest Boulevard","address2":"","city":"Edmond","state":"OK","postalCode":"73034","coordinates":{"lat":35.67413,"lng":-97.39058399999999}},{"address1":"1536 North Main Street","address2":"","city":"Salinas","state":"CA","postalCode":"93906","coordinates":{"lat":36.7122208,"lng":-121.6522485}},{"address1":"33 Linscott Road","address2":"","city":"Hingham","state":"MA","postalCode":"02043","coordinates":{"lat":42.2257391,"lng":-70.8828675}},{"address1":"1732 27th Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94601","coordinates":{"lat":37.783431,"lng":-122.228238}},{"address1":"22 Gallatin Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.9526368,"lng":-77.0080993}},{"address1":"8125 Glynnwood Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.341844,"lng":-86.14093}},{"address1":"2139 Glynnwood Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31404","coordinates":{"lat":32.021538,"lng":-81.06860999999999}},{"address1":"14 School Street","address2":"","city":"Medway","state":"MA","postalCode":"02053","coordinates":{"lat":42.141711,"lng":-71.395014}},{"address1":"264 Crest Drive","address2":"","city":"Soldotna","state":"AK","postalCode":"99669","coordinates":{"lat":60.497608,"lng":-151.080848}},{"address1":"307 Joel Street","address2":"","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.123265,"lng":-81.24991}},{"address1":"188 River Road","address2":"","city":"Essex","state":"VT","postalCode":"05452","coordinates":{"lat":44.478846,"lng":-73.058294}},{"address1":"1643 Oxford Street","address2":"R C","city":"Berkeley","state":"CA","postalCode":"94709","coordinates":{"lat":37.877894,"lng":-122.266436}},{"address1":"5545 Saddlewood Lane","address2":"","city":"Brentwood","state":"TN","postalCode":"37027","coordinates":{"lat":36.026888,"lng":-86.7576629}},{"address1":"26466 Mockingbird Lane","address2":"","city":"Hayward","state":"CA","postalCode":"94544","coordinates":{"lat":37.6410262,"lng":-122.0864272}},{"address1":"4840 Reservoir Road Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20007","coordinates":{"lat":38.9158933,"lng":-77.0962873}},{"address1":"599 Cambridge Street","address2":"#303","city":"Cambridge","state":"MA","postalCode":"02141","coordinates":{"lat":42.3720518,"lng":-71.08610949999999}},{"address1":"584 Rural Hill Road","address2":"","city":"Nashville","state":"TN","postalCode":"37217","coordinates":{"lat":36.089291,"lng":-86.621854}},{"address1":"10262 West 59th Avenue","address2":"#1","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.803718,"lng":-105.111974}},{"address1":"945 South 5th Street","address2":"#1020","city":"Louisville","state":"KY","postalCode":"40203","coordinates":{"lat":38.2402351,"lng":-85.76031119999999}},{"address1":"2543 The Meadows","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.3463001,"lng":-86.2185382}},{"address1":"153 Atlantic Avenue","address2":"#6","city":"Salisbury","state":"MA","postalCode":"01952","coordinates":{"lat":42.8339101,"lng":-70.81575269999999}},{"address1":"9 Brooklyn Street","address2":"","state":"VT","postalCode":"05488","coordinates":{"lat":44.924599,"lng":-73.12809399999999}},{"address1":"5722 8th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.959305,"lng":-77.024463}},{"address1":"8700 Seaton Boulevard","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.3378676,"lng":-86.1731595}},{"address1":"1004 Bellflower Street","address2":"","city":"Livermore","state":"CA","postalCode":"94551","coordinates":{"lat":37.710745,"lng":-121.732765}},{"address1":"4738 Mallard Common","address2":"","city":"Fremont","state":"CA","postalCode":"94555","coordinates":{"lat":37.5666441,"lng":-122.0444344}},{"address1":"875 Latouche Street","address2":"#APT 001010","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.2132529,"lng":-149.8608243}},{"address1":"4940 Fuller Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36110","coordinates":{"lat":32.42936,"lng":-86.21683519999999}},{"address1":"5754 Belleau Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.394398,"lng":-86.203138}},{"address1":"1403 Lincoln Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.0613716,"lng":-81.09482249999999}},{"address1":"140 South Hill Avenue","address2":"#305","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0618737,"lng":-94.16920189999999}},{"address1":"642 South 2nd Street","address2":"#608","city":"Louisville","state":"KY","postalCode":"40202","coordinates":{"lat":38.2472593,"lng":-85.7549195}},{"address1":"6473 Zephyr Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.814341,"lng":-105.085116}},{"address1":"4250 North Valley Lake Drive","address2":"#8","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1279064,"lng":-94.12180719999999}},{"address1":"565 North Lakeshore Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.246868,"lng":-85.918511}},{"address1":"5514 West Wedington Drive","address2":"#3","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.079411,"lng":-94.240031}},{"address1":"1909 Wainwright Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.183868,"lng":-85.722174}},{"address1":"4525 West Frier Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5488732,"lng":-112.1565998}},{"address1":"201 West Montgomery Cross Road","address2":"#170","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":31.9996137,"lng":-81.13121}},{"address1":"915 Heath Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.363883,"lng":-86.333247}},{"address1":"95 Briarwood Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.745751,"lng":-72.542544}},{"address1":"69 Washington Street","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.78712489999999,"lng":-72.52083069999999}},{"address1":"2900 North Western Avenue","address2":"","city":"Edmond","state":"OK","postalCode":"73012","coordinates":{"lat":35.687568,"lng":-97.53227299999999}},{"address1":"7841 West Kristal Way","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.658804,"lng":-112.228834}},{"address1":"361 Parmley Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37207","coordinates":{"lat":36.2446128,"lng":-86.8197718}},{"address1":"6120 Southeast 84th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73135","coordinates":{"lat":35.380836,"lng":-97.41582}},{"address1":"9428 North 65th Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.571222,"lng":-112.20045}},{"address1":"11 Meeting Place Circle","address2":"","city":"Boxford","state":"MA","postalCode":"01921","coordinates":{"lat":42.6946519,"lng":-71.0008529}},{"address1":"4438 Maine Avenue","address2":"","city":"Baldwin Park","state":"CA","postalCode":"91706","coordinates":{"lat":34.093409,"lng":-117.959953}},{"address1":"65 Jones Lane","address2":"","city":"Montevallo","state":"AL","postalCode":"35115","coordinates":{"lat":33.096851,"lng":-86.846577}},{"address1":"3140 Commander Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40220","coordinates":{"lat":38.215781,"lng":-85.653981}},{"address1":"107 Guaymas Place","address2":"","city":"Davis","state":"CA","postalCode":"95616","coordinates":{"lat":38.567048,"lng":-121.746046}},{"address1":"6114 West Glenn Drive","address2":"#1","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5401454,"lng":-112.1912722}},{"address1":"622 Thomas Street","address2":"","city":"Woodland","state":"CA","postalCode":"95776","coordinates":{"lat":38.672731,"lng":-121.76065}},{"address1":"127 Grand Heron Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32407","coordinates":{"lat":30.189702,"lng":-85.80841099999999}},{"address1":"3504 East 16th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99508","coordinates":{"lat":61.2058945,"lng":-149.8158624}},{"address1":"1230 Stafford Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.32403,"lng":-86.14840099999999}},{"address1":"6007 Yarrow Street","address2":"H","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.806211,"lng":-105.084446}},{"address1":"632 Belmar Drive","address2":"","city":"Edmond","state":"OK","postalCode":"73025","coordinates":{"lat":35.7016024,"lng":-97.4912627}},{"address1":"1515 Chandlee Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.176365,"lng":-85.666253}},{"address1":"10632 Admiral Court","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73162","coordinates":{"lat":35.57886200000001,"lng":-97.6270728}},{"address1":"11655 West 81st Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.84356820000001,"lng":-105.1297584}},{"address1":"3500 Blanchard Drive Southwest","address2":"","city":"Washington","state":"DC","postalCode":"20032","coordinates":{"lat":38.8388931,"lng":-77.02011139999999}},{"address1":"2755 Country Drive","address2":"#244","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.557882,"lng":-121.986823}},{"address1":"1850 Berryhill Place","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.3527548,"lng":-86.16858669999999}},{"address1":"58 North U.S.A Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":35.994914,"lng":-94.185867}},{"address1":"8785 Ellis Court","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.853725,"lng":-105.158861}},{"address1":"1636 Briarview Court","address2":"","city":"Severn","state":"MD","postalCode":"21144","coordinates":{"lat":39.12539599999999,"lng":-76.704015}},{"address1":"12 Knox Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.774166,"lng":-72.527697}},{"address1":"425 Middle Turnpike East","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7847772,"lng":-72.50354829999999}},{"address1":"2017 North Hartford Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.08820499999999,"lng":-94.1074905}},{"address1":"5900 Upland Road","address2":"","city":"Brooklyn Park","state":"MD","postalCode":"21225","coordinates":{"lat":39.213888,"lng":-76.61925099999999}},{"address1":"9331 Edison Road","address2":"","city":"Lithia","state":"FL","postalCode":"33547","coordinates":{"lat":27.86851,"lng":-82.07391199999999}},{"address1":"1810 Orchard Place","address2":"","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.145912,"lng":-149.9134259}},{"address1":"145 Grau Drive","address2":"","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.582453,"lng":-121.994476}},{"address1":"3959 Fairlands Drive","address2":"","city":"Pleasanton","state":"CA","postalCode":"94588","coordinates":{"lat":37.6992001,"lng":-121.8703701}},{"address1":"3613 East 18th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99508","coordinates":{"lat":61.20485339999999,"lng":-149.8135521}},{"address1":"1275 South Holland Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.051782,"lng":-94.226855}},{"address1":"109 Cambridge Station Road","address2":"","city":"Louisville","state":"KY","postalCode":"40223","coordinates":{"lat":38.244527,"lng":-85.56912799999999}},{"address1":"2107 Elfen Glen","address2":"Apt B","city":"Van Buren","state":"AR","postalCode":"72956","coordinates":{"lat":35.469752,"lng":-94.364987}},{"address1":"8522 Ingalls Circle","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8528593,"lng":-105.0629778}},{"address1":"1809 Cedar Drive","address2":"","city":"Severn","state":"MD","postalCode":"21144","coordinates":{"lat":39.139311,"lng":-76.72028999999999}},{"address1":"1376 Oakland Avenue","address2":"#1","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.080981,"lng":-94.172549}},{"address1":"4306 Bylsma Circle","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.223294,"lng":-85.589715}},{"address1":"233 Buckland Hills Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.8100683,"lng":-72.5453665}},{"address1":"7701 Southwest 104th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73169","coordinates":{"lat":35.3641983,"lng":-97.6475346}},{"address1":"14003 Crossbranch Court","address2":"","city":"Louisville","state":"KY","postalCode":"40245","coordinates":{"lat":38.242033,"lng":-85.489885}},{"address1":"19590 East Batavia Drive","address2":"","city":"Aurora","state":"CO","postalCode":"80011","coordinates":{"lat":39.7420886,"lng":-104.7581149}},{"address1":"6424 Simms Street","address2":"#71","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8133443,"lng":-105.1283237}},{"address1":"718 Dutchmans Court","address2":"","city":"Nashville","state":"TN","postalCode":"37076","coordinates":{"lat":36.2048851,"lng":-86.5994752}},{"address1":"8496 Isles Court","address2":"","city":"Pasadena","state":"MD","postalCode":"21122","coordinates":{"lat":39.111297,"lng":-76.467049}},{"address1":"100 East Joyce Boulevard","address2":"#110","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1253411,"lng":-94.1551631}},{"address1":"9036 Calico Court","address2":"","city":"Hesperia","state":"CA","postalCode":"92344","coordinates":{"lat":34.414491,"lng":-117.375403}},{"address1":"2723 East Joyce Boulevard","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.119414,"lng":-94.12229500000001}},{"address1":"90 Via Verde","address2":"","city":"San Lorenzo","state":"CA","postalCode":"94580","coordinates":{"lat":37.67869,"lng":-122.117142}},{"address1":"1015 Castle Road","address2":"","city":"Edmond","state":"OK","postalCode":"73034","coordinates":{"lat":35.665019,"lng":-97.466045}},{"address1":"2787 West Blackstone Crossing","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0608984,"lng":-94.1993461}},{"address1":"3555 Alamosa Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.142316,"lng":-149.9454749}},{"address1":"6231 North 59th Avenue","address2":"#35","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5285304,"lng":-112.1860744}},{"address1":"311 South Panama Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36107","coordinates":{"lat":32.376833,"lng":-86.27416099999999}},{"address1":"3313 Daisy Trail","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.076186,"lng":-86.60113799999999}},{"address1":"5436 Dorbrandt Street","address2":"#APT 000002","city":"Anchorage","state":"AK","postalCode":"99518","coordinates":{"lat":61.17090200000001,"lng":-149.904782}},{"address1":"553 South Arlington Road","address2":"","city":"Orange","state":"CA","postalCode":"92869","coordinates":{"lat":33.7794839,"lng":-117.820383}},{"address1":"615 Q Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.9113118,"lng":-77.0206808}},{"address1":"457 Mountain Village Boulevard","address2":"#320-3","city":"Mountain Village","state":"CO","postalCode":"81435","coordinates":{"lat":37.93323040000001,"lng":-107.8515732}},{"address1":"144 Lauderdale Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.309978,"lng":-86.259716}},{"address1":"2 Ambelwood Way","address2":"","city":"Savannah","state":"GA","postalCode":"31411","coordinates":{"lat":31.9138389,"lng":-81.07297989999999}},{"address1":"4113 Holiday Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32408","coordinates":{"lat":30.1548681,"lng":-85.7709976}},{"address1":"2001 Van Hoose Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.039421,"lng":-94.065534}},{"address1":"9457 Winfield Place","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.341347,"lng":-86.14867799999999}},{"address1":"1120 Mitchell Young Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.327464,"lng":-86.44011599999999}},{"address1":"12816 West 65th Way","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8141779,"lng":-105.1426275}},{"address1":"10 Erick Road","address2":"#47","city":"Mansfield","state":"MA","postalCode":"02048","coordinates":{"lat":42.032505,"lng":-71.17718599999999}},{"address1":"481 East Redbud Lane","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.103899,"lng":-94.151128}},{"address1":"320 Northwest 22nd Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73103","coordinates":{"lat":35.491908,"lng":-97.51843099999999}},{"address1":"33 South Hill Avenue","address2":"#306","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0619602,"lng":-94.16977700000001}},{"address1":"355 Gillette Road","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.061143,"lng":-86.70823299999999}},{"address1":"151 Main Street","address2":"","city":"Savannah","state":"GA","postalCode":"31408","coordinates":{"lat":32.113199,"lng":-81.148934}},{"address1":"545 Tracey Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.1354251,"lng":-85.5573034}},{"address1":"3 Southerberry Drive","address2":"","state":"VT","postalCode":"05468","coordinates":{"lat":44.62322460000001,"lng":-73.1326629}},{"address1":"736 Sicard Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20003","coordinates":{"lat":38.8729038,"lng":-76.9949528}},{"address1":"6214 Herzog Street","address2":"","city":"Oakland","state":"CA","postalCode":"94608","coordinates":{"lat":37.84557849999999,"lng":-122.2825201}},{"address1":"1160 North College Avenue","address2":"#2","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0785477,"lng":-94.1566273}},{"address1":"5843 West McLellan Road","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5330898,"lng":-112.1857087}},{"address1":"1452 55th Avenue","address2":"B","city":"Oakland","state":"CA","postalCode":"94621","coordinates":{"lat":37.767671,"lng":-122.202326}},{"address1":"4255 Tanager Common","address2":"","city":"Fremont","state":"CA","postalCode":"94555","coordinates":{"lat":37.5738888,"lng":-122.0460256}},{"address1":"13426 West Rovey Avenue","address2":"","city":"Litchfield Park","state":"AZ","postalCode":"85340","coordinates":{"lat":33.522973,"lng":-112.34802}},{"address1":"195 Nursery Street","address2":"#D10","city":"Springfield","state":"MA","postalCode":"01104","coordinates":{"lat":42.1178409,"lng":-72.5892289}},{"address1":"126 Marjorie Lane","address2":"C","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.8073257,"lng":-72.5188292}},{"address1":"22 Charnock Street","address2":"#2","city":"Beverly","state":"MA","postalCode":"01915","coordinates":{"lat":42.55227,"lng":-70.876549}},{"address1":"817 25th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20037","coordinates":{"lat":38.900077,"lng":-77.053066}},{"address1":"2552 Massachusetts Avenue Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20008","coordinates":{"lat":38.9165459,"lng":-77.057323}},{"address1":"1711 Lore Road","address2":"#APT 000106","city":"Anchorage","state":"AK","postalCode":"99507","coordinates":{"lat":61.15195259999999,"lng":-149.8511487}},{"address1":"19091 Northeast 23rd Street","address2":"","city":"Harrah","state":"OK","postalCode":"73045","coordinates":{"lat":35.493447,"lng":-97.193078}},{"address1":"8318 North 57th Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.557537,"lng":-112.183238}},{"address1":"7256 West 84th Way","address2":"#918","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8506912,"lng":-105.0767393}},{"address1":"706 Seagrove Road","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21060","coordinates":{"lat":39.163384,"lng":-76.609205}},{"address1":"2318 Camryns Crossing","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.221926,"lng":-85.62420000000002}},{"address1":"968 Virginia Avenue","address2":"","city":"Olivehurst","state":"CA","postalCode":"95961","coordinates":{"lat":39.1022419,"lng":-121.581218}},{"address1":"416 South University Boulevard","address2":"","city":"Norman","state":"OK","postalCode":"73069","coordinates":{"lat":35.215351,"lng":-97.446319}},{"address1":"137 Gazebo East Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.3793507,"lng":-86.20407399999999}},{"address1":"10723 Colonial Woods Court","address2":"","city":"Louisville","state":"KY","postalCode":"40223","coordinates":{"lat":38.2496439,"lng":-85.55717709999999}},{"address1":"119 Matthew Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37215","coordinates":{"lat":36.11663619999999,"lng":-86.80955829999999}},{"address1":"3142 West Finger Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.042837,"lng":-94.205309}},{"address1":"4 Elm Street","address2":"","city":"Windsor","state":"VT","postalCode":"05089","coordinates":{"lat":43.476997,"lng":-72.398925}},{"address1":"78 School Street","address2":"","city":"Woburn","state":"MA","postalCode":"01801","coordinates":{"lat":42.506877,"lng":-71.15299}},{"address1":"19020 North 68th Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6574037,"lng":-112.2062039}},{"address1":"2849 Quail Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.095294,"lng":-94.20036300000001}},{"address1":"2456 22nd Avenue","address2":"","city":"Greeley","state":"CO","postalCode":"80631","coordinates":{"lat":40.397153,"lng":-104.713982}},{"address1":"200 Boulder Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7792079,"lng":-72.494963}},{"address1":"11150 Sun Valley Drive","address2":"","city":"Oakland","state":"CA","postalCode":"94605","coordinates":{"lat":37.752039,"lng":-122.11822}},{"address1":"505 Southeast 32nd Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73129","coordinates":{"lat":35.4325058,"lng":-97.5032743}},{"address1":"1025 West 19th Street","address2":"#UNIT 1-C","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.18252889999999,"lng":-85.676771}},{"address1":"6725 Pamela Court","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.334546,"lng":-86.20349999999999}},{"address1":"4714 Narrow Lane Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.3140725,"lng":-86.2819674}},{"address1":"11 Proctor Circle","address2":"","city":"Peabody","state":"MA","postalCode":"01960","coordinates":{"lat":42.535503,"lng":-70.953384}},{"address1":"10508 Kovats Court","address2":"","city":"Louisville","state":"KY","postalCode":"40223","coordinates":{"lat":38.2330381,"lng":-85.5695464}},{"address1":"3179 18th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20010","coordinates":{"lat":38.9312712,"lng":-77.0412983}},{"address1":"3194 Bladensburg Road Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20018","coordinates":{"lat":38.930136,"lng":-76.95929799999999}},{"address1":"260 Rio Del Mar Boulevard","address2":"##14","city":"Aptos","state":"CA","postalCode":"95003","coordinates":{"lat":36.967915,"lng":-121.902513}},{"address1":"1040 West 27th Avenue","address2":"#APT 000401","city":"Anchorage","state":"AK","postalCode":"99503","coordinates":{"lat":61.195892,"lng":-149.901984}},{"address1":"42 Lake Lane","address2":"","city":"Westmore","state":"VT","postalCode":"05860","coordinates":{"lat":44.77954099999999,"lng":-72.0682889}},{"address1":"3718 Bay Tree Road","address2":"","city":"Lynn Haven","state":"FL","postalCode":"32444","coordinates":{"lat":30.205726,"lng":-85.63441999999999}},{"address1":"3408 Bellisima Place","address2":"#204","city":"Louisville","state":"KY","postalCode":"40245","coordinates":{"lat":38.2857023,"lng":-85.5023064}},{"address1":"4109 General Bate Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37204","coordinates":{"lat":36.099427,"lng":-86.787756}},{"address1":"5329 A Street","address2":"","city":"Greeley","state":"CO","postalCode":"80634","coordinates":{"lat":40.4347001,"lng":-104.7702805}},{"address1":"88 Shute Street","address2":"#1","city":"Everett","state":"MA","postalCode":"02149","coordinates":{"lat":42.4192568,"lng":-71.0469179}},{"address1":"480 Keene Road","address2":"","city":"Walden","state":"VT","postalCode":"05836","coordinates":{"lat":44.4879516,"lng":-72.2823264}},{"address1":"4 Cutting Avenue","address2":"","city":"Worcester","state":"MA","postalCode":"01606","coordinates":{"lat":42.307664,"lng":-71.79180099999999}},{"address1":"275 South 40th Street","address2":"","city":"Boulder","state":"CO","postalCode":"80305","coordinates":{"lat":39.988864,"lng":-105.247011}},{"address1":"1189 Northwest End Avenue","address2":"#D3","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0793885,"lng":-94.19657190000001}},{"address1":"25 Cliffside Drive","address2":"D","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.79505229999999,"lng":-72.48762169999999}},{"address1":"2515 60th Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94605","coordinates":{"lat":37.7705346,"lng":-122.1907449}},{"address1":"2057 Lucas Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36107","coordinates":{"lat":32.3934472,"lng":-86.2766814}},{"address1":"386 Daniels Road","address2":"","city":"New Haven","state":"VT","postalCode":"05472","coordinates":{"lat":44.114323,"lng":-73.1911159}},{"address1":"9805 Meadow Vale Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40242","coordinates":{"lat":38.281955,"lng":-85.57182100000001}},{"address1":"8 Village Circle","address2":"","city":"Randolph","state":"VT","postalCode":"05060","coordinates":{"lat":43.927687,"lng":-72.65563}},{"address1":"1011 San Jose Street","address2":"","city":"San Leandro","state":"CA","postalCode":"94577","coordinates":{"lat":37.72956300000001,"lng":-122.147074}},{"address1":"2505 Walker Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37207","coordinates":{"lat":36.2125119,"lng":-86.806625}},{"address1":"11225 West 79th Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.840784,"lng":-105.124533}},{"address1":"1907 18th Avenue South","address2":"","city":"Nashville","state":"TN","postalCode":"37212","coordinates":{"lat":36.134703,"lng":-86.79737700000001}},{"address1":"16 Conway Street","address2":"","city":"Shelburne Falls","state":"MA","postalCode":"01370","coordinates":{"lat":42.6022637,"lng":-72.74100059999999}},{"address1":"20375 Wisteria Street","address2":"","city":"Castro Valley","state":"CA","postalCode":"94546","coordinates":{"lat":37.696683,"lng":-122.085865}},{"address1":"6408 Fern Crest Road","address2":"","city":"Louisville","state":"KY","postalCode":"40291","coordinates":{"lat":38.154488,"lng":-85.612144}},{"address1":"175 Creek Road","address2":"","city":"Castleton","state":"VT","postalCode":"05735","coordinates":{"lat":43.6055996,"lng":-73.2336737}},{"address1":"2531 Prestwick Avenue","address2":"","city":"Concord","state":"CA","postalCode":"94519","coordinates":{"lat":37.9966039,"lng":-122.0280747}},{"address1":"1002 Highland Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40204","coordinates":{"lat":38.2371577,"lng":-85.7367362}},{"address1":"2927 Leatherwood Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37214","coordinates":{"lat":36.156413,"lng":-86.65534099999999}},{"address1":"8467 Chase Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.851766,"lng":-105.071498}},{"address1":"8556 Nelson Court","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.850965,"lng":-105.117879}},{"address1":"122 Summer Street","address2":"#1","city":"Medford","state":"MA","postalCode":"02155","coordinates":{"lat":42.415648,"lng":-71.116886}},{"address1":"12061 Johns Road","address2":"#APT 000002","city":"Anchorage","state":"AK","postalCode":"99515","coordinates":{"lat":61.111453,"lng":-149.8780899}},{"address1":"8358 WB&A Road","address2":"","city":"Severn","state":"MD","postalCode":"21144","coordinates":{"lat":39.108962,"lng":-76.68668799999999}},{"address1":"43 Henderson Avenue","address2":"","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":31.97937899999999,"lng":-81.06062}},{"address1":"347 Brewer Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.054592,"lng":-86.708157}},{"address1":"2765 North Barcelona Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.102026,"lng":-94.15365}},{"address1":"5311 Chenoweth Park Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40291","coordinates":{"lat":38.168051,"lng":-85.571491}},{"address1":"6398 Jellison Way","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8118489,"lng":-105.1121974}},{"address1":"604 Northwest 118th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73114","coordinates":{"lat":35.5902559,"lng":-97.523444}},{"address1":"37 Rushforde Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.738226,"lng":-72.538398}},{"address1":"5434 West Beck Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.6266139,"lng":-112.176412}},{"address1":"1516 Ringe Drive","address2":"","city":"Severn","state":"MD","postalCode":"21144","coordinates":{"lat":39.094173,"lng":-76.68423299999999}},{"address1":"3701 Lake Towne Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.068871,"lng":-86.612042}},{"address1":"20250 North 67th Avenue","address2":"#2143","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6705359,"lng":-112.2044722}},{"address1":"62 Prospect Avenue","address2":"#1","city":"Quincy","state":"MA","postalCode":"02170","coordinates":{"lat":42.261576,"lng":-71.020522}},{"address1":"25 Morton Street","address2":"#216","city":"Quincy","state":"MA","postalCode":"02169","coordinates":{"lat":42.24450900000001,"lng":-71.021176}},{"address1":"8202 4 Winds Drive","address2":"#3","city":"Lyndon","state":"KY","postalCode":"40222","coordinates":{"lat":38.26545309999999,"lng":-85.60216830000002}},{"address1":"513 Habberton Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.107299,"lng":-94.053033}},{"address1":"1960 Sigfrid Court","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":38.998796,"lng":-76.564554}},{"address1":"663 Chesapeake Way","address2":"#1","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0498647,"lng":-94.1504411}},{"address1":"3354 Wilmington Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36105","coordinates":{"lat":32.345724,"lng":-86.301384}},{"address1":"8529 Old Harding Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37221","coordinates":{"lat":36.027995,"lng":-87.014506}},{"address1":"22219 Panama City Beach Parkway","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.2620426,"lng":-85.96316709999999}},{"address1":"37 East Broad Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.0776278,"lng":-81.08469219999999}},{"address1":"1309 Columbia Road Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20009","coordinates":{"lat":38.9275945,"lng":-77.0307141}},{"address1":"1211 Castine Court","address2":"","city":"Pasadena","state":"MD","postalCode":"21122","coordinates":{"lat":39.1404092,"lng":-76.5313772}},{"address1":"906 West Berry Street","address2":"#204","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0760793,"lng":-94.1723526}},{"address1":"341 Oakland Street","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.805274,"lng":-72.5180772}},{"address1":"60 Downey Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7786337,"lng":-72.5757232}},{"address1":"3770 North Front Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1183319,"lng":-94.1443548}},{"address1":"25 Church Street","address2":"A","city":"Pittsfield","state":"MA","postalCode":"01201","coordinates":{"lat":42.446859,"lng":-73.255836}},{"address1":"6578 Marauder Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37209","coordinates":{"lat":36.142929,"lng":-86.885521}},{"address1":"2747 68th Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94605","coordinates":{"lat":37.768532,"lng":-122.180694}},{"address1":"95 Woods Hill Road","address2":"","state":"VT","postalCode":"05488","coordinates":{"lat":44.897682,"lng":-73.0753299}},{"address1":"35 Keach Avenue","address2":"","city":"Worcester","state":"MA","postalCode":"01607","coordinates":{"lat":42.2269409,"lng":-71.801441}},{"address1":"1822 North Grand Avenue","address2":"","city":"Pueblo","state":"CO","postalCode":"81003","coordinates":{"lat":38.284427,"lng":-104.611581}},{"address1":"1809 U.S. 80","address2":"","city":"Savannah","state":"GA","postalCode":"31408","coordinates":{"lat":32.0847824,"lng":-81.16739679999999}},{"address1":"5065 North 54th Avenue","address2":"#8","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5118429,"lng":-112.1748805}},{"address1":"1261 Steamboat Drive","address2":"#3","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0804859,"lng":-94.2049698}},{"address1":"1695 Archer Street","address2":"","city":"Savannah","state":"GA","postalCode":"31405","coordinates":{"lat":32.0475974,"lng":-81.13348289999999}},{"address1":"3904 October Woods Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.009291,"lng":-86.624016}},{"address1":"1223 Delaware Avenue","address2":"","city":"Deale","state":"MD","postalCode":"20733","coordinates":{"lat":38.799962,"lng":-76.51803699999999}},{"address1":"10383 Eagle River Lane","address2":"","city":"Anchorage","state":"AK","postalCode":"99577","coordinates":{"lat":61.31412899999999,"lng":-149.509103}},{"address1":"1314 89th Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94621","coordinates":{"lat":37.7497401,"lng":-122.1762833}},{"address1":"21 Longview Bluff Drive East","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.95754299999999,"lng":-81.13848899999999}},{"address1":"1689 Fisher Pond Road","address2":"","city":"Saint Albans City","state":"VT","postalCode":"05478","coordinates":{"lat":44.826977,"lng":-73.055054}},{"address1":"9920 West 81st Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8446204,"lng":-105.1083834}},{"address1":"2732 Rosedale Place","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.1230861,"lng":-86.7625204}},{"address1":"10881 Northforde Drive","address2":"","city":"Cupertino","state":"CA","postalCode":"95014","coordinates":{"lat":37.335812,"lng":-122.023985}},{"address1":"926 Mill Court","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.959343,"lng":-81.142287}},{"address1":"7550 Kline Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8342031,"lng":-105.1106565}},{"address1":"5688 Johnson Court","address2":"","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.798419,"lng":-105.109316}},{"address1":"4439 Gale Street","address2":"","city":"Livermore","state":"CA","postalCode":"94550","coordinates":{"lat":37.690199,"lng":-121.7411119}},{"address1":"6450 West Bethany Home Road","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5242005,"lng":-112.1991369}},{"address1":"2931 Shady Oaks Drive","address2":"","city":"Evans","state":"CO","postalCode":"80620","coordinates":{"lat":40.384469,"lng":-104.726478}},{"address1":"6451 West Bell Road","address2":"#1144","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6380231,"lng":-112.1986753}},{"address1":"644 West Maple Street","address2":"#2","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0703335,"lng":-94.1686289}},{"address1":"1219 North Storer Avenue","address2":"#66","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.078949,"lng":-94.17225499999999}},{"address1":"152 Holly Court","address2":"","city":"Mountain View","state":"CA","postalCode":"94043","coordinates":{"lat":37.390391,"lng":-122.060062}},{"address1":"6086 Kennedy Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.103629,"lng":-94.24773599999999}},{"address1":"2300 Deer Path Circle","address2":"#207","city":"Hurstbourne Acres","state":"KY","postalCode":"40220","coordinates":{"lat":38.2187876,"lng":-85.59292239999999}},{"address1":"802 East 37th Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.054012,"lng":-81.087324}},{"address1":"5821 Taft Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8029119,"lng":-105.1308558}},{"address1":"188 Saint Matthews Avenue","address2":"#1","city":"Louisville","state":"KY","postalCode":"40207","coordinates":{"lat":38.2577576,"lng":-85.6546706}},{"address1":"68 Hampstead Place","address2":"","city":"Athol","state":"MA","postalCode":"01331","coordinates":{"lat":42.5894395,"lng":-72.2275859}},{"address1":"3164 West Woodfield Way","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.084691,"lng":-94.20445}},{"address1":"7998 Chase Circle","address2":"#1","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.841232,"lng":-105.057933}},{"address1":"1797 Pasatiempo Drive","address2":"","city":"Chico","state":"CA","postalCode":"95928","coordinates":{"lat":39.6777229,"lng":-121.7704692}},{"address1":"3722 Kisling Loop","address2":"","city":"Tyndall Air Force Base","state":"FL","postalCode":"32403","coordinates":{"lat":30.1048481,"lng":-85.65097360000001}},{"address1":"429 Patterson Street","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.102655,"lng":-86.744186}},{"address1":"6140 Fenton Street","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8080314,"lng":-105.0601435}},{"address1":"7404 West Crest Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85310","coordinates":{"lat":33.6851098,"lng":-112.2167229}},{"address1":"7841 North 59th Lane","address2":"#G37","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5516587,"lng":-112.1879207}},{"address1":"8043 Cranberry Street","address2":"#APT 000001","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.14769579999999,"lng":-149.9369466}},{"address1":"173 Spruce Street","address2":"#18","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7705332,"lng":-72.51594109999999}},{"address1":"4712 Cherokee Heights Road","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.234223,"lng":-85.566684}},{"address1":"915 Sacramento Street","address2":"","city":"Bakersfield","state":"CA","postalCode":"93305","coordinates":{"lat":35.3798759,"lng":-119.0002119}},{"address1":"317 Windsor Road","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.973034,"lng":-81.141871}},{"address1":"1332 Maple Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.3589738,"lng":-86.3278235}},{"address1":"4709 Blagden Terrace Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.9481213,"lng":-77.0401892}},{"address1":"5102 Ander Drive","address2":"","city":"Brentwood","state":"TN","postalCode":"37027","coordinates":{"lat":36.0025004,"lng":-86.6944901}},{"address1":"6754 Field Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8193709,"lng":-105.097531}},{"address1":"2347 Glen Eagle Drive","address2":"","city":"Northfield","state":"KY","postalCode":"40222","coordinates":{"lat":38.2862836,"lng":-85.6299745}},{"address1":"1613 Maple Timber Court","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.067096,"lng":-86.607005}},{"address1":"269 Park Street","address2":"#1","city":"North Reading","state":"MA","postalCode":"01864","coordinates":{"lat":42.57268,"lng":-71.09888800000002}},{"address1":"6444 North 67th Avenue","address2":"#1081","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5302444,"lng":-112.2049579}},{"address1":"11 Pine Point Road","address2":"","city":"Duxbury","state":"MA","postalCode":"02332","coordinates":{"lat":42.0613192,"lng":-70.6510247}},{"address1":"4136 East Virginia Lane","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.295998,"lng":-86.22073999999999}},{"address1":"5740 North 59th Avenue","address2":"#1156","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5207722,"lng":-112.189044}},{"address1":"95 Central Street","address2":"A","city":"Springfield","state":"MA","postalCode":"01105","coordinates":{"lat":42.098581,"lng":-72.57880999999999}},{"address1":"74 Heard Street","address2":"#1","city":"Chelsea","state":"MA","postalCode":"02150","coordinates":{"lat":42.3972985,"lng":-71.035599}},{"address1":"2500 Snowdoun Chambers Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36105","coordinates":{"lat":32.24569110000001,"lng":-86.2577436}},{"address1":"429 Dennison Ridge Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.750419,"lng":-72.474013}},{"address1":"1208 Lindenwood Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.187016,"lng":-85.681247}},{"address1":"7609 Doris Place","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73162","coordinates":{"lat":35.5759649,"lng":-97.64877299999999}},{"address1":"1915 Southeast 29th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73129","coordinates":{"lat":35.4360844,"lng":-97.4787061}},{"address1":"212 Holiday Circle","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":32.025153,"lng":-81.240329}},{"address1":"32 Amsden Street","address2":"#1","city":"Arlington","state":"MA","postalCode":"02474","coordinates":{"lat":42.4043927,"lng":-71.138137}},{"address1":"4016 Doane Street","address2":"","city":"Fremont","state":"CA","postalCode":"94538","coordinates":{"lat":37.514834,"lng":-121.95302}},{"address1":"8700 Lillington Circle","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.330168,"lng":-86.14481099999999}},{"address1":"7720 Allison Street","address2":"#105","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8383411,"lng":-105.0855734}},{"address1":"17878 Front Beach Road","address2":"#C-2","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.237658,"lng":-85.91577099999999}},{"address1":"1328 Tuckerman Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.9673595,"lng":-77.03106919999999}},{"address1":"4600 East Huntsville Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0476559,"lng":-94.0953342}},{"address1":"5038 North Cimarron Drive","address2":"","city":"Beverly Hills","state":"FL","postalCode":"34465","coordinates":{"lat":28.935938,"lng":-82.527367}},{"address1":"1216 West Hill Street","address2":"M","city":"Louisville","state":"KY","postalCode":"40210","coordinates":{"lat":38.227343,"lng":-85.7764254}},{"address1":"3033 Aubert Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40206","coordinates":{"lat":38.250779,"lng":-85.679931}},{"address1":"17020 West 64th Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.8131034,"lng":-105.1914804}},{"address1":"12420 West Montebello Avenue","address2":"","city":"Litchfield Park","state":"AZ","postalCode":"85340","coordinates":{"lat":33.519491,"lng":-112.32613}},{"address1":"2538 East 40th Plaza","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.221455,"lng":-85.626834}},{"address1":"827 10th Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.901021,"lng":-76.992391}},{"address1":"5912 North 48th Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5231022,"lng":-112.162186}},{"address1":"37 Fieldside Drive","address2":"","city":"Groton","state":"CT","postalCode":"06340","coordinates":{"lat":41.3668422,"lng":-72.07844349999999}},{"address1":"9176 Ellis Way","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8624095,"lng":-105.1574648}},{"address1":"5370 Business Park Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.317376,"lng":-86.232969}},{"address1":"1612 Beech Street","address2":"","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.2296247,"lng":-85.805719}},{"address1":"8532 Ingalls Circle","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8532617,"lng":-105.0629712}},{"address1":"7941 Alpine View Circle","address2":"","city":"Anchorage","state":"AK","postalCode":"99507","coordinates":{"lat":61.1486467,"lng":-149.830947}},{"address1":"8595 West 81st Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8449341,"lng":-105.0937351}},{"address1":"4296 North Blossom Court","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1288759,"lng":-94.1239252}},{"address1":"1738 Annabellas Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32407","coordinates":{"lat":30.1877596,"lng":-85.7782311}},{"address1":"3215 Madsen Street","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.6618825,"lng":-122.0904612}},{"address1":"4 Village Lake Drive","address2":"#4","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0994717,"lng":-94.1570279}},{"address1":"86 Russell Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.77985700000001,"lng":-72.525724}},{"address1":"570 Broadway","address2":"","city":"Lynnfield","state":"MA","postalCode":"01940","coordinates":{"lat":42.517525,"lng":-71.00125799999999}},{"address1":"1405 Monroe Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20017","coordinates":{"lat":38.93258,"lng":-76.98579699999999}},{"address1":"900 North Leverett Avenue","address2":"#126","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0754825,"lng":-94.1696884}},{"address1":"222 Quince Street","address2":"#2-B","city":"San Diego","state":"CA","postalCode":"92103","coordinates":{"lat":32.7368499,"lng":-117.162443}},{"address1":"370 Wallace Road","address2":"#D-28","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.078257,"lng":-86.724182}},{"address1":"6672 Urban Court","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.817946,"lng":-105.13477}},{"address1":"516 Southwest 60th Terrace","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73139","coordinates":{"lat":35.4051605,"lng":-97.5223633}},{"address1":"1513 Southeast 9th Street","address2":"","city":"Moore","state":"OK","postalCode":"73160","coordinates":{"lat":35.329431,"lng":-97.465397}},{"address1":"154 Byrd Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.161691,"lng":-85.59920199999999}},{"address1":"1106 Homer Avenue","address2":"","city":"Savannah","state":"GA","postalCode":"31405","coordinates":{"lat":32.0453896,"lng":-81.12456809999999}},{"address1":"1010 M Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.9054822,"lng":-77.0265494}},{"address1":"5420 Allison Street","address2":"#202","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.7958727,"lng":-105.0858231}},{"address1":"20 Hacker Street","address2":"#3","city":"Worcester","state":"MA","postalCode":"01603","coordinates":{"lat":42.244896,"lng":-71.8175172}},{"address1":"732 Kevin Court","address2":"","city":"Oakland","state":"CA","postalCode":"94621","coordinates":{"lat":37.757904,"lng":-122.206479}},{"address1":"509 Franklin Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20017","coordinates":{"lat":38.9255849,"lng":-76.9990895}},{"address1":"23 Whitcomb Street","address2":"","city":"Springfield","state":"VT","postalCode":"05156","coordinates":{"lat":43.2987361,"lng":-72.4880749}},{"address1":"3377 Sandstone Court","address2":"","city":"Pleasanton","state":"CA","postalCode":"94588","coordinates":{"lat":37.680463,"lng":-121.860128}},{"address1":"14 Huntington Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7772379,"lng":-72.518456}},{"address1":"2802 US Highway 98","address2":"BLDG F","city":"Mexico Beach","state":"FL","postalCode":"32456","coordinates":{"lat":29.9474344,"lng":-85.4170788}},{"address1":"412 Virginia Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40222","coordinates":{"lat":38.2538807,"lng":-85.6152334}},{"address1":"1644 New Jersey Avenue Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.91233,"lng":-77.017736}},{"address1":"832 51st Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20019","coordinates":{"lat":38.9008832,"lng":-76.9273381}},{"address1":"894 Windmill Park Lane","address2":"","city":"Mountain View","state":"CA","postalCode":"94043","coordinates":{"lat":37.399505,"lng":-122.077478}},{"address1":"9636 Morar Road","address2":"","city":"Panama City","state":"FL","postalCode":"32409","coordinates":{"lat":30.324968,"lng":-85.620589}},{"address1":"9472 Noble Way","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.8690661,"lng":-105.1784169}},{"address1":"618 Staley Avenue","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.6629263,"lng":-122.091801}},{"address1":"8704 Bayberry Place","address2":"","city":"Plantation","state":"KY","postalCode":"40242","coordinates":{"lat":38.2814983,"lng":-85.5918425}},{"address1":"2506 West Madison Street","address2":"","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.253755,"lng":-85.7933322}},{"address1":"840 Inglewood Drive","address2":"","city":"West Sacramento","state":"CA","postalCode":"95605","coordinates":{"lat":38.591235,"lng":-121.524984}},{"address1":"10 Dalry Lane","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.941447,"lng":-81.160151}},{"address1":"3301 Nora Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40220","coordinates":{"lat":38.199844,"lng":-85.61509}},{"address1":"8304 Glaser Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40291","coordinates":{"lat":38.1437892,"lng":-85.6080724}},{"address1":"3720 West 86th Avenue","address2":"APT F","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.142615,"lng":-149.949251}},{"address1":"3298 Chestnut Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20015","coordinates":{"lat":38.979577,"lng":-77.061088}},{"address1":"82 Fairfield Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7673619,"lng":-72.53831}},{"address1":"3138 P Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20007","coordinates":{"lat":38.9091118,"lng":-77.0629963}},{"address1":"80 Locust Avenue","address2":"#110","city":"Worcester","state":"MA","postalCode":"01604","coordinates":{"lat":42.266896,"lng":-71.762913}},{"address1":"2715 Thornbrook Court","address2":"","city":"Odenton","state":"MD","postalCode":"21113","coordinates":{"lat":39.06450299999999,"lng":-76.727459}},{"address1":"3579 2nd Avenue","address2":"","city":"Edgewater","state":"MD","postalCode":"21037","coordinates":{"lat":38.91283200000001,"lng":-76.5224099}},{"address1":"6739 Taft Court","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8189901,"lng":-105.1325295}},{"address1":"1528 Stafford Avenue","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.680081,"lng":-122.074569}},{"address1":"2024 Merrily Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36111","coordinates":{"lat":32.3328739,"lng":-86.28072999999999}},{"address1":"2034 Fairfax Road","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":38.9734343,"lng":-76.5357427}},{"address1":"1430 East Audubon Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36111","coordinates":{"lat":32.328226,"lng":-86.28300399999999}},{"address1":"3652 East Blue Stone Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72764","coordinates":{"lat":36.139309,"lng":-94.1078069}},{"address1":"3302 Woodland Park Drive","address2":"#APT 000001","city":"Anchorage","state":"AK","postalCode":"99517","coordinates":{"lat":61.190512,"lng":-149.927286}},{"address1":"1771 Daisey Court","address2":"","city":"Millersville","state":"MD","postalCode":"21108","coordinates":{"lat":39.044662,"lng":-76.64797399999999}},{"address1":"406 East Waldburg Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.064691,"lng":-81.092321}},{"address1":"11843 North 60th Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85304","coordinates":{"lat":33.594584,"lng":-112.188319}},{"address1":"9515 West 74th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.831067,"lng":-105.103952}},{"address1":"119 Antioch Pike","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.10072,"lng":-86.72331}},{"address1":"1157 1st Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.90538280000001,"lng":-77.0121662}},{"address1":"3578 Galindo Street","address2":"","city":"Oakland","state":"CA","postalCode":"94601","coordinates":{"lat":37.783471,"lng":-122.2149729}},{"address1":"12800 Saunders Road","address2":"","city":"Anchorage","state":"AK","postalCode":"99516","coordinates":{"lat":61.10499799999999,"lng":-149.746856}},{"address1":"5556 West Northview Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5433092,"lng":-112.1797889}},{"address1":"3617 Oak Grove Circle","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.333812,"lng":-86.21464499999999}},{"address1":"2443 Sierra Nevada Road","address2":"#N5","city":"Mammoth Lakes","state":"CA","postalCode":"93546","coordinates":{"lat":37.641304,"lng":-118.971489}},{"address1":"10124 Watsonville Road","address2":"","city":"Louisville","state":"KY","postalCode":"40272","coordinates":{"lat":38.105204,"lng":-85.820047}},{"address1":"2441 Chase Park Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36110","coordinates":{"lat":32.4266516,"lng":-86.2700112}},{"address1":"28 Wayne Avenue","address2":"","city":"Waltham","state":"MA","postalCode":"02453","coordinates":{"lat":42.3806325,"lng":-71.2015761}},{"address1":"3605 Normandy Place South","address2":"","city":"Nashville","state":"TN","postalCode":"37209","coordinates":{"lat":36.1459501,"lng":-86.8276312}},{"address1":"25538 Calaroga Avenue","address2":"","city":"Hayward","state":"CA","postalCode":"94545","coordinates":{"lat":37.642952,"lng":-122.098647}},{"address1":"1521 159th Avenue","address2":"","city":"San Leandro","state":"CA","postalCode":"94578","coordinates":{"lat":37.70179340000001,"lng":-122.1192658}},{"address1":"344 Island Road","address2":"","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":31.927239,"lng":-81.09320199999999}},{"address1":"826 South Hancock Street","address2":"","city":"Louisville","state":"KY","postalCode":"40203","coordinates":{"lat":38.2408519,"lng":-85.744652}},{"address1":"2212 Greenville Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36107","coordinates":{"lat":32.3767039,"lng":-86.275049}},{"address1":"325 East 7th Street","address2":"","city":"Edmond","state":"OK","postalCode":"73034","coordinates":{"lat":35.6480391,"lng":-97.47550249999999}},{"address1":"7 Maple Hill Road","address2":"","city":"Aquinnah","state":"MA","postalCode":"02535","coordinates":{"lat":41.33201400000001,"lng":-70.8181309}},{"address1":"73455 Twentynine Palms Highway","address2":"","city":"Twentynine Palms","state":"CA","postalCode":"92277","coordinates":{"lat":34.1353352,"lng":-116.0598794}},{"address1":"410 West 89th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99515","coordinates":{"lat":61.1402906,"lng":-149.8870399}},{"address1":"24147 Clinton Court","address2":"","city":"Hayward","state":"CA","postalCode":"94545","coordinates":{"lat":37.648857,"lng":-122.112388}},{"address1":"5620 Lilly Street","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.148082,"lng":-85.58977999999999}},{"address1":"207 Spruce Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7690054,"lng":-72.51569599999999}},{"address1":"236 Alden Road","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.682588,"lng":-122.112121}},{"address1":"467 North Mountain Ranch Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0706293,"lng":-94.2107741}},{"address1":"2042 High Street","address2":"","city":"Oakland","state":"CA","postalCode":"94601","coordinates":{"lat":37.776415,"lng":-122.209418}},{"address1":"6244 Sun River Drive","address2":"","city":"Sacramento","state":"CA","postalCode":"95824","coordinates":{"lat":38.512894,"lng":-121.41258}},{"address1":"8801 Rosshire Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40118","coordinates":{"lat":38.1216631,"lng":-85.7505505}},{"address1":"449 15th Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.896241,"lng":-76.983372}},{"address1":"4385 Wares Ferry Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.389301,"lng":-86.228872}},{"address1":"8546 North 59th Lane","address2":"#171","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.5615847,"lng":-112.1884147}},{"address1":"8262 Elvaton Road","address2":"","city":"Millersville","state":"MD","postalCode":"21108","coordinates":{"lat":39.12422,"lng":-76.610394}},{"address1":"7018 Russell Court","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.824701,"lng":-105.186699}},{"address1":"1353 West 27th Avenue","address2":"#APT 000004","city":"Anchorage","state":"AK","postalCode":"99503","coordinates":{"lat":61.19630069999999,"lng":-149.9098041}},{"address1":"1030 Lake Claire Drive","address2":"","city":"Annapolis","state":"MD","postalCode":"21409","coordinates":{"lat":39.048603,"lng":-76.448911}},{"address1":"10980 Splendor Loop","address2":"","city":"Anchorage","state":"AK","postalCode":"99577","coordinates":{"lat":61.319069,"lng":-149.563601}},{"address1":"36043 Soapberry Commons","address2":"","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.555484,"lng":-122.012744}},{"address1":"419 Wabasso Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40209","coordinates":{"lat":38.1812976,"lng":-85.7511801}},{"address1":"2098 Lower Newton Street","address2":"","city":"Saint Albans City","state":"VT","postalCode":"05478","coordinates":{"lat":44.843051,"lng":-73.106488}},{"address1":"115 Waddell Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7660221,"lng":-72.5477647}},{"address1":"463 East Rutgers Loop","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.386378,"lng":-86.22309899999999}},{"address1":"31130 Meadowbrook Avenue","address2":"","city":"Hayward","state":"CA","postalCode":"94544","coordinates":{"lat":37.61744100000001,"lng":-122.038397}},{"address1":"8506 Laviento Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99515","coordinates":{"lat":61.143603,"lng":-149.8784269}},{"address1":"19404 North 77th Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6603179,"lng":-112.223814}},{"address1":"302 East Granada Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1004549,"lng":-94.15316299999999}},{"address1":"9321 Amy Lane","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32407","coordinates":{"lat":30.186053,"lng":-85.79181899999999}},{"address1":"1156 Greenhill Road","address2":"","city":"Arnold","state":"MD","postalCode":"21012","coordinates":{"lat":39.052169,"lng":-76.48806499999999}},{"address1":"30 Curtis Road","address2":"#509","city":"Milton","state":"MA","postalCode":"02186","coordinates":{"lat":42.2660192,"lng":-71.0910829}},{"address1":"904 Shepherd Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.9396331,"lng":-77.0252273}},{"address1":"124 Crane Street","address2":"","city":"Panama City","state":"FL","postalCode":"32413","coordinates":{"lat":30.203032,"lng":-85.84606699999999}},{"address1":"15847 West 74th Place","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.832021,"lng":-105.178337}},{"address1":"435 Granite Street","address2":"","city":"Quincy","state":"MA","postalCode":"02169","coordinates":{"lat":42.2404974,"lng":-71.01624509999999}},{"address1":"4418 Signal Hill Road","address2":"","city":"Louisville","state":"KY","postalCode":"40207","coordinates":{"lat":38.27605399999999,"lng":-85.650572}},{"address1":"2285 Wold Run Drive","address2":"#1","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0992725,"lng":-94.19149589999999}},{"address1":"110 Castle Hill","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7820711,"lng":-72.4827912}},{"address1":"8474 Chase Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8522641,"lng":-105.0715699}},{"address1":"4074 North Sunflower Circle","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.125209,"lng":-94.1317431}},{"address1":"249 Yellow Leaf Circle","address2":"","city":"Anchorage","state":"AK","postalCode":"99504","coordinates":{"lat":61.221345,"lng":-149.71888}},{"address1":"8010 Holland Court","address2":"D","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.84229029999999,"lng":-105.1030368}},{"address1":"1300 East Dowling Road","address2":"","city":"Anchorage","state":"AK","postalCode":"99518","coordinates":{"lat":61.1663648,"lng":-149.858972}},{"address1":"189 Danforth Street","address2":"","city":"Framingham","state":"MA","postalCode":"01701","coordinates":{"lat":42.3259861,"lng":-71.39104990000001}},{"address1":"1011 Bell Avenue","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21060","coordinates":{"lat":39.177114,"lng":-76.59223899999999}},{"address1":"5224 Wasena Avenue","address2":"","city":"Baltimore","state":"MD","postalCode":"21225","coordinates":{"lat":39.223779,"lng":-76.60339499999999}},{"address1":"7613 Yule Court","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.834511,"lng":-105.202472}},{"address1":"1243 Doris Avenue","address2":"","city":"Pasadena","state":"MD","postalCode":"21122","coordinates":{"lat":39.109591,"lng":-76.486294}},{"address1":"3504 East 5th Street","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.156461,"lng":-85.61573399999999}},{"address1":"1 Dunsmuir Lane","address2":"","city":"Savannah","state":"GA","postalCode":"31411","coordinates":{"lat":31.891353,"lng":-81.053618}},{"address1":"1320 Dunbarton Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.401737,"lng":-86.19376799999999}},{"address1":"14524 Lodestar Drive","address2":"","city":"Grass Valley","state":"CA","postalCode":"95949","coordinates":{"lat":39.101221,"lng":-121.008546}},{"address1":"8404 West Myrtle Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85305","coordinates":{"lat":33.5414927,"lng":-112.2400905}},{"address1":"620 Oakland Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.072612,"lng":-94.17295999999999}},{"address1":"39 Cottage Street","address2":"","city":"Athol","state":"MA","postalCode":"01331","coordinates":{"lat":42.5926786,"lng":-72.2271482}},{"address1":"82 Lookout Mountain Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.75723,"lng":-72.491035}},{"address1":"1635 Generals Highway","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":39.0139641,"lng":-76.5724717}},{"address1":"555 North Dupont Avenue","address2":"#C-55","city":"Nashville","state":"TN","postalCode":"37115","coordinates":{"lat":36.268033,"lng":-86.6999979}},{"address1":"2505 North Hampton Court","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0959268,"lng":-94.1238079}},{"address1":"136 Acacia Drive","address2":"","city":"Blue Lake","state":"CA","postalCode":"95525","coordinates":{"lat":40.879484,"lng":-123.978726}},{"address1":"22825 North 74th Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85310","coordinates":{"lat":33.691213,"lng":-112.219428}},{"address1":"643 Farragut Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.951281,"lng":-77.021523}},{"address1":"17 West 26th Circle","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.033699,"lng":-94.15958800000001}},{"address1":"335 C Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20003","coordinates":{"lat":38.8858796,"lng":-77.00075350000002}},{"address1":"1418 Paddocks Court","address2":"","city":"Crownsville","state":"MD","postalCode":"21032","coordinates":{"lat":39.05389,"lng":-76.623632}},{"address1":"2917 Miramar Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.107054,"lng":-94.2004709}},{"address1":"301 Argonaut Street","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.20514,"lng":-85.84755899999999}},{"address1":"12901 Mission Circle","address2":"","city":"Anchorage","state":"AK","postalCode":"99516","coordinates":{"lat":61.10380240000001,"lng":-149.8253975}},{"address1":"3013 Sprowl Road","address2":"#4","city":"Jeffersontown","state":"KY","postalCode":"40299","coordinates":{"lat":38.1966913,"lng":-85.5693363}},{"address1":"5929 West Via Montoya Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85310","coordinates":{"lat":33.68642,"lng":-112.188159}},{"address1":"325 Joseph Circle","address2":"","city":"Southport","state":"FL","postalCode":"32409","coordinates":{"lat":30.407817,"lng":-85.684715}},{"address1":"922 Urciolo Court","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":38.979099,"lng":-76.57732589999999}},{"address1":"2212 Daffin Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31404","coordinates":{"lat":32.027338,"lng":-81.07870799999999}},{"address1":"1401 Cordova Street","address2":"#APT 000006","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.20849370000001,"lng":-149.8792198}},{"address1":"8064 Claytie Circle","address2":"","city":"Nashville","state":"TN","postalCode":"37221","coordinates":{"lat":36.06466899999999,"lng":-86.976433}},{"address1":"566 Middle Turnpike East","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7850955,"lng":-72.4967557}},{"address1":"93 Hamlin Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7735186,"lng":-72.5152106}},{"address1":"123 Remember Baker Lane","address2":"","city":"Hartford","state":"VT","postalCode":"05001","coordinates":{"lat":43.6696484,"lng":-72.4299719}},{"address1":"125 Connors Street","address2":"#516","city":"Gardner","state":"MA","postalCode":"01440","coordinates":{"lat":42.5738871,"lng":-71.9966865}},{"address1":"2315 Chestnut Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36107","coordinates":{"lat":32.367382,"lng":-86.27867599999999}},{"address1":"2716 30th Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20020","coordinates":{"lat":38.855798,"lng":-76.96482499999999}},{"address1":"2406 Lindbergh Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40208","coordinates":{"lat":38.215833,"lng":-85.775153}},{"address1":"2035 Ninth Street","address2":"R A","city":"Berkeley","state":"CA","postalCode":"94710","coordinates":{"lat":37.8676351,"lng":-122.2938418}},{"address1":"34 Holyoke Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.753855,"lng":-72.498972}},{"address1":"2276 West Woodley Square","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.3256494,"lng":-86.2702235}},{"address1":"20251 North 75th Avenue","address2":"#1046","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6696067,"lng":-112.2196548}},{"address1":"72 Bentley Avenue","address2":"","city":"Poultney","state":"VT","postalCode":"05764","coordinates":{"lat":43.5158214,"lng":-73.2343441}},{"address1":"2807 Huxley Place","address2":"","city":"Fremont","state":"CA","postalCode":"94555","coordinates":{"lat":37.584941,"lng":-122.03291}},{"address1":"7772 West Palmaire Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85303","coordinates":{"lat":33.540431,"lng":-112.227013}},{"address1":"82 Linnmore Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.777262,"lng":-72.54537499999999}},{"address1":"882 Plantation Way","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.400186,"lng":-86.20771099999999}},{"address1":"8150 North 61st Avenue","address2":"#3128","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.555668,"lng":-112.1926295}},{"address1":"503 Orchard Road","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21061","coordinates":{"lat":39.19076099999999,"lng":-76.64618}},{"address1":"3616 Echo Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37218","coordinates":{"lat":36.236713,"lng":-86.833956}},{"address1":"376 Whites Road","address2":"","city":"Wilmington","state":"VT","postalCode":"05363","coordinates":{"lat":42.880951,"lng":-72.84163699999999}},{"address1":"322 East Taylor Street","address2":"#1103","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.0706543,"lng":-81.0908408}},{"address1":"605 Main Street","address2":"","city":"Watertown","state":"MA","postalCode":"02472","coordinates":{"lat":42.373378,"lng":-71.202116}},{"address1":"238 West Rock Street","address2":"#4","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0609635,"lng":-94.1628029}},{"address1":"1819 Q Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20020","coordinates":{"lat":38.870406,"lng":-76.978219}},{"address1":"1261 Sioux Terrace","address2":"","city":"Nashville","state":"TN","postalCode":"37115","coordinates":{"lat":36.247799,"lng":-86.670508}},{"address1":"7002 Secrest Court","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.8236009,"lng":-105.1901759}},{"address1":"169 Avenida Drive","address2":"M","city":"Berkeley","state":"CA","postalCode":"94708","coordinates":{"lat":37.884824,"lng":-122.249694}},{"address1":"6095 Terry Lane","address2":"","city":"Golden","state":"CO","postalCode":"80403","coordinates":{"lat":39.807376,"lng":-105.191019}},{"address1":"3620 Colmar Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.235977,"lng":-85.81636}},{"address1":"8820 Vaughn Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.337777,"lng":-86.13765590000001}},{"address1":"113 Hammarlee Road","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21060","coordinates":{"lat":39.177265,"lng":-76.602519}},{"address1":"281 MacArthur Boulevard","address2":"","city":"Oakland","state":"CA","postalCode":"94610","coordinates":{"lat":37.8147324,"lng":-122.25217}},{"address1":"8159 West 81st Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.843993,"lng":-105.089124}},{"address1":"512 North Center Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.15768199999999,"lng":-85.6292129}},{"address1":"4876 Norris Road","address2":"","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.543515,"lng":-122.008143}},{"address1":"8378 Cole Street","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8479398,"lng":-105.1526049}},{"address1":"2406 Brighton Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40205","coordinates":{"lat":38.217094,"lng":-85.66769599999999}},{"address1":"19 Heritage","address2":"","city":"Oakland","state":"CA","postalCode":"94605","coordinates":{"lat":37.765568,"lng":-122.129528}},{"address1":"6228 West Larkspur Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85304","coordinates":{"lat":33.600267,"lng":-112.193207}},{"address1":"2504 Longest Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40204","coordinates":{"lat":38.239449,"lng":-85.7079849}},{"address1":"3 Mad Anthony Lane","address2":"","city":"Savannah","state":"GA","postalCode":"31411","coordinates":{"lat":31.949414,"lng":-81.02015399999999}},{"address1":"2248 South Sutherland Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.331721,"lng":-86.19776999999999}},{"address1":"330 Michell Court","address2":"","city":"Livermore","state":"CA","postalCode":"94551","coordinates":{"lat":37.690035,"lng":-121.759468}},{"address1":"6748 West San Juan Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85303","coordinates":{"lat":33.518939,"lng":-112.205511}},{"address1":"1734 Tamarack Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20012","coordinates":{"lat":38.993375,"lng":-77.04060299999999}},{"address1":"915 Arkansas Avenue","address2":"","city":"Lynn Haven","state":"FL","postalCode":"32444","coordinates":{"lat":30.244151,"lng":-85.6392089}},{"address1":"116 Queens Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37218","coordinates":{"lat":36.214841,"lng":-86.859562}},{"address1":"8 Linden Circle","address2":"","city":"Somerville","state":"MA","postalCode":"02143","coordinates":{"lat":42.3879993,"lng":-71.11345200000001}},{"address1":"4 Chamois Court","address2":"","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.088701,"lng":-81.24825}},{"address1":"6941 West 87th Way","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.852809,"lng":-105.073449}},{"address1":"354 North University Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0659848,"lng":-94.16817080000001}},{"address1":"6145 East Castro Valley Boulevard","address2":"","city":"Castro Valley","state":"CA","postalCode":"94552","coordinates":{"lat":37.6992206,"lng":-122.0300502}},{"address1":"1401 Saint George Avenue","address2":"","city":"Moore","state":"OK","postalCode":"73160","coordinates":{"lat":35.3503092,"lng":-97.5079329}},{"address1":"1713 Arrow Cove Lane","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":39.00848999999999,"lng":-76.53611699999999}},{"address1":"56 Gardner Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7630186,"lng":-72.5033322}},{"address1":"327 Idlewylde Drive","address2":"#3","city":"Louisville","state":"KY","postalCode":"40206","coordinates":{"lat":38.260003,"lng":-85.70065199999999}},{"address1":"18789 Crane Avenue","address2":"","city":"Castro Valley","state":"CA","postalCode":"94546","coordinates":{"lat":37.70902600000001,"lng":-122.059504}},{"address1":"814 East 10th Court","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.166997,"lng":-85.648022}},{"address1":"6431 Shattuck Avenue","address2":"B","city":"Oakland","state":"CA","postalCode":"94609","coordinates":{"lat":37.85015,"lng":-122.266142}},{"address1":"4719 Bayou Bluff Trail","address2":"","city":"Lynn Haven","state":"FL","postalCode":"32444","coordinates":{"lat":30.236109,"lng":-85.599884}},{"address1":"24 Lambert Street","address2":"","city":"Medford","state":"MA","postalCode":"02155","coordinates":{"lat":42.4235908,"lng":-71.093309}},{"address1":"1318 35th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20007","coordinates":{"lat":38.90724700000001,"lng":-77.0690174}},{"address1":"4807 North Grove Avenue","address2":"","city":"Warr Acres","state":"OK","postalCode":"73122","coordinates":{"lat":35.5203601,"lng":-97.6147122}},{"address1":"4408 Bonaparte Boulevard","address2":"","city":"Midwest City","state":"OK","postalCode":"73110","coordinates":{"lat":35.482651,"lng":-97.38337399999999}},{"address1":"73 Twin Hills Drive","address2":"","city":"Longmeadow","state":"MA","postalCode":"01106","coordinates":{"lat":42.0420378,"lng":-72.5428872}},{"address1":"34 Harris Street","address2":"#6","city":"Brookline","state":"MA","postalCode":"02446","coordinates":{"lat":42.3382219,"lng":-71.12330899999999}},{"address1":"22352 North 67th Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85310","coordinates":{"lat":33.686126,"lng":-112.203991}},{"address1":"11522 Country Spring Court","address2":"","city":"Cupertino","state":"CA","postalCode":"95014","coordinates":{"lat":37.3004559,"lng":-122.049009}},{"address1":"21 Soling Avenue","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":32.0376484,"lng":-81.2540562}},{"address1":"302 Mcmillin Street","address2":"","city":"Nashville","state":"TN","postalCode":"37203","coordinates":{"lat":36.1583239,"lng":-86.7947425}},{"address1":"129 Grant Street","address2":"","city":"Redlands","state":"CA","postalCode":"92373","coordinates":{"lat":34.0529643,"lng":-117.1847245}},{"address1":"3035 South Highway A1A","address2":"#3B","city":"Melbourne Beach","state":"FL","postalCode":"32951","coordinates":{"lat":28.0357085,"lng":-80.54249569999999}},{"address1":"1637 Acre Circle","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32407","coordinates":{"lat":30.18644399999999,"lng":-85.78322299999999}},{"address1":"130 West Brown Road","address2":"","city":"Mesa","state":"AZ","postalCode":"85201","coordinates":{"lat":33.4356918,"lng":-111.8348295}},{"address1":"2632 Jackson Street East","address2":"","city":"Carson","state":"CA","postalCode":"90810","coordinates":{"lat":33.8360282,"lng":-118.2202665}},{"address1":"4503 North Council Road","address2":"","city":"Bethany","state":"OK","postalCode":"73008","coordinates":{"lat":35.5176604,"lng":-97.65550879999999}},{"address1":"119 Redwood Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.751289,"lng":-72.563575}},{"address1":"5721 Frank Hough Road","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.23643,"lng":-85.559361}},{"address1":"2917 Danzig Place","address2":"#102","city":"Louisville","state":"KY","postalCode":"40245","coordinates":{"lat":38.280137,"lng":-85.49418639999999}},{"address1":"26563 Chisholm Court","address2":"","city":"Hayward","state":"CA","postalCode":"94544","coordinates":{"lat":37.641711,"lng":-122.078659}},{"address1":"4221 East Mission Boulevard","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0954898,"lng":-94.10028220000001}},{"address1":"6021 Yarrow Street","address2":"#A1","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.806803,"lng":-105.084306}},{"address1":"7102 North 43rd Avenue","address2":"#160","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5415384,"lng":-112.1514119}},{"address1":"3386 Sudlersville South","address2":"","city":"Laurel","state":"MD","postalCode":"20724","coordinates":{"lat":39.089731,"lng":-76.81937599999999}},{"address1":"6022 West Alice Avenue","address2":"#3","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.5640709,"lng":-112.1893361}},{"address1":"580 Hollow Wood Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.3914018,"lng":-86.2181083}},{"address1":"435 East 5th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.217854,"lng":-149.875705}},{"address1":"6713 Holt Road","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.013723,"lng":-86.729686}},{"address1":"5605 North Terry Avenue","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73111","coordinates":{"lat":35.526483,"lng":-97.4830379}},{"address1":"412 West Ila Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.071266,"lng":-94.165154}},{"address1":"9403 Fairground Road","address2":"","city":"Louisville","state":"KY","postalCode":"40291","coordinates":{"lat":38.17058,"lng":-85.5852139}},{"address1":"6049 Quail Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.806876,"lng":-105.1239949}},{"address1":"17 Hillcrest Road","address2":"","city":"Rutland","state":"VT","postalCode":"05701","coordinates":{"lat":43.6216373,"lng":-72.9688374}},{"address1":"424 Callan Avenue","address2":"#216","city":"San Leandro","state":"CA","postalCode":"94577","coordinates":{"lat":37.72780789999999,"lng":-122.152331}},{"address1":"105 Gilmore Street","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21061","coordinates":{"lat":39.176817,"lng":-76.630884}},{"address1":"910 Arlington Terrace","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.077652,"lng":-94.14529000000002}},{"address1":"2204 7th Street Road","address2":"#12","city":"Louisville","state":"KY","postalCode":"40208","coordinates":{"lat":38.218784,"lng":-85.7800649}},{"address1":"11 North Vineyard Drive","address2":"","city":"Pueblo West","state":"CO","postalCode":"81007","coordinates":{"lat":38.318953,"lng":-104.680591}},{"address1":"3505 Albee Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37076","coordinates":{"lat":36.181781,"lng":-86.611408}},{"address1":"689 Stableway Road","address2":"","city":"Pike Road","state":"AL","postalCode":"36064","coordinates":{"lat":32.354837,"lng":-86.076679}},{"address1":"102 East Cydnee Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.10683,"lng":-94.155547}},{"address1":"208 Towne Lake Way","address2":"","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.137605,"lng":-81.25850600000001}},{"address1":"2555 West 69th Court","address2":"","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.158468,"lng":-149.933297}},{"address1":"58 Rice Street Southwest","address2":"","city":"Washington","state":"DC","postalCode":"20032","coordinates":{"lat":38.83841899999999,"lng":-77.0113105}},{"address1":"2961 Vinson Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36110","coordinates":{"lat":32.42687530000001,"lng":-86.2080404}},{"address1":"172 Chestnut Street","address2":"","city":"Lynn","state":"MA","postalCode":"01902","coordinates":{"lat":42.4696809,"lng":-70.93746680000001}},{"address1":"307 Meadowood Court","address2":"","city":"Lynn Haven","state":"FL","postalCode":"32444","coordinates":{"lat":30.237071,"lng":-85.60347}},{"address1":"403 Turkey Creek Road","address2":"","city":"Mathews","state":"AL","postalCode":"36052","coordinates":{"lat":32.220426,"lng":-86.059168}},{"address1":"11 Rosewood Lane","address2":"","city":"Essex","state":"VT","postalCode":"05452","coordinates":{"lat":44.4912319,"lng":-73.097297}},{"address1":"102 Old Depot Road","address2":"#14","city":"Farmington","state":"AR","postalCode":"72730","coordinates":{"lat":36.040414,"lng":-94.245223}},{"address1":"9 Pierce Road","address2":"","city":"Watertown","state":"MA","postalCode":"02472","coordinates":{"lat":42.380059,"lng":-71.19283399999999}},{"address1":"15254 North 52nd Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.6244609,"lng":-112.171094}},{"address1":"11140 West 60th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.805639,"lng":-105.122694}},{"address1":"803 18th Avenue South","address2":"","city":"Nashville","state":"TN","postalCode":"37203","coordinates":{"lat":36.1500199,"lng":-86.79477}},{"address1":"918 Cheryl Ann Circle","address2":"","city":"Hayward","state":"CA","postalCode":"94544","coordinates":{"lat":37.635859,"lng":-122.076923}},{"address1":"1328 Jenks Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.1726222,"lng":-85.6620902}},{"address1":"2201 Marks Mill Lane","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0917726,"lng":-94.15142089999999}},{"address1":"12371 Atlanta Highway","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.369194,"lng":-86.06518799999999}},{"address1":"3437 Sommerville Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36111","coordinates":{"lat":32.342288,"lng":-86.256546}},{"address1":"829 Dunbarton Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.397179,"lng":-86.205326}},{"address1":"8 Kozera Avenue","address2":"","city":"Hadley","state":"MA","postalCode":"01035","coordinates":{"lat":42.36135549999999,"lng":-72.57288930000001}},{"address1":"89 High Ledge Circle","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7495971,"lng":-72.476336}},{"address1":"35 Lakewood Circle South","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.754591,"lng":-72.52192000000001}},{"address1":"2222 Martin Luther King Junior Boulevard","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0554972,"lng":-94.1910602}},{"address1":"1720 Quacco Road","address2":"A","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.062374,"lng":-81.269502}},{"address1":"116 Jourdan Street","address2":"","city":"Hinesburg","state":"VT","postalCode":"05461","coordinates":{"lat":44.347454,"lng":-73.08877600000001}},{"address1":"2507 R Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20020","coordinates":{"lat":38.869211,"lng":-76.970202}},{"address1":"4719 West Cochise Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.580297,"lng":-112.161185}},{"address1":"1838 Crofton Parkway","address2":"","city":"Crofton","state":"MD","postalCode":"21114","coordinates":{"lat":38.9983069,"lng":-76.67975299999999}},{"address1":"26 Seaman Circle","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7668725,"lng":-72.5461613}},{"address1":"2572 Drake Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.342203,"lng":-86.33643599999999}},{"address1":"4231 Miramonte Way","address2":"","city":"Union City","state":"CA","postalCode":"94587","coordinates":{"lat":37.591721,"lng":-122.075993}},{"address1":"2508 Grant Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.193964,"lng":-85.712509}},{"address1":"6505 South Lagoon Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32408","coordinates":{"lat":30.155249,"lng":-85.76467099999999}},{"address1":"2032 Gorgas Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36106","coordinates":{"lat":32.357466,"lng":-86.27658699999999}},{"address1":"1129 I Street","address2":"","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.2110743,"lng":-149.899634}},{"address1":"5201 North Miller Avenue","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73112","coordinates":{"lat":35.523283,"lng":-97.561933}},{"address1":"1987 Boxer Court","address2":"","city":"San Lorenzo","state":"CA","postalCode":"94580","coordinates":{"lat":37.670738,"lng":-122.147019}},{"address1":"3219 Lakeshore Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37138","coordinates":{"lat":36.242959,"lng":-86.625265}},{"address1":"415 West 42nd Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.0543472,"lng":-81.1064222}},{"address1":"5792 Owl Hill Avenue","address2":"","city":"Santa Rosa","state":"CA","postalCode":"95409","coordinates":{"lat":38.467127,"lng":-122.640498}},{"address1":"6816 West 84th Circle","address2":"#42","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.848863,"lng":-105.0735009}},{"address1":"1900 West Virginia Avenue Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.9114897,"lng":-76.9847941}},{"address1":"2936 State Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.202236,"lng":-85.66611499999999}},{"address1":"2604 13th Street","address2":"","city":"Savannah","state":"GA","postalCode":"31408","coordinates":{"lat":32.092738,"lng":-81.17643199999999}},{"address1":"10304 North 179th Drive","address2":"","city":"Waddell","state":"AZ","postalCode":"85355","coordinates":{"lat":33.5780134,"lng":-112.4458901}},{"address1":"8142 Mallard Shore Drive","address2":"","city":"Laurel","state":"MD","postalCode":"20724","coordinates":{"lat":39.112812,"lng":-76.80575499999999}},{"address1":"653 Stratton Arlington Road","address2":"","city":"Stratton","state":"VT","postalCode":"05360","coordinates":{"lat":43.04115300000001,"lng":-72.90772199999999}},{"address1":"2414 Parker Street","address2":"#R 16","city":"Berkeley","state":"CA","postalCode":"94704","coordinates":{"lat":37.862903,"lng":-122.2595092}},{"address1":"43 Westminster Street","address2":"","city":"Pittsfield","state":"MA","postalCode":"01201","coordinates":{"lat":42.458409,"lng":-73.23273499999999}},{"address1":"422 C Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.8942029,"lng":-76.99988809999999}},{"address1":"535 Saddlewood Lane","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.39012,"lng":-86.218373}},{"address1":"7910 West Krall Street","address2":"","city":"Glendale","state":"AZ","postalCode":"85303","coordinates":{"lat":33.534019,"lng":-112.2299964}},{"address1":"1600 20th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20009","coordinates":{"lat":38.9113128,"lng":-77.0451932}},{"address1":"1217 Bay Street","address2":"#318-A","city":"Tybee Island","state":"GA","postalCode":"31328","coordinates":{"lat":32.0222005,"lng":-80.8587482}},{"address1":"7645 Marshall Street","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.835952,"lng":-105.070063}},{"address1":"717 Joseph Avenue","address2":"","city":"Nashville","state":"TN","postalCode":"37207","coordinates":{"lat":36.183641,"lng":-86.772214}},{"address1":"2106 Standard Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40210","coordinates":{"lat":38.231378,"lng":-85.7922619}},{"address1":"316 20th Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.8939527,"lng":-76.97642739999999}},{"address1":"227 West Montgomery Cross Road","address2":"#736","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":31.998812,"lng":-81.134464}},{"address1":"310 12th Avenue","address2":"","city":"Santa Cruz","state":"CA","postalCode":"95062","coordinates":{"lat":36.963154,"lng":-121.994045}},{"address1":"2685 California Street","address2":"#APT 305","city":"Mountain View","state":"CA","postalCode":"94040","coordinates":{"lat":37.4068693,"lng":-122.1129728}},{"address1":"6460 Vermont 113","address2":"","city":"Vershire","state":"VT","postalCode":"05079","coordinates":{"lat":43.9678972,"lng":-72.3154863}},{"address1":"8404 South Villa Avenue","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73159","coordinates":{"lat":35.3818163,"lng":-97.5570041}},{"address1":"7030 West Krall Street","address2":"","city":"Glendale","state":"AZ","postalCode":"85303","coordinates":{"lat":33.534067,"lng":-112.210763}},{"address1":"189 Dalton Avenue","address2":"","city":"Pittsfield","state":"MA","postalCode":"01201","coordinates":{"lat":42.459217,"lng":-73.22532799999999}},{"address1":"2455 Manchester Drive","address2":"","city":"The Village","state":"OK","postalCode":"73120","coordinates":{"lat":35.576392,"lng":-97.55644629999999}},{"address1":"2405 230th Street","address2":"","city":"Pasadena","state":"MD","postalCode":"21122","coordinates":{"lat":39.12585,"lng":-76.549013}},{"address1":"589 East Main Street","address2":"","city":"Newport","state":"VT","postalCode":"05855","coordinates":{"lat":44.943275,"lng":-72.19193299999999}},{"address1":"1520 H Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20006","coordinates":{"lat":38.90021429999999,"lng":-77.0351541}},{"address1":"4603 Grant Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20019","coordinates":{"lat":38.8983173,"lng":-76.9364561}},{"address1":"171 Brickhill Circle","address2":"","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.175349,"lng":-81.25099}},{"address1":"607 North 46th Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0741371,"lng":-94.22645829999999}},{"address1":"9134 Brook Park Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.3076534,"lng":-86.1451185}},{"address1":"2134 West Mills Drive","address2":"","city":"Orange","state":"CA","postalCode":"92868","coordinates":{"lat":33.786584,"lng":-117.875665}},{"address1":"2 Cockle Shell Road","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.960368,"lng":-81.229034}},{"address1":"1431 King George Boulevard","address2":"#21-C","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.9775273,"lng":-81.2259819}},{"address1":"1804 Calhoun Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.181413,"lng":-85.693748}},{"address1":"23 Florida Avenue Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.910125,"lng":-77.00808099999999}},{"address1":"5630 Silverado Way","address2":"#STE A8","city":"Anchorage","state":"AK","postalCode":"99518","coordinates":{"lat":61.1695128,"lng":-149.8896842}},{"address1":"11300 Lillian Lane","address2":"","city":"Anchorage","state":"AK","postalCode":"99515","coordinates":{"lat":61.11845399999999,"lng":-149.881223}},{"address1":"2209 East Manor Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.075132,"lng":-94.12903399999999}},{"address1":"8325 Northwest 19th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73127","coordinates":{"lat":35.48856,"lng":-97.66233199999999}},{"address1":"6925 Lariat Lane","address2":"","city":"Castro Valley","state":"CA","postalCode":"94552","coordinates":{"lat":37.7157257,"lng":-122.0270913}},{"address1":"6721 Boundary Run","address2":"","city":"Nashville","state":"TN","postalCode":"37221","coordinates":{"lat":36.087655,"lng":-87.006136}},{"address1":"1700 William E Summers III Avenue","address2":"#201","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.22952540000001,"lng":-85.82045680000002}},{"address1":"14 6th Street","address2":"#1","city":"Medford","state":"MA","postalCode":"02155","coordinates":{"lat":42.4074868,"lng":-71.07807670000001}},{"address1":"11865 West 74th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.830545,"lng":-105.131624}},{"address1":"912 Countryside Lane","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.404751,"lng":-86.18589899999999}},{"address1":"6080 Frontier Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.030597,"lng":-86.73436}},{"address1":"1124 Bluewillow Court","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.040783,"lng":-86.577798}},{"address1":"17722 North 79th Avenue","address2":"#1135","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.646496,"lng":-112.2317614}},{"address1":"6 Oak Street","address2":"","city":"Town of Rockingham","state":"VT","postalCode":"05101","coordinates":{"lat":43.134108,"lng":-72.449474}},{"address1":"1537 Northwest 123rd Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73120","coordinates":{"lat":35.5961896,"lng":-97.53951699999999}},{"address1":"10001 Pheasant Lane","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73162","coordinates":{"lat":35.571646,"lng":-97.63995700000001}},{"address1":"10340 West 62nd Place","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8101545,"lng":-105.1135667}},{"address1":"52 Oleary Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7716925,"lng":-72.5521002}},{"address1":"15082 North 59th Avenue","address2":"#111","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.6231673,"lng":-112.1871757}},{"address1":"7047 Vinson Road","address2":"","city":"Panama City","state":"FL","postalCode":"32413","coordinates":{"lat":30.336868,"lng":-85.829662}},{"address1":"200 Edson Road","address2":"","city":"Windham","state":"VT","postalCode":"05359","coordinates":{"lat":43.2215166,"lng":-72.7049368}},{"address1":"150 Manistee Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.235428,"lng":-85.89155099999999}},{"address1":"2335 Orchard View Lane","address2":"","city":"Escondido","state":"CA","postalCode":"92027","coordinates":{"lat":33.119461,"lng":-117.007959}},{"address1":"65 Clark Street","address2":"#2","city":"Newton","state":"MA","postalCode":"02459","coordinates":{"lat":42.321396,"lng":-71.1995577}},{"address1":"18318 Pioneer Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99577","coordinates":{"lat":61.364421,"lng":-149.540056}},{"address1":"110 Elmwood Avenue","address2":"","city":"Barre","state":"VT","postalCode":"05641","coordinates":{"lat":44.2097089,"lng":-72.50493600000001}},{"address1":"4800 Huffman Road","address2":"","city":"Anchorage","state":"AK","postalCode":"99516","coordinates":{"lat":61.10827899999999,"lng":-149.791977}},{"address1":"8219 Minor Lane","address2":"#9","city":"Louisville","state":"KY","postalCode":"40219","coordinates":{"lat":38.12841,"lng":-85.7107249}},{"address1":"10129 Spring Gate Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40241","coordinates":{"lat":38.312891,"lng":-85.562299}},{"address1":"65 Arcellia Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.788139,"lng":-72.491989}},{"address1":"12460 West Solano Drive","address2":"","city":"Litchfield Park","state":"AZ","postalCode":"85340","coordinates":{"lat":33.520308,"lng":-112.3275521}},{"address1":"618 Watts Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36104","coordinates":{"lat":32.37152700000001,"lng":-86.294285}},{"address1":"5805 Armada Drive","address2":"","city":"Carlsbad","state":"CA","postalCode":"92008","coordinates":{"lat":33.1238541,"lng":-117.3152497}},{"address1":"1644 Queenstown Road","address2":"","city":"Nichols Hills","state":"OK","postalCode":"73116","coordinates":{"lat":35.542511,"lng":-97.547282}},{"address1":"143 Main Street","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.7886316,"lng":-72.52390249999999}},{"address1":"226 Tranquility Lane","address2":"","city":"Saint Albans Town","state":"VT","postalCode":"05488","coordinates":{"lat":44.8389381,"lng":-73.18372149999999}},{"address1":"831 21st Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.9011079,"lng":-76.974034}},{"address1":"22825 Paseo Place","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.6678961,"lng":-122.0832649}},{"address1":"2902 Flint Street","address2":"","city":"Union City","state":"CA","postalCode":"94587","coordinates":{"lat":37.60442,"lng":-122.069607}},{"address1":"919 Windsor Avenue","address2":"","city":"Annapolis","state":"MD","postalCode":"21403","coordinates":{"lat":38.968518,"lng":-76.4905689}},{"address1":"6041 North 72nd Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85303","coordinates":{"lat":33.525117,"lng":-112.215039}},{"address1":"163 Highwood Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.76664299999999,"lng":-72.490877}},{"address1":"1334 East 14th Avenue","address2":"#APT 000004","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.208547,"lng":-149.857294}},{"address1":"223 Goose Pond Road","address2":"","city":"Fairfax","state":"VT","postalCode":"05454","coordinates":{"lat":44.653053,"lng":-72.971587}},{"address1":"1021 North Center Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.1670475,"lng":-85.6292984}},{"address1":"1559 Alabama Avenue Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20032","coordinates":{"lat":38.8467679,"lng":-76.98076200000001}},{"address1":"1238 Roanwood Way","address2":"","city":"Concord","state":"CA","postalCode":"94521","coordinates":{"lat":37.94042,"lng":-121.944464}},{"address1":"2068 Happy Lane","address2":"","city":"Crofton","state":"MD","postalCode":"21114","coordinates":{"lat":39.013318,"lng":-76.6754904}},{"address1":"5378 Allison Street","address2":"#102","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.7944109,"lng":-105.0860024}},{"address1":"4604 Virginia Loop Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.314591,"lng":-86.24074999999999}},{"address1":"7711 North 51st Avenue","address2":"#1180","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5502243,"lng":-112.1665731}},{"address1":"343 Daman Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.2999,"lng":-86.342286}},{"address1":"3623 Chateau Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40219","coordinates":{"lat":38.1473803,"lng":-85.6954641}},{"address1":"2619 North Quality Lane","address2":"#315","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.09925399999999,"lng":-94.164274}},{"address1":"5334 West Northern Avenue","address2":"#327","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5535111,"lng":-112.1747068}},{"address1":"3835 Oakes Drive","address2":"","city":"Hayward","state":"CA","postalCode":"94542","coordinates":{"lat":37.661345,"lng":-122.032784}},{"address1":"295 Townes Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.052158,"lng":-86.70206900000001}},{"address1":"125 13th Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.891265,"lng":-76.988068}},{"address1":"7308 Northwest 119th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73162","coordinates":{"lat":35.592396,"lng":-97.643619}},{"address1":"1911 East 58th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99507","coordinates":{"lat":61.16876999999999,"lng":-149.847225}},{"address1":"22649 McManus Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99567","coordinates":{"lat":61.418189,"lng":-149.460766}},{"address1":"4617 East 3rd Street","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.129243,"lng":-85.606926}},{"address1":"6436 Stoney Point Road","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.266241,"lng":-85.599245}},{"address1":"2577 Rhode Island Avenue Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20018","coordinates":{"lat":38.931902,"lng":-76.969579}},{"address1":"44 Campfield Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.768442,"lng":-72.540232}},{"address1":"7132 South Villa Avenue","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73159","coordinates":{"lat":35.392665,"lng":-97.5569639}},{"address1":"107 West Canton Circle","address2":"","city":"Springfield","state":"MA","postalCode":"01104","coordinates":{"lat":42.144682,"lng":-72.57098599999999}},{"address1":"14358 West 88th Place","address2":"C","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8568436,"lng":-105.161713}},{"address1":"2100 Sandy Creek Trail","address2":"","city":"Edmond","state":"OK","postalCode":"73013","coordinates":{"lat":35.63330699999999,"lng":-97.509911}},{"address1":"6404 West 82nd Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.846475,"lng":-105.067397}},{"address1":"1609 Porter Avenue","address2":"","city":"Nashville","state":"TN","postalCode":"37206","coordinates":{"lat":36.196292,"lng":-86.725028}},{"address1":"8421 Thomas Drive","address2":"#4","city":"Panama City","state":"FL","postalCode":"32408","coordinates":{"lat":30.165178,"lng":-85.78605}},{"address1":"116 Frost Park","address2":"","city":"Hartford","state":"VT","postalCode":"05001","coordinates":{"lat":43.6692262,"lng":-72.3088865}},{"address1":"132 Tensaw Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.384289,"lng":-86.147064}},{"address1":"3147 West Old Farmington Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0531475,"lng":-94.2055113}},{"address1":"3538 Mendenhall Court","address2":"","city":"Pleasanton","state":"CA","postalCode":"94588","coordinates":{"lat":37.6991919,"lng":-121.85909}},{"address1":"1623 Mines Road","address2":"","city":"Lowell","state":"VT","postalCode":"05847","coordinates":{"lat":44.795108,"lng":-72.48690599999999}},{"address1":"99 Pond Avenue","address2":"#606","city":"Brookline","state":"MA","postalCode":"02445","coordinates":{"lat":42.3293159,"lng":-71.1152839}},{"address1":"557 West Willoughby Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.019975,"lng":-94.16828199999999}},{"address1":"309 Brooke Court","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.1536175,"lng":-85.5881338}},{"address1":"4696 Bull Run Road","address2":"","city":"Ashland City","state":"TN","postalCode":"37015","coordinates":{"lat":36.241285,"lng":-86.940741}},{"address1":"18330 North 79th Avenue","address2":"#3155","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6487128,"lng":-112.2313289}},{"address1":"5601 West Missouri Avenue","address2":"#165","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5152999,"lng":-112.179748}},{"address1":"2903 West 31st Avenue","address2":"#APT 000002","city":"Anchorage","state":"AK","postalCode":"99517","coordinates":{"lat":61.192819,"lng":-149.937665}},{"address1":"2611 Bluefield Avenue","address2":"","city":"Nashville","state":"TN","postalCode":"37214","coordinates":{"lat":36.16786,"lng":-86.670203}},{"address1":"203 East Gwinnett Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.06637,"lng":-81.093895}},{"address1":"3517 S Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20007","coordinates":{"lat":38.914807,"lng":-77.070229}},{"address1":"1123 Ardee Avenue","address2":"","city":"Nashville","state":"TN","postalCode":"37216","coordinates":{"lat":36.219121,"lng":-86.725616}},{"address1":"3811 W Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20020","coordinates":{"lat":38.8629369,"lng":-76.9515086}},{"address1":"2130 Loren Circle","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.071889,"lng":-94.191613}},{"address1":"4 Orchard Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7747,"lng":-72.5247351}},{"address1":"4755 Coventry Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.318132,"lng":-86.28353}},{"address1":"1806 Boscobel Street","address2":"","city":"Nashville","state":"TN","postalCode":"37206","coordinates":{"lat":36.170799,"lng":-86.73835299999999}},{"address1":"7034 West John Garrison Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.107097,"lng":-94.2619139}},{"address1":"233 Juniper Drive","address2":"","city":"South Burlington","state":"VT","postalCode":"05403","coordinates":{"lat":44.473457,"lng":-73.176118}},{"address1":"1831 Frankford Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.181993,"lng":-85.692285}},{"address1":"4924 West 65th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8146604,"lng":-105.050343}},{"address1":"7095 Gladiola Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.824892,"lng":-105.162799}},{"address1":"7564 Moore Court","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.834188,"lng":-105.11569}},{"address1":"8442 Everett Way","address2":"A","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.850942,"lng":-105.096599}},{"address1":"1330 West 82nd Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99518","coordinates":{"lat":61.147676,"lng":-149.905329}},{"address1":"4907 Roger Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99507","coordinates":{"lat":61.17564799999999,"lng":-149.839627}},{"address1":"123 Blossom Road","address2":"","city":"Westport","state":"MA","postalCode":"02790","coordinates":{"lat":41.68531,"lng":-71.0961337}},{"address1":"915 Hargrove Street","address2":"","city":"Ardmore","state":"OK","postalCode":"73401","coordinates":{"lat":34.184371,"lng":-97.13386190000001}},{"address1":"1983 Reidsville Street","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":38.9817243,"lng":-76.5313745}},{"address1":"12403 Deerfield Road","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.977229,"lng":-81.145139}},{"address1":"1011 Devon Drive","address2":"","city":"Hayward","state":"CA","postalCode":"94542","coordinates":{"lat":37.65444100000001,"lng":-122.067741}},{"address1":"5222 West Laurie Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.5587639,"lng":-112.172235}},{"address1":"35 Pilgrim Lane","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.772138,"lng":-72.498806}},{"address1":"2728 Hale Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.2390813,"lng":-85.79926999999999}},{"address1":"65 Lowry Road","address2":"","city":"Falmouth","state":"MA","postalCode":"02540","coordinates":{"lat":41.5471365,"lng":-70.6075836}},{"address1":"302 Depot Road","address2":"","city":"Boxborough","state":"MA","postalCode":"01719","coordinates":{"lat":42.5013,"lng":-71.49441}},{"address1":"1402 Maggies Way","address2":"","city":"Waterbury Center","state":"VT","postalCode":"05677","coordinates":{"lat":44.410965,"lng":-72.71017499999999}},{"address1":"81 Lyness Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.76787789999999,"lng":-72.5443361}},{"address1":"6518 Dolphin Court","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21061","coordinates":{"lat":39.198769,"lng":-76.63721}},{"address1":"1842 West Park Place","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73106","coordinates":{"lat":35.4795219,"lng":-97.5431009}},{"address1":"1 Pond View Road","address2":"","city":"Proctor","state":"VT","postalCode":"05765","coordinates":{"lat":43.663678,"lng":-73.0458419}},{"address1":"1340 5th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.907549,"lng":-77.018924}},{"address1":"6000 Parker Drive","address2":"","city":"Deale","state":"MD","postalCode":"20751","coordinates":{"lat":38.780208,"lng":-76.539991}},{"address1":"822 Bowden Street","address2":"","city":"Savannah","state":"GA","postalCode":"31415","coordinates":{"lat":32.071342,"lng":-81.11783199999999}},{"address1":"1710 East Harold Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.109875,"lng":-94.1359389}},{"address1":"1518 Jenks Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.1765819,"lng":-85.662077}},{"address1":"814 South Pickard Avenue","address2":"","city":"Norman","state":"OK","postalCode":"73069","coordinates":{"lat":35.206961,"lng":-97.45494099999999}},{"address1":"100 Fenwick Village Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":32.0244412,"lng":-81.23017689999999}},{"address1":"218 Middle Street","address2":"","city":"Brighton","state":"VT","postalCode":"05846","coordinates":{"lat":44.818438,"lng":-71.8846049}},{"address1":"5470 Atlanta Highway","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.3802399,"lng":-86.21232959999999}},{"address1":"43 Main Street","address2":"","city":"Essex","state":"VT","postalCode":"05452","coordinates":{"lat":44.4921,"lng":-73.1074749}},{"address1":"804 East 7th Court","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.161259,"lng":-85.648719}},{"address1":"1709 Queensbury Road","address2":"","city":"Moore","state":"OK","postalCode":"73160","coordinates":{"lat":35.3546959,"lng":-97.507938}},{"address1":"646 Clinton Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.3602725,"lng":-86.3183004}},{"address1":"708 Pine Drift Drive","address2":"","city":"Odenton","state":"MD","postalCode":"21113","coordinates":{"lat":39.070589,"lng":-76.715406}},{"address1":"5104 West Tierra Buena Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.62898759999999,"lng":-112.168811}},{"address1":"1234 Carmel Street","address2":"","city":"Madera","state":"CA","postalCode":"93638","coordinates":{"lat":36.949941,"lng":-120.043739}},{"address1":"1753 Zion Road","address2":"#E33","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1273162,"lng":-94.1350437}},{"address1":"22538 6th Street","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.680829,"lng":-122.07335}},{"address1":"415 Lullwater Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.22177929999999,"lng":-85.8841423}},{"address1":"219 Bidwell Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.761322,"lng":-72.5498278}},{"address1":"4500 Margalo Avenue","address2":"","city":"Bakersfield","state":"CA","postalCode":"93313","coordinates":{"lat":35.305082,"lng":-119.052448}},{"address1":"8380 West 67th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.817999,"lng":-105.090301}},{"address1":"2334 Nantucket Drive","address2":"","city":"Crofton","state":"MD","postalCode":"21114","coordinates":{"lat":39.0298609,"lng":-76.67307600000001}},{"address1":"720 East Muhammad Ali Boulevard","address2":"","city":"Louisville","state":"KY","postalCode":"40202","coordinates":{"lat":38.2491941,"lng":-85.7396682}},{"address1":"12022 Town Park Circle","address2":"","city":"Anchorage","state":"AK","postalCode":"99577","coordinates":{"lat":61.32927710000001,"lng":-149.5778193}},{"address1":"2305 Ranchland Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31404","coordinates":{"lat":32.026112,"lng":-81.0755779}},{"address1":"1656 Newton Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20010","coordinates":{"lat":38.933985,"lng":-77.03866099999999}},{"address1":"91 85th Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.064165,"lng":-94.285358}},{"address1":"228 Central Street","address2":"","city":"Milford","state":"MA","postalCode":"01757","coordinates":{"lat":42.13911,"lng":-71.5115022}},{"address1":"20 Masters Way","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.740694,"lng":-72.51832}},{"address1":"5396 North Reese Avenue","address2":"","city":"Fresno","state":"CA","postalCode":"93722","coordinates":{"lat":36.815278,"lng":-119.864119}},{"address1":"28 Wilfred Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.766696,"lng":-72.5597335}},{"address1":"200 Pheasant Avenue","address2":"#103","city":"Louisville","state":"KY","postalCode":"40118","coordinates":{"lat":38.1134628,"lng":-85.76321279999999}},{"address1":"1650 Garland Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0845144,"lng":-94.1751065}},{"address1":"4600 Ritchie Highway","address2":"","city":"Baltimore","state":"MD","postalCode":"21225","coordinates":{"lat":39.228241,"lng":-76.6136159}},{"address1":"733 East DeRenne Avenue","address2":"","city":"Savannah","state":"GA","postalCode":"31405","coordinates":{"lat":32.024217,"lng":-81.095602}},{"address1":"8349 West Stella Way","address2":"","city":"Glendale","state":"AZ","postalCode":"85305","coordinates":{"lat":33.529493,"lng":-112.240632}},{"address1":"33 Pond Avenue","address2":"#804","city":"Brookline","state":"MA","postalCode":"02445","coordinates":{"lat":42.33094200000001,"lng":-71.1145331}},{"address1":"9 Kimball Court","address2":"#107","city":"Burlington","state":"MA","postalCode":"01803","coordinates":{"lat":42.501798,"lng":-71.168725}},{"address1":"2433 Southwest 36th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73109","coordinates":{"lat":35.42839900000001,"lng":-97.556119}},{"address1":"4607 Artelia Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.071468,"lng":-86.675555}},{"address1":"212 Ambleside Drive","address2":"","city":"Severna Park","state":"MD","postalCode":"21146","coordinates":{"lat":39.097022,"lng":-76.55617699999999}},{"address1":"8757 Lamar Circle","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8557446,"lng":-105.0681477}},{"address1":"130 Carolina Cherry Circle","address2":"","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.1485911,"lng":-81.2620116}},{"address1":"7804 Abercorn Street","address2":"#11","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":32.00192,"lng":-81.11689830000002}},{"address1":"12870 Old Seward Highway","address2":"#STE 000105","city":"Anchorage","state":"AK","postalCode":"99515","coordinates":{"lat":61.10396369999999,"lng":-149.8575515}},{"address1":"8133 Meadowgreen Place","address2":"","city":"Louisville","state":"KY","postalCode":"40299","coordinates":{"lat":38.1899697,"lng":-85.60704779999999}},{"address1":"5 Meadow Lane","address2":"","city":"Rutland","state":"VT","postalCode":"05701","coordinates":{"lat":43.619797,"lng":-72.983231}},{"address1":"562 South Pierremont Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.05627330000001,"lng":-94.1251461}},{"address1":"1219 Carleton Street","address2":"M","city":"Berkeley","state":"CA","postalCode":"94702","coordinates":{"lat":37.8591054,"lng":-122.285823}},{"address1":"1403 Boulder Court","address2":"","city":"Hanover","state":"MD","postalCode":"21076","coordinates":{"lat":39.140743,"lng":-76.69958}},{"address1":"122 Coral Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.233822,"lng":-85.89228399999999}},{"address1":"1404 James Way","address2":"","city":"Edgewater","state":"MD","postalCode":"21037","coordinates":{"lat":38.8879642,"lng":-76.5100926}},{"address1":"4300 Woodley Square","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.3269015,"lng":-86.2695368}},{"address1":"422 Richmond Street","address2":"","city":"El Cerrito","state":"CA","postalCode":"94530","coordinates":{"lat":37.9028101,"lng":-122.2981152}},{"address1":"222 Plymouth Street","address2":"A","city":"Middleborough","state":"MA","postalCode":"02346","coordinates":{"lat":41.928117,"lng":-70.9416075}},{"address1":"451 East Street","address2":"","city":"Huntington","state":"VT","postalCode":"05462","coordinates":{"lat":44.3194104,"lng":-72.9844982}},{"address1":"9209 Eupora Court","address2":"","city":"Jeffersontown","state":"KY","postalCode":"40299","coordinates":{"lat":38.1970417,"lng":-85.58631430000001}},{"address1":"4 Conti Circle","address2":"","city":"Barre","state":"VT","postalCode":"05641","coordinates":{"lat":44.1731699,"lng":-72.4920951}},{"address1":"5264 Shafter Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94618","coordinates":{"lat":37.839058,"lng":-122.256035}},{"address1":"1630 Eton Way","address2":"","city":"Crofton","state":"MD","postalCode":"21114","coordinates":{"lat":39.008958,"lng":-76.69134199999999}},{"address1":"5244 West Port Au Prince Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.622672,"lng":-112.17283}},{"address1":"1835 Pointer Lane","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.08606899999999,"lng":-94.1187549}},{"address1":"107 Laurel Green Court","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":32.025628,"lng":-81.24673399999999}},{"address1":"7250 Urban Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.827875,"lng":-105.133965}},{"address1":"12 Kane Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.764315,"lng":-72.51276}},{"address1":"4132 Northwest 57th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73112","coordinates":{"lat":35.529164,"lng":-97.594155}},{"address1":"10774 West 54th Lane","address2":"","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.7963587,"lng":-105.11861}},{"address1":"6729 North 54th Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.536068,"lng":-112.17458}},{"address1":"6483 West 76th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.834927,"lng":-105.069802}},{"address1":"5732 Jean Drive","address2":"","city":"Union City","state":"CA","postalCode":"94587","coordinates":{"lat":37.580691,"lng":-122.082773}},{"address1":"8221 Surf Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32408","coordinates":{"lat":30.1630986,"lng":-85.7845665}},{"address1":"9101 Vanguard Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99507","coordinates":{"lat":61.1382426,"lng":-149.84756}},{"address1":"18713 Shilstone Way","address2":"","city":"Edmond","state":"OK","postalCode":"73012","coordinates":{"lat":35.6618776,"lng":-97.53426999999999}},{"address1":"51185 Helmsman Street","address2":"","city":"Kenai","state":"AK","postalCode":"99611","coordinates":{"lat":60.509562,"lng":-151.265293}},{"address1":"128 East Oak Street","address2":"#3","city":"Louisville","state":"KY","postalCode":"40203","coordinates":{"lat":38.2342125,"lng":-85.7539867}},{"address1":"1222 Arcade Boulevard","address2":"","city":"Sacramento","state":"CA","postalCode":"95815","coordinates":{"lat":38.626122,"lng":-121.43861}},{"address1":"1405 Mercedes Avenue","address2":"APARTMENT G","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.1738039,"lng":-85.6462091}},{"address1":"7024 Johnny Mercer Boulevard","address2":"","city":"Savannah","state":"GA","postalCode":"31410","coordinates":{"lat":32.022447,"lng":-80.969861}},{"address1":"3600 Pennsylvania Avenue","address2":"#APT 6","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.5516245,"lng":-121.9872735}},{"address1":"312 North Cove Boulevard","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.1520433,"lng":-85.6500713}},{"address1":"3118 Sora Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40213","coordinates":{"lat":38.208849,"lng":-85.724113}},{"address1":"6420 Via Baron","address2":"","city":"Rancho Palos Verdes","state":"CA","postalCode":"90275","coordinates":{"lat":33.741162,"lng":-118.390767}},{"address1":"3321 Furman Boulevard","address2":"","city":"Louisville","state":"KY","postalCode":"40220","coordinates":{"lat":38.2134349,"lng":-85.640439}},{"address1":"98 Lincoln Street","address2":"","city":"Revere","state":"MA","postalCode":"02151","coordinates":{"lat":42.418115,"lng":-71.027503}},{"address1":"984 Greendale Avenue","address2":"","city":"Needham","state":"MA","postalCode":"02492","coordinates":{"lat":42.275811,"lng":-71.203287}},{"address1":"239 Eastern Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0605438,"lng":-94.18373079999999}},{"address1":"1106 Commanders Way South","address2":"","city":"Annapolis","state":"MD","postalCode":"21409","coordinates":{"lat":39.033352,"lng":-76.447767}},{"address1":"4927 Alvin Sperry Road","address2":"","city":"Mount Juliet","state":"TN","postalCode":"37122","coordinates":{"lat":36.143557,"lng":-86.556877}},{"address1":"1632 North Lunsford Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0827979,"lng":-94.137607}},{"address1":"2349 East Tall Oaks Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.09277,"lng":-94.12758799999999}},{"address1":"2036 Hermitage Hills Drive","address2":"","city":"Gambrills","state":"MD","postalCode":"21054","coordinates":{"lat":38.9951,"lng":-76.65160999999999}},{"address1":"119 Oakland Street","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.7976637,"lng":-72.5199944}},{"address1":"37675 Fremont Boulevard","address2":"#APT 42","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.555306,"lng":-122.003412}},{"address1":"3104 Southwest 46th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73119","coordinates":{"lat":35.4186213,"lng":-97.56952249999999}},{"address1":"2036 Gorgas Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36106","coordinates":{"lat":32.357301,"lng":-86.276583}},{"address1":"11102 Little Rock Court","address2":"","city":"Louisville","state":"KY","postalCode":"40241","coordinates":{"lat":38.3214271,"lng":-85.5421016}},{"address1":"46 Deslauriers Street","address2":"","city":"Chicopee","state":"MA","postalCode":"01020","coordinates":{"lat":42.1855005,"lng":-72.5733508}},{"address1":"12 Red Fox Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.981396,"lng":-81.22833899999999}},{"address1":"503 Blackwood Terrace Southeast","address2":"","city":"Calhoun","state":"GA","postalCode":"30701","coordinates":{"lat":34.459017,"lng":-84.914659}},{"address1":"2223 North Fernwood Court","address2":"","city":"Savannah","state":"GA","postalCode":"31404","coordinates":{"lat":32.029307,"lng":-81.06297099999999}},{"address1":"5444 Nicole Boulevard","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.238007,"lng":-85.562274}},{"address1":"849 East Victoria Street","address2":"#204","city":"Carson","state":"CA","postalCode":"90746","coordinates":{"lat":33.8673562,"lng":-118.2597713}},{"address1":"445 South Potomac Circle","address2":"","city":"Aurora","state":"CO","postalCode":"80012","coordinates":{"lat":39.705341,"lng":-104.830397}},{"address1":"201 East 9th Avenue","address2":"#APT 000102","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.213897,"lng":-149.880633}},{"address1":"3500 15th Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20017","coordinates":{"lat":38.93311000000001,"lng":-76.98485699999999}},{"address1":"4981 Shirley Way","address2":"","city":"Livermore","state":"CA","postalCode":"94550","coordinates":{"lat":37.682649,"lng":-121.733308}},{"address1":"1300 Lemos Lane","address2":"","city":"Fremont","state":"CA","postalCode":"94539","coordinates":{"lat":37.546996,"lng":-121.951627}},{"address1":"5000 V Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20007","coordinates":{"lat":38.917076,"lng":-77.09743399999999}},{"address1":"6823 Forsythe Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.12332199999999,"lng":-85.571428}},{"address1":"1522 South 36th Street","address2":"","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.231691,"lng":-85.8144612}},{"address1":"313 Lone Oak Drive","address2":"","city":"Norman","state":"OK","postalCode":"73071","coordinates":{"lat":35.221084,"lng":-97.405029}},{"address1":"970 Old Oak Road","address2":"","city":"Livermore","state":"CA","postalCode":"94550","coordinates":{"lat":37.653774,"lng":-121.796632}},{"address1":"1653 Brooks Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.04687,"lng":-94.17589699999999}},{"address1":"441 Merritt Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94610","coordinates":{"lat":37.8058663,"lng":-122.2493644}},{"address1":"632 North Pine Street","address2":"","city":"Anchorage","state":"AK","postalCode":"99508","coordinates":{"lat":61.22930220000001,"lng":-149.7938547}}],"attribution":["City of Haddam (CT)","Ciy of Hartford (CT)","City of Lyme (CT)","City of Manchester (CT)","City of Watertown (CT)","City of Avon (CT)","Town of Fairfield (CT)","City of Groton (CT)","Office of Geographic Information (MassGIS), Commonwealth of Massachusetts, MassIT (MA)","VT Enhanced 911 Board, VCGI (VT)","City of Huntsville (AL)","City of Montgomery (AL)","Shelby County (AL)","Talladega County (AL)","City of Fayetteville (AR)","Arkansas Geographic Information Office (AR)","City of Washington (DC)","Bay County (FL)","Brevard County (FL)","Charlotte County (FL)","Citrus County (FL)","Clay County (FL)","Highlands County, FL (FL)","Hillsborough County (FL)","City of Savannah (GA)","Gordon County (GA)","Muscogee County (GA)","Sumter County (GA)","Metro Louisville, LOJIC partners (KY)","Anne Arundel County (MD)","City of Baltimore (MD)","Frederick County (MD)","Oklahoma and Logan Counties - Association of Central Oklahoma Governments (OK)","Kern, Cleveland, Canadian, Logan Counties (OK)","City of Nashville (TN)","Cooke,Fannin,Grayson Counties - Texoma Council of Governments (TX)","Municipality of Anchorage (AK)","Copyright © 2015 Kenai Peninsula Borough (AK)","Matanuska-Susitna Borough (AK)","City of Glendale (AZ)","City of Mesa (AZ)","Alameda County (CA)","Amador County (CA)","City of Berkeley (CA)","Butte County (CA)","City of Bakersfield (CA)","City of Carson (CA)","City of Cupertino (CA)","City of Hayward and Fairview. Licensed for Public Use (CA)","City of Mountain View (CA)","City of Orange (CA)","Contra Costa County (CA)","El Dorando County (CA)","Fresno County (CA)","Humboldt County (CA)","Kern County (CA)","Kings County (CA)","Lake County (CA)","Lassen County (CA)","Los Angeles County (CA)","Madera County (CA)","Marin County (CA)","Merced County (CA)","Mono County (CA)","Monterey County (CA)","Napa County (CA)","County of Nevada, California (CA)","Orange County (CA)","City of Palo Alto (CA)","County of Placer (CA)","Secramento County (CA)","San Bernardino County (CA)","San Diego Geographic Information Source - JPA (CA)","San Joaquin County (CA)","San Luis Obispo County (CA)","San Mateo County (CA)","Santa Barbara County (CA)","Santa Clara County (CA)","Santa Cruz County (CA)","Shasta County (CA)","Solano County (CA)","Sonoma County (CA)","Stanislaus County (CA)","Tuolumne County (CA)","Yolo County (CA)","Yuba County (CA)","Arapahoe County (CO)","Archuleta County (CO)","City of Arvada (CO)","City of Aurora (CO)","City of Boulder (CO)","City of Fort Collins (CO)","City of Greeley (CO)","City of Loveland (CO)","City of Westminster (CO)","Gilpin County (CO)","Gunnison County (CO)","Jefferson County (CO)","Larimer County (CO)","Mesa County (CO)","Pitkin County (CO)","Pubelo County (CO)","San Miguel County (CO)","City of Honolulu (HI)"]} +{"addresses":[{"address1":"1745 T Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20020","coordinates":{"lat":38.867033,"lng":-76.979235}},{"address1":"6007 Applegate Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40219","coordinates":{"lat":38.1343013,"lng":-85.6498512}},{"address1":"560 Penstock Drive","address2":"","city":"Grass Valley","state":"CA","postalCode":"95945","coordinates":{"lat":39.213076,"lng":-121.077583}},{"address1":"150 Carter Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.76556000000001,"lng":-72.473091}},{"address1":"2721 Lindsay Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40206","coordinates":{"lat":38.263793,"lng":-85.700243}},{"address1":"18 Densmore Drive","address2":"","city":"Essex","state":"VT","postalCode":"05452","coordinates":{"lat":44.492953,"lng":-73.101883}},{"address1":"637 Britannia Drive","address2":"","city":"Vallejo","state":"CA","postalCode":"94591","coordinates":{"lat":38.10476999999999,"lng":-122.193849}},{"address1":"5601 West Crocus Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.6152469,"lng":-112.179737}},{"address1":"5403 Illinois Avenue","address2":"","city":"Nashville","state":"TN","postalCode":"37209","coordinates":{"lat":36.157077,"lng":-86.853827}},{"address1":"8821 West Myrtle Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85305","coordinates":{"lat":33.5404296,"lng":-112.2488391}},{"address1":"2203 7th Street Road","address2":"","city":"Louisville","state":"KY","postalCode":"40208","coordinates":{"lat":38.218107,"lng":-85.779006}},{"address1":"6463 Vrain Street","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.814056,"lng":-105.046913}},{"address1":"87 Horseshoe Drive","address2":"","city":"West Windsor","state":"VT","postalCode":"05037","coordinates":{"lat":43.4731793,"lng":-72.4967532}},{"address1":"60 Desousa Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7409259,"lng":-72.5619104}},{"address1":"4 Old Colony Way","address2":"","city":"Yarmouth","state":"MA","postalCode":"02664","coordinates":{"lat":41.697168,"lng":-70.189992}},{"address1":"314 South 17th Street","address2":"","city":"Nashville","state":"TN","postalCode":"37206","coordinates":{"lat":36.1719075,"lng":-86.740228}},{"address1":"1649 Timberridge Court","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.084563,"lng":-94.206082}},{"address1":"5461 West Shades Valley Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.296422,"lng":-86.34280299999999}},{"address1":"629 Debbie Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37076","coordinates":{"lat":36.208114,"lng":-86.58621199999999}},{"address1":"22572 Toreador Drive","address2":"","city":"Salinas","state":"CA","postalCode":"93908","coordinates":{"lat":36.602449,"lng":-121.699071}},{"address1":"3034 Mica Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0807929,"lng":-94.2066449}},{"address1":"3729 East Mission Boulevard","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0919353,"lng":-94.10654219999999}},{"address1":"5114 Greentree Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.0618539,"lng":-86.738508}},{"address1":"3466 Southview Avenue","address2":"","city":"Montgomery","state":"AL","postalCode":"36111","coordinates":{"lat":32.341227,"lng":-86.2846859}},{"address1":"1513 Cathy Street","address2":"","city":"Savannah","state":"GA","postalCode":"31415","coordinates":{"lat":32.067416,"lng":-81.125331}},{"address1":"600 West 19th Avenue","address2":"APT B","city":"Anchorage","state":"AK","postalCode":"99503","coordinates":{"lat":61.203115,"lng":-149.894107}},{"address1":"1208 Elkader Court North","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.080049,"lng":-86.60116099999999}},{"address1":"210 Green Road","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.7909099,"lng":-72.51195129999999}},{"address1":"49548 Road 200","address2":"","city":"O'Neals","state":"CA","postalCode":"93645","coordinates":{"lat":37.153463,"lng":-119.648192}},{"address1":"81 Seaton Place Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.9149499,"lng":-77.01170259999999}},{"address1":"1267 Martin Street","address2":"#203","city":"Nashville","state":"TN","postalCode":"37203","coordinates":{"lat":36.1404897,"lng":-86.7695179}},{"address1":"7431 Candace Way","address2":"#1","city":"Louisville","state":"KY","postalCode":"40214","coordinates":{"lat":38.142768,"lng":-85.7717132}},{"address1":"1407 Walden Court","address2":"","city":"Crofton","state":"MD","postalCode":"21114","coordinates":{"lat":39.019306,"lng":-76.660653}},{"address1":"5906 Milton Avenue","address2":"","city":"Deale","state":"MD","postalCode":"20751","coordinates":{"lat":38.784451,"lng":-76.54125499999999}},{"address1":"74 Springfield Street","address2":"B","city":"Agawam","state":"MA","postalCode":"01001","coordinates":{"lat":42.0894922,"lng":-72.6297558}},{"address1":"2905 Stonebridge Court","address2":"","city":"Norman","state":"OK","postalCode":"73071","coordinates":{"lat":35.183319,"lng":-97.40210499999999}},{"address1":"20930 Todd Valley Road","address2":"","city":"Foresthill","state":"CA","postalCode":"95631","coordinates":{"lat":38.989466,"lng":-120.883108}},{"address1":"5928 West Mauna Loa Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.6204899,"lng":-112.18702}},{"address1":"802 Madison Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.9582381,"lng":-77.0244287}},{"address1":"2811 Battery Place Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20016","coordinates":{"lat":38.9256252,"lng":-77.0982646}},{"address1":"210 Lacross Lane","address2":"","city":"Westmore","state":"VT","postalCode":"05860","coordinates":{"lat":44.771005,"lng":-72.048664}},{"address1":"2010 Rising Hill Drive","address2":"","city":"Norman","state":"OK","postalCode":"73071","coordinates":{"lat":35.177281,"lng":-97.411869}},{"address1":"388 East Main Street","address2":"","state":"VT","postalCode":"05753","coordinates":{"lat":43.9727945,"lng":-73.1023187}},{"address1":"450 Kinhawk Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.030927,"lng":-86.71949099999999}},{"address1":"131 Westerly Street","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.7906813,"lng":-72.53559729999999}},{"address1":"308 Woodleaf Court","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21061","coordinates":{"lat":39.1425931,"lng":-76.6238441}},{"address1":"8502 Madrone Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40258","coordinates":{"lat":38.1286407,"lng":-85.8678042}},{"address1":"23 Sable Run Lane","address2":"","city":"Methuen","state":"MA","postalCode":"01844","coordinates":{"lat":42.759847,"lng":-71.157721}},{"address1":"716 Waller Road","address2":"","city":"Brentwood","state":"TN","postalCode":"37027","coordinates":{"lat":35.998892,"lng":-86.696529}},{"address1":"416 McIver Street","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.10436,"lng":-86.74411599999999}},{"address1":"1508 Massachusetts Avenue Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20003","coordinates":{"lat":38.887255,"lng":-76.98318499999999}},{"address1":"5615 West Villa Maria Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.650988,"lng":-112.180624}},{"address1":"3162 Martin Luther King Junior Boulevard","address2":"#2","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.05233310000001,"lng":-94.2056987}},{"address1":"5306 Ritchie Highway","address2":"","city":"Baltimore","state":"MD","postalCode":"21225","coordinates":{"lat":39.221978,"lng":-76.614183}},{"address1":"109 Summit Street","address2":"","city":"Burlington","state":"VT","postalCode":"05401","coordinates":{"lat":44.4729749,"lng":-73.2026566}},{"address1":"816 West 19th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99503","coordinates":{"lat":61.203221,"lng":-149.898655}},{"address1":"172 Alburg Springs Road","address2":"","city":"Alburgh","state":"VT","postalCode":"05440","coordinates":{"lat":44.995827,"lng":-73.2201539}},{"address1":"159 Downey Drive","address2":"A","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7800126,"lng":-72.5754309}},{"address1":"125 John Street","address2":"","city":"Santa Cruz","state":"CA","postalCode":"95060","coordinates":{"lat":36.950901,"lng":-122.046881}},{"address1":"1101 Lotus Avenue","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21061","coordinates":{"lat":39.191982,"lng":-76.6525659}},{"address1":"8376 Albacore Drive","address2":"","city":"Pasadena","state":"MD","postalCode":"21122","coordinates":{"lat":39.110409,"lng":-76.46565799999999}},{"address1":"491 Arabian Way","address2":"","city":"Grand Junction","state":"CO","postalCode":"81504","coordinates":{"lat":39.07548999999999,"lng":-108.474785}},{"address1":"12245 West 71st Place","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8267078,"lng":-105.1366798}},{"address1":"80 North East Street","address2":"#4","city":"Holyoke","state":"MA","postalCode":"01040","coordinates":{"lat":42.2041219,"lng":-72.5977704}},{"address1":"4695 East Huntsville Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0471975,"lng":-94.0946286}},{"address1":"310 Timrod Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.756758,"lng":-72.493501}},{"address1":"1364 Capri Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.2207276,"lng":-85.6808795}},{"address1":"132 Laurel Green Court","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":32.0243075,"lng":-81.2468102}},{"address1":"6657 West Rose Garden Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.676018,"lng":-112.201658}},{"address1":"519 West 75th Avenue","address2":"#APT 000003","city":"Anchorage","state":"AK","postalCode":"99518","coordinates":{"lat":61.15288690000001,"lng":-149.889133}},{"address1":"31353 Santa Elena Way","address2":"","city":"Union City","state":"CA","postalCode":"94587","coordinates":{"lat":37.593981,"lng":-122.059762}},{"address1":"8398 West Denton Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85305","coordinates":{"lat":33.515353,"lng":-112.240812}},{"address1":"700 Winston Place","address2":"","city":"Anchorage","state":"AK","postalCode":"99504","coordinates":{"lat":61.215882,"lng":-149.737337}},{"address1":"232 Maine Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.1527033,"lng":-85.63207129999999}},{"address1":"1 Kempf Drive","address2":"","city":"Easton","state":"MA","postalCode":"02375","coordinates":{"lat":42.0505989,"lng":-71.08029379999999}},{"address1":"5811 Crossings Boulevard","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.0370847,"lng":-86.6413728}},{"address1":"5108 Franklin Street","address2":"","city":"Savannah","state":"GA","postalCode":"31405","coordinates":{"lat":32.034987,"lng":-81.121928}},{"address1":"913 Fallview Trail","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.02419100000001,"lng":-86.718305}},{"address1":"270 Chrissy's Court","address2":"","state":"VT","postalCode":"05443","coordinates":{"lat":44.1710043,"lng":-73.1065617}},{"address1":"130 Old Route 103","address2":"","city":"Chester","state":"VT","postalCode":"05143","coordinates":{"lat":43.224335,"lng":-72.54227399999999}},{"address1":"10826 Pointe Royal Drive","address2":"","city":"Bakersfield","state":"CA","postalCode":"93311","coordinates":{"lat":35.2930007,"lng":-119.1225908}},{"address1":"74 Ranch Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.383322,"lng":-86.235124}},{"address1":"6601 West Ocotillo Road","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.53433,"lng":-112.2011246}},{"address1":"19416 Barclay Road","address2":"","city":"Castro Valley","state":"CA","postalCode":"94546","coordinates":{"lat":37.70382,"lng":-122.091054}},{"address1":"1347 Blackwalnut Court","address2":"","city":"Annapolis","state":"MD","postalCode":"21403","coordinates":{"lat":38.936881,"lng":-76.475823}},{"address1":"1770 Colony Way","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0867,"lng":-94.229754}},{"address1":"165 Saint John Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7762171,"lng":-72.5410548}},{"address1":"2409 Research Boulevard","address2":"","city":"Fort Collins","state":"CO","postalCode":"80526","coordinates":{"lat":40.554586,"lng":-105.087852}},{"address1":"1903 Bashford Manor Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40218","coordinates":{"lat":38.1977059,"lng":-85.675288}},{"address1":"8315 Surf Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32408","coordinates":{"lat":30.163458,"lng":-85.785449}},{"address1":"3301 Old Muldoon Road","address2":"","city":"Anchorage","state":"AK","postalCode":"99504","coordinates":{"lat":61.1908348,"lng":-149.7340096}},{"address1":"8800 Cordell Circle","address2":"#APT 000003","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.1409305,"lng":-149.9437822}},{"address1":"117 East Cook Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.230336,"lng":-149.883795}},{"address1":"6231 North 67th Avenue","address2":"#241","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5279666,"lng":-112.2022551}},{"address1":"8505 Waters Avenue","address2":"#66","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":31.9901877,"lng":-81.1070672}},{"address1":"7 Underwood Place Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20012","coordinates":{"lat":38.969351,"lng":-77.009722}},{"address1":"21950 Arnold Center Road","address2":"","city":"Carson","state":"CA","postalCode":"90810","coordinates":{"lat":33.8272706,"lng":-118.2302826}},{"address1":"1427 South Carolina Avenue Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20003","coordinates":{"lat":38.886615,"lng":-76.9845349}},{"address1":"1420 Turtleback Trail","address2":"","city":"Panama City","state":"FL","postalCode":"32413","coordinates":{"lat":30.281084,"lng":-85.9677169}},{"address1":"6990 Pierson Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.824425,"lng":-105.122103}},{"address1":"376 North Williams Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.067997,"lng":-94.142563}},{"address1":"3617 Menlo Court","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.307397,"lng":-86.26001099999999}},{"address1":"711 Parker Street","address2":"","city":"East Longmeadow","state":"MA","postalCode":"01028","coordinates":{"lat":42.082262,"lng":-72.488113}},{"address1":"8521 Crystal Street","address2":"","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.143426,"lng":-149.94665}},{"address1":"1622 Edgar D Nixon Avenue","address2":"","city":"Montgomery","state":"AL","postalCode":"36104","coordinates":{"lat":32.356384,"lng":-86.3128909}},{"address1":"1608 Gales Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.8985542,"lng":-76.9813444}},{"address1":"122 East Hayes Street","address2":"","city":"Norman","state":"OK","postalCode":"73069","coordinates":{"lat":35.232121,"lng":-97.445053}},{"address1":"5144 Cattail Court","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.041153,"lng":-94.087419}},{"address1":"131 Kent Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.803084,"lng":-72.492786}},{"address1":"2313 Vegas Avenue","address2":"","city":"Castro Valley","state":"CA","postalCode":"94546","coordinates":{"lat":37.689189,"lng":-122.076775}},{"address1":"5420 Sunset Avenue","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32408","coordinates":{"lat":30.145603,"lng":-85.755095}},{"address1":"242 North Ash Street","address2":"","city":"Fruita","state":"CO","postalCode":"81521","coordinates":{"lat":39.161544,"lng":-108.725378}},{"address1":"38676 Greenwich Circle","address2":"","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.562256,"lng":-121.976451}},{"address1":"2426 East Onyx Trail","address2":"#6","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.065707,"lng":-94.1276125}},{"address1":"110 Seaton Place Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.9146701,"lng":-77.01264680000001}},{"address1":"5385 Iris Street","address2":"","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.794498,"lng":-105.106056}},{"address1":"5628 West Tonopah Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6710947,"lng":-112.1810955}},{"address1":"65 Bay Drive","address2":"","city":"Annapolis","state":"MD","postalCode":"21403","coordinates":{"lat":38.937493,"lng":-76.45638699999999}},{"address1":"7401 North 61st Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5450005,"lng":-112.191417}},{"address1":"8 Watkins Road","address2":"","state":"VT","postalCode":"05468","coordinates":{"lat":44.6028809,"lng":-73.17689299999999}},{"address1":"2209 June Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37214","coordinates":{"lat":36.16848,"lng":-86.695241}},{"address1":"1840 Nobel Place","address2":"","city":"Louisville","state":"KY","postalCode":"40216","coordinates":{"lat":38.198892,"lng":-85.8090129}},{"address1":"2622 Martin Luther King Junior Boulevard","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.053922,"lng":-94.1973008}},{"address1":"4 Glen Circle","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21060","coordinates":{"lat":39.157751,"lng":-76.60633399999999}},{"address1":"7529 West 72nd Avenue","address2":"#4","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8276128,"lng":-105.0799305}},{"address1":"10996 Largo Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.99178,"lng":-81.14366799999999}},{"address1":"2027 North Shannon Drive","address2":"#5","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0892622,"lng":-94.17333020000001}},{"address1":"154 Boca Lagoon Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32408","coordinates":{"lat":30.171012,"lng":-85.77501099999999}},{"address1":"3311 Wiley Post Loop","address2":"","city":"Anchorage","state":"AK","postalCode":"99517","coordinates":{"lat":61.18686499999999,"lng":-149.946288}},{"address1":"5055 West 58th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.8024171,"lng":-105.0505121}},{"address1":"3228 Chettenham Drive","address2":"","city":"Rancho Cordova","state":"CA","postalCode":"95670","coordinates":{"lat":38.577813,"lng":-121.301333}},{"address1":"1901 North Midwest Boulevard","address2":"","city":"Edmond","state":"OK","postalCode":"73034","coordinates":{"lat":35.67413,"lng":-97.39058399999999}},{"address1":"1536 North Main Street","address2":"","city":"Salinas","state":"CA","postalCode":"93906","coordinates":{"lat":36.7122208,"lng":-121.6522485}},{"address1":"33 Linscott Road","address2":"","city":"Hingham","state":"MA","postalCode":"02043","coordinates":{"lat":42.2257391,"lng":-70.8828675}},{"address1":"1732 27th Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94601","coordinates":{"lat":37.783431,"lng":-122.228238}},{"address1":"22 Gallatin Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.9526368,"lng":-77.0080993}},{"address1":"8125 Glynnwood Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.341844,"lng":-86.14093}},{"address1":"2139 Glynnwood Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31404","coordinates":{"lat":32.021538,"lng":-81.06860999999999}},{"address1":"14 School Street","address2":"","city":"Medway","state":"MA","postalCode":"02053","coordinates":{"lat":42.141711,"lng":-71.395014}},{"address1":"264 Crest Drive","address2":"","city":"Soldotna","state":"AK","postalCode":"99669","coordinates":{"lat":60.497608,"lng":-151.080848}},{"address1":"307 Joel Street","address2":"","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.123265,"lng":-81.24991}},{"address1":"188 River Road","address2":"","city":"Essex","state":"VT","postalCode":"05452","coordinates":{"lat":44.478846,"lng":-73.058294}},{"address1":"1643 Oxford Street","address2":"R C","city":"Berkeley","state":"CA","postalCode":"94709","coordinates":{"lat":37.877894,"lng":-122.266436}},{"address1":"5545 Saddlewood Lane","address2":"","city":"Brentwood","state":"TN","postalCode":"37027","coordinates":{"lat":36.026888,"lng":-86.7576629}},{"address1":"26466 Mockingbird Lane","address2":"","city":"Hayward","state":"CA","postalCode":"94544","coordinates":{"lat":37.6410262,"lng":-122.0864272}},{"address1":"4840 Reservoir Road Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20007","coordinates":{"lat":38.9158933,"lng":-77.0962873}},{"address1":"599 Cambridge Street","address2":"#303","city":"Cambridge","state":"MA","postalCode":"02141","coordinates":{"lat":42.3720518,"lng":-71.08610949999999}},{"address1":"584 Rural Hill Road","address2":"","city":"Nashville","state":"TN","postalCode":"37217","coordinates":{"lat":36.089291,"lng":-86.621854}},{"address1":"10262 West 59th Avenue","address2":"#1","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.803718,"lng":-105.111974}},{"address1":"945 South 5th Street","address2":"#1020","city":"Louisville","state":"KY","postalCode":"40203","coordinates":{"lat":38.2402351,"lng":-85.76031119999999}},{"address1":"2543 The Meadows","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.3463001,"lng":-86.2185382}},{"address1":"153 Atlantic Avenue","address2":"#6","city":"Salisbury","state":"MA","postalCode":"01952","coordinates":{"lat":42.8339101,"lng":-70.81575269999999}},{"address1":"9 Brooklyn Street","address2":"","state":"VT","postalCode":"05488","coordinates":{"lat":44.924599,"lng":-73.12809399999999}},{"address1":"5722 8th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.959305,"lng":-77.024463}},{"address1":"8700 Seaton Boulevard","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.3378676,"lng":-86.1731595}},{"address1":"1004 Bellflower Street","address2":"","city":"Livermore","state":"CA","postalCode":"94551","coordinates":{"lat":37.710745,"lng":-121.732765}},{"address1":"4738 Mallard Common","address2":"","city":"Fremont","state":"CA","postalCode":"94555","coordinates":{"lat":37.5666441,"lng":-122.0444344}},{"address1":"875 Latouche Street","address2":"#APT 001010","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.2132529,"lng":-149.8608243}},{"address1":"4940 Fuller Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36110","coordinates":{"lat":32.42936,"lng":-86.21683519999999}},{"address1":"5754 Belleau Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.394398,"lng":-86.203138}},{"address1":"1403 Lincoln Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.0613716,"lng":-81.09482249999999}},{"address1":"140 South Hill Avenue","address2":"#305","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0618737,"lng":-94.16920189999999}},{"address1":"642 South 2nd Street","address2":"#608","city":"Louisville","state":"KY","postalCode":"40202","coordinates":{"lat":38.2472593,"lng":-85.7549195}},{"address1":"6473 Zephyr Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.814341,"lng":-105.085116}},{"address1":"4250 North Valley Lake Drive","address2":"#8","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1279064,"lng":-94.12180719999999}},{"address1":"565 North Lakeshore Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.246868,"lng":-85.918511}},{"address1":"5514 West Wedington Drive","address2":"#3","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.079411,"lng":-94.240031}},{"address1":"1909 Wainwright Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.183868,"lng":-85.722174}},{"address1":"4525 West Frier Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5488732,"lng":-112.1565998}},{"address1":"201 West Montgomery Cross Road","address2":"#170","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":31.9996137,"lng":-81.13121}},{"address1":"915 Heath Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.363883,"lng":-86.333247}},{"address1":"95 Briarwood Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.745751,"lng":-72.542544}},{"address1":"69 Washington Street","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.78712489999999,"lng":-72.52083069999999}},{"address1":"2900 North Western Avenue","address2":"","city":"Edmond","state":"OK","postalCode":"73012","coordinates":{"lat":35.687568,"lng":-97.53227299999999}},{"address1":"7841 West Kristal Way","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.658804,"lng":-112.228834}},{"address1":"361 Parmley Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37207","coordinates":{"lat":36.2446128,"lng":-86.8197718}},{"address1":"6120 Southeast 84th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73135","coordinates":{"lat":35.380836,"lng":-97.41582}},{"address1":"9428 North 65th Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.571222,"lng":-112.20045}},{"address1":"11 Meeting Place Circle","address2":"","city":"Boxford","state":"MA","postalCode":"01921","coordinates":{"lat":42.6946519,"lng":-71.0008529}},{"address1":"4438 Maine Avenue","address2":"","city":"Baldwin Park","state":"CA","postalCode":"91706","coordinates":{"lat":34.093409,"lng":-117.959953}},{"address1":"65 Jones Lane","address2":"","city":"Montevallo","state":"AL","postalCode":"35115","coordinates":{"lat":33.096851,"lng":-86.846577}},{"address1":"3140 Commander Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40220","coordinates":{"lat":38.215781,"lng":-85.653981}},{"address1":"107 Guaymas Place","address2":"","city":"Davis","state":"CA","postalCode":"95616","coordinates":{"lat":38.567048,"lng":-121.746046}},{"address1":"6114 West Glenn Drive","address2":"#1","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5401454,"lng":-112.1912722}},{"address1":"622 Thomas Street","address2":"","city":"Woodland","state":"CA","postalCode":"95776","coordinates":{"lat":38.672731,"lng":-121.76065}},{"address1":"127 Grand Heron Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32407","coordinates":{"lat":30.189702,"lng":-85.80841099999999}},{"address1":"3504 East 16th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99508","coordinates":{"lat":61.2058945,"lng":-149.8158624}},{"address1":"1230 Stafford Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.32403,"lng":-86.14840099999999}},{"address1":"6007 Yarrow Street","address2":"H","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.806211,"lng":-105.084446}},{"address1":"632 Belmar Drive","address2":"","city":"Edmond","state":"OK","postalCode":"73025","coordinates":{"lat":35.7016024,"lng":-97.4912627}},{"address1":"1515 Chandlee Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.176365,"lng":-85.666253}},{"address1":"10632 Admiral Court","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73162","coordinates":{"lat":35.57886200000001,"lng":-97.6270728}},{"address1":"11655 West 81st Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.84356820000001,"lng":-105.1297584}},{"address1":"3500 Blanchard Drive Southwest","address2":"","city":"Washington","state":"DC","postalCode":"20032","coordinates":{"lat":38.8388931,"lng":-77.02011139999999}},{"address1":"2755 Country Drive","address2":"#244","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.557882,"lng":-121.986823}},{"address1":"1850 Berryhill Place","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.3527548,"lng":-86.16858669999999}},{"address1":"58 North U.S.A Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":35.994914,"lng":-94.185867}},{"address1":"8785 Ellis Court","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.853725,"lng":-105.158861}},{"address1":"1636 Briarview Court","address2":"","city":"Severn","state":"MD","postalCode":"21144","coordinates":{"lat":39.12539599999999,"lng":-76.704015}},{"address1":"12 Knox Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.774166,"lng":-72.527697}},{"address1":"425 Middle Turnpike East","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7847772,"lng":-72.50354829999999}},{"address1":"2017 North Hartford Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.08820499999999,"lng":-94.1074905}},{"address1":"5900 Upland Road","address2":"","city":"Brooklyn Park","state":"MD","postalCode":"21225","coordinates":{"lat":39.213888,"lng":-76.61925099999999}},{"address1":"9331 Edison Road","address2":"","city":"Lithia","state":"FL","postalCode":"33547","coordinates":{"lat":27.86851,"lng":-82.07391199999999}},{"address1":"1810 Orchard Place","address2":"","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.145912,"lng":-149.9134259}},{"address1":"145 Grau Drive","address2":"","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.582453,"lng":-121.994476}},{"address1":"3959 Fairlands Drive","address2":"","city":"Pleasanton","state":"CA","postalCode":"94588","coordinates":{"lat":37.6992001,"lng":-121.8703701}},{"address1":"3613 East 18th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99508","coordinates":{"lat":61.20485339999999,"lng":-149.8135521}},{"address1":"1275 South Holland Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.051782,"lng":-94.226855}},{"address1":"109 Cambridge Station Road","address2":"","city":"Louisville","state":"KY","postalCode":"40223","coordinates":{"lat":38.244527,"lng":-85.56912799999999}},{"address1":"2107 Elfen Glen","address2":"Apt B","city":"Van Buren","state":"AR","postalCode":"72956","coordinates":{"lat":35.469752,"lng":-94.364987}},{"address1":"8522 Ingalls Circle","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8528593,"lng":-105.0629778}},{"address1":"1809 Cedar Drive","address2":"","city":"Severn","state":"MD","postalCode":"21144","coordinates":{"lat":39.139311,"lng":-76.72028999999999}},{"address1":"1376 Oakland Avenue","address2":"#1","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.080981,"lng":-94.172549}},{"address1":"4306 Bylsma Circle","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.223294,"lng":-85.589715}},{"address1":"233 Buckland Hills Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.8100683,"lng":-72.5453665}},{"address1":"7701 Southwest 104th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73169","coordinates":{"lat":35.3641983,"lng":-97.6475346}},{"address1":"14003 Crossbranch Court","address2":"","city":"Louisville","state":"KY","postalCode":"40245","coordinates":{"lat":38.242033,"lng":-85.489885}},{"address1":"19590 East Batavia Drive","address2":"","city":"Aurora","state":"CO","postalCode":"80011","coordinates":{"lat":39.7420886,"lng":-104.7581149}},{"address1":"6424 Simms Street","address2":"#71","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8133443,"lng":-105.1283237}},{"address1":"718 Dutchmans Court","address2":"","city":"Nashville","state":"TN","postalCode":"37076","coordinates":{"lat":36.2048851,"lng":-86.5994752}},{"address1":"8496 Isles Court","address2":"","city":"Pasadena","state":"MD","postalCode":"21122","coordinates":{"lat":39.111297,"lng":-76.467049}},{"address1":"100 East Joyce Boulevard","address2":"#110","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1253411,"lng":-94.1551631}},{"address1":"9036 Calico Court","address2":"","city":"Hesperia","state":"CA","postalCode":"92344","coordinates":{"lat":34.414491,"lng":-117.375403}},{"address1":"2723 East Joyce Boulevard","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.119414,"lng":-94.12229500000001}},{"address1":"90 Via Verde","address2":"","city":"San Lorenzo","state":"CA","postalCode":"94580","coordinates":{"lat":37.67869,"lng":-122.117142}},{"address1":"1015 Castle Road","address2":"","city":"Edmond","state":"OK","postalCode":"73034","coordinates":{"lat":35.665019,"lng":-97.466045}},{"address1":"2787 West Blackstone Crossing","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0608984,"lng":-94.1993461}},{"address1":"3555 Alamosa Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.142316,"lng":-149.9454749}},{"address1":"6231 North 59th Avenue","address2":"#35","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5285304,"lng":-112.1860744}},{"address1":"311 South Panama Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36107","coordinates":{"lat":32.376833,"lng":-86.27416099999999}},{"address1":"3313 Daisy Trail","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.076186,"lng":-86.60113799999999}},{"address1":"5436 Dorbrandt Street","address2":"#APT 000002","city":"Anchorage","state":"AK","postalCode":"99518","coordinates":{"lat":61.17090200000001,"lng":-149.904782}},{"address1":"553 South Arlington Road","address2":"","city":"Orange","state":"CA","postalCode":"92869","coordinates":{"lat":33.7794839,"lng":-117.820383}},{"address1":"615 Q Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.9113118,"lng":-77.0206808}},{"address1":"457 Mountain Village Boulevard","address2":"#320-3","city":"Mountain Village","state":"CO","postalCode":"81435","coordinates":{"lat":37.93323040000001,"lng":-107.8515732}},{"address1":"144 Lauderdale Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.309978,"lng":-86.259716}},{"address1":"2 Ambelwood Way","address2":"","city":"Savannah","state":"GA","postalCode":"31411","coordinates":{"lat":31.9138389,"lng":-81.07297989999999}},{"address1":"4113 Holiday Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32408","coordinates":{"lat":30.1548681,"lng":-85.7709976}},{"address1":"2001 Van Hoose Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.039421,"lng":-94.065534}},{"address1":"9457 Winfield Place","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.341347,"lng":-86.14867799999999}},{"address1":"1120 Mitchell Young Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.327464,"lng":-86.44011599999999}},{"address1":"12816 West 65th Way","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8141779,"lng":-105.1426275}},{"address1":"10 Erick Road","address2":"#47","city":"Mansfield","state":"MA","postalCode":"02048","coordinates":{"lat":42.032505,"lng":-71.17718599999999}},{"address1":"481 East Redbud Lane","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.103899,"lng":-94.151128}},{"address1":"320 Northwest 22nd Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73103","coordinates":{"lat":35.491908,"lng":-97.51843099999999}},{"address1":"33 South Hill Avenue","address2":"#306","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0619602,"lng":-94.16977700000001}},{"address1":"355 Gillette Road","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.061143,"lng":-86.70823299999999}},{"address1":"151 Main Street","address2":"","city":"Savannah","state":"GA","postalCode":"31408","coordinates":{"lat":32.113199,"lng":-81.148934}},{"address1":"545 Tracey Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.1354251,"lng":-85.5573034}},{"address1":"3 Southerberry Drive","address2":"","city":"Milton","state":"VT","postalCode":"05468","coordinates":{"lat":44.62322460000001,"lng":-73.1326629}},{"address1":"736 Sicard Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20003","coordinates":{"lat":38.8729038,"lng":-76.9949528}},{"address1":"6214 Herzog Street","address2":"","city":"Oakland","state":"CA","postalCode":"94608","coordinates":{"lat":37.84557849999999,"lng":-122.2825201}},{"address1":"1160 North College Avenue","address2":"#2","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0785477,"lng":-94.1566273}},{"address1":"5843 West McLellan Road","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5330898,"lng":-112.1857087}},{"address1":"1452 55th Avenue","address2":"B","city":"Oakland","state":"CA","postalCode":"94621","coordinates":{"lat":37.767671,"lng":-122.202326}},{"address1":"4255 Tanager Common","address2":"","city":"Fremont","state":"CA","postalCode":"94555","coordinates":{"lat":37.5738888,"lng":-122.0460256}},{"address1":"13426 West Rovey Avenue","address2":"","city":"Litchfield Park","state":"AZ","postalCode":"85340","coordinates":{"lat":33.522973,"lng":-112.34802}},{"address1":"195 Nursery Street","address2":"#D10","city":"Springfield","state":"MA","postalCode":"01104","coordinates":{"lat":42.1178409,"lng":-72.5892289}},{"address1":"126 Marjorie Lane","address2":"C","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.8073257,"lng":-72.5188292}},{"address1":"22 Charnock Street","address2":"#2","city":"Beverly","state":"MA","postalCode":"01915","coordinates":{"lat":42.55227,"lng":-70.876549}},{"address1":"817 25th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20037","coordinates":{"lat":38.900077,"lng":-77.053066}},{"address1":"2552 Massachusetts Avenue Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20008","coordinates":{"lat":38.9165459,"lng":-77.057323}},{"address1":"1711 Lore Road","address2":"#APT 000106","city":"Anchorage","state":"AK","postalCode":"99507","coordinates":{"lat":61.15195259999999,"lng":-149.8511487}},{"address1":"19091 Northeast 23rd Street","address2":"","city":"Harrah","state":"OK","postalCode":"73045","coordinates":{"lat":35.493447,"lng":-97.193078}},{"address1":"8318 North 57th Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.557537,"lng":-112.183238}},{"address1":"7256 West 84th Way","address2":"#918","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8506912,"lng":-105.0767393}},{"address1":"706 Seagrove Road","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21060","coordinates":{"lat":39.163384,"lng":-76.609205}},{"address1":"2318 Camryns Crossing","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.221926,"lng":-85.62420000000002}},{"address1":"968 Virginia Avenue","address2":"","city":"Olivehurst","state":"CA","postalCode":"95961","coordinates":{"lat":39.1022419,"lng":-121.581218}},{"address1":"416 South University Boulevard","address2":"","city":"Norman","state":"OK","postalCode":"73069","coordinates":{"lat":35.215351,"lng":-97.446319}},{"address1":"137 Gazebo East Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.3793507,"lng":-86.20407399999999}},{"address1":"10723 Colonial Woods Court","address2":"","city":"Louisville","state":"KY","postalCode":"40223","coordinates":{"lat":38.2496439,"lng":-85.55717709999999}},{"address1":"119 Matthew Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37215","coordinates":{"lat":36.11663619999999,"lng":-86.80955829999999}},{"address1":"3142 West Finger Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.042837,"lng":-94.205309}},{"address1":"4 Elm Street","address2":"","city":"Windsor","state":"VT","postalCode":"05089","coordinates":{"lat":43.476997,"lng":-72.398925}},{"address1":"78 School Street","address2":"","city":"Woburn","state":"MA","postalCode":"01801","coordinates":{"lat":42.506877,"lng":-71.15299}},{"address1":"19020 North 68th Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6574037,"lng":-112.2062039}},{"address1":"2849 Quail Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.095294,"lng":-94.20036300000001}},{"address1":"2456 22nd Avenue","address2":"","city":"Greeley","state":"CO","postalCode":"80631","coordinates":{"lat":40.397153,"lng":-104.713982}},{"address1":"200 Boulder Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7792079,"lng":-72.494963}},{"address1":"11150 Sun Valley Drive","address2":"","city":"Oakland","state":"CA","postalCode":"94605","coordinates":{"lat":37.752039,"lng":-122.11822}},{"address1":"505 Southeast 32nd Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73129","coordinates":{"lat":35.4325058,"lng":-97.5032743}},{"address1":"1025 West 19th Street","address2":"#UNIT 1-C","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.18252889999999,"lng":-85.676771}},{"address1":"6725 Pamela Court","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.334546,"lng":-86.20349999999999}},{"address1":"4714 Narrow Lane Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.3140725,"lng":-86.2819674}},{"address1":"11 Proctor Circle","address2":"","city":"Peabody","state":"MA","postalCode":"01960","coordinates":{"lat":42.535503,"lng":-70.953384}},{"address1":"10508 Kovats Court","address2":"","city":"Louisville","state":"KY","postalCode":"40223","coordinates":{"lat":38.2330381,"lng":-85.5695464}},{"address1":"3179 18th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20010","coordinates":{"lat":38.9312712,"lng":-77.0412983}},{"address1":"3194 Bladensburg Road Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20018","coordinates":{"lat":38.930136,"lng":-76.95929799999999}},{"address1":"260 Rio Del Mar Boulevard","address2":"##14","city":"Aptos","state":"CA","postalCode":"95003","coordinates":{"lat":36.967915,"lng":-121.902513}},{"address1":"1040 West 27th Avenue","address2":"#APT 000401","city":"Anchorage","state":"AK","postalCode":"99503","coordinates":{"lat":61.195892,"lng":-149.901984}},{"address1":"42 Lake Lane","address2":"","city":"Westmore","state":"VT","postalCode":"05860","coordinates":{"lat":44.77954099999999,"lng":-72.0682889}},{"address1":"3718 Bay Tree Road","address2":"","city":"Lynn Haven","state":"FL","postalCode":"32444","coordinates":{"lat":30.205726,"lng":-85.63441999999999}},{"address1":"3408 Bellisima Place","address2":"#204","city":"Louisville","state":"KY","postalCode":"40245","coordinates":{"lat":38.2857023,"lng":-85.5023064}},{"address1":"4109 General Bate Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37204","coordinates":{"lat":36.099427,"lng":-86.787756}},{"address1":"5329 A Street","address2":"","city":"Greeley","state":"CO","postalCode":"80634","coordinates":{"lat":40.4347001,"lng":-104.7702805}},{"address1":"88 Shute Street","address2":"#1","city":"Everett","state":"MA","postalCode":"02149","coordinates":{"lat":42.4192568,"lng":-71.0469179}},{"address1":"480 Keene Road","address2":"","city":"Walden","state":"VT","postalCode":"05836","coordinates":{"lat":44.4879516,"lng":-72.2823264}},{"address1":"4 Cutting Avenue","address2":"","city":"Worcester","state":"MA","postalCode":"01606","coordinates":{"lat":42.307664,"lng":-71.79180099999999}},{"address1":"275 South 40th Street","address2":"","city":"Boulder","state":"CO","postalCode":"80305","coordinates":{"lat":39.988864,"lng":-105.247011}},{"address1":"1189 Northwest End Avenue","address2":"#D3","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0793885,"lng":-94.19657190000001}},{"address1":"25 Cliffside Drive","address2":"D","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.79505229999999,"lng":-72.48762169999999}},{"address1":"2515 60th Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94605","coordinates":{"lat":37.7705346,"lng":-122.1907449}},{"address1":"2057 Lucas Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36107","coordinates":{"lat":32.3934472,"lng":-86.2766814}},{"address1":"386 Daniels Road","address2":"","city":"New Haven","state":"VT","postalCode":"05472","coordinates":{"lat":44.114323,"lng":-73.1911159}},{"address1":"9805 Meadow Vale Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40242","coordinates":{"lat":38.281955,"lng":-85.57182100000001}},{"address1":"8 Village Circle","address2":"","city":"Randolph","state":"VT","postalCode":"05060","coordinates":{"lat":43.927687,"lng":-72.65563}},{"address1":"1011 San Jose Street","address2":"","city":"San Leandro","state":"CA","postalCode":"94577","coordinates":{"lat":37.72956300000001,"lng":-122.147074}},{"address1":"2505 Walker Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37207","coordinates":{"lat":36.2125119,"lng":-86.806625}},{"address1":"11225 West 79th Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.840784,"lng":-105.124533}},{"address1":"1907 18th Avenue South","address2":"","city":"Nashville","state":"TN","postalCode":"37212","coordinates":{"lat":36.134703,"lng":-86.79737700000001}},{"address1":"16 Conway Street","address2":"","city":"Shelburne Falls","state":"MA","postalCode":"01370","coordinates":{"lat":42.6022637,"lng":-72.74100059999999}},{"address1":"20375 Wisteria Street","address2":"","city":"Castro Valley","state":"CA","postalCode":"94546","coordinates":{"lat":37.696683,"lng":-122.085865}},{"address1":"6408 Fern Crest Road","address2":"","city":"Louisville","state":"KY","postalCode":"40291","coordinates":{"lat":38.154488,"lng":-85.612144}},{"address1":"175 Creek Road","address2":"","city":"Castleton","state":"VT","postalCode":"05735","coordinates":{"lat":43.6055996,"lng":-73.2336737}},{"address1":"2531 Prestwick Avenue","address2":"","city":"Concord","state":"CA","postalCode":"94519","coordinates":{"lat":37.9966039,"lng":-122.0280747}},{"address1":"1002 Highland Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40204","coordinates":{"lat":38.2371577,"lng":-85.7367362}},{"address1":"2927 Leatherwood Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37214","coordinates":{"lat":36.156413,"lng":-86.65534099999999}},{"address1":"8467 Chase Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.851766,"lng":-105.071498}},{"address1":"8556 Nelson Court","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.850965,"lng":-105.117879}},{"address1":"122 Summer Street","address2":"#1","city":"Medford","state":"MA","postalCode":"02155","coordinates":{"lat":42.415648,"lng":-71.116886}},{"address1":"12061 Johns Road","address2":"#APT 000002","city":"Anchorage","state":"AK","postalCode":"99515","coordinates":{"lat":61.111453,"lng":-149.8780899}},{"address1":"8358 WB&A Road","address2":"","city":"Severn","state":"MD","postalCode":"21144","coordinates":{"lat":39.108962,"lng":-76.68668799999999}},{"address1":"43 Henderson Avenue","address2":"","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":31.97937899999999,"lng":-81.06062}},{"address1":"347 Brewer Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.054592,"lng":-86.708157}},{"address1":"2765 North Barcelona Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.102026,"lng":-94.15365}},{"address1":"5311 Chenoweth Park Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40291","coordinates":{"lat":38.168051,"lng":-85.571491}},{"address1":"6398 Jellison Way","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8118489,"lng":-105.1121974}},{"address1":"604 Northwest 118th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73114","coordinates":{"lat":35.5902559,"lng":-97.523444}},{"address1":"37 Rushforde Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.738226,"lng":-72.538398}},{"address1":"5434 West Beck Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.6266139,"lng":-112.176412}},{"address1":"1516 Ringe Drive","address2":"","city":"Severn","state":"MD","postalCode":"21144","coordinates":{"lat":39.094173,"lng":-76.68423299999999}},{"address1":"3701 Lake Towne Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.068871,"lng":-86.612042}},{"address1":"20250 North 67th Avenue","address2":"#2143","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6705359,"lng":-112.2044722}},{"address1":"62 Prospect Avenue","address2":"#1","city":"Quincy","state":"MA","postalCode":"02170","coordinates":{"lat":42.261576,"lng":-71.020522}},{"address1":"25 Morton Street","address2":"#216","city":"Quincy","state":"MA","postalCode":"02169","coordinates":{"lat":42.24450900000001,"lng":-71.021176}},{"address1":"8202 4 Winds Drive","address2":"#3","city":"Lyndon","state":"KY","postalCode":"40222","coordinates":{"lat":38.26545309999999,"lng":-85.60216830000002}},{"address1":"513 Habberton Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.107299,"lng":-94.053033}},{"address1":"1960 Sigfrid Court","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":38.998796,"lng":-76.564554}},{"address1":"663 Chesapeake Way","address2":"#1","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0498647,"lng":-94.1504411}},{"address1":"3354 Wilmington Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36105","coordinates":{"lat":32.345724,"lng":-86.301384}},{"address1":"8529 Old Harding Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37221","coordinates":{"lat":36.027995,"lng":-87.014506}},{"address1":"22219 Panama City Beach Parkway","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.2620426,"lng":-85.96316709999999}},{"address1":"37 East Broad Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.0776278,"lng":-81.08469219999999}},{"address1":"1309 Columbia Road Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20009","coordinates":{"lat":38.9275945,"lng":-77.0307141}},{"address1":"1211 Castine Court","address2":"","city":"Pasadena","state":"MD","postalCode":"21122","coordinates":{"lat":39.1404092,"lng":-76.5313772}},{"address1":"906 West Berry Street","address2":"#204","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0760793,"lng":-94.1723526}},{"address1":"341 Oakland Street","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.805274,"lng":-72.5180772}},{"address1":"60 Downey Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7786337,"lng":-72.5757232}},{"address1":"3770 North Front Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1183319,"lng":-94.1443548}},{"address1":"25 Church Street","address2":"A","city":"Pittsfield","state":"MA","postalCode":"01201","coordinates":{"lat":42.446859,"lng":-73.255836}},{"address1":"6578 Marauder Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37209","coordinates":{"lat":36.142929,"lng":-86.885521}},{"address1":"2747 68th Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94605","coordinates":{"lat":37.768532,"lng":-122.180694}},{"address1":"95 Woods Hill Road","address2":"","state":"VT","postalCode":"05488","coordinates":{"lat":44.897682,"lng":-73.0753299}},{"address1":"35 Keach Avenue","address2":"","city":"Worcester","state":"MA","postalCode":"01607","coordinates":{"lat":42.2269409,"lng":-71.801441}},{"address1":"1822 North Grand Avenue","address2":"","city":"Pueblo","state":"CO","postalCode":"81003","coordinates":{"lat":38.284427,"lng":-104.611581}},{"address1":"1809 U.S. 80","address2":"","city":"Savannah","state":"GA","postalCode":"31408","coordinates":{"lat":32.0847824,"lng":-81.16739679999999}},{"address1":"5065 North 54th Avenue","address2":"#8","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5118429,"lng":-112.1748805}},{"address1":"1261 Steamboat Drive","address2":"#3","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0804859,"lng":-94.2049698}},{"address1":"1695 Archer Street","address2":"","city":"Savannah","state":"GA","postalCode":"31405","coordinates":{"lat":32.0475974,"lng":-81.13348289999999}},{"address1":"3904 October Woods Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.009291,"lng":-86.624016}},{"address1":"1223 Delaware Avenue","address2":"","city":"Deale","state":"MD","postalCode":"20733","coordinates":{"lat":38.799962,"lng":-76.51803699999999}},{"address1":"10383 Eagle River Lane","address2":"","city":"Anchorage","state":"AK","postalCode":"99577","coordinates":{"lat":61.31412899999999,"lng":-149.509103}},{"address1":"1314 89th Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94621","coordinates":{"lat":37.7497401,"lng":-122.1762833}},{"address1":"21 Longview Bluff Drive East","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.95754299999999,"lng":-81.13848899999999}},{"address1":"1689 Fisher Pond Road","address2":"","city":"Saint Albans City","state":"VT","postalCode":"05478","coordinates":{"lat":44.826977,"lng":-73.055054}},{"address1":"9920 West 81st Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8446204,"lng":-105.1083834}},{"address1":"2732 Rosedale Place","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.1230861,"lng":-86.7625204}},{"address1":"10881 Northforde Drive","address2":"","city":"Cupertino","state":"CA","postalCode":"95014","coordinates":{"lat":37.335812,"lng":-122.023985}},{"address1":"926 Mill Court","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.959343,"lng":-81.142287}},{"address1":"7550 Kline Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8342031,"lng":-105.1106565}},{"address1":"5688 Johnson Court","address2":"","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.798419,"lng":-105.109316}},{"address1":"4439 Gale Street","address2":"","city":"Livermore","state":"CA","postalCode":"94550","coordinates":{"lat":37.690199,"lng":-121.7411119}},{"address1":"6450 West Bethany Home Road","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5242005,"lng":-112.1991369}},{"address1":"2931 Shady Oaks Drive","address2":"","city":"Evans","state":"CO","postalCode":"80620","coordinates":{"lat":40.384469,"lng":-104.726478}},{"address1":"6451 West Bell Road","address2":"#1144","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6380231,"lng":-112.1986753}},{"address1":"644 West Maple Street","address2":"#2","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0703335,"lng":-94.1686289}},{"address1":"1219 North Storer Avenue","address2":"#66","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.078949,"lng":-94.17225499999999}},{"address1":"152 Holly Court","address2":"","city":"Mountain View","state":"CA","postalCode":"94043","coordinates":{"lat":37.390391,"lng":-122.060062}},{"address1":"6086 Kennedy Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.103629,"lng":-94.24773599999999}},{"address1":"2300 Deer Path Circle","address2":"#207","city":"Hurstbourne Acres","state":"KY","postalCode":"40220","coordinates":{"lat":38.2187876,"lng":-85.59292239999999}},{"address1":"802 East 37th Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.054012,"lng":-81.087324}},{"address1":"5821 Taft Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8029119,"lng":-105.1308558}},{"address1":"188 Saint Matthews Avenue","address2":"#1","city":"Louisville","state":"KY","postalCode":"40207","coordinates":{"lat":38.2577576,"lng":-85.6546706}},{"address1":"68 Hampstead Place","address2":"","city":"Athol","state":"MA","postalCode":"01331","coordinates":{"lat":42.5894395,"lng":-72.2275859}},{"address1":"3164 West Woodfield Way","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.084691,"lng":-94.20445}},{"address1":"7998 Chase Circle","address2":"#1","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.841232,"lng":-105.057933}},{"address1":"1797 Pasatiempo Drive","address2":"","city":"Chico","state":"CA","postalCode":"95928","coordinates":{"lat":39.6777229,"lng":-121.7704692}},{"address1":"3722 Kisling Loop","address2":"","city":"Tyndall Air Force Base","state":"FL","postalCode":"32403","coordinates":{"lat":30.1048481,"lng":-85.65097360000001}},{"address1":"429 Patterson Street","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.102655,"lng":-86.744186}},{"address1":"6140 Fenton Street","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8080314,"lng":-105.0601435}},{"address1":"7404 West Crest Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85310","coordinates":{"lat":33.6851098,"lng":-112.2167229}},{"address1":"7841 North 59th Lane","address2":"#G37","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5516587,"lng":-112.1879207}},{"address1":"8043 Cranberry Street","address2":"#APT 000001","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.14769579999999,"lng":-149.9369466}},{"address1":"173 Spruce Street","address2":"#18","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7705332,"lng":-72.51594109999999}},{"address1":"4712 Cherokee Heights Road","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.234223,"lng":-85.566684}},{"address1":"915 Sacramento Street","address2":"","city":"Bakersfield","state":"CA","postalCode":"93305","coordinates":{"lat":35.3798759,"lng":-119.0002119}},{"address1":"317 Windsor Road","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.973034,"lng":-81.141871}},{"address1":"1332 Maple Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.3589738,"lng":-86.3278235}},{"address1":"4709 Blagden Terrace Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.9481213,"lng":-77.0401892}},{"address1":"5102 Ander Drive","address2":"","city":"Brentwood","state":"TN","postalCode":"37027","coordinates":{"lat":36.0025004,"lng":-86.6944901}},{"address1":"6754 Field Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8193709,"lng":-105.097531}},{"address1":"2347 Glen Eagle Drive","address2":"","city":"Northfield","state":"KY","postalCode":"40222","coordinates":{"lat":38.2862836,"lng":-85.6299745}},{"address1":"1613 Maple Timber Court","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.067096,"lng":-86.607005}},{"address1":"269 Park Street","address2":"#1","city":"North Reading","state":"MA","postalCode":"01864","coordinates":{"lat":42.57268,"lng":-71.09888800000002}},{"address1":"6444 North 67th Avenue","address2":"#1081","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5302444,"lng":-112.2049579}},{"address1":"11 Pine Point Road","address2":"","city":"Duxbury","state":"MA","postalCode":"02332","coordinates":{"lat":42.0613192,"lng":-70.6510247}},{"address1":"4136 East Virginia Lane","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.295998,"lng":-86.22073999999999}},{"address1":"5740 North 59th Avenue","address2":"#1156","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5207722,"lng":-112.189044}},{"address1":"95 Central Street","address2":"A","city":"Springfield","state":"MA","postalCode":"01105","coordinates":{"lat":42.098581,"lng":-72.57880999999999}},{"address1":"74 Heard Street","address2":"#1","city":"Chelsea","state":"MA","postalCode":"02150","coordinates":{"lat":42.3972985,"lng":-71.035599}},{"address1":"2500 Snowdoun Chambers Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36105","coordinates":{"lat":32.24569110000001,"lng":-86.2577436}},{"address1":"429 Dennison Ridge Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.750419,"lng":-72.474013}},{"address1":"1208 Lindenwood Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.187016,"lng":-85.681247}},{"address1":"7609 Doris Place","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73162","coordinates":{"lat":35.5759649,"lng":-97.64877299999999}},{"address1":"1915 Southeast 29th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73129","coordinates":{"lat":35.4360844,"lng":-97.4787061}},{"address1":"212 Holiday Circle","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":32.025153,"lng":-81.240329}},{"address1":"32 Amsden Street","address2":"#1","city":"Arlington","state":"MA","postalCode":"02474","coordinates":{"lat":42.4043927,"lng":-71.138137}},{"address1":"4016 Doane Street","address2":"","city":"Fremont","state":"CA","postalCode":"94538","coordinates":{"lat":37.514834,"lng":-121.95302}},{"address1":"8700 Lillington Circle","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.330168,"lng":-86.14481099999999}},{"address1":"7720 Allison Street","address2":"#105","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8383411,"lng":-105.0855734}},{"address1":"17878 Front Beach Road","address2":"#C-2","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.237658,"lng":-85.91577099999999}},{"address1":"1328 Tuckerman Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.9673595,"lng":-77.03106919999999}},{"address1":"4600 East Huntsville Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0476559,"lng":-94.0953342}},{"address1":"5038 North Cimarron Drive","address2":"","city":"Beverly Hills","state":"FL","postalCode":"34465","coordinates":{"lat":28.935938,"lng":-82.527367}},{"address1":"1216 West Hill Street","address2":"M","city":"Louisville","state":"KY","postalCode":"40210","coordinates":{"lat":38.227343,"lng":-85.7764254}},{"address1":"3033 Aubert Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40206","coordinates":{"lat":38.250779,"lng":-85.679931}},{"address1":"17020 West 64th Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.8131034,"lng":-105.1914804}},{"address1":"12420 West Montebello Avenue","address2":"","city":"Litchfield Park","state":"AZ","postalCode":"85340","coordinates":{"lat":33.519491,"lng":-112.32613}},{"address1":"2538 East 40th Plaza","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.221455,"lng":-85.626834}},{"address1":"827 10th Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.901021,"lng":-76.992391}},{"address1":"5912 North 48th Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5231022,"lng":-112.162186}},{"address1":"37 Fieldside Drive","address2":"","city":"Groton","state":"CT","postalCode":"06340","coordinates":{"lat":41.3668422,"lng":-72.07844349999999}},{"address1":"9176 Ellis Way","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8624095,"lng":-105.1574648}},{"address1":"5370 Business Park Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.317376,"lng":-86.232969}},{"address1":"1612 Beech Street","address2":"","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.2296247,"lng":-85.805719}},{"address1":"8532 Ingalls Circle","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8532617,"lng":-105.0629712}},{"address1":"7941 Alpine View Circle","address2":"","city":"Anchorage","state":"AK","postalCode":"99507","coordinates":{"lat":61.1486467,"lng":-149.830947}},{"address1":"8595 West 81st Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8449341,"lng":-105.0937351}},{"address1":"4296 North Blossom Court","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1288759,"lng":-94.1239252}},{"address1":"1738 Annabellas Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32407","coordinates":{"lat":30.1877596,"lng":-85.7782311}},{"address1":"3215 Madsen Street","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.6618825,"lng":-122.0904612}},{"address1":"4 Village Lake Drive","address2":"#4","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0994717,"lng":-94.1570279}},{"address1":"86 Russell Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.77985700000001,"lng":-72.525724}},{"address1":"570 Broadway","address2":"","city":"Lynnfield","state":"MA","postalCode":"01940","coordinates":{"lat":42.517525,"lng":-71.00125799999999}},{"address1":"1405 Monroe Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20017","coordinates":{"lat":38.93258,"lng":-76.98579699999999}},{"address1":"900 North Leverett Avenue","address2":"#126","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0754825,"lng":-94.1696884}},{"address1":"222 Quince Street","address2":"#2-B","city":"San Diego","state":"CA","postalCode":"92103","coordinates":{"lat":32.7368499,"lng":-117.162443}},{"address1":"370 Wallace Road","address2":"#D-28","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.078257,"lng":-86.724182}},{"address1":"6672 Urban Court","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.817946,"lng":-105.13477}},{"address1":"516 Southwest 60th Terrace","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73139","coordinates":{"lat":35.4051605,"lng":-97.5223633}},{"address1":"1513 Southeast 9th Street","address2":"","city":"Moore","state":"OK","postalCode":"73160","coordinates":{"lat":35.329431,"lng":-97.465397}},{"address1":"154 Byrd Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.161691,"lng":-85.59920199999999}},{"address1":"1106 Homer Avenue","address2":"","city":"Savannah","state":"GA","postalCode":"31405","coordinates":{"lat":32.0453896,"lng":-81.12456809999999}},{"address1":"1010 M Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.9054822,"lng":-77.0265494}},{"address1":"5420 Allison Street","address2":"#202","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.7958727,"lng":-105.0858231}},{"address1":"20 Hacker Street","address2":"#3","city":"Worcester","state":"MA","postalCode":"01603","coordinates":{"lat":42.244896,"lng":-71.8175172}},{"address1":"732 Kevin Court","address2":"","city":"Oakland","state":"CA","postalCode":"94621","coordinates":{"lat":37.757904,"lng":-122.206479}},{"address1":"509 Franklin Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20017","coordinates":{"lat":38.9255849,"lng":-76.9990895}},{"address1":"23 Whitcomb Street","address2":"","city":"Springfield","state":"VT","postalCode":"05156","coordinates":{"lat":43.2987361,"lng":-72.4880749}},{"address1":"3377 Sandstone Court","address2":"","city":"Pleasanton","state":"CA","postalCode":"94588","coordinates":{"lat":37.680463,"lng":-121.860128}},{"address1":"14 Huntington Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7772379,"lng":-72.518456}},{"address1":"2802 US Highway 98","address2":"BLDG F","city":"Mexico Beach","state":"FL","postalCode":"32456","coordinates":{"lat":29.9474344,"lng":-85.4170788}},{"address1":"412 Virginia Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40222","coordinates":{"lat":38.2538807,"lng":-85.6152334}},{"address1":"1644 New Jersey Avenue Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.91233,"lng":-77.017736}},{"address1":"832 51st Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20019","coordinates":{"lat":38.9008832,"lng":-76.9273381}},{"address1":"894 Windmill Park Lane","address2":"","city":"Mountain View","state":"CA","postalCode":"94043","coordinates":{"lat":37.399505,"lng":-122.077478}},{"address1":"9636 Morar Road","address2":"","city":"Panama City","state":"FL","postalCode":"32409","coordinates":{"lat":30.324968,"lng":-85.620589}},{"address1":"9472 Noble Way","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.8690661,"lng":-105.1784169}},{"address1":"618 Staley Avenue","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.6629263,"lng":-122.091801}},{"address1":"8704 Bayberry Place","address2":"","city":"Plantation","state":"KY","postalCode":"40242","coordinates":{"lat":38.2814983,"lng":-85.5918425}},{"address1":"2506 West Madison Street","address2":"","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.253755,"lng":-85.7933322}},{"address1":"840 Inglewood Drive","address2":"","city":"West Sacramento","state":"CA","postalCode":"95605","coordinates":{"lat":38.591235,"lng":-121.524984}},{"address1":"10 Dalry Lane","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.941447,"lng":-81.160151}},{"address1":"3301 Nora Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40220","coordinates":{"lat":38.199844,"lng":-85.61509}},{"address1":"8304 Glaser Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40291","coordinates":{"lat":38.1437892,"lng":-85.6080724}},{"address1":"3720 West 86th Avenue","address2":"APT F","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.142615,"lng":-149.949251}},{"address1":"3298 Chestnut Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20015","coordinates":{"lat":38.979577,"lng":-77.061088}},{"address1":"82 Fairfield Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7673619,"lng":-72.53831}},{"address1":"3138 P Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20007","coordinates":{"lat":38.9091118,"lng":-77.0629963}},{"address1":"80 Locust Avenue","address2":"#110","city":"Worcester","state":"MA","postalCode":"01604","coordinates":{"lat":42.266896,"lng":-71.762913}},{"address1":"2715 Thornbrook Court","address2":"","city":"Odenton","state":"MD","postalCode":"21113","coordinates":{"lat":39.06450299999999,"lng":-76.727459}},{"address1":"3579 2nd Avenue","address2":"","city":"Edgewater","state":"MD","postalCode":"21037","coordinates":{"lat":38.91283200000001,"lng":-76.5224099}},{"address1":"6739 Taft Court","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8189901,"lng":-105.1325295}},{"address1":"1528 Stafford Avenue","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.680081,"lng":-122.074569}},{"address1":"2024 Merrily Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36111","coordinates":{"lat":32.3328739,"lng":-86.28072999999999}},{"address1":"2034 Fairfax Road","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":38.9734343,"lng":-76.5357427}},{"address1":"1430 East Audubon Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36111","coordinates":{"lat":32.328226,"lng":-86.28300399999999}},{"address1":"3652 East Blue Stone Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72764","coordinates":{"lat":36.139309,"lng":-94.1078069}},{"address1":"3302 Woodland Park Drive","address2":"#APT 000001","city":"Anchorage","state":"AK","postalCode":"99517","coordinates":{"lat":61.190512,"lng":-149.927286}},{"address1":"1771 Daisey Court","address2":"","city":"Millersville","state":"MD","postalCode":"21108","coordinates":{"lat":39.044662,"lng":-76.64797399999999}},{"address1":"406 East Waldburg Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.064691,"lng":-81.092321}},{"address1":"11843 North 60th Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85304","coordinates":{"lat":33.594584,"lng":-112.188319}},{"address1":"9515 West 74th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.831067,"lng":-105.103952}},{"address1":"119 Antioch Pike","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.10072,"lng":-86.72331}},{"address1":"1157 1st Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.90538280000001,"lng":-77.0121662}},{"address1":"3578 Galindo Street","address2":"","city":"Oakland","state":"CA","postalCode":"94601","coordinates":{"lat":37.783471,"lng":-122.2149729}},{"address1":"12800 Saunders Road","address2":"","city":"Anchorage","state":"AK","postalCode":"99516","coordinates":{"lat":61.10499799999999,"lng":-149.746856}},{"address1":"5556 West Northview Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5433092,"lng":-112.1797889}},{"address1":"3617 Oak Grove Circle","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.333812,"lng":-86.21464499999999}},{"address1":"2443 Sierra Nevada Road","address2":"#N5","city":"Mammoth Lakes","state":"CA","postalCode":"93546","coordinates":{"lat":37.641304,"lng":-118.971489}},{"address1":"10124 Watsonville Road","address2":"","city":"Louisville","state":"KY","postalCode":"40272","coordinates":{"lat":38.105204,"lng":-85.820047}},{"address1":"2441 Chase Park Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36110","coordinates":{"lat":32.4266516,"lng":-86.2700112}},{"address1":"28 Wayne Avenue","address2":"","city":"Waltham","state":"MA","postalCode":"02453","coordinates":{"lat":42.3806325,"lng":-71.2015761}},{"address1":"3605 Normandy Place South","address2":"","city":"Nashville","state":"TN","postalCode":"37209","coordinates":{"lat":36.1459501,"lng":-86.8276312}},{"address1":"25538 Calaroga Avenue","address2":"","city":"Hayward","state":"CA","postalCode":"94545","coordinates":{"lat":37.642952,"lng":-122.098647}},{"address1":"1521 159th Avenue","address2":"","city":"San Leandro","state":"CA","postalCode":"94578","coordinates":{"lat":37.70179340000001,"lng":-122.1192658}},{"address1":"344 Island Road","address2":"","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":31.927239,"lng":-81.09320199999999}},{"address1":"826 South Hancock Street","address2":"","city":"Louisville","state":"KY","postalCode":"40203","coordinates":{"lat":38.2408519,"lng":-85.744652}},{"address1":"2212 Greenville Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36107","coordinates":{"lat":32.3767039,"lng":-86.275049}},{"address1":"325 East 7th Street","address2":"","city":"Edmond","state":"OK","postalCode":"73034","coordinates":{"lat":35.6480391,"lng":-97.47550249999999}},{"address1":"7 Maple Hill Road","address2":"","city":"Aquinnah","state":"MA","postalCode":"02535","coordinates":{"lat":41.33201400000001,"lng":-70.8181309}},{"address1":"73455 Twentynine Palms Highway","address2":"","city":"Twentynine Palms","state":"CA","postalCode":"92277","coordinates":{"lat":34.1353352,"lng":-116.0598794}},{"address1":"410 West 89th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99515","coordinates":{"lat":61.1402906,"lng":-149.8870399}},{"address1":"24147 Clinton Court","address2":"","city":"Hayward","state":"CA","postalCode":"94545","coordinates":{"lat":37.648857,"lng":-122.112388}},{"address1":"5620 Lilly Street","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.148082,"lng":-85.58977999999999}},{"address1":"207 Spruce Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7690054,"lng":-72.51569599999999}},{"address1":"236 Alden Road","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.682588,"lng":-122.112121}},{"address1":"467 North Mountain Ranch Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0706293,"lng":-94.2107741}},{"address1":"2042 High Street","address2":"","city":"Oakland","state":"CA","postalCode":"94601","coordinates":{"lat":37.776415,"lng":-122.209418}},{"address1":"6244 Sun River Drive","address2":"","city":"Sacramento","state":"CA","postalCode":"95824","coordinates":{"lat":38.512894,"lng":-121.41258}},{"address1":"8801 Rosshire Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40118","coordinates":{"lat":38.1216631,"lng":-85.7505505}},{"address1":"449 15th Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.896241,"lng":-76.983372}},{"address1":"4385 Wares Ferry Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.389301,"lng":-86.228872}},{"address1":"8546 North 59th Lane","address2":"#171","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.5615847,"lng":-112.1884147}},{"address1":"8262 Elvaton Road","address2":"","city":"Millersville","state":"MD","postalCode":"21108","coordinates":{"lat":39.12422,"lng":-76.610394}},{"address1":"7018 Russell Court","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.824701,"lng":-105.186699}},{"address1":"1353 West 27th Avenue","address2":"#APT 000004","city":"Anchorage","state":"AK","postalCode":"99503","coordinates":{"lat":61.19630069999999,"lng":-149.9098041}},{"address1":"1030 Lake Claire Drive","address2":"","city":"Annapolis","state":"MD","postalCode":"21409","coordinates":{"lat":39.048603,"lng":-76.448911}},{"address1":"10980 Splendor Loop","address2":"","city":"Anchorage","state":"AK","postalCode":"99577","coordinates":{"lat":61.319069,"lng":-149.563601}},{"address1":"36043 Soapberry Commons","address2":"","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.555484,"lng":-122.012744}},{"address1":"419 Wabasso Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40209","coordinates":{"lat":38.1812976,"lng":-85.7511801}},{"address1":"2098 Lower Newton Street","address2":"","city":"Saint Albans City","state":"VT","postalCode":"05478","coordinates":{"lat":44.843051,"lng":-73.106488}},{"address1":"115 Waddell Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7660221,"lng":-72.5477647}},{"address1":"463 East Rutgers Loop","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.386378,"lng":-86.22309899999999}},{"address1":"31130 Meadowbrook Avenue","address2":"","city":"Hayward","state":"CA","postalCode":"94544","coordinates":{"lat":37.61744100000001,"lng":-122.038397}},{"address1":"8506 Laviento Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99515","coordinates":{"lat":61.143603,"lng":-149.8784269}},{"address1":"19404 North 77th Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6603179,"lng":-112.223814}},{"address1":"302 East Granada Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1004549,"lng":-94.15316299999999}},{"address1":"9321 Amy Lane","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32407","coordinates":{"lat":30.186053,"lng":-85.79181899999999}},{"address1":"1156 Greenhill Road","address2":"","city":"Arnold","state":"MD","postalCode":"21012","coordinates":{"lat":39.052169,"lng":-76.48806499999999}},{"address1":"30 Curtis Road","address2":"#509","city":"Milton","state":"MA","postalCode":"02186","coordinates":{"lat":42.2660192,"lng":-71.0910829}},{"address1":"904 Shepherd Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.9396331,"lng":-77.0252273}},{"address1":"124 Crane Street","address2":"","city":"Panama City","state":"FL","postalCode":"32413","coordinates":{"lat":30.203032,"lng":-85.84606699999999}},{"address1":"15847 West 74th Place","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.832021,"lng":-105.178337}},{"address1":"435 Granite Street","address2":"","city":"Quincy","state":"MA","postalCode":"02169","coordinates":{"lat":42.2404974,"lng":-71.01624509999999}},{"address1":"4418 Signal Hill Road","address2":"","city":"Louisville","state":"KY","postalCode":"40207","coordinates":{"lat":38.27605399999999,"lng":-85.650572}},{"address1":"2285 Wold Run Drive","address2":"#1","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0992725,"lng":-94.19149589999999}},{"address1":"110 Castle Hill","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7820711,"lng":-72.4827912}},{"address1":"8474 Chase Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8522641,"lng":-105.0715699}},{"address1":"4074 North Sunflower Circle","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.125209,"lng":-94.1317431}},{"address1":"249 Yellow Leaf Circle","address2":"","city":"Anchorage","state":"AK","postalCode":"99504","coordinates":{"lat":61.221345,"lng":-149.71888}},{"address1":"8010 Holland Court","address2":"D","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.84229029999999,"lng":-105.1030368}},{"address1":"1300 East Dowling Road","address2":"","city":"Anchorage","state":"AK","postalCode":"99518","coordinates":{"lat":61.1663648,"lng":-149.858972}},{"address1":"189 Danforth Street","address2":"","city":"Framingham","state":"MA","postalCode":"01701","coordinates":{"lat":42.3259861,"lng":-71.39104990000001}},{"address1":"1011 Bell Avenue","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21060","coordinates":{"lat":39.177114,"lng":-76.59223899999999}},{"address1":"5224 Wasena Avenue","address2":"","city":"Baltimore","state":"MD","postalCode":"21225","coordinates":{"lat":39.223779,"lng":-76.60339499999999}},{"address1":"7613 Yule Court","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.834511,"lng":-105.202472}},{"address1":"1243 Doris Avenue","address2":"","city":"Pasadena","state":"MD","postalCode":"21122","coordinates":{"lat":39.109591,"lng":-76.486294}},{"address1":"3504 East 5th Street","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.156461,"lng":-85.61573399999999}},{"address1":"1 Dunsmuir Lane","address2":"","city":"Savannah","state":"GA","postalCode":"31411","coordinates":{"lat":31.891353,"lng":-81.053618}},{"address1":"1320 Dunbarton Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.401737,"lng":-86.19376799999999}},{"address1":"14524 Lodestar Drive","address2":"","city":"Grass Valley","state":"CA","postalCode":"95949","coordinates":{"lat":39.101221,"lng":-121.008546}},{"address1":"8404 West Myrtle Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85305","coordinates":{"lat":33.5414927,"lng":-112.2400905}},{"address1":"620 Oakland Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.072612,"lng":-94.17295999999999}},{"address1":"39 Cottage Street","address2":"","city":"Athol","state":"MA","postalCode":"01331","coordinates":{"lat":42.5926786,"lng":-72.2271482}},{"address1":"82 Lookout Mountain Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.75723,"lng":-72.491035}},{"address1":"1635 Generals Highway","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":39.0139641,"lng":-76.5724717}},{"address1":"555 North Dupont Avenue","address2":"#C-55","city":"Nashville","state":"TN","postalCode":"37115","coordinates":{"lat":36.268033,"lng":-86.6999979}},{"address1":"2505 North Hampton Court","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0959268,"lng":-94.1238079}},{"address1":"136 Acacia Drive","address2":"","city":"Blue Lake","state":"CA","postalCode":"95525","coordinates":{"lat":40.879484,"lng":-123.978726}},{"address1":"22825 North 74th Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85310","coordinates":{"lat":33.691213,"lng":-112.219428}},{"address1":"643 Farragut Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20011","coordinates":{"lat":38.951281,"lng":-77.021523}},{"address1":"17 West 26th Circle","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.033699,"lng":-94.15958800000001}},{"address1":"335 C Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20003","coordinates":{"lat":38.8858796,"lng":-77.00075350000002}},{"address1":"1418 Paddocks Court","address2":"","city":"Crownsville","state":"MD","postalCode":"21032","coordinates":{"lat":39.05389,"lng":-76.623632}},{"address1":"2917 Miramar Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.107054,"lng":-94.2004709}},{"address1":"301 Argonaut Street","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.20514,"lng":-85.84755899999999}},{"address1":"12901 Mission Circle","address2":"","city":"Anchorage","state":"AK","postalCode":"99516","coordinates":{"lat":61.10380240000001,"lng":-149.8253975}},{"address1":"3013 Sprowl Road","address2":"#4","city":"Jeffersontown","state":"KY","postalCode":"40299","coordinates":{"lat":38.1966913,"lng":-85.5693363}},{"address1":"5929 West Via Montoya Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85310","coordinates":{"lat":33.68642,"lng":-112.188159}},{"address1":"325 Joseph Circle","address2":"","city":"Southport","state":"FL","postalCode":"32409","coordinates":{"lat":30.407817,"lng":-85.684715}},{"address1":"922 Urciolo Court","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":38.979099,"lng":-76.57732589999999}},{"address1":"2212 Daffin Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31404","coordinates":{"lat":32.027338,"lng":-81.07870799999999}},{"address1":"1401 Cordova Street","address2":"#APT 000006","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.20849370000001,"lng":-149.8792198}},{"address1":"8064 Claytie Circle","address2":"","city":"Nashville","state":"TN","postalCode":"37221","coordinates":{"lat":36.06466899999999,"lng":-86.976433}},{"address1":"566 Middle Turnpike East","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7850955,"lng":-72.4967557}},{"address1":"93 Hamlin Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7735186,"lng":-72.5152106}},{"address1":"123 Remember Baker Lane","address2":"","city":"Hartford","state":"VT","postalCode":"05001","coordinates":{"lat":43.6696484,"lng":-72.4299719}},{"address1":"125 Connors Street","address2":"#516","city":"Gardner","state":"MA","postalCode":"01440","coordinates":{"lat":42.5738871,"lng":-71.9966865}},{"address1":"2315 Chestnut Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36107","coordinates":{"lat":32.367382,"lng":-86.27867599999999}},{"address1":"2716 30th Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20020","coordinates":{"lat":38.855798,"lng":-76.96482499999999}},{"address1":"2406 Lindbergh Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40208","coordinates":{"lat":38.215833,"lng":-85.775153}},{"address1":"2035 Ninth Street","address2":"R A","city":"Berkeley","state":"CA","postalCode":"94710","coordinates":{"lat":37.8676351,"lng":-122.2938418}},{"address1":"34 Holyoke Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.753855,"lng":-72.498972}},{"address1":"2276 West Woodley Square","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.3256494,"lng":-86.2702235}},{"address1":"20251 North 75th Avenue","address2":"#1046","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6696067,"lng":-112.2196548}},{"address1":"72 Bentley Avenue","address2":"","city":"Poultney","state":"VT","postalCode":"05764","coordinates":{"lat":43.5158214,"lng":-73.2343441}},{"address1":"2807 Huxley Place","address2":"","city":"Fremont","state":"CA","postalCode":"94555","coordinates":{"lat":37.584941,"lng":-122.03291}},{"address1":"7772 West Palmaire Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85303","coordinates":{"lat":33.540431,"lng":-112.227013}},{"address1":"82 Linnmore Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.777262,"lng":-72.54537499999999}},{"address1":"882 Plantation Way","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.400186,"lng":-86.20771099999999}},{"address1":"8150 North 61st Avenue","address2":"#3128","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.555668,"lng":-112.1926295}},{"address1":"503 Orchard Road","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21061","coordinates":{"lat":39.19076099999999,"lng":-76.64618}},{"address1":"3616 Echo Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37218","coordinates":{"lat":36.236713,"lng":-86.833956}},{"address1":"376 Whites Road","address2":"","city":"Wilmington","state":"VT","postalCode":"05363","coordinates":{"lat":42.880951,"lng":-72.84163699999999}},{"address1":"322 East Taylor Street","address2":"#1103","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.0706543,"lng":-81.0908408}},{"address1":"605 Main Street","address2":"","city":"Watertown","state":"MA","postalCode":"02472","coordinates":{"lat":42.373378,"lng":-71.202116}},{"address1":"238 West Rock Street","address2":"#4","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0609635,"lng":-94.1628029}},{"address1":"1819 Q Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20020","coordinates":{"lat":38.870406,"lng":-76.978219}},{"address1":"1261 Sioux Terrace","address2":"","city":"Nashville","state":"TN","postalCode":"37115","coordinates":{"lat":36.247799,"lng":-86.670508}},{"address1":"7002 Secrest Court","address2":"","city":"Arvada","state":"CO","postalCode":"80007","coordinates":{"lat":39.8236009,"lng":-105.1901759}},{"address1":"169 Avenida Drive","address2":"M","city":"Berkeley","state":"CA","postalCode":"94708","coordinates":{"lat":37.884824,"lng":-122.249694}},{"address1":"6095 Terry Lane","address2":"","city":"Golden","state":"CO","postalCode":"80403","coordinates":{"lat":39.807376,"lng":-105.191019}},{"address1":"3620 Colmar Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.235977,"lng":-85.81636}},{"address1":"8820 Vaughn Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.337777,"lng":-86.13765590000001}},{"address1":"113 Hammarlee Road","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21060","coordinates":{"lat":39.177265,"lng":-76.602519}},{"address1":"281 MacArthur Boulevard","address2":"","city":"Oakland","state":"CA","postalCode":"94610","coordinates":{"lat":37.8147324,"lng":-122.25217}},{"address1":"8159 West 81st Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.843993,"lng":-105.089124}},{"address1":"512 North Center Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.15768199999999,"lng":-85.6292129}},{"address1":"4876 Norris Road","address2":"","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.543515,"lng":-122.008143}},{"address1":"8378 Cole Street","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8479398,"lng":-105.1526049}},{"address1":"2406 Brighton Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40205","coordinates":{"lat":38.217094,"lng":-85.66769599999999}},{"address1":"19 Heritage","address2":"","city":"Oakland","state":"CA","postalCode":"94605","coordinates":{"lat":37.765568,"lng":-122.129528}},{"address1":"6228 West Larkspur Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85304","coordinates":{"lat":33.600267,"lng":-112.193207}},{"address1":"2504 Longest Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40204","coordinates":{"lat":38.239449,"lng":-85.7079849}},{"address1":"3 Mad Anthony Lane","address2":"","city":"Savannah","state":"GA","postalCode":"31411","coordinates":{"lat":31.949414,"lng":-81.02015399999999}},{"address1":"2248 South Sutherland Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.331721,"lng":-86.19776999999999}},{"address1":"330 Michell Court","address2":"","city":"Livermore","state":"CA","postalCode":"94551","coordinates":{"lat":37.690035,"lng":-121.759468}},{"address1":"6748 West San Juan Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85303","coordinates":{"lat":33.518939,"lng":-112.205511}},{"address1":"1734 Tamarack Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20012","coordinates":{"lat":38.993375,"lng":-77.04060299999999}},{"address1":"915 Arkansas Avenue","address2":"","city":"Lynn Haven","state":"FL","postalCode":"32444","coordinates":{"lat":30.244151,"lng":-85.6392089}},{"address1":"116 Queens Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37218","coordinates":{"lat":36.214841,"lng":-86.859562}},{"address1":"8 Linden Circle","address2":"","city":"Somerville","state":"MA","postalCode":"02143","coordinates":{"lat":42.3879993,"lng":-71.11345200000001}},{"address1":"4 Chamois Court","address2":"","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.088701,"lng":-81.24825}},{"address1":"6941 West 87th Way","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.852809,"lng":-105.073449}},{"address1":"354 North University Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0659848,"lng":-94.16817080000001}},{"address1":"6145 East Castro Valley Boulevard","address2":"","city":"Castro Valley","state":"CA","postalCode":"94552","coordinates":{"lat":37.6992206,"lng":-122.0300502}},{"address1":"1401 Saint George Avenue","address2":"","city":"Moore","state":"OK","postalCode":"73160","coordinates":{"lat":35.3503092,"lng":-97.5079329}},{"address1":"1713 Arrow Cove Lane","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":39.00848999999999,"lng":-76.53611699999999}},{"address1":"56 Gardner Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7630186,"lng":-72.5033322}},{"address1":"327 Idlewylde Drive","address2":"#3","city":"Louisville","state":"KY","postalCode":"40206","coordinates":{"lat":38.260003,"lng":-85.70065199999999}},{"address1":"18789 Crane Avenue","address2":"","city":"Castro Valley","state":"CA","postalCode":"94546","coordinates":{"lat":37.70902600000001,"lng":-122.059504}},{"address1":"814 East 10th Court","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.166997,"lng":-85.648022}},{"address1":"6431 Shattuck Avenue","address2":"B","city":"Oakland","state":"CA","postalCode":"94609","coordinates":{"lat":37.85015,"lng":-122.266142}},{"address1":"4719 Bayou Bluff Trail","address2":"","city":"Lynn Haven","state":"FL","postalCode":"32444","coordinates":{"lat":30.236109,"lng":-85.599884}},{"address1":"24 Lambert Street","address2":"","city":"Medford","state":"MA","postalCode":"02155","coordinates":{"lat":42.4235908,"lng":-71.093309}},{"address1":"1318 35th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20007","coordinates":{"lat":38.90724700000001,"lng":-77.0690174}},{"address1":"4807 North Grove Avenue","address2":"","city":"Warr Acres","state":"OK","postalCode":"73122","coordinates":{"lat":35.5203601,"lng":-97.6147122}},{"address1":"4408 Bonaparte Boulevard","address2":"","city":"Midwest City","state":"OK","postalCode":"73110","coordinates":{"lat":35.482651,"lng":-97.38337399999999}},{"address1":"73 Twin Hills Drive","address2":"","city":"Longmeadow","state":"MA","postalCode":"01106","coordinates":{"lat":42.0420378,"lng":-72.5428872}},{"address1":"34 Harris Street","address2":"#6","city":"Brookline","state":"MA","postalCode":"02446","coordinates":{"lat":42.3382219,"lng":-71.12330899999999}},{"address1":"22352 North 67th Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85310","coordinates":{"lat":33.686126,"lng":-112.203991}},{"address1":"11522 Country Spring Court","address2":"","city":"Cupertino","state":"CA","postalCode":"95014","coordinates":{"lat":37.3004559,"lng":-122.049009}},{"address1":"21 Soling Avenue","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":32.0376484,"lng":-81.2540562}},{"address1":"302 Mcmillin Street","address2":"","city":"Nashville","state":"TN","postalCode":"37203","coordinates":{"lat":36.1583239,"lng":-86.7947425}},{"address1":"129 Grant Street","address2":"","city":"Redlands","state":"CA","postalCode":"92373","coordinates":{"lat":34.0529643,"lng":-117.1847245}},{"address1":"3035 South Highway A1A","address2":"#3B","city":"Melbourne Beach","state":"FL","postalCode":"32951","coordinates":{"lat":28.0357085,"lng":-80.54249569999999}},{"address1":"1637 Acre Circle","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32407","coordinates":{"lat":30.18644399999999,"lng":-85.78322299999999}},{"address1":"130 West Brown Road","address2":"","city":"Mesa","state":"AZ","postalCode":"85201","coordinates":{"lat":33.4356918,"lng":-111.8348295}},{"address1":"2632 Jackson Street East","address2":"","city":"Carson","state":"CA","postalCode":"90810","coordinates":{"lat":33.8360282,"lng":-118.2202665}},{"address1":"4503 North Council Road","address2":"","city":"Bethany","state":"OK","postalCode":"73008","coordinates":{"lat":35.5176604,"lng":-97.65550879999999}},{"address1":"119 Redwood Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.751289,"lng":-72.563575}},{"address1":"5721 Frank Hough Road","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.23643,"lng":-85.559361}},{"address1":"2917 Danzig Place","address2":"#102","city":"Louisville","state":"KY","postalCode":"40245","coordinates":{"lat":38.280137,"lng":-85.49418639999999}},{"address1":"26563 Chisholm Court","address2":"","city":"Hayward","state":"CA","postalCode":"94544","coordinates":{"lat":37.641711,"lng":-122.078659}},{"address1":"4221 East Mission Boulevard","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0954898,"lng":-94.10028220000001}},{"address1":"6021 Yarrow Street","address2":"#A1","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.806803,"lng":-105.084306}},{"address1":"7102 North 43rd Avenue","address2":"#160","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5415384,"lng":-112.1514119}},{"address1":"3386 Sudlersville South","address2":"","city":"Laurel","state":"MD","postalCode":"20724","coordinates":{"lat":39.089731,"lng":-76.81937599999999}},{"address1":"6022 West Alice Avenue","address2":"#3","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.5640709,"lng":-112.1893361}},{"address1":"580 Hollow Wood Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.3914018,"lng":-86.2181083}},{"address1":"435 East 5th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.217854,"lng":-149.875705}},{"address1":"6713 Holt Road","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.013723,"lng":-86.729686}},{"address1":"5605 North Terry Avenue","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73111","coordinates":{"lat":35.526483,"lng":-97.4830379}},{"address1":"412 West Ila Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.071266,"lng":-94.165154}},{"address1":"9403 Fairground Road","address2":"","city":"Louisville","state":"KY","postalCode":"40291","coordinates":{"lat":38.17058,"lng":-85.5852139}},{"address1":"6049 Quail Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.806876,"lng":-105.1239949}},{"address1":"17 Hillcrest Road","address2":"","city":"Rutland","state":"VT","postalCode":"05701","coordinates":{"lat":43.6216373,"lng":-72.9688374}},{"address1":"424 Callan Avenue","address2":"#216","city":"San Leandro","state":"CA","postalCode":"94577","coordinates":{"lat":37.72780789999999,"lng":-122.152331}},{"address1":"105 Gilmore Street","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21061","coordinates":{"lat":39.176817,"lng":-76.630884}},{"address1":"910 Arlington Terrace","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.077652,"lng":-94.14529000000002}},{"address1":"2204 7th Street Road","address2":"#12","city":"Louisville","state":"KY","postalCode":"40208","coordinates":{"lat":38.218784,"lng":-85.7800649}},{"address1":"11 North Vineyard Drive","address2":"","city":"Pueblo West","state":"CO","postalCode":"81007","coordinates":{"lat":38.318953,"lng":-104.680591}},{"address1":"3505 Albee Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37076","coordinates":{"lat":36.181781,"lng":-86.611408}},{"address1":"689 Stableway Road","address2":"","city":"Pike Road","state":"AL","postalCode":"36064","coordinates":{"lat":32.354837,"lng":-86.076679}},{"address1":"102 East Cydnee Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.10683,"lng":-94.155547}},{"address1":"208 Towne Lake Way","address2":"","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.137605,"lng":-81.25850600000001}},{"address1":"2555 West 69th Court","address2":"","city":"Anchorage","state":"AK","postalCode":"99502","coordinates":{"lat":61.158468,"lng":-149.933297}},{"address1":"58 Rice Street Southwest","address2":"","city":"Washington","state":"DC","postalCode":"20032","coordinates":{"lat":38.83841899999999,"lng":-77.0113105}},{"address1":"2961 Vinson Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36110","coordinates":{"lat":32.42687530000001,"lng":-86.2080404}},{"address1":"172 Chestnut Street","address2":"","city":"Lynn","state":"MA","postalCode":"01902","coordinates":{"lat":42.4696809,"lng":-70.93746680000001}},{"address1":"307 Meadowood Court","address2":"","city":"Lynn Haven","state":"FL","postalCode":"32444","coordinates":{"lat":30.237071,"lng":-85.60347}},{"address1":"403 Turkey Creek Road","address2":"","city":"Mathews","state":"AL","postalCode":"36052","coordinates":{"lat":32.220426,"lng":-86.059168}},{"address1":"11 Rosewood Lane","address2":"","city":"Essex","state":"VT","postalCode":"05452","coordinates":{"lat":44.4912319,"lng":-73.097297}},{"address1":"102 Old Depot Road","address2":"#14","city":"Farmington","state":"AR","postalCode":"72730","coordinates":{"lat":36.040414,"lng":-94.245223}},{"address1":"9 Pierce Road","address2":"","city":"Watertown","state":"MA","postalCode":"02472","coordinates":{"lat":42.380059,"lng":-71.19283399999999}},{"address1":"15254 North 52nd Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.6244609,"lng":-112.171094}},{"address1":"11140 West 60th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.805639,"lng":-105.122694}},{"address1":"803 18th Avenue South","address2":"","city":"Nashville","state":"TN","postalCode":"37203","coordinates":{"lat":36.1500199,"lng":-86.79477}},{"address1":"918 Cheryl Ann Circle","address2":"","city":"Hayward","state":"CA","postalCode":"94544","coordinates":{"lat":37.635859,"lng":-122.076923}},{"address1":"1328 Jenks Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.1726222,"lng":-85.6620902}},{"address1":"2201 Marks Mill Lane","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0917726,"lng":-94.15142089999999}},{"address1":"12371 Atlanta Highway","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.369194,"lng":-86.06518799999999}},{"address1":"3437 Sommerville Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36111","coordinates":{"lat":32.342288,"lng":-86.256546}},{"address1":"829 Dunbarton Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.397179,"lng":-86.205326}},{"address1":"8 Kozera Avenue","address2":"","city":"Hadley","state":"MA","postalCode":"01035","coordinates":{"lat":42.36135549999999,"lng":-72.57288930000001}},{"address1":"89 High Ledge Circle","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7495971,"lng":-72.476336}},{"address1":"35 Lakewood Circle South","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.754591,"lng":-72.52192000000001}},{"address1":"2222 Martin Luther King Junior Boulevard","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0554972,"lng":-94.1910602}},{"address1":"1720 Quacco Road","address2":"A","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.062374,"lng":-81.269502}},{"address1":"116 Jourdan Street","address2":"","city":"Hinesburg","state":"VT","postalCode":"05461","coordinates":{"lat":44.347454,"lng":-73.08877600000001}},{"address1":"2507 R Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20020","coordinates":{"lat":38.869211,"lng":-76.970202}},{"address1":"4719 West Cochise Drive","address2":"","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.580297,"lng":-112.161185}},{"address1":"1838 Crofton Parkway","address2":"","city":"Crofton","state":"MD","postalCode":"21114","coordinates":{"lat":38.9983069,"lng":-76.67975299999999}},{"address1":"26 Seaman Circle","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7668725,"lng":-72.5461613}},{"address1":"2572 Drake Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.342203,"lng":-86.33643599999999}},{"address1":"4231 Miramonte Way","address2":"","city":"Union City","state":"CA","postalCode":"94587","coordinates":{"lat":37.591721,"lng":-122.075993}},{"address1":"2508 Grant Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.193964,"lng":-85.712509}},{"address1":"6505 South Lagoon Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32408","coordinates":{"lat":30.155249,"lng":-85.76467099999999}},{"address1":"2032 Gorgas Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36106","coordinates":{"lat":32.357466,"lng":-86.27658699999999}},{"address1":"1129 I Street","address2":"","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.2110743,"lng":-149.899634}},{"address1":"5201 North Miller Avenue","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73112","coordinates":{"lat":35.523283,"lng":-97.561933}},{"address1":"1987 Boxer Court","address2":"","city":"San Lorenzo","state":"CA","postalCode":"94580","coordinates":{"lat":37.670738,"lng":-122.147019}},{"address1":"3219 Lakeshore Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37138","coordinates":{"lat":36.242959,"lng":-86.625265}},{"address1":"415 West 42nd Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.0543472,"lng":-81.1064222}},{"address1":"5792 Owl Hill Avenue","address2":"","city":"Santa Rosa","state":"CA","postalCode":"95409","coordinates":{"lat":38.467127,"lng":-122.640498}},{"address1":"6816 West 84th Circle","address2":"#42","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.848863,"lng":-105.0735009}},{"address1":"1900 West Virginia Avenue Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.9114897,"lng":-76.9847941}},{"address1":"2936 State Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.202236,"lng":-85.66611499999999}},{"address1":"2604 13th Street","address2":"","city":"Savannah","state":"GA","postalCode":"31408","coordinates":{"lat":32.092738,"lng":-81.17643199999999}},{"address1":"10304 North 179th Drive","address2":"","city":"Waddell","state":"AZ","postalCode":"85355","coordinates":{"lat":33.5780134,"lng":-112.4458901}},{"address1":"8142 Mallard Shore Drive","address2":"","city":"Laurel","state":"MD","postalCode":"20724","coordinates":{"lat":39.112812,"lng":-76.80575499999999}},{"address1":"653 Stratton Arlington Road","address2":"","city":"Stratton","state":"VT","postalCode":"05360","coordinates":{"lat":43.04115300000001,"lng":-72.90772199999999}},{"address1":"2414 Parker Street","address2":"#R 16","city":"Berkeley","state":"CA","postalCode":"94704","coordinates":{"lat":37.862903,"lng":-122.2595092}},{"address1":"43 Westminster Street","address2":"","city":"Pittsfield","state":"MA","postalCode":"01201","coordinates":{"lat":42.458409,"lng":-73.23273499999999}},{"address1":"422 C Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.8942029,"lng":-76.99988809999999}},{"address1":"535 Saddlewood Lane","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.39012,"lng":-86.218373}},{"address1":"7910 West Krall Street","address2":"","city":"Glendale","state":"AZ","postalCode":"85303","coordinates":{"lat":33.534019,"lng":-112.2299964}},{"address1":"1600 20th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20009","coordinates":{"lat":38.9113128,"lng":-77.0451932}},{"address1":"1217 Bay Street","address2":"#318-A","city":"Tybee Island","state":"GA","postalCode":"31328","coordinates":{"lat":32.0222005,"lng":-80.8587482}},{"address1":"7645 Marshall Street","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.835952,"lng":-105.070063}},{"address1":"717 Joseph Avenue","address2":"","city":"Nashville","state":"TN","postalCode":"37207","coordinates":{"lat":36.183641,"lng":-86.772214}},{"address1":"2106 Standard Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40210","coordinates":{"lat":38.231378,"lng":-85.7922619}},{"address1":"316 20th Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.8939527,"lng":-76.97642739999999}},{"address1":"227 West Montgomery Cross Road","address2":"#736","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":31.998812,"lng":-81.134464}},{"address1":"310 12th Avenue","address2":"","city":"Santa Cruz","state":"CA","postalCode":"95062","coordinates":{"lat":36.963154,"lng":-121.994045}},{"address1":"2685 California Street","address2":"#APT 305","city":"Mountain View","state":"CA","postalCode":"94040","coordinates":{"lat":37.4068693,"lng":-122.1129728}},{"address1":"6460 Vermont 113","address2":"","city":"Vershire","state":"VT","postalCode":"05079","coordinates":{"lat":43.9678972,"lng":-72.3154863}},{"address1":"8404 South Villa Avenue","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73159","coordinates":{"lat":35.3818163,"lng":-97.5570041}},{"address1":"7030 West Krall Street","address2":"","city":"Glendale","state":"AZ","postalCode":"85303","coordinates":{"lat":33.534067,"lng":-112.210763}},{"address1":"189 Dalton Avenue","address2":"","city":"Pittsfield","state":"MA","postalCode":"01201","coordinates":{"lat":42.459217,"lng":-73.22532799999999}},{"address1":"2455 Manchester Drive","address2":"","city":"The Village","state":"OK","postalCode":"73120","coordinates":{"lat":35.576392,"lng":-97.55644629999999}},{"address1":"2405 230th Street","address2":"","city":"Pasadena","state":"MD","postalCode":"21122","coordinates":{"lat":39.12585,"lng":-76.549013}},{"address1":"589 East Main Street","address2":"","city":"Newport","state":"VT","postalCode":"05855","coordinates":{"lat":44.943275,"lng":-72.19193299999999}},{"address1":"1520 H Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20006","coordinates":{"lat":38.90021429999999,"lng":-77.0351541}},{"address1":"4603 Grant Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20019","coordinates":{"lat":38.8983173,"lng":-76.9364561}},{"address1":"171 Brickhill Circle","address2":"","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.175349,"lng":-81.25099}},{"address1":"607 North 46th Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0741371,"lng":-94.22645829999999}},{"address1":"9134 Brook Park Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.3076534,"lng":-86.1451185}},{"address1":"2134 West Mills Drive","address2":"","city":"Orange","state":"CA","postalCode":"92868","coordinates":{"lat":33.786584,"lng":-117.875665}},{"address1":"2 Cockle Shell Road","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.960368,"lng":-81.229034}},{"address1":"1431 King George Boulevard","address2":"#21-C","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.9775273,"lng":-81.2259819}},{"address1":"1804 Calhoun Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.181413,"lng":-85.693748}},{"address1":"23 Florida Avenue Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.910125,"lng":-77.00808099999999}},{"address1":"5630 Silverado Way","address2":"#STE A8","city":"Anchorage","state":"AK","postalCode":"99518","coordinates":{"lat":61.1695128,"lng":-149.8896842}},{"address1":"11300 Lillian Lane","address2":"","city":"Anchorage","state":"AK","postalCode":"99515","coordinates":{"lat":61.11845399999999,"lng":-149.881223}},{"address1":"2209 East Manor Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.075132,"lng":-94.12903399999999}},{"address1":"8325 Northwest 19th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73127","coordinates":{"lat":35.48856,"lng":-97.66233199999999}},{"address1":"6925 Lariat Lane","address2":"","city":"Castro Valley","state":"CA","postalCode":"94552","coordinates":{"lat":37.7157257,"lng":-122.0270913}},{"address1":"6721 Boundary Run","address2":"","city":"Nashville","state":"TN","postalCode":"37221","coordinates":{"lat":36.087655,"lng":-87.006136}},{"address1":"1700 William E Summers III Avenue","address2":"#201","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.22952540000001,"lng":-85.82045680000002}},{"address1":"14 6th Street","address2":"#1","city":"Medford","state":"MA","postalCode":"02155","coordinates":{"lat":42.4074868,"lng":-71.07807670000001}},{"address1":"11865 West 74th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.830545,"lng":-105.131624}},{"address1":"912 Countryside Lane","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.404751,"lng":-86.18589899999999}},{"address1":"6080 Frontier Lane","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.030597,"lng":-86.73436}},{"address1":"1124 Bluewillow Court","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.040783,"lng":-86.577798}},{"address1":"17722 North 79th Avenue","address2":"#1135","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.646496,"lng":-112.2317614}},{"address1":"6 Oak Street","address2":"","city":"Town of Rockingham","state":"VT","postalCode":"05101","coordinates":{"lat":43.134108,"lng":-72.449474}},{"address1":"1537 Northwest 123rd Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73120","coordinates":{"lat":35.5961896,"lng":-97.53951699999999}},{"address1":"10001 Pheasant Lane","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73162","coordinates":{"lat":35.571646,"lng":-97.63995700000001}},{"address1":"10340 West 62nd Place","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.8101545,"lng":-105.1135667}},{"address1":"52 Oleary Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7716925,"lng":-72.5521002}},{"address1":"15082 North 59th Avenue","address2":"#111","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.6231673,"lng":-112.1871757}},{"address1":"7047 Vinson Road","address2":"","city":"Panama City","state":"FL","postalCode":"32413","coordinates":{"lat":30.336868,"lng":-85.829662}},{"address1":"200 Edson Road","address2":"","city":"Windham","state":"VT","postalCode":"05359","coordinates":{"lat":43.2215166,"lng":-72.7049368}},{"address1":"150 Manistee Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.235428,"lng":-85.89155099999999}},{"address1":"2335 Orchard View Lane","address2":"","city":"Escondido","state":"CA","postalCode":"92027","coordinates":{"lat":33.119461,"lng":-117.007959}},{"address1":"65 Clark Street","address2":"#2","city":"Newton","state":"MA","postalCode":"02459","coordinates":{"lat":42.321396,"lng":-71.1995577}},{"address1":"18318 Pioneer Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99577","coordinates":{"lat":61.364421,"lng":-149.540056}},{"address1":"110 Elmwood Avenue","address2":"","city":"Barre","state":"VT","postalCode":"05641","coordinates":{"lat":44.2097089,"lng":-72.50493600000001}},{"address1":"4800 Huffman Road","address2":"","city":"Anchorage","state":"AK","postalCode":"99516","coordinates":{"lat":61.10827899999999,"lng":-149.791977}},{"address1":"8219 Minor Lane","address2":"#9","city":"Louisville","state":"KY","postalCode":"40219","coordinates":{"lat":38.12841,"lng":-85.7107249}},{"address1":"10129 Spring Gate Drive","address2":"","city":"Louisville","state":"KY","postalCode":"40241","coordinates":{"lat":38.312891,"lng":-85.562299}},{"address1":"65 Arcellia Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.788139,"lng":-72.491989}},{"address1":"12460 West Solano Drive","address2":"","city":"Litchfield Park","state":"AZ","postalCode":"85340","coordinates":{"lat":33.520308,"lng":-112.3275521}},{"address1":"618 Watts Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36104","coordinates":{"lat":32.37152700000001,"lng":-86.294285}},{"address1":"5805 Armada Drive","address2":"","city":"Carlsbad","state":"CA","postalCode":"92008","coordinates":{"lat":33.1238541,"lng":-117.3152497}},{"address1":"1644 Queenstown Road","address2":"","city":"Nichols Hills","state":"OK","postalCode":"73116","coordinates":{"lat":35.542511,"lng":-97.547282}},{"address1":"143 Main Street","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.7886316,"lng":-72.52390249999999}},{"address1":"226 Tranquility Lane","address2":"","city":"Saint Albans Town","state":"VT","postalCode":"05488","coordinates":{"lat":44.8389381,"lng":-73.18372149999999}},{"address1":"831 21st Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.9011079,"lng":-76.974034}},{"address1":"22825 Paseo Place","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.6678961,"lng":-122.0832649}},{"address1":"2902 Flint Street","address2":"","city":"Union City","state":"CA","postalCode":"94587","coordinates":{"lat":37.60442,"lng":-122.069607}},{"address1":"919 Windsor Avenue","address2":"","city":"Annapolis","state":"MD","postalCode":"21403","coordinates":{"lat":38.968518,"lng":-76.4905689}},{"address1":"6041 North 72nd Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85303","coordinates":{"lat":33.525117,"lng":-112.215039}},{"address1":"163 Highwood Drive","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.76664299999999,"lng":-72.490877}},{"address1":"1334 East 14th Avenue","address2":"#APT 000004","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.208547,"lng":-149.857294}},{"address1":"223 Goose Pond Road","address2":"","city":"Fairfax","state":"VT","postalCode":"05454","coordinates":{"lat":44.653053,"lng":-72.971587}},{"address1":"1021 North Center Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.1670475,"lng":-85.6292984}},{"address1":"1559 Alabama Avenue Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20032","coordinates":{"lat":38.8467679,"lng":-76.98076200000001}},{"address1":"1238 Roanwood Way","address2":"","city":"Concord","state":"CA","postalCode":"94521","coordinates":{"lat":37.94042,"lng":-121.944464}},{"address1":"2068 Happy Lane","address2":"","city":"Crofton","state":"MD","postalCode":"21114","coordinates":{"lat":39.013318,"lng":-76.6754904}},{"address1":"5378 Allison Street","address2":"#102","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.7944109,"lng":-105.0860024}},{"address1":"4604 Virginia Loop Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.314591,"lng":-86.24074999999999}},{"address1":"7711 North 51st Avenue","address2":"#1180","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5502243,"lng":-112.1665731}},{"address1":"343 Daman Drive","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.2999,"lng":-86.342286}},{"address1":"3623 Chateau Lane","address2":"","city":"Louisville","state":"KY","postalCode":"40219","coordinates":{"lat":38.1473803,"lng":-85.6954641}},{"address1":"2619 North Quality Lane","address2":"#315","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.09925399999999,"lng":-94.164274}},{"address1":"5334 West Northern Avenue","address2":"#327","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5535111,"lng":-112.1747068}},{"address1":"3835 Oakes Drive","address2":"","city":"Hayward","state":"CA","postalCode":"94542","coordinates":{"lat":37.661345,"lng":-122.032784}},{"address1":"295 Townes Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37211","coordinates":{"lat":36.052158,"lng":-86.70206900000001}},{"address1":"125 13th Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20002","coordinates":{"lat":38.891265,"lng":-76.988068}},{"address1":"7308 Northwest 119th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73162","coordinates":{"lat":35.592396,"lng":-97.643619}},{"address1":"1911 East 58th Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99507","coordinates":{"lat":61.16876999999999,"lng":-149.847225}},{"address1":"22649 McManus Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99567","coordinates":{"lat":61.418189,"lng":-149.460766}},{"address1":"4617 East 3rd Street","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.129243,"lng":-85.606926}},{"address1":"6436 Stoney Point Road","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.266241,"lng":-85.599245}},{"address1":"2577 Rhode Island Avenue Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20018","coordinates":{"lat":38.931902,"lng":-76.969579}},{"address1":"44 Campfield Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.768442,"lng":-72.540232}},{"address1":"7132 South Villa Avenue","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73159","coordinates":{"lat":35.392665,"lng":-97.5569639}},{"address1":"107 West Canton Circle","address2":"","city":"Springfield","state":"MA","postalCode":"01104","coordinates":{"lat":42.144682,"lng":-72.57098599999999}},{"address1":"14358 West 88th Place","address2":"C","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.8568436,"lng":-105.161713}},{"address1":"2100 Sandy Creek Trail","address2":"","city":"Edmond","state":"OK","postalCode":"73013","coordinates":{"lat":35.63330699999999,"lng":-97.509911}},{"address1":"6404 West 82nd Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.846475,"lng":-105.067397}},{"address1":"1609 Porter Avenue","address2":"","city":"Nashville","state":"TN","postalCode":"37206","coordinates":{"lat":36.196292,"lng":-86.725028}},{"address1":"8421 Thomas Drive","address2":"#4","city":"Panama City","state":"FL","postalCode":"32408","coordinates":{"lat":30.165178,"lng":-85.78605}},{"address1":"116 Frost Park","address2":"","city":"Hartford","state":"VT","postalCode":"05001","coordinates":{"lat":43.6692262,"lng":-72.3088865}},{"address1":"132 Tensaw Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36117","coordinates":{"lat":32.384289,"lng":-86.147064}},{"address1":"3147 West Old Farmington Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.0531475,"lng":-94.2055113}},{"address1":"3538 Mendenhall Court","address2":"","city":"Pleasanton","state":"CA","postalCode":"94588","coordinates":{"lat":37.6991919,"lng":-121.85909}},{"address1":"1623 Mines Road","address2":"","city":"Lowell","state":"VT","postalCode":"05847","coordinates":{"lat":44.795108,"lng":-72.48690599999999}},{"address1":"99 Pond Avenue","address2":"#606","city":"Brookline","state":"MA","postalCode":"02445","coordinates":{"lat":42.3293159,"lng":-71.1152839}},{"address1":"557 West Willoughby Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.019975,"lng":-94.16828199999999}},{"address1":"309 Brooke Court","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.1536175,"lng":-85.5881338}},{"address1":"4696 Bull Run Road","address2":"","city":"Ashland City","state":"TN","postalCode":"37015","coordinates":{"lat":36.241285,"lng":-86.940741}},{"address1":"18330 North 79th Avenue","address2":"#3155","city":"Glendale","state":"AZ","postalCode":"85308","coordinates":{"lat":33.6487128,"lng":-112.2313289}},{"address1":"5601 West Missouri Avenue","address2":"#165","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.5152999,"lng":-112.179748}},{"address1":"2903 West 31st Avenue","address2":"#APT 000002","city":"Anchorage","state":"AK","postalCode":"99517","coordinates":{"lat":61.192819,"lng":-149.937665}},{"address1":"2611 Bluefield Avenue","address2":"","city":"Nashville","state":"TN","postalCode":"37214","coordinates":{"lat":36.16786,"lng":-86.670203}},{"address1":"203 East Gwinnett Street","address2":"","city":"Savannah","state":"GA","postalCode":"31401","coordinates":{"lat":32.06637,"lng":-81.093895}},{"address1":"3517 S Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20007","coordinates":{"lat":38.914807,"lng":-77.070229}},{"address1":"1123 Ardee Avenue","address2":"","city":"Nashville","state":"TN","postalCode":"37216","coordinates":{"lat":36.219121,"lng":-86.725616}},{"address1":"3811 W Street Southeast","address2":"","city":"Washington","state":"DC","postalCode":"20020","coordinates":{"lat":38.8629369,"lng":-76.9515086}},{"address1":"2130 Loren Circle","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.071889,"lng":-94.191613}},{"address1":"4 Orchard Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.7747,"lng":-72.5247351}},{"address1":"4755 Coventry Road","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.318132,"lng":-86.28353}},{"address1":"1806 Boscobel Street","address2":"","city":"Nashville","state":"TN","postalCode":"37206","coordinates":{"lat":36.170799,"lng":-86.73835299999999}},{"address1":"7034 West John Garrison Road","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.107097,"lng":-94.2619139}},{"address1":"233 Juniper Drive","address2":"","city":"South Burlington","state":"VT","postalCode":"05403","coordinates":{"lat":44.473457,"lng":-73.176118}},{"address1":"1831 Frankford Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.181993,"lng":-85.692285}},{"address1":"4924 West 65th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8146604,"lng":-105.050343}},{"address1":"7095 Gladiola Street","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.824892,"lng":-105.162799}},{"address1":"7564 Moore Court","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.834188,"lng":-105.11569}},{"address1":"8442 Everett Way","address2":"A","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.850942,"lng":-105.096599}},{"address1":"1330 West 82nd Avenue","address2":"","city":"Anchorage","state":"AK","postalCode":"99518","coordinates":{"lat":61.147676,"lng":-149.905329}},{"address1":"4907 Roger Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99507","coordinates":{"lat":61.17564799999999,"lng":-149.839627}},{"address1":"123 Blossom Road","address2":"","city":"Westport","state":"MA","postalCode":"02790","coordinates":{"lat":41.68531,"lng":-71.0961337}},{"address1":"915 Hargrove Street","address2":"","city":"Ardmore","state":"OK","postalCode":"73401","coordinates":{"lat":34.184371,"lng":-97.13386190000001}},{"address1":"1983 Reidsville Street","address2":"","city":"Annapolis","state":"MD","postalCode":"21401","coordinates":{"lat":38.9817243,"lng":-76.5313745}},{"address1":"12403 Deerfield Road","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.977229,"lng":-81.145139}},{"address1":"1011 Devon Drive","address2":"","city":"Hayward","state":"CA","postalCode":"94542","coordinates":{"lat":37.65444100000001,"lng":-122.067741}},{"address1":"5222 West Laurie Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85302","coordinates":{"lat":33.5587639,"lng":-112.172235}},{"address1":"35 Pilgrim Lane","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.772138,"lng":-72.498806}},{"address1":"2728 Hale Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.2390813,"lng":-85.79926999999999}},{"address1":"65 Lowry Road","address2":"","city":"Falmouth","state":"MA","postalCode":"02540","coordinates":{"lat":41.5471365,"lng":-70.6075836}},{"address1":"302 Depot Road","address2":"","city":"Boxborough","state":"MA","postalCode":"01719","coordinates":{"lat":42.5013,"lng":-71.49441}},{"address1":"1402 Maggies Way","address2":"","city":"Waterbury Center","state":"VT","postalCode":"05677","coordinates":{"lat":44.410965,"lng":-72.71017499999999}},{"address1":"81 Lyness Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.76787789999999,"lng":-72.5443361}},{"address1":"6518 Dolphin Court","address2":"","city":"Glen Burnie","state":"MD","postalCode":"21061","coordinates":{"lat":39.198769,"lng":-76.63721}},{"address1":"1842 West Park Place","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73106","coordinates":{"lat":35.4795219,"lng":-97.5431009}},{"address1":"1 Pond View Road","address2":"","city":"Proctor","state":"VT","postalCode":"05765","coordinates":{"lat":43.663678,"lng":-73.0458419}},{"address1":"1340 5th Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20001","coordinates":{"lat":38.907549,"lng":-77.018924}},{"address1":"6000 Parker Drive","address2":"","city":"Deale","state":"MD","postalCode":"20751","coordinates":{"lat":38.780208,"lng":-76.539991}},{"address1":"822 Bowden Street","address2":"","city":"Savannah","state":"GA","postalCode":"31415","coordinates":{"lat":32.071342,"lng":-81.11783199999999}},{"address1":"1710 East Harold Street","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.109875,"lng":-94.1359389}},{"address1":"1518 Jenks Avenue","address2":"","city":"Panama City","state":"FL","postalCode":"32405","coordinates":{"lat":30.1765819,"lng":-85.662077}},{"address1":"814 South Pickard Avenue","address2":"","city":"Norman","state":"OK","postalCode":"73069","coordinates":{"lat":35.206961,"lng":-97.45494099999999}},{"address1":"100 Fenwick Village Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":32.0244412,"lng":-81.23017689999999}},{"address1":"218 Middle Street","address2":"","city":"Brighton","state":"VT","postalCode":"05846","coordinates":{"lat":44.818438,"lng":-71.8846049}},{"address1":"5470 Atlanta Highway","address2":"","city":"Montgomery","state":"AL","postalCode":"36109","coordinates":{"lat":32.3802399,"lng":-86.21232959999999}},{"address1":"43 Main Street","address2":"","city":"Essex","state":"VT","postalCode":"05452","coordinates":{"lat":44.4921,"lng":-73.1074749}},{"address1":"804 East 7th Court","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.161259,"lng":-85.648719}},{"address1":"1709 Queensbury Road","address2":"","city":"Moore","state":"OK","postalCode":"73160","coordinates":{"lat":35.3546959,"lng":-97.507938}},{"address1":"646 Clinton Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36108","coordinates":{"lat":32.3602725,"lng":-86.3183004}},{"address1":"708 Pine Drift Drive","address2":"","city":"Odenton","state":"MD","postalCode":"21113","coordinates":{"lat":39.070589,"lng":-76.715406}},{"address1":"5104 West Tierra Buena Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.62898759999999,"lng":-112.168811}},{"address1":"1234 Carmel Street","address2":"","city":"Madera","state":"CA","postalCode":"93638","coordinates":{"lat":36.949941,"lng":-120.043739}},{"address1":"1753 Zion Road","address2":"#E33","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.1273162,"lng":-94.1350437}},{"address1":"22538 6th Street","address2":"","city":"Hayward","state":"CA","postalCode":"94541","coordinates":{"lat":37.680829,"lng":-122.07335}},{"address1":"415 Lullwater Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.22177929999999,"lng":-85.8841423}},{"address1":"219 Bidwell Street","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.761322,"lng":-72.5498278}},{"address1":"4500 Margalo Avenue","address2":"","city":"Bakersfield","state":"CA","postalCode":"93313","coordinates":{"lat":35.305082,"lng":-119.052448}},{"address1":"8380 West 67th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80004","coordinates":{"lat":39.817999,"lng":-105.090301}},{"address1":"2334 Nantucket Drive","address2":"","city":"Crofton","state":"MD","postalCode":"21114","coordinates":{"lat":39.0298609,"lng":-76.67307600000001}},{"address1":"720 East Muhammad Ali Boulevard","address2":"","city":"Louisville","state":"KY","postalCode":"40202","coordinates":{"lat":38.2491941,"lng":-85.7396682}},{"address1":"12022 Town Park Circle","address2":"","city":"Anchorage","state":"AK","postalCode":"99577","coordinates":{"lat":61.32927710000001,"lng":-149.5778193}},{"address1":"2305 Ranchland Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31404","coordinates":{"lat":32.026112,"lng":-81.0755779}},{"address1":"1656 Newton Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20010","coordinates":{"lat":38.933985,"lng":-77.03866099999999}},{"address1":"91 85th Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72704","coordinates":{"lat":36.064165,"lng":-94.285358}},{"address1":"228 Central Street","address2":"","city":"Milford","state":"MA","postalCode":"01757","coordinates":{"lat":42.13911,"lng":-71.5115022}},{"address1":"20 Masters Way","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.740694,"lng":-72.51832}},{"address1":"5396 North Reese Avenue","address2":"","city":"Fresno","state":"CA","postalCode":"93722","coordinates":{"lat":36.815278,"lng":-119.864119}},{"address1":"28 Wilfred Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.766696,"lng":-72.5597335}},{"address1":"200 Pheasant Avenue","address2":"#103","city":"Louisville","state":"KY","postalCode":"40118","coordinates":{"lat":38.1134628,"lng":-85.76321279999999}},{"address1":"1650 Garland Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.0845144,"lng":-94.1751065}},{"address1":"4600 Ritchie Highway","address2":"","city":"Baltimore","state":"MD","postalCode":"21225","coordinates":{"lat":39.228241,"lng":-76.6136159}},{"address1":"733 East DeRenne Avenue","address2":"","city":"Savannah","state":"GA","postalCode":"31405","coordinates":{"lat":32.024217,"lng":-81.095602}},{"address1":"8349 West Stella Way","address2":"","city":"Glendale","state":"AZ","postalCode":"85305","coordinates":{"lat":33.529493,"lng":-112.240632}},{"address1":"33 Pond Avenue","address2":"#804","city":"Brookline","state":"MA","postalCode":"02445","coordinates":{"lat":42.33094200000001,"lng":-71.1145331}},{"address1":"9 Kimball Court","address2":"#107","city":"Burlington","state":"MA","postalCode":"01803","coordinates":{"lat":42.501798,"lng":-71.168725}},{"address1":"2433 Southwest 36th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73109","coordinates":{"lat":35.42839900000001,"lng":-97.556119}},{"address1":"4607 Artelia Drive","address2":"","city":"Nashville","state":"TN","postalCode":"37013","coordinates":{"lat":36.071468,"lng":-86.675555}},{"address1":"212 Ambleside Drive","address2":"","city":"Severna Park","state":"MD","postalCode":"21146","coordinates":{"lat":39.097022,"lng":-76.55617699999999}},{"address1":"8757 Lamar Circle","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.8557446,"lng":-105.0681477}},{"address1":"130 Carolina Cherry Circle","address2":"","city":"Pooler","state":"GA","postalCode":"31322","coordinates":{"lat":32.1485911,"lng":-81.2620116}},{"address1":"7804 Abercorn Street","address2":"#11","city":"Savannah","state":"GA","postalCode":"31406","coordinates":{"lat":32.00192,"lng":-81.11689830000002}},{"address1":"12870 Old Seward Highway","address2":"#STE 000105","city":"Anchorage","state":"AK","postalCode":"99515","coordinates":{"lat":61.10396369999999,"lng":-149.8575515}},{"address1":"8133 Meadowgreen Place","address2":"","city":"Louisville","state":"KY","postalCode":"40299","coordinates":{"lat":38.1899697,"lng":-85.60704779999999}},{"address1":"5 Meadow Lane","address2":"","city":"Rutland","state":"VT","postalCode":"05701","coordinates":{"lat":43.619797,"lng":-72.983231}},{"address1":"562 South Pierremont Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.05627330000001,"lng":-94.1251461}},{"address1":"1219 Carleton Street","address2":"M","city":"Berkeley","state":"CA","postalCode":"94702","coordinates":{"lat":37.8591054,"lng":-122.285823}},{"address1":"1403 Boulder Court","address2":"","city":"Hanover","state":"MD","postalCode":"21076","coordinates":{"lat":39.140743,"lng":-76.69958}},{"address1":"122 Coral Drive","address2":"","city":"Panama City Beach","state":"FL","postalCode":"32413","coordinates":{"lat":30.233822,"lng":-85.89228399999999}},{"address1":"1404 James Way","address2":"","city":"Edgewater","state":"MD","postalCode":"21037","coordinates":{"lat":38.8879642,"lng":-76.5100926}},{"address1":"4300 Woodley Square","address2":"","city":"Montgomery","state":"AL","postalCode":"36116","coordinates":{"lat":32.3269015,"lng":-86.2695368}},{"address1":"422 Richmond Street","address2":"","city":"El Cerrito","state":"CA","postalCode":"94530","coordinates":{"lat":37.9028101,"lng":-122.2981152}},{"address1":"222 Plymouth Street","address2":"A","city":"Middleborough","state":"MA","postalCode":"02346","coordinates":{"lat":41.928117,"lng":-70.9416075}},{"address1":"451 East Street","address2":"","city":"Huntington","state":"VT","postalCode":"05462","coordinates":{"lat":44.3194104,"lng":-72.9844982}},{"address1":"9209 Eupora Court","address2":"","city":"Jeffersontown","state":"KY","postalCode":"40299","coordinates":{"lat":38.1970417,"lng":-85.58631430000001}},{"address1":"4 Conti Circle","address2":"","city":"Barre","state":"VT","postalCode":"05641","coordinates":{"lat":44.1731699,"lng":-72.4920951}},{"address1":"5264 Shafter Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94618","coordinates":{"lat":37.839058,"lng":-122.256035}},{"address1":"1630 Eton Way","address2":"","city":"Crofton","state":"MD","postalCode":"21114","coordinates":{"lat":39.008958,"lng":-76.69134199999999}},{"address1":"5244 West Port Au Prince Lane","address2":"","city":"Glendale","state":"AZ","postalCode":"85306","coordinates":{"lat":33.622672,"lng":-112.17283}},{"address1":"1835 Pointer Lane","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.08606899999999,"lng":-94.1187549}},{"address1":"107 Laurel Green Court","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":32.025628,"lng":-81.24673399999999}},{"address1":"7250 Urban Drive","address2":"","city":"Arvada","state":"CO","postalCode":"80005","coordinates":{"lat":39.827875,"lng":-105.133965}},{"address1":"12 Kane Road","address2":"","city":"Manchester","state":"CT","postalCode":"06040","coordinates":{"lat":41.764315,"lng":-72.51276}},{"address1":"4132 Northwest 57th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73112","coordinates":{"lat":35.529164,"lng":-97.594155}},{"address1":"10774 West 54th Lane","address2":"","city":"Arvada","state":"CO","postalCode":"80002","coordinates":{"lat":39.7963587,"lng":-105.11861}},{"address1":"6729 North 54th Avenue","address2":"","city":"Glendale","state":"AZ","postalCode":"85301","coordinates":{"lat":33.536068,"lng":-112.17458}},{"address1":"6483 West 76th Avenue","address2":"","city":"Arvada","state":"CO","postalCode":"80003","coordinates":{"lat":39.834927,"lng":-105.069802}},{"address1":"5732 Jean Drive","address2":"","city":"Union City","state":"CA","postalCode":"94587","coordinates":{"lat":37.580691,"lng":-122.082773}},{"address1":"8221 Surf Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32408","coordinates":{"lat":30.1630986,"lng":-85.7845665}},{"address1":"9101 Vanguard Drive","address2":"","city":"Anchorage","state":"AK","postalCode":"99507","coordinates":{"lat":61.1382426,"lng":-149.84756}},{"address1":"18713 Shilstone Way","address2":"","city":"Edmond","state":"OK","postalCode":"73012","coordinates":{"lat":35.6618776,"lng":-97.53426999999999}},{"address1":"51185 Helmsman Street","address2":"","city":"Kenai","state":"AK","postalCode":"99611","coordinates":{"lat":60.509562,"lng":-151.265293}},{"address1":"128 East Oak Street","address2":"#3","city":"Louisville","state":"KY","postalCode":"40203","coordinates":{"lat":38.2342125,"lng":-85.7539867}},{"address1":"1222 Arcade Boulevard","address2":"","city":"Sacramento","state":"CA","postalCode":"95815","coordinates":{"lat":38.626122,"lng":-121.43861}},{"address1":"1405 Mercedes Avenue","address2":"APARTMENT G","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.1738039,"lng":-85.6462091}},{"address1":"7024 Johnny Mercer Boulevard","address2":"","city":"Savannah","state":"GA","postalCode":"31410","coordinates":{"lat":32.022447,"lng":-80.969861}},{"address1":"3600 Pennsylvania Avenue","address2":"#APT 6","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.5516245,"lng":-121.9872735}},{"address1":"312 North Cove Boulevard","address2":"","city":"Panama City","state":"FL","postalCode":"32401","coordinates":{"lat":30.1520433,"lng":-85.6500713}},{"address1":"3118 Sora Avenue","address2":"","city":"Louisville","state":"KY","postalCode":"40213","coordinates":{"lat":38.208849,"lng":-85.724113}},{"address1":"6420 Via Baron","address2":"","city":"Rancho Palos Verdes","state":"CA","postalCode":"90275","coordinates":{"lat":33.741162,"lng":-118.390767}},{"address1":"3321 Furman Boulevard","address2":"","city":"Louisville","state":"KY","postalCode":"40220","coordinates":{"lat":38.2134349,"lng":-85.640439}},{"address1":"98 Lincoln Street","address2":"","city":"Revere","state":"MA","postalCode":"02151","coordinates":{"lat":42.418115,"lng":-71.027503}},{"address1":"984 Greendale Avenue","address2":"","city":"Needham","state":"MA","postalCode":"02492","coordinates":{"lat":42.275811,"lng":-71.203287}},{"address1":"239 Eastern Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0605438,"lng":-94.18373079999999}},{"address1":"1106 Commanders Way South","address2":"","city":"Annapolis","state":"MD","postalCode":"21409","coordinates":{"lat":39.033352,"lng":-76.447767}},{"address1":"4927 Alvin Sperry Road","address2":"","city":"Mount Juliet","state":"TN","postalCode":"37122","coordinates":{"lat":36.143557,"lng":-86.556877}},{"address1":"1632 North Lunsford Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.0827979,"lng":-94.137607}},{"address1":"2349 East Tall Oaks Drive","address2":"","city":"Fayetteville","state":"AR","postalCode":"72703","coordinates":{"lat":36.09277,"lng":-94.12758799999999}},{"address1":"2036 Hermitage Hills Drive","address2":"","city":"Gambrills","state":"MD","postalCode":"21054","coordinates":{"lat":38.9951,"lng":-76.65160999999999}},{"address1":"119 Oakland Street","address2":"","city":"Manchester","state":"CT","postalCode":"06042","coordinates":{"lat":41.7976637,"lng":-72.5199944}},{"address1":"37675 Fremont Boulevard","address2":"#APT 42","city":"Fremont","state":"CA","postalCode":"94536","coordinates":{"lat":37.555306,"lng":-122.003412}},{"address1":"3104 Southwest 46th Street","address2":"","city":"Oklahoma City","state":"OK","postalCode":"73119","coordinates":{"lat":35.4186213,"lng":-97.56952249999999}},{"address1":"2036 Gorgas Street","address2":"","city":"Montgomery","state":"AL","postalCode":"36106","coordinates":{"lat":32.357301,"lng":-86.276583}},{"address1":"11102 Little Rock Court","address2":"","city":"Louisville","state":"KY","postalCode":"40241","coordinates":{"lat":38.3214271,"lng":-85.5421016}},{"address1":"46 Deslauriers Street","address2":"","city":"Chicopee","state":"MA","postalCode":"01020","coordinates":{"lat":42.1855005,"lng":-72.5733508}},{"address1":"12 Red Fox Drive","address2":"","city":"Savannah","state":"GA","postalCode":"31419","coordinates":{"lat":31.981396,"lng":-81.22833899999999}},{"address1":"503 Blackwood Terrace Southeast","address2":"","city":"Calhoun","state":"GA","postalCode":"30701","coordinates":{"lat":34.459017,"lng":-84.914659}},{"address1":"2223 North Fernwood Court","address2":"","city":"Savannah","state":"GA","postalCode":"31404","coordinates":{"lat":32.029307,"lng":-81.06297099999999}},{"address1":"5444 Nicole Boulevard","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.238007,"lng":-85.562274}},{"address1":"849 East Victoria Street","address2":"#204","city":"Carson","state":"CA","postalCode":"90746","coordinates":{"lat":33.8673562,"lng":-118.2597713}},{"address1":"445 South Potomac Circle","address2":"","city":"Aurora","state":"CO","postalCode":"80012","coordinates":{"lat":39.705341,"lng":-104.830397}},{"address1":"201 East 9th Avenue","address2":"#APT 000102","city":"Anchorage","state":"AK","postalCode":"99501","coordinates":{"lat":61.213897,"lng":-149.880633}},{"address1":"3500 15th Street Northeast","address2":"","city":"Washington","state":"DC","postalCode":"20017","coordinates":{"lat":38.93311000000001,"lng":-76.98485699999999}},{"address1":"4981 Shirley Way","address2":"","city":"Livermore","state":"CA","postalCode":"94550","coordinates":{"lat":37.682649,"lng":-121.733308}},{"address1":"1300 Lemos Lane","address2":"","city":"Fremont","state":"CA","postalCode":"94539","coordinates":{"lat":37.546996,"lng":-121.951627}},{"address1":"5000 V Street Northwest","address2":"","city":"Washington","state":"DC","postalCode":"20007","coordinates":{"lat":38.917076,"lng":-77.09743399999999}},{"address1":"6823 Forsythe Drive","address2":"","city":"Panama City","state":"FL","postalCode":"32404","coordinates":{"lat":30.12332199999999,"lng":-85.571428}},{"address1":"1522 South 36th Street","address2":"","city":"Louisville","state":"KY","postalCode":"40211","coordinates":{"lat":38.231691,"lng":-85.8144612}},{"address1":"313 Lone Oak Drive","address2":"","city":"Norman","state":"OK","postalCode":"73071","coordinates":{"lat":35.221084,"lng":-97.405029}},{"address1":"970 Old Oak Road","address2":"","city":"Livermore","state":"CA","postalCode":"94550","coordinates":{"lat":37.653774,"lng":-121.796632}},{"address1":"1653 Brooks Avenue","address2":"","city":"Fayetteville","state":"AR","postalCode":"72701","coordinates":{"lat":36.04687,"lng":-94.17589699999999}},{"address1":"441 Merritt Avenue","address2":"","city":"Oakland","state":"CA","postalCode":"94610","coordinates":{"lat":37.8058663,"lng":-122.2493644}},{"address1":"632 North Pine Street","address2":"","city":"Anchorage","state":"AK","postalCode":"99508","coordinates":{"lat":61.22930220000001,"lng":-149.7938547}}],"attribution":["City of Haddam (CT)","Ciy of Hartford (CT)","City of Lyme (CT)","City of Manchester (CT)","City of Watertown (CT)","City of Avon (CT)","Town of Fairfield (CT)","City of Groton (CT)","Office of Geographic Information (MassGIS), Commonwealth of Massachusetts, MassIT (MA)","VT Enhanced 911 Board, VCGI (VT)","City of Huntsville (AL)","City of Montgomery (AL)","Shelby County (AL)","Talladega County (AL)","City of Fayetteville (AR)","Arkansas Geographic Information Office (AR)","City of Washington (DC)","Bay County (FL)","Brevard County (FL)","Charlotte County (FL)","Citrus County (FL)","Clay County (FL)","Highlands County, FL (FL)","Hillsborough County (FL)","City of Savannah (GA)","Gordon County (GA)","Muscogee County (GA)","Sumter County (GA)","Metro Louisville, LOJIC partners (KY)","Anne Arundel County (MD)","City of Baltimore (MD)","Frederick County (MD)","Oklahoma and Logan Counties - Association of Central Oklahoma Governments (OK)","Kern, Cleveland, Canadian, Logan Counties (OK)","City of Nashville (TN)","Cooke,Fannin,Grayson Counties - Texoma Council of Governments (TX)","Municipality of Anchorage (AK)","Copyright © 2015 Kenai Peninsula Borough (AK)","Matanuska-Susitna Borough (AK)","City of Glendale (AZ)","City of Mesa (AZ)","Alameda County (CA)","Amador County (CA)","City of Berkeley (CA)","Butte County (CA)","City of Bakersfield (CA)","City of Carson (CA)","City of Cupertino (CA)","City of Hayward and Fairview. Licensed for Public Use (CA)","City of Mountain View (CA)","City of Orange (CA)","Contra Costa County (CA)","El Dorando County (CA)","Fresno County (CA)","Humboldt County (CA)","Kern County (CA)","Kings County (CA)","Lake County (CA)","Lassen County (CA)","Los Angeles County (CA)","Madera County (CA)","Marin County (CA)","Merced County (CA)","Mono County (CA)","Monterey County (CA)","Napa County (CA)","County of Nevada, California (CA)","Orange County (CA)","City of Palo Alto (CA)","County of Placer (CA)","Secramento County (CA)","San Bernardino County (CA)","San Diego Geographic Information Source - JPA (CA)","San Joaquin County (CA)","San Luis Obispo County (CA)","San Mateo County (CA)","Santa Barbara County (CA)","Santa Clara County (CA)","Santa Cruz County (CA)","Shasta County (CA)","Solano County (CA)","Sonoma County (CA)","Stanislaus County (CA)","Tuolumne County (CA)","Yolo County (CA)","Yuba County (CA)","Arapahoe County (CO)","Archuleta County (CO)","City of Arvada (CO)","City of Aurora (CO)","City of Boulder (CO)","City of Fort Collins (CO)","City of Greeley (CO)","City of Loveland (CO)","City of Westminster (CO)","Gilpin County (CO)","Gunnison County (CO)","Jefferson County (CO)","Larimer County (CO)","Mesa County (CO)","Pitkin County (CO)","Pubelo County (CO)","San Miguel County (CO)","City of Honolulu (HI)"]} \ No newline at end of file diff --git a/vendor/modules.txt b/vendor/modules.txt index 48d8c63fb..850687513 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -46,7 +46,7 @@ github.com/felixge/httpsnoop # github.com/fsnotify/fsnotify v1.7.0 ## explicit; go 1.17 github.com/fsnotify/fsnotify -# github.com/go-faker/faker/v4 v4.2.0 +# github.com/go-faker/faker/v4 v4.3.0 ## explicit; go 1.18 github.com/go-faker/faker/v4 github.com/go-faker/faker/v4/pkg/errors From fb9a88faadc14194b2cc566264375c1179931402 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 10:28:01 +0000 Subject: [PATCH 04/34] build(deps): bump golang.org/x/sys from 0.16.0 to 0.17.0 Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.16.0 to 0.17.0. - [Commits](https://github.com/golang/sys/compare/v0.16.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 2 +- vendor/golang.org/x/sys/unix/zerrors_linux.go | 36 ++++- .../x/sys/unix/zerrors_linux_386.go | 3 + .../x/sys/unix/zerrors_linux_amd64.go | 3 + .../x/sys/unix/zerrors_linux_arm.go | 3 + .../x/sys/unix/zerrors_linux_arm64.go | 3 + .../x/sys/unix/zerrors_linux_loong64.go | 3 + .../x/sys/unix/zerrors_linux_mips.go | 3 + .../x/sys/unix/zerrors_linux_mips64.go | 3 + .../x/sys/unix/zerrors_linux_mips64le.go | 3 + .../x/sys/unix/zerrors_linux_mipsle.go | 3 + .../x/sys/unix/zerrors_linux_ppc.go | 3 + .../x/sys/unix/zerrors_linux_ppc64.go | 3 + .../x/sys/unix/zerrors_linux_ppc64le.go | 3 + .../x/sys/unix/zerrors_linux_riscv64.go | 3 + .../x/sys/unix/zerrors_linux_s390x.go | 3 + .../x/sys/unix/zerrors_linux_sparc64.go | 3 + .../x/sys/unix/zsysnum_linux_386.go | 4 + .../x/sys/unix/zsysnum_linux_amd64.go | 3 + .../x/sys/unix/zsysnum_linux_arm.go | 4 + .../x/sys/unix/zsysnum_linux_arm64.go | 4 + .../x/sys/unix/zsysnum_linux_loong64.go | 4 + .../x/sys/unix/zsysnum_linux_mips.go | 4 + .../x/sys/unix/zsysnum_linux_mips64.go | 4 + .../x/sys/unix/zsysnum_linux_mips64le.go | 4 + .../x/sys/unix/zsysnum_linux_mipsle.go | 4 + .../x/sys/unix/zsysnum_linux_ppc.go | 4 + .../x/sys/unix/zsysnum_linux_ppc64.go | 4 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 4 + .../x/sys/unix/zsysnum_linux_riscv64.go | 4 + .../x/sys/unix/zsysnum_linux_s390x.go | 4 + .../x/sys/unix/zsysnum_linux_sparc64.go | 4 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 125 +++++++++--------- .../golang.org/x/sys/windows/env_windows.go | 17 ++- .../x/sys/windows/syscall_windows.go | 3 +- vendor/modules.txt | 2 +- 38 files changed, 220 insertions(+), 75 deletions(-) diff --git a/go.mod b/go.mod index f9fd6a0c1..2d9a03cdd 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/tigera/operator v1.32.4 github.com/vishvananda/netlink v1.2.1-beta.2.0.20230130171208-05506ada9f99 go.uber.org/zap v1.25.0 - golang.org/x/sys v0.16.0 + golang.org/x/sys v0.17.0 gomodules.xyz/jsonpatch/v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.29.1 diff --git a/go.sum b/go.sum index ed117169e..cfdf508c4 100644 --- a/go.sum +++ b/go.sum @@ -745,8 +745,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220804214406-8e32c043e418/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index c6492020e..fdcaa974d 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -584,7 +584,7 @@ ccflags="$@" $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || $2 ~ /^KEYCTL_/ || $2 ~ /^PERF_/ || - $2 ~ /^SECCOMP_MODE_/ || + $2 ~ /^SECCOMP_/ || $2 ~ /^SEEK_/ || $2 ~ /^SCHED_/ || $2 ~ /^SPLICE_/ || diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index a5d3ff8df..36bf8399f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -1785,6 +1785,8 @@ const ( LANDLOCK_ACCESS_FS_REMOVE_FILE = 0x20 LANDLOCK_ACCESS_FS_TRUNCATE = 0x4000 LANDLOCK_ACCESS_FS_WRITE_FILE = 0x2 + LANDLOCK_ACCESS_NET_BIND_TCP = 0x1 + LANDLOCK_ACCESS_NET_CONNECT_TCP = 0x2 LANDLOCK_CREATE_RULESET_VERSION = 0x1 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef @@ -2465,6 +2467,7 @@ const ( PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 + PR_MDWE_NO_INHERIT = 0x2 PR_MDWE_REFUSE_EXEC_GAIN = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b @@ -2669,8 +2672,9 @@ const ( RTAX_FEATURES = 0xc RTAX_FEATURE_ALLFRAG = 0x8 RTAX_FEATURE_ECN = 0x1 - RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_MASK = 0x1f RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TCP_USEC_TS = 0x10 RTAX_FEATURE_TIMESTAMP = 0x4 RTAX_HOPLIMIT = 0xa RTAX_INITCWND = 0xb @@ -2913,9 +2917,38 @@ const ( SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d SC_LOG_FLUSH = 0x100000 + SECCOMP_ADDFD_FLAG_SEND = 0x2 + SECCOMP_ADDFD_FLAG_SETFD = 0x1 + SECCOMP_FILTER_FLAG_LOG = 0x2 + SECCOMP_FILTER_FLAG_NEW_LISTENER = 0x8 + SECCOMP_FILTER_FLAG_SPEC_ALLOW = 0x4 + SECCOMP_FILTER_FLAG_TSYNC = 0x1 + SECCOMP_FILTER_FLAG_TSYNC_ESRCH = 0x10 + SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV = 0x20 + SECCOMP_GET_ACTION_AVAIL = 0x2 + SECCOMP_GET_NOTIF_SIZES = 0x3 + SECCOMP_IOCTL_NOTIF_RECV = 0xc0502100 + SECCOMP_IOCTL_NOTIF_SEND = 0xc0182101 + SECCOMP_IOC_MAGIC = '!' SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 + SECCOMP_RET_ACTION = 0x7fff0000 + SECCOMP_RET_ACTION_FULL = 0xffff0000 + SECCOMP_RET_ALLOW = 0x7fff0000 + SECCOMP_RET_DATA = 0xffff + SECCOMP_RET_ERRNO = 0x50000 + SECCOMP_RET_KILL = 0x0 + SECCOMP_RET_KILL_PROCESS = 0x80000000 + SECCOMP_RET_KILL_THREAD = 0x0 + SECCOMP_RET_LOG = 0x7ffc0000 + SECCOMP_RET_TRACE = 0x7ff00000 + SECCOMP_RET_TRAP = 0x30000 + SECCOMP_RET_USER_NOTIF = 0x7fc00000 + SECCOMP_SET_MODE_FILTER = 0x1 + SECCOMP_SET_MODE_STRICT = 0x0 + SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP = 0x1 + SECCOMP_USER_NOTIF_FLAG_CONTINUE = 0x1 SECRETMEM_MAGIC = 0x5345434d SECURITYFS_MAGIC = 0x73636673 SEEK_CUR = 0x1 @@ -3075,6 +3108,7 @@ const ( SOL_TIPC = 0x10f SOL_TLS = 0x11a SOL_UDP = 0x11 + SOL_VSOCK = 0x11f SOL_X25 = 0x106 SOL_XDP = 0x11b SOMAXCONN = 0x1000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 4920821cf..42ff8c3c1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -281,6 +281,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x800 SIOCATMARK = 0x8905 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index a0c1e4112..dca436004 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -282,6 +282,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x800 SIOCATMARK = 0x8905 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index c63985560..5cca668ac 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -288,6 +288,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x800 SIOCATMARK = 0x8905 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 47cc62e25..d8cae6d15 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -278,6 +278,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x800 SIOCATMARK = 0x8905 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go index 27ac4a09e..28e39afdc 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go @@ -275,6 +275,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x800 SIOCATMARK = 0x8905 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 54694642a..cd66e92cb 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -281,6 +281,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x80 SIOCATMARK = 0x40047307 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 3adb81d75..c1595eba7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -281,6 +281,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x80 SIOCATMARK = 0x40047307 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 2dfe98f0d..ee9456b0d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -281,6 +281,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x80 SIOCATMARK = 0x40047307 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index f5398f84f..8cfca81e1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -281,6 +281,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x80 SIOCATMARK = 0x40047307 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index c54f152d6..60b0deb3a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -336,6 +336,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x800 SIOCATMARK = 0x8905 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 76057dc72..f90aa7281 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -340,6 +340,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x800 SIOCATMARK = 0x8905 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index e0c3725e2..ba9e01503 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -340,6 +340,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x800 SIOCATMARK = 0x8905 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index 18f2813ed..07cdfd6e9 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -272,6 +272,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x800 SIOCATMARK = 0x8905 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 11619d4ec..2f1dd214a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -344,6 +344,9 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x40082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x40082104 SFD_CLOEXEC = 0x80000 SFD_NONBLOCK = 0x800 SIOCATMARK = 0x8905 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 396d994da..f40519d90 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -335,6 +335,9 @@ const ( SCM_TIMESTAMPNS = 0x21 SCM_TXTIME = 0x3f SCM_WIFI_STATUS = 0x25 + SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103 + SECCOMP_IOCTL_NOTIF_ID_VALID = 0x80082102 + SECCOMP_IOCTL_NOTIF_SET_FLAGS = 0x80082104 SFD_CLOEXEC = 0x400000 SFD_NONBLOCK = 0x4000 SF_FP = 0x38 diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index fcf3ecbdd..0cc3ce496 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -448,4 +448,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index f56dc2504..856d92d69 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -371,4 +371,7 @@ const ( SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index 974bf2467..8d467094c 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -412,4 +412,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 39a2739e2..edc173244 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -315,4 +315,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go index cf9c9d77e..445eba206 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go @@ -309,4 +309,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 10b7362ef..adba01bca 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -432,4 +432,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 4450 SYS_CACHESTAT = 4451 SYS_FCHMODAT2 = 4452 + SYS_MAP_SHADOW_STACK = 4453 + SYS_FUTEX_WAKE = 4454 + SYS_FUTEX_WAIT = 4455 + SYS_FUTEX_REQUEUE = 4456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index cd4d8b4fd..014c4e9c7 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -362,4 +362,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 5450 SYS_CACHESTAT = 5451 SYS_FCHMODAT2 = 5452 + SYS_MAP_SHADOW_STACK = 5453 + SYS_FUTEX_WAKE = 5454 + SYS_FUTEX_WAIT = 5455 + SYS_FUTEX_REQUEUE = 5456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index 2c0efca81..ccc97d74d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -362,4 +362,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 5450 SYS_CACHESTAT = 5451 SYS_FCHMODAT2 = 5452 + SYS_MAP_SHADOW_STACK = 5453 + SYS_FUTEX_WAKE = 5454 + SYS_FUTEX_WAIT = 5455 + SYS_FUTEX_REQUEUE = 5456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index a72e31d39..ec2b64a95 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -432,4 +432,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 4450 SYS_CACHESTAT = 4451 SYS_FCHMODAT2 = 4452 + SYS_MAP_SHADOW_STACK = 4453 + SYS_FUTEX_WAKE = 4454 + SYS_FUTEX_WAIT = 4455 + SYS_FUTEX_REQUEUE = 4456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go index c7d1e3747..21a839e33 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go @@ -439,4 +439,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index f4d4838c8..c11121ec3 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -411,4 +411,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index b64f0e591..909b631fc 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -411,4 +411,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 95711195a..e49bed16e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -316,4 +316,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index f94e943bc..66017d2d3 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -377,4 +377,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index ba0c2bc51..47bab18dc 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -390,4 +390,8 @@ const ( SYS_SET_MEMPOLICY_HOME_NODE = 450 SYS_CACHESTAT = 451 SYS_FCHMODAT2 = 452 + SYS_MAP_SHADOW_STACK = 453 + SYS_FUTEX_WAKE = 454 + SYS_FUTEX_WAIT = 455 + SYS_FUTEX_REQUEUE = 456 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index bbf8399ff..dc0c955ee 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -174,7 +174,8 @@ type FscryptPolicyV2 struct { Contents_encryption_mode uint8 Filenames_encryption_mode uint8 Flags uint8 - _ [4]uint8 + Log2_data_unit_size uint8 + _ [3]uint8 Master_key_identifier [16]uint8 } @@ -455,60 +456,63 @@ type Ucred struct { } type TCPInfo struct { - State uint8 - Ca_state uint8 - Retransmits uint8 - Probes uint8 - Backoff uint8 - Options uint8 - Rto uint32 - Ato uint32 - Snd_mss uint32 - Rcv_mss uint32 - Unacked uint32 - Sacked uint32 - Lost uint32 - Retrans uint32 - Fackets uint32 - Last_data_sent uint32 - Last_ack_sent uint32 - Last_data_recv uint32 - Last_ack_recv uint32 - Pmtu uint32 - Rcv_ssthresh uint32 - Rtt uint32 - Rttvar uint32 - Snd_ssthresh uint32 - Snd_cwnd uint32 - Advmss uint32 - Reordering uint32 - Rcv_rtt uint32 - Rcv_space uint32 - Total_retrans uint32 - Pacing_rate uint64 - Max_pacing_rate uint64 - Bytes_acked uint64 - Bytes_received uint64 - Segs_out uint32 - Segs_in uint32 - Notsent_bytes uint32 - Min_rtt uint32 - Data_segs_in uint32 - Data_segs_out uint32 - Delivery_rate uint64 - Busy_time uint64 - Rwnd_limited uint64 - Sndbuf_limited uint64 - Delivered uint32 - Delivered_ce uint32 - Bytes_sent uint64 - Bytes_retrans uint64 - Dsack_dups uint32 - Reord_seen uint32 - Rcv_ooopack uint32 - Snd_wnd uint32 - Rcv_wnd uint32 - Rehash uint32 + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 + Pacing_rate uint64 + Max_pacing_rate uint64 + Bytes_acked uint64 + Bytes_received uint64 + Segs_out uint32 + Segs_in uint32 + Notsent_bytes uint32 + Min_rtt uint32 + Data_segs_in uint32 + Data_segs_out uint32 + Delivery_rate uint64 + Busy_time uint64 + Rwnd_limited uint64 + Sndbuf_limited uint64 + Delivered uint32 + Delivered_ce uint32 + Bytes_sent uint64 + Bytes_retrans uint64 + Dsack_dups uint32 + Reord_seen uint32 + Rcv_ooopack uint32 + Snd_wnd uint32 + Rcv_wnd uint32 + Rehash uint32 + Total_rto uint16 + Total_rto_recoveries uint16 + Total_rto_time uint32 } type CanFilter struct { @@ -551,7 +555,7 @@ const ( SizeofIPv6MTUInfo = 0x20 SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc - SizeofTCPInfo = 0xf0 + SizeofTCPInfo = 0xf8 SizeofCanFilter = 0x8 SizeofTCPRepairOpt = 0x8 ) @@ -3399,7 +3403,7 @@ const ( DEVLINK_PORT_FN_ATTR_STATE = 0x2 DEVLINK_PORT_FN_ATTR_OPSTATE = 0x3 DEVLINK_PORT_FN_ATTR_CAPS = 0x4 - DEVLINK_PORT_FUNCTION_ATTR_MAX = 0x4 + DEVLINK_PORT_FUNCTION_ATTR_MAX = 0x5 ) type FsverityDigest struct { @@ -4183,7 +4187,8 @@ const ( ) type LandlockRulesetAttr struct { - Access_fs uint64 + Access_fs uint64 + Access_net uint64 } type LandlockPathBeneathAttr struct { @@ -5134,7 +5139,7 @@ const ( NL80211_FREQUENCY_ATTR_GO_CONCURRENT = 0xf NL80211_FREQUENCY_ATTR_INDOOR_ONLY = 0xe NL80211_FREQUENCY_ATTR_IR_CONCURRENT = 0xf - NL80211_FREQUENCY_ATTR_MAX = 0x1b + NL80211_FREQUENCY_ATTR_MAX = 0x1c NL80211_FREQUENCY_ATTR_MAX_TX_POWER = 0x6 NL80211_FREQUENCY_ATTR_NO_10MHZ = 0x11 NL80211_FREQUENCY_ATTR_NO_160MHZ = 0xc @@ -5547,7 +5552,7 @@ const ( NL80211_REGDOM_TYPE_CUSTOM_WORLD = 0x2 NL80211_REGDOM_TYPE_INTERSECTION = 0x3 NL80211_REGDOM_TYPE_WORLD = 0x1 - NL80211_REG_RULE_ATTR_MAX = 0x7 + NL80211_REG_RULE_ATTR_MAX = 0x8 NL80211_REKEY_DATA_AKM = 0x4 NL80211_REKEY_DATA_KCK = 0x2 NL80211_REKEY_DATA_KEK = 0x1 diff --git a/vendor/golang.org/x/sys/windows/env_windows.go b/vendor/golang.org/x/sys/windows/env_windows.go index b8ad19250..d4577a423 100644 --- a/vendor/golang.org/x/sys/windows/env_windows.go +++ b/vendor/golang.org/x/sys/windows/env_windows.go @@ -37,14 +37,17 @@ func (token Token) Environ(inheritExisting bool) (env []string, err error) { return nil, err } defer DestroyEnvironmentBlock(block) - blockp := unsafe.Pointer(block) - for { - entry := UTF16PtrToString((*uint16)(blockp)) - if len(entry) == 0 { - break + size := unsafe.Sizeof(*block) + for *block != 0 { + // find NUL terminator + end := unsafe.Pointer(block) + for *(*uint16)(end) != 0 { + end = unsafe.Add(end, size) } - env = append(env, entry) - blockp = unsafe.Add(blockp, 2*(len(entry)+1)) + + entry := unsafe.Slice(block, (uintptr(end)-uintptr(unsafe.Pointer(block)))/size) + env = append(env, UTF16ToString(entry)) + block = (*uint16)(unsafe.Add(end, size)) } return env, nil } diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index ffb8708cc..6395a031d 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -125,8 +125,7 @@ func UTF16PtrToString(p *uint16) string { for ptr := unsafe.Pointer(p); *(*uint16)(ptr) != 0; n++ { ptr = unsafe.Pointer(uintptr(ptr) + unsafe.Sizeof(*p)) } - - return string(utf16.Decode(unsafe.Slice(p, n))) + return UTF16ToString(unsafe.Slice(p, n)) } func Getpagesize() int { return 4096 } diff --git a/vendor/modules.txt b/vendor/modules.txt index 48d8c63fb..e50386c84 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -501,7 +501,7 @@ golang.org/x/oauth2/internal # golang.org/x/sync v0.5.0 ## explicit; go 1.18 golang.org/x/sync/errgroup -# golang.org/x/sys v0.16.0 +# golang.org/x/sys v0.17.0 ## explicit; go 1.18 golang.org/x/sys/plan9 golang.org/x/sys/unix From 8e626093c20b38a179affffe15f596ca2ea2c53e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 10:32:10 +0000 Subject: [PATCH 05/34] build(deps): bump crazy-max/ghaction-import-gpg from 5 to 6 Bumps [crazy-max/ghaction-import-gpg](https://github.com/crazy-max/ghaction-import-gpg) from 5 to 6. - [Release notes](https://github.com/crazy-max/ghaction-import-gpg/releases) - [Commits](https://github.com/crazy-max/ghaction-import-gpg/compare/v5...v6) --- updated-dependencies: - dependency-name: crazy-max/ghaction-import-gpg dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/auto-cherrypick.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/auto-cherrypick.yaml b/.github/workflows/auto-cherrypick.yaml index 9db5409ee..07bb13ba8 100644 --- a/.github/workflows/auto-cherrypick.yaml +++ b/.github/workflows/auto-cherrypick.yaml @@ -30,7 +30,7 @@ jobs: with: fetch-depth: 0 - - uses: crazy-max/ghaction-import-gpg@v5 + - uses: crazy-max/ghaction-import-gpg@v6 with: gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} passphrase: ${{ secrets.GPG_PASSPHRASE }} From 3dabc5b17e37612576b8a22fbd7c27dbd713725e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 10:32:30 +0000 Subject: [PATCH 06/34] build(deps): bump dorny/paths-filter from 2.11.1 to 3.0.1 Bumps [dorny/paths-filter](https://github.com/dorny/paths-filter) from 2.11.1 to 3.0.1. - [Release notes](https://github.com/dorny/paths-filter/releases) - [Changelog](https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md) - [Commits](https://github.com/dorny/paths-filter/compare/v2.11.1...v3.0.1) --- updated-dependencies: - dependency-name: dorny/paths-filter dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/auto-pr-ci.yaml | 2 +- .github/workflows/lint-codeowners.yaml | 2 +- .github/workflows/lint-golang.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/auto-pr-ci.yaml b/.github/workflows/auto-pr-ci.yaml index e69926b28..5ae804ffd 100644 --- a/.github/workflows/auto-pr-ci.yaml +++ b/.github/workflows/auto-pr-ci.yaml @@ -62,7 +62,7 @@ jobs: JustE2E: ${{ env.RUN_JustE2E }} steps: - name: Check Code Changes - uses: dorny/paths-filter@v2.11.1 + uses: dorny/paths-filter@v3.0.1 if: ${{ github.event_name == 'pull_request_target' }} id: filter_pr with: diff --git a/.github/workflows/lint-codeowners.yaml b/.github/workflows/lint-codeowners.yaml index b6b0522bb..f40d9ef3b 100644 --- a/.github/workflows/lint-codeowners.yaml +++ b/.github/workflows/lint-codeowners.yaml @@ -22,7 +22,7 @@ jobs: codeowners-changed: ${{ steps.changes.outputs.codeowners-changed }} steps: - name: Check code changes - uses: dorny/paths-filter@v2.11.1 + uses: dorny/paths-filter@v3.0.1 id: changes with: filters: | diff --git a/.github/workflows/lint-golang.yaml b/.github/workflows/lint-golang.yaml index a5b18b725..ffbf1891d 100644 --- a/.github/workflows/lint-golang.yaml +++ b/.github/workflows/lint-golang.yaml @@ -39,7 +39,7 @@ jobs: crd: ${{ env.RUN_CRD_CHECK }} steps: - name: Check Go Code Changes - uses: dorny/paths-filter@v2.11.1 + uses: dorny/paths-filter@v3.0.1 if: ${{ github.event_name == 'pull_request' }} id: filter_pr with: From 6b642b98734aad4f6a638ab8710204cc810ab12b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 10:58:02 +0000 Subject: [PATCH 07/34] build(deps): bump github.com/tigera/operator from 1.32.4 to 1.33.0 Bumps [github.com/tigera/operator](https://github.com/tigera/operator) from 1.32.4 to 1.33.0. - [Release notes](https://github.com/tigera/operator/releases) - [Changelog](https://github.com/tigera/operator/blob/master/generate-release-notes.py) - [Commits](https://github.com/tigera/operator/compare/v1.32.4...v1.33.0) --- updated-dependencies: - dependency-name: github.com/tigera/operator dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- vendor/modules.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 32001fc5a..157293141 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.18.2 github.com/stretchr/testify v1.8.4 - github.com/tigera/operator v1.32.4 + github.com/tigera/operator v1.33.0 github.com/vishvananda/netlink v1.2.1-beta.2.0.20230130171208-05506ada9f99 go.uber.org/zap v1.25.0 golang.org/x/sys v0.17.0 diff --git a/go.sum b/go.sum index e5359c98a..a05bd62c1 100644 --- a/go.sum +++ b/go.sum @@ -512,8 +512,8 @@ github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tigera/api v0.0.0-20230406222214-ca74195900cb h1:Y7r5Al3V235KaEoAzGBz9RYXEbwDu8CPaZoCq2PlD8w= github.com/tigera/api v0.0.0-20230406222214-ca74195900cb/go.mod h1:ZZghiX3CUsBAc0osBjRvV6y/eun2ObYdvSbjqXAoj/w= -github.com/tigera/operator v1.32.4 h1:3bJb2+xDlo7HBlDUClJpdNA1bI3HcaL/EXnGJojcgr8= -github.com/tigera/operator v1.32.4/go.mod h1:kTdcz+sQC3ISa77YdMPsmH5YqDER/R7hnboGkXl+qk8= +github.com/tigera/operator v1.33.0 h1:ml2d8+eADJHMxenBcMlMpC4ZRZ0bgvXGx9i6fQsKje0= +github.com/tigera/operator v1.33.0/go.mod h1:wNvPsEdBNdcVBC7pDKz+D8+2Jg/1mTK0bm0Ob/xT8Ho= github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ= github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= github.com/vishvananda/netlink v1.2.1-beta.2.0.20230130171208-05506ada9f99 h1:FUmcbl0T7ugzsjfmWBKmIM1c4UPOMygAEpmwGKKdAp8= diff --git a/vendor/modules.txt b/vendor/modules.txt index 87cbe34c3..a07ac64b5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -419,7 +419,7 @@ github.com/subosito/gotenv # github.com/tigera/api v0.0.0-20230406222214-ca74195900cb ## explicit; go 1.18 github.com/tigera/api/pkg/lib/numorstring -# github.com/tigera/operator v1.32.4 +# github.com/tigera/operator v1.33.0 ## explicit; go 1.20 github.com/tigera/operator/pkg/apis/crd.projectcalico.org/v1 # github.com/toqueteos/webbrowser v1.2.0 From e8b07d45446bc717a6bc8002316ecce9dbab90c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 10:58:24 +0000 Subject: [PATCH 08/34] build(deps): bump k8s.io/client-go from 0.29.1 to 0.29.2 Bumps [k8s.io/client-go](https://github.com/kubernetes/client-go) from 0.29.1 to 0.29.2. - [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/kubernetes/client-go/compare/v0.29.1...v0.29.2) --- updated-dependencies: - dependency-name: k8s.io/client-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 6 +++--- go.sum | 12 ++++++------ vendor/k8s.io/api/core/v1/generated.proto | 2 +- vendor/k8s.io/api/core/v1/types.go | 2 +- .../api/core/v1/types_swagger_doc_generated.go | 2 +- vendor/modules.txt | 6 +++--- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 32001fc5a..897104b41 100644 --- a/go.mod +++ b/go.mod @@ -33,9 +33,9 @@ require ( golang.org/x/sys v0.17.0 gomodules.xyz/jsonpatch/v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.29.1 - k8s.io/apimachinery v0.29.1 - k8s.io/client-go v0.29.1 + k8s.io/api v0.29.2 + k8s.io/apimachinery v0.29.2 + k8s.io/client-go v0.29.2 k8s.io/utils v0.0.0-20230726121419-3b25d923346b modernc.org/memory v1.7.2 sigs.k8s.io/cluster-api-provider-azure v1.11.5 diff --git a/go.sum b/go.sum index e5359c98a..c19f9ccc9 100644 --- a/go.sum +++ b/go.sum @@ -973,16 +973,16 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.23.2/go.mod h1:sYuDb3flCtRPI8ghn6qFrcK5ZBu2mhbElxRE95qpwlI= -k8s.io/api v0.29.1 h1:DAjwWX/9YT7NQD4INu49ROJuZAAAP/Ijki48GUPzxqw= -k8s.io/api v0.29.1/go.mod h1:7Kl10vBRUXhnQQI8YR/R327zXC8eJ7887/+Ybta+RoQ= +k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A= +k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= k8s.io/apimachinery v0.23.2/go.mod h1:zDqeV0AK62LbCI0CI7KbWCAYdLg+E+8UXJ0rIz5gmS8= -k8s.io/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc= -k8s.io/apimachinery v0.29.1/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8= +k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= k8s.io/client-go v0.23.2/go.mod h1:k3YbsWg6GWdHF1THHTQP88X9RhB1DWPo3Dq7KfU/D1c= -k8s.io/client-go v0.29.1 h1:19B/+2NGEwnFLzt0uB5kNJnfTsbV8w6TgQRz9l7ti7A= -k8s.io/client-go v0.29.1/go.mod h1:TDG/psL9hdet0TI9mGyHJSgRkW3H9JZk2dNEUS7bRks= +k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= +k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= k8s.io/component-base v0.28.1 h1:LA4AujMlK2mr0tZbQDZkjWbdhTV5bRyEyAFe0TJxlWg= k8s.io/component-base v0.28.1/go.mod h1:jI11OyhbX21Qtbav7JkhehyBsIRfnO8oEgoAR12ArIU= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= diff --git a/vendor/k8s.io/api/core/v1/generated.proto b/vendor/k8s.io/api/core/v1/generated.proto index cf9b6e6eb..d099238cd 100644 --- a/vendor/k8s.io/api/core/v1/generated.proto +++ b/vendor/k8s.io/api/core/v1/generated.proto @@ -3286,7 +3286,7 @@ message PersistentVolumeStatus { // lastPhaseTransitionTime is the time the phase transitioned from one to another // and automatically resets to current time everytime a volume phase transitions. - // This is an alpha field and requires enabling PersistentVolumeLastPhaseTransitionTime feature. + // This is a beta field and requires the PersistentVolumeLastPhaseTransitionTime feature to be enabled (enabled by default). // +featureGate=PersistentVolumeLastPhaseTransitionTime // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastPhaseTransitionTime = 4; diff --git a/vendor/k8s.io/api/core/v1/types.go b/vendor/k8s.io/api/core/v1/types.go index 1aade3806..61ba21bca 100644 --- a/vendor/k8s.io/api/core/v1/types.go +++ b/vendor/k8s.io/api/core/v1/types.go @@ -423,7 +423,7 @@ type PersistentVolumeStatus struct { Reason string `json:"reason,omitempty" protobuf:"bytes,3,opt,name=reason"` // lastPhaseTransitionTime is the time the phase transitioned from one to another // and automatically resets to current time everytime a volume phase transitions. - // This is an alpha field and requires enabling PersistentVolumeLastPhaseTransitionTime feature. + // This is a beta field and requires the PersistentVolumeLastPhaseTransitionTime feature to be enabled (enabled by default). // +featureGate=PersistentVolumeLastPhaseTransitionTime // +optional LastPhaseTransitionTime *metav1.Time `json:"lastPhaseTransitionTime,omitempty" protobuf:"bytes,4,opt,name=lastPhaseTransitionTime"` diff --git a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index 01152a096..fd6f7dc61 100644 --- a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1478,7 +1478,7 @@ var map_PersistentVolumeStatus = map[string]string{ "phase": "phase indicates if a volume is available, bound to a claim, or released by a claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#phase", "message": "message is a human-readable message indicating details about why the volume is in this state.", "reason": "reason is a brief CamelCase string that describes any failure and is meant for machine parsing and tidy display in the CLI.", - "lastPhaseTransitionTime": "lastPhaseTransitionTime is the time the phase transitioned from one to another and automatically resets to current time everytime a volume phase transitions. This is an alpha field and requires enabling PersistentVolumeLastPhaseTransitionTime feature.", + "lastPhaseTransitionTime": "lastPhaseTransitionTime is the time the phase transitioned from one to another and automatically resets to current time everytime a volume phase transitions. This is a beta field and requires the PersistentVolumeLastPhaseTransitionTime feature to be enabled (enabled by default).", } func (PersistentVolumeStatus) SwaggerDoc() map[string]string { diff --git a/vendor/modules.txt b/vendor/modules.txt index 87cbe34c3..798d8dc24 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -619,7 +619,7 @@ gopkg.in/yaml.v2 # gopkg.in/yaml.v3 v3.0.1 ## explicit gopkg.in/yaml.v3 -# k8s.io/api v0.29.1 +# k8s.io/api v0.29.2 ## explicit; go 1.21 k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 @@ -680,7 +680,7 @@ k8s.io/api/storage/v1beta1 k8s.io/apiextensions-apiserver/pkg/apis/apiextensions k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1 k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1 -# k8s.io/apimachinery v0.29.1 +# k8s.io/apimachinery v0.29.2 ## explicit; go 1.21 k8s.io/apimachinery/pkg/api/equality k8s.io/apimachinery/pkg/api/errors @@ -732,7 +732,7 @@ k8s.io/apimachinery/pkg/version k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/json k8s.io/apimachinery/third_party/forked/golang/reflect -# k8s.io/client-go v0.29.1 +# k8s.io/client-go v0.29.2 ## explicit; go 1.21 k8s.io/client-go/applyconfigurations/admissionregistration/v1 k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1 From 04521105f1b555835a4716743891f5d5708cd3a4 Mon Sep 17 00:00:00 2001 From: bzsuni Date: Mon, 29 Jan 2024 22:57:44 +0800 Subject: [PATCH 09/34] Add clean egress Signed-off-by: bzsuni --- .github/workflows/call-e2e.yaml | 17 ++++++++++++++--- Makefile | 4 ++++ test/Makefile | 10 +++++++++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/.github/workflows/call-e2e.yaml b/.github/workflows/call-e2e.yaml index e3044fe73..64bf70af0 100644 --- a/.github/workflows/call-e2e.yaml +++ b/.github/workflows/call-e2e.yaml @@ -144,9 +144,9 @@ jobs: -e E2E_GINKGO_LABELS=${E2E_LABELS} \ -e E2E_IP_FAMILY=${{ inputs.ipfamily }} -e CNI=${{ env.cni }}} || RESULT=1 if ((RESULT==0)) ; then - echo "RUN_PASS=true" >> $GITHUB_ENV + echo "RUN_E2E_PASS=true" >> $GITHUB_ENV else - echo "RUN_PASS=false" >> $GITHUB_ENV + echo "RUN_E2E_PASS=false" >> $GITHUB_ENV fi if [ -f "${{ env.E2E_LOG_PATH }}" ] ; then echo "RUN_UPLOAD_LOG=true" >> $GITHUB_ENV @@ -174,9 +174,20 @@ jobs: path: ${{ env.E2E_GINKGO_REPORT_PATH }} retention-days: 30 + - name: helm uninstalls egress + id: clean + run: | + RESULT=0 + make clean_e2e_egress -e E2E_KIND_CLUSTER_NAME=${{ env.RUN_KIND_CLUSTER_NAME }} || RESULT=1 + if ((RESULT==0)) ; then + echo "CLEAN_E2E_PASS=true" >> $GITHUB_ENV + else + echo "CLEAN_E2E_PASS=false" >> $GITHUB_ENV + fi + - name: Show e2e Result run: | - if ${{ env.RUN_PASS == 'true' }} ;then + if ${{ env.RUN_E2E_PASS == 'true' && env.CLEAN_E2E_PASS == 'true'}} ;then exit 0 else exit 1 diff --git a/Makefile b/Makefile index 761c24af9..7dcc76137 100644 --- a/Makefile +++ b/Makefile @@ -397,6 +397,10 @@ e2e_run: e2e_clean: make -C test clean +.PHONY: clean_e2e_egress +clean_e2e_egress: + -$(QUIET) make -C test uninstall_egress + #============ doc diff --git a/test/Makefile b/test/Makefile index bb4f8b830..83cd4619a 100644 --- a/test/Makefile +++ b/test/Makefile @@ -281,6 +281,14 @@ deploy_project: || { KIND_CLUSTER_NAME=$(KIND_CLUSTER_NAME) ./scripts/debugCluster.sh $(KIND_KUBECONFIG) "detail" $(E2E_NAMESPACE) ; exit 1 ; } ; \ exit 0 +.PHONY: uninstall_egress +uninstall_egress: KIND_KUBECONFIG ?= $(E2E_KIND_KUBECONFIG_PATH) +uninstall_egress: KIND_CLUSTER_NAME ?= $(E2E_KIND_CLUSTER_NAME) +uninstall_egress: + @echo -e "\033[35m [helm uninstall egress] \033[0m" + helm uninstall project --wait --debug -n $(E2E_NAMESPACE) \ + --kubeconfig=$(KIND_KUBECONFIG) || { $(KIND_CLUSTER_NAME) ./scripts/debugCluster.sh $(KIND_KUBECONFIG) "detail" $(E2E_NAMESPACE) ; exit 1 ; } ; \ + kubectl --kubeconfig=$(KIND_KUBECONFIG) get all --all-namespaces | grep -q "egressgateway"` && { echo "error: found egressgateway resources" ; exit 1 ; } # test kind is ok .PHONY: install_example_app @@ -323,7 +331,7 @@ e2e_test: @echo -e "\033[35mRun e2e testing on the cluster $(KIND_CLUSTER_NAME) \033[0m" @echo -e "\033[35m label=$(E2E_GINKGO_LABELS)\n timeout=$(E2E_TIMEOUT) \n options=$(E2E_GINKGO_OPTION) \n egress_namespace=$(E2E_NAMESPACE) \033[0m" @echo -e "\033[35m[STEP1]\033[0m check KUBECONFIG file path"; \ - export KUBECONFIG=$(KIND_KUBECONFIG) ; [ -f "$(KIND_KUBECONFIG)" ] || { echo -e "error, does not exist KUBECONFIG $(E2E_KUBECONFIG)" ; exit 1 ; } ; \ + export KUBECONFIG=$(KIND_KUBECONFIG) ; [ -f "$(KIND_KUBECONFIG)" ] || { echo -e "error, does not exist KUBECONFIG $(KIND_KUBECONFIG)" ; exit 1 ; } ; \ echo -e "success" ; \ echo -e "\033[35m[STEP2]\033[0m clean old e2e log file"; \ [ -f "$(E2E_LOG_FILE)" ] && rm -f "$(E2E_LOG_FILE)"; \ From 4f0c0fb5c0e6334ee77cc219552c6e89107c5124 Mon Sep 17 00:00:00 2001 From: bzsuni Date: Mon, 5 Feb 2024 14:11:19 +0800 Subject: [PATCH 10/34] fix time out to wait egressgateway status to be empty after delete the polices Signed-off-by: bzsuni --- test/e2e/reliability/reliability_ip_test.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/test/e2e/reliability/reliability_ip_test.go b/test/e2e/reliability/reliability_ip_test.go index 5ec5c4253..ed75f0fbf 100644 --- a/test/e2e/reliability/reliability_ip_test.go +++ b/test/e2e/reliability/reliability_ip_test.go @@ -13,6 +13,7 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" egressv1 "github.com/spidernet-io/egressgateway/pkg/k8s/apis/v1beta1" "github.com/spidernet-io/egressgateway/test/e2e/common" @@ -137,11 +138,19 @@ var _ = Describe("IP Allocation", Label("Reliability_IP"), func() { // check eip after policies deleted By("check egressgateway status should be empty") - err = common.WaitEGWSyncedWithEGP(cli, egw, egressConfig.EnableIPv4, egressConfig.EnableIPv6, 0, deletionThresholdTime) - Expect(err).NotTo(HaveOccurred()) + Eventually(ctx, func() []egressv1.Eips { + eips := make([]egressv1.Eips, 0) + _ = cli.Get(ctx, types.NamespacedName{Namespace: egw.Namespace, Name: egw.Name}, egw) + for _, eipStatus := range egw.Status.NodeList { + eips = append(eips, eipStatus.Eips...) + } + return eips + }).WithTimeout(time.Minute*2).WithPolling(time.Second*2).Should(BeEmpty(), + fmt.Sprintf("failed to wait the egressgateway: %s status to be empty, egressgateway yaml: %v", egw.Name, egw)) deletionTime := time.Since(deletionStart) // check egessgateway ip number + By("check egressgateway status IPUsage") if egressConfig.EnableIPv4 { Expect(egw.Status.IPUsage.IPv4Free).To(Equal(int(IPNum))) Expect(egw.Status.IPUsage.IPv4Total).To(Equal(int(IPNum))) From 8a7b16841b230ffa042e7ee3f9104a8bdb26fbc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 10:14:12 +0000 Subject: [PATCH 11/34] build(deps): bump helm/kind-action from 1.8.0 to 1.9.0 Bumps [helm/kind-action](https://github.com/helm/kind-action) from 1.8.0 to 1.9.0. - [Release notes](https://github.com/helm/kind-action/releases) - [Commits](https://github.com/helm/kind-action/compare/v1.8.0...v1.9.0) --- updated-dependencies: - dependency-name: helm/kind-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/call-e2e.yaml | 2 +- .github/workflows/call-lint-chart.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/call-e2e.yaml b/.github/workflows/call-e2e.yaml index e3044fe73..9d10170da 100644 --- a/.github/workflows/call-e2e.yaml +++ b/.github/workflows/call-e2e.yaml @@ -83,7 +83,7 @@ jobs: # https://github.com/helm/kind-action - name: Install Kind Bin - uses: helm/kind-action@v1.8.0 + uses: helm/kind-action@v1.9.0 with: install_only: true diff --git a/.github/workflows/call-lint-chart.yaml b/.github/workflows/call-lint-chart.yaml index 4d268b3ea..540fb0813 100644 --- a/.github/workflows/call-lint-chart.yaml +++ b/.github/workflows/call-lint-chart.yaml @@ -106,7 +106,7 @@ jobs: # https://github.com/helm/kind-action - name: Create Kind cluster if: ${{ env.RUN_CHANGED == 'true' && env.RUN_JUST_LINT_CHART == 'false' }} - uses: helm/kind-action@v1.8.0 + uses: helm/kind-action@v1.9.0 with: wait: 120s #kubectl_version: ${{ env.K8S_VERSION }} From 9e524c12aa4b832343b52f90cb77f76fc4f963f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 10:14:15 +0000 Subject: [PATCH 12/34] build(deps): bump ncipollo/release-action from 1.13.0 to 1.14.0 Bumps [ncipollo/release-action](https://github.com/ncipollo/release-action) from 1.13.0 to 1.14.0. - [Release notes](https://github.com/ncipollo/release-action/releases) - [Commits](https://github.com/ncipollo/release-action/compare/v1.13.0...v1.14.0) --- updated-dependencies: - dependency-name: ncipollo/release-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/auto-release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/auto-release.yaml b/.github/workflows/auto-release.yaml index cdad791bd..be1f6e2aa 100644 --- a/.github/workflows/auto-release.yaml +++ b/.github/workflows/auto-release.yaml @@ -157,7 +157,7 @@ jobs: - name: Create Release id: create_release continue-on-error: false - uses: ncipollo/release-action@v1.13.0 + uses: ncipollo/release-action@v1.14.0 with: artifacts: "chart-package/*" allowUpdates: true From 9c99e97e4494263c1a9a0866929be7ce9006570b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 10:34:21 +0000 Subject: [PATCH 13/34] build(deps): bump go.uber.org/zap from 1.25.0 to 1.27.0 Bumps [go.uber.org/zap](https://github.com/uber-go/zap) from 1.25.0 to 1.27.0. - [Release notes](https://github.com/uber-go/zap/releases) - [Changelog](https://github.com/uber-go/zap/blob/master/CHANGELOG.md) - [Commits](https://github.com/uber-go/zap/compare/v1.25.0...v1.27.0) --- updated-dependencies: - dependency-name: go.uber.org/zap dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 7 +- vendor/go.uber.org/zap/.golangci.yml | 77 +++++ vendor/go.uber.org/zap/.readme.tmpl | 10 +- vendor/go.uber.org/zap/CHANGELOG.md | 273 +++++++++++------- .../go.uber.org/zap/{LICENSE.txt => LICENSE} | 0 vendor/go.uber.org/zap/Makefile | 82 +++--- vendor/go.uber.org/zap/README.md | 66 +++-- vendor/go.uber.org/zap/array.go | 127 ++++++++ vendor/go.uber.org/zap/array_go118.go | 156 ---------- vendor/go.uber.org/zap/buffer/buffer.go | 5 + vendor/go.uber.org/zap/error.go | 5 +- vendor/go.uber.org/zap/field.go | 27 +- vendor/go.uber.org/zap/http_handler.go | 19 +- .../stacktrace/stack.go} | 71 +++-- vendor/go.uber.org/zap/logger.go | 81 ++++-- vendor/go.uber.org/zap/options.go | 15 + vendor/go.uber.org/zap/sink.go | 5 +- vendor/go.uber.org/zap/sugar.go | 39 +++ vendor/go.uber.org/zap/writer.go | 12 +- .../zap/zapcore/console_encoder.go | 2 +- vendor/go.uber.org/zap/zapcore/core.go | 6 +- vendor/go.uber.org/zap/zapcore/encoder.go | 15 + vendor/go.uber.org/zap/zapcore/entry.go | 4 +- vendor/go.uber.org/zap/zapcore/error.go | 5 +- vendor/go.uber.org/zap/zapcore/field.go | 2 +- .../go.uber.org/zap/zapcore/json_encoder.go | 145 ++++++---- vendor/go.uber.org/zap/zapcore/lazy_with.go | 54 ++++ vendor/modules.txt | 3 +- 29 files changed, 827 insertions(+), 488 deletions(-) create mode 100644 vendor/go.uber.org/zap/.golangci.yml rename vendor/go.uber.org/zap/{LICENSE.txt => LICENSE} (100%) delete mode 100644 vendor/go.uber.org/zap/array_go118.go rename vendor/go.uber.org/zap/{stacktrace.go => internal/stacktrace/stack.go} (75%) create mode 100644 vendor/go.uber.org/zap/zapcore/lazy_with.go diff --git a/go.mod b/go.mod index 897104b41..ae682a27f 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tigera/operator v1.32.4 github.com/vishvananda/netlink v1.2.1-beta.2.0.20230130171208-05506ada9f99 - go.uber.org/zap v1.25.0 + go.uber.org/zap v1.27.0 golang.org/x/sys v0.17.0 gomodules.xyz/jsonpatch/v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index c19f9ccc9..c020be558 100644 --- a/go.sum +++ b/go.sum @@ -62,7 +62,6 @@ github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:W 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/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= 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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -548,14 +547,14 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/mock v0.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= 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.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= -go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= diff --git a/vendor/go.uber.org/zap/.golangci.yml b/vendor/go.uber.org/zap/.golangci.yml new file mode 100644 index 000000000..2346df135 --- /dev/null +++ b/vendor/go.uber.org/zap/.golangci.yml @@ -0,0 +1,77 @@ +output: + # Make output more digestible with quickfix in vim/emacs/etc. + sort-results: true + print-issued-lines: false + +linters: + # We'll track the golangci-lint default linters manually + # instead of letting them change without our control. + disable-all: true + enable: + # golangci-lint defaults: + - errcheck + - gosimple + - govet + - ineffassign + - staticcheck + - unused + + # Our own extras: + - gofumpt + - nolintlint # lints nolint directives + - revive + +linters-settings: + govet: + # These govet checks are disabled by default, but they're useful. + enable: + - niliness + - reflectvaluecompare + - sortslice + - unusedwrite + + errcheck: + exclude-functions: + # These methods can not fail. + # They operate on an in-memory buffer. + - (*go.uber.org/zap/buffer.Buffer).Write + - (*go.uber.org/zap/buffer.Buffer).WriteByte + - (*go.uber.org/zap/buffer.Buffer).WriteString + + - (*go.uber.org/zap/zapio.Writer).Close + - (*go.uber.org/zap/zapio.Writer).Sync + - (*go.uber.org/zap/zapio.Writer).Write + # Write to zapio.Writer cannot fail, + # so io.WriteString on it cannot fail. + - io.WriteString(*go.uber.org/zap/zapio.Writer) + + # Writing a plain string to a fmt.State cannot fail. + - io.WriteString(fmt.State) + +issues: + # Print all issues reported by all linters. + max-issues-per-linter: 0 + max-same-issues: 0 + + # Don't ignore some of the issues that golangci-lint considers okay. + # This includes documenting all exported entities. + exclude-use-default: false + + exclude-rules: + # Don't warn on unused parameters. + # Parameter names are useful; replacing them with '_' is undesirable. + - linters: [revive] + text: 'unused-parameter: parameter \S+ seems to be unused, consider removing or renaming it as _' + + # staticcheck already has smarter checks for empty blocks. + # revive's empty-block linter has false positives. + # For example, as of writing this, the following is not allowed. + # for foo() { } + - linters: [revive] + text: 'empty-block: this block is empty, you can remove it' + + # Ignore logger.Sync() errcheck failures in example_test.go + # since those are intended to be uncomplicated examples. + - linters: [errcheck] + path: example_test.go + text: 'Error return value of `logger.Sync` is not checked' diff --git a/vendor/go.uber.org/zap/.readme.tmpl b/vendor/go.uber.org/zap/.readme.tmpl index 92aa65d66..4fea3027a 100644 --- a/vendor/go.uber.org/zap/.readme.tmpl +++ b/vendor/go.uber.org/zap/.readme.tmpl @@ -1,7 +1,15 @@ # :zap: zap [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] +
+ Blazing fast, structured, leveled logging in Go. +![Zap logo](assets/logo.png) + +[![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +
+ ## Installation `go get -u go.uber.org/zap` @@ -92,7 +100,7 @@ standard.
-Released under the [MIT License](LICENSE.txt). +Released under the [MIT License](LICENSE). 1 In particular, keep in mind that we may be benchmarking against slightly older versions of other packages. Versions are diff --git a/vendor/go.uber.org/zap/CHANGELOG.md b/vendor/go.uber.org/zap/CHANGELOG.md index fe57bc085..6d6cd5f4d 100644 --- a/vendor/go.uber.org/zap/CHANGELOG.md +++ b/vendor/go.uber.org/zap/CHANGELOG.md @@ -1,7 +1,34 @@ # Changelog All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## 1.27.0 (20 Feb 2024) +Enhancements: +* [#1378][]: Add `WithLazy` method for `SugaredLogger`. +* [#1399][]: zaptest: Add `NewTestingWriter` for customizing TestingWriter with more flexibility than `NewLogger`. +* [#1406][]: Add `Log`, `Logw`, `Logln` methods for `SugaredLogger`. +* [#1416][]: Add `WithPanicHook` option for testing panic logs. + +Thanks to @defval, @dimmo, @arxeiss, and @MKrupauskas for their contributions to this release. + +[#1378]: https://github.com/uber-go/zap/pull/1378 +[#1399]: https://github.com/uber-go/zap/pull/1399 +[#1406]: https://github.com/uber-go/zap/pull/1406 +[#1416]: https://github.com/uber-go/zap/pull/1416 + +## 1.26.0 (14 Sep 2023) +Enhancements: +* [#1297][]: Add Dict as a Field. +* [#1319][]: Add `WithLazy` method to `Logger` which lazily evaluates the structured +context. +* [#1350][]: String encoding is much (~50%) faster now. + +Thanks to @hhk7734, @jquirke, and @cdvr1993 for their contributions to this release. + +[#1297]: https://github.com/uber-go/zap/pull/1297 +[#1319]: https://github.com/uber-go/zap/pull/1319 +[#1350]: https://github.com/uber-go/zap/pull/1350 ## 1.25.0 (1 Aug 2023) @@ -14,7 +41,7 @@ Enhancements: * [#1273][]: Add `Name` to `Logger` which returns the Logger's name if one is set. * [#1281][]: Add `zap/exp/expfield` package which contains helper methods `Str` and `Strs` for constructing String-like zap.Fields. -* [#1310][]: Reduce stack size on `Any`. +* [#1310][]: Reduce stack size on `Any`. Thanks to @knight42, @dzakaammar, @bcspragu, and @rexywork for their contributions to this release. @@ -48,7 +75,6 @@ Enhancements: [#1147]: https://github.com/uber-go/zap/pull/1147 [#1155]: https://github.com/uber-go/zap/pull/1155 - ## 1.22.0 (8 Aug 2022) Enhancements: @@ -197,6 +223,16 @@ Enhancements: Thanks to @ash2k, @FMLS, @jimmystewpot, @Oncilla, @tsoslow, @tylitianrui, @withshubh, and @wziww for their contributions to this release. +[#865]: https://github.com/uber-go/zap/pull/865 +[#867]: https://github.com/uber-go/zap/pull/867 +[#881]: https://github.com/uber-go/zap/pull/881 +[#903]: https://github.com/uber-go/zap/pull/903 +[#912]: https://github.com/uber-go/zap/pull/912 +[#913]: https://github.com/uber-go/zap/pull/913 +[#928]: https://github.com/uber-go/zap/pull/928 +[#931]: https://github.com/uber-go/zap/pull/931 +[#936]: https://github.com/uber-go/zap/pull/936 + ## 1.16.0 (1 Sep 2020) Bugfixes: @@ -218,6 +254,17 @@ Enhancements: Thanks to @SteelPhase, @tmshn, @lixingwang, @wyxloading, @moul, @segevfiner, @andy-retailnext and @jcorbin for their contributions to this release. +[#629]: https://github.com/uber-go/zap/pull/629 +[#697]: https://github.com/uber-go/zap/pull/697 +[#828]: https://github.com/uber-go/zap/pull/828 +[#835]: https://github.com/uber-go/zap/pull/835 +[#843]: https://github.com/uber-go/zap/pull/843 +[#844]: https://github.com/uber-go/zap/pull/844 +[#852]: https://github.com/uber-go/zap/pull/852 +[#854]: https://github.com/uber-go/zap/pull/854 +[#861]: https://github.com/uber-go/zap/pull/861 +[#862]: https://github.com/uber-go/zap/pull/862 + ## 1.15.0 (23 Apr 2020) Bugfixes: @@ -234,6 +281,11 @@ Enhancements: Thanks to @danielbprice for their contributions to this release. +[#804]: https://github.com/uber-go/zap/pull/804 +[#812]: https://github.com/uber-go/zap/pull/812 +[#806]: https://github.com/uber-go/zap/pull/806 +[#813]: https://github.com/uber-go/zap/pull/813 + ## 1.14.1 (14 Mar 2020) Bugfixes: @@ -246,6 +298,10 @@ Bugfixes: Thanks to @YashishDua for their contributions to this release. +[#791]: https://github.com/uber-go/zap/pull/791 +[#795]: https://github.com/uber-go/zap/pull/795 +[#799]: https://github.com/uber-go/zap/pull/799 + ## 1.14.0 (20 Feb 2020) Enhancements: @@ -256,6 +312,11 @@ Enhancements: Thanks to @caibirdme for their contributions to this release. +[#771]: https://github.com/uber-go/zap/pull/771 +[#773]: https://github.com/uber-go/zap/pull/773 +[#775]: https://github.com/uber-go/zap/pull/775 +[#786]: https://github.com/uber-go/zap/pull/786 + ## 1.13.0 (13 Nov 2019) Enhancements: @@ -264,11 +325,15 @@ Enhancements: Thanks to @jbizzle for their contributions to this release. +[#758]: https://github.com/uber-go/zap/pull/758 + ## 1.12.0 (29 Oct 2019) Enhancements: * [#751][]: Migrate to Go modules. +[#751]: https://github.com/uber-go/zap/pull/751 + ## 1.11.0 (21 Oct 2019) Enhancements: @@ -277,6 +342,9 @@ Enhancements: Thanks to @juicemia, @uhthomas for their contributions to this release. +[#725]: https://github.com/uber-go/zap/pull/725 +[#736]: https://github.com/uber-go/zap/pull/736 + ## 1.10.0 (29 Apr 2019) Bugfixes: @@ -294,13 +362,21 @@ Enhancements: Thanks to @iaroslav-ciupin, @lelenanam, @joa, @NWilson for their contributions to this release. -## v1.9.1 (06 Aug 2018) +[#657]: https://github.com/uber-go/zap/pull/657 +[#706]: https://github.com/uber-go/zap/pull/706 +[#610]: https://github.com/uber-go/zap/pull/610 +[#675]: https://github.com/uber-go/zap/pull/675 +[#704]: https://github.com/uber-go/zap/pull/704 + +## 1.9.1 (06 Aug 2018) Bugfixes: * [#614][]: MapObjectEncoder should not ignore empty slices. -## v1.9.0 (19 Jul 2018) +[#614]: https://github.com/uber-go/zap/pull/614 + +## 1.9.0 (19 Jul 2018) Enhancements: * [#602][]: Reduce number of allocations when logging with reflection. @@ -309,7 +385,11 @@ Enhancements: Thanks to @nfarah86, @AlekSi, @JeanMertz, @philippgille, @etsangsplk, and @dimroc for their contributions to this release. -## v1.8.0 (13 Apr 2018) +[#602]: https://github.com/uber-go/zap/pull/602 +[#572]: https://github.com/uber-go/zap/pull/572 +[#606]: https://github.com/uber-go/zap/pull/606 + +## 1.8.0 (13 Apr 2018) Enhancements: * [#508][]: Make log level configurable when redirecting the standard @@ -322,19 +402,28 @@ Bugfixes: Thanks to @DiSiqueira and @djui for their contributions to this release. -## v1.7.1 (25 Sep 2017) +[#508]: https://github.com/uber-go/zap/pull/508 +[#518]: https://github.com/uber-go/zap/pull/518 +[#577]: https://github.com/uber-go/zap/pull/577 +[#574]: https://github.com/uber-go/zap/pull/574 + +## 1.7.1 (25 Sep 2017) Bugfixes: * [#504][]: Store strings when using AddByteString with the map encoder. -## v1.7.0 (21 Sep 2017) +[#504]: https://github.com/uber-go/zap/pull/504 + +## 1.7.0 (21 Sep 2017) Enhancements: * [#487][]: Add `NewStdLogAt`, which extends `NewStdLog` by allowing the user to specify the level of the logged messages. -## v1.6.0 (30 Aug 2017) +[#487]: https://github.com/uber-go/zap/pull/487 + +## 1.6.0 (30 Aug 2017) Enhancements: @@ -342,7 +431,10 @@ Enhancements: * [#490][]: Add a `ContextMap` method to observer logs for simpler field validation in tests. -## v1.5.0 (22 Jul 2017) +[#490]: https://github.com/uber-go/zap/pull/490 +[#491]: https://github.com/uber-go/zap/pull/491 + +## 1.5.0 (22 Jul 2017) Enhancements: @@ -355,7 +447,12 @@ Bugfixes: Thanks to @richard-tunein and @pavius for their contributions to this release. -## v1.4.1 (08 Jun 2017) +[#477]: https://github.com/uber-go/zap/pull/477 +[#465]: https://github.com/uber-go/zap/pull/465 +[#460]: https://github.com/uber-go/zap/pull/460 +[#470]: https://github.com/uber-go/zap/pull/470 + +## 1.4.1 (08 Jun 2017) This release fixes two bugs. @@ -364,7 +461,10 @@ Bugfixes: * [#435][]: Support a variety of case conventions when unmarshaling levels. * [#444][]: Fix a panic in the observer. -## v1.4.0 (12 May 2017) +[#435]: https://github.com/uber-go/zap/pull/435 +[#444]: https://github.com/uber-go/zap/pull/444 + +## 1.4.0 (12 May 2017) This release adds a few small features and is fully backward-compatible. @@ -376,7 +476,11 @@ Enhancements: * [#431][]: Make `zap.AtomicLevel` implement `fmt.Stringer`, which makes a variety of operations a bit simpler. -## v1.3.0 (25 Apr 2017) +[#424]: https://github.com/uber-go/zap/pull/424 +[#425]: https://github.com/uber-go/zap/pull/425 +[#431]: https://github.com/uber-go/zap/pull/431 + +## 1.3.0 (25 Apr 2017) This release adds an enhancement to zap's testing helpers as well as the ability to marshal an AtomicLevel. It is fully backward-compatible. @@ -387,7 +491,10 @@ Enhancements: particularly useful when testing the `SugaredLogger`. * [#416][]: Make `AtomicLevel` implement `encoding.TextMarshaler`. -## v1.2.0 (13 Apr 2017) +[#415]: https://github.com/uber-go/zap/pull/415 +[#416]: https://github.com/uber-go/zap/pull/416 + +## 1.2.0 (13 Apr 2017) This release adds a gRPC compatibility wrapper. It is fully backward-compatible. @@ -396,7 +503,9 @@ Enhancements: * [#402][]: Add a `zapgrpc` package that wraps zap's Logger and implements `grpclog.Logger`. -## v1.1.0 (31 Mar 2017) +[#402]: https://github.com/uber-go/zap/pull/402 + +## 1.1.0 (31 Mar 2017) This release fixes two bugs and adds some enhancements to zap's testing helpers. It is fully backward-compatible. @@ -413,7 +522,11 @@ Enhancements: Thanks to @moitias for contributing to this release. -## v1.0.0 (14 Mar 2017) +[#385]: https://github.com/uber-go/zap/pull/385 +[#396]: https://github.com/uber-go/zap/pull/396 +[#386]: https://github.com/uber-go/zap/pull/386 + +## 1.0.0 (14 Mar 2017) This is zap's first stable release. All exported APIs are now final, and no further breaking changes will be made in the 1.x release series. Anyone using a @@ -458,7 +571,21 @@ Enhancements: Thanks to @suyash, @htrendev, @flisky, @Ulexus, and @skipor for their contributions to this release. -## v1.0.0-rc.3 (7 Mar 2017) +[#366]: https://github.com/uber-go/zap/pull/366 +[#364]: https://github.com/uber-go/zap/pull/364 +[#371]: https://github.com/uber-go/zap/pull/371 +[#362]: https://github.com/uber-go/zap/pull/362 +[#369]: https://github.com/uber-go/zap/pull/369 +[#347]: https://github.com/uber-go/zap/pull/347 +[#373]: https://github.com/uber-go/zap/pull/373 +[#348]: https://github.com/uber-go/zap/pull/348 +[#327]: https://github.com/uber-go/zap/pull/327 +[#376]: https://github.com/uber-go/zap/pull/376 +[#346]: https://github.com/uber-go/zap/pull/346 +[#365]: https://github.com/uber-go/zap/pull/365 +[#372]: https://github.com/uber-go/zap/pull/372 + +## 1.0.0-rc.3 (7 Mar 2017) This is the third release candidate for zap's stable release. There are no breaking changes. @@ -479,7 +606,12 @@ Enhancements: Thanks to @ansel1 and @suyash for their contributions to this release. -## v1.0.0-rc.2 (21 Feb 2017) +[#339]: https://github.com/uber-go/zap/pull/339 +[#307]: https://github.com/uber-go/zap/pull/307 +[#353]: https://github.com/uber-go/zap/pull/353 +[#311]: https://github.com/uber-go/zap/pull/311 + +## 1.0.0-rc.2 (21 Feb 2017) This is the second release candidate for zap's stable release. It includes two breaking changes. @@ -516,7 +648,16 @@ Enhancements: Thanks to @skipor and @chapsuk for their contributions to this release. -## v1.0.0-rc.1 (14 Feb 2017) +[#316]: https://github.com/uber-go/zap/pull/316 +[#309]: https://github.com/uber-go/zap/pull/309 +[#317]: https://github.com/uber-go/zap/pull/317 +[#321]: https://github.com/uber-go/zap/pull/321 +[#325]: https://github.com/uber-go/zap/pull/325 +[#333]: https://github.com/uber-go/zap/pull/333 +[#326]: https://github.com/uber-go/zap/pull/326 +[#300]: https://github.com/uber-go/zap/pull/300 + +## 1.0.0-rc.1 (14 Feb 2017) This is the first release candidate for zap's stable release. There are multiple breaking changes and improvements from the pre-release version. Most notably: @@ -536,7 +677,7 @@ breaking changes and improvements from the pre-release version. Most notably: * Sampling is more accurate, and doesn't depend on the standard library's shared timer heap. -## v0.1.0-beta.1 (6 Feb 2017) +## 0.1.0-beta.1 (6 Feb 2017) This is a minor version, tagged to allow users to pin to the pre-1.0 APIs and upgrade at their leisure. Since this is the first tagged release, there are no @@ -544,95 +685,3 @@ backward compatibility concerns and all functionality is new. Early zap adopters should pin to the 0.1.x minor version until they're ready to upgrade to the upcoming stable release. - -[#316]: https://github.com/uber-go/zap/pull/316 -[#309]: https://github.com/uber-go/zap/pull/309 -[#317]: https://github.com/uber-go/zap/pull/317 -[#321]: https://github.com/uber-go/zap/pull/321 -[#325]: https://github.com/uber-go/zap/pull/325 -[#333]: https://github.com/uber-go/zap/pull/333 -[#326]: https://github.com/uber-go/zap/pull/326 -[#300]: https://github.com/uber-go/zap/pull/300 -[#339]: https://github.com/uber-go/zap/pull/339 -[#307]: https://github.com/uber-go/zap/pull/307 -[#353]: https://github.com/uber-go/zap/pull/353 -[#311]: https://github.com/uber-go/zap/pull/311 -[#366]: https://github.com/uber-go/zap/pull/366 -[#364]: https://github.com/uber-go/zap/pull/364 -[#371]: https://github.com/uber-go/zap/pull/371 -[#362]: https://github.com/uber-go/zap/pull/362 -[#369]: https://github.com/uber-go/zap/pull/369 -[#347]: https://github.com/uber-go/zap/pull/347 -[#373]: https://github.com/uber-go/zap/pull/373 -[#348]: https://github.com/uber-go/zap/pull/348 -[#327]: https://github.com/uber-go/zap/pull/327 -[#376]: https://github.com/uber-go/zap/pull/376 -[#346]: https://github.com/uber-go/zap/pull/346 -[#365]: https://github.com/uber-go/zap/pull/365 -[#372]: https://github.com/uber-go/zap/pull/372 -[#385]: https://github.com/uber-go/zap/pull/385 -[#396]: https://github.com/uber-go/zap/pull/396 -[#386]: https://github.com/uber-go/zap/pull/386 -[#402]: https://github.com/uber-go/zap/pull/402 -[#415]: https://github.com/uber-go/zap/pull/415 -[#416]: https://github.com/uber-go/zap/pull/416 -[#424]: https://github.com/uber-go/zap/pull/424 -[#425]: https://github.com/uber-go/zap/pull/425 -[#431]: https://github.com/uber-go/zap/pull/431 -[#435]: https://github.com/uber-go/zap/pull/435 -[#444]: https://github.com/uber-go/zap/pull/444 -[#477]: https://github.com/uber-go/zap/pull/477 -[#465]: https://github.com/uber-go/zap/pull/465 -[#460]: https://github.com/uber-go/zap/pull/460 -[#470]: https://github.com/uber-go/zap/pull/470 -[#487]: https://github.com/uber-go/zap/pull/487 -[#490]: https://github.com/uber-go/zap/pull/490 -[#491]: https://github.com/uber-go/zap/pull/491 -[#504]: https://github.com/uber-go/zap/pull/504 -[#508]: https://github.com/uber-go/zap/pull/508 -[#518]: https://github.com/uber-go/zap/pull/518 -[#577]: https://github.com/uber-go/zap/pull/577 -[#574]: https://github.com/uber-go/zap/pull/574 -[#602]: https://github.com/uber-go/zap/pull/602 -[#572]: https://github.com/uber-go/zap/pull/572 -[#606]: https://github.com/uber-go/zap/pull/606 -[#614]: https://github.com/uber-go/zap/pull/614 -[#657]: https://github.com/uber-go/zap/pull/657 -[#706]: https://github.com/uber-go/zap/pull/706 -[#610]: https://github.com/uber-go/zap/pull/610 -[#675]: https://github.com/uber-go/zap/pull/675 -[#704]: https://github.com/uber-go/zap/pull/704 -[#725]: https://github.com/uber-go/zap/pull/725 -[#736]: https://github.com/uber-go/zap/pull/736 -[#751]: https://github.com/uber-go/zap/pull/751 -[#758]: https://github.com/uber-go/zap/pull/758 -[#771]: https://github.com/uber-go/zap/pull/771 -[#773]: https://github.com/uber-go/zap/pull/773 -[#775]: https://github.com/uber-go/zap/pull/775 -[#786]: https://github.com/uber-go/zap/pull/786 -[#791]: https://github.com/uber-go/zap/pull/791 -[#795]: https://github.com/uber-go/zap/pull/795 -[#799]: https://github.com/uber-go/zap/pull/799 -[#804]: https://github.com/uber-go/zap/pull/804 -[#812]: https://github.com/uber-go/zap/pull/812 -[#806]: https://github.com/uber-go/zap/pull/806 -[#813]: https://github.com/uber-go/zap/pull/813 -[#629]: https://github.com/uber-go/zap/pull/629 -[#697]: https://github.com/uber-go/zap/pull/697 -[#828]: https://github.com/uber-go/zap/pull/828 -[#835]: https://github.com/uber-go/zap/pull/835 -[#843]: https://github.com/uber-go/zap/pull/843 -[#844]: https://github.com/uber-go/zap/pull/844 -[#852]: https://github.com/uber-go/zap/pull/852 -[#854]: https://github.com/uber-go/zap/pull/854 -[#861]: https://github.com/uber-go/zap/pull/861 -[#862]: https://github.com/uber-go/zap/pull/862 -[#865]: https://github.com/uber-go/zap/pull/865 -[#867]: https://github.com/uber-go/zap/pull/867 -[#881]: https://github.com/uber-go/zap/pull/881 -[#903]: https://github.com/uber-go/zap/pull/903 -[#912]: https://github.com/uber-go/zap/pull/912 -[#913]: https://github.com/uber-go/zap/pull/913 -[#928]: https://github.com/uber-go/zap/pull/928 -[#931]: https://github.com/uber-go/zap/pull/931 -[#936]: https://github.com/uber-go/zap/pull/936 diff --git a/vendor/go.uber.org/zap/LICENSE.txt b/vendor/go.uber.org/zap/LICENSE similarity index 100% rename from vendor/go.uber.org/zap/LICENSE.txt rename to vendor/go.uber.org/zap/LICENSE diff --git a/vendor/go.uber.org/zap/Makefile b/vendor/go.uber.org/zap/Makefile index 518c3fa6b..eb1cee53b 100644 --- a/vendor/go.uber.org/zap/Makefile +++ b/vendor/go.uber.org/zap/Makefile @@ -1,64 +1,62 @@ -export GOBIN ?= $(shell pwd)/bin +# Directory containing the Makefile. +PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +export GOBIN ?= $(PROJECT_ROOT)/bin +export PATH := $(GOBIN):$(PATH) -REVIVE = $(GOBIN)/revive -STATICCHECK = $(GOBIN)/staticcheck GOVULNCHECK = $(GOBIN)/govulncheck BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem # Directories containing independent Go modules. -# -# We track coverage only for the main module. MODULE_DIRS = . ./exp ./benchmarks ./zapgrpc/internal/test -# Many Go tools take file globs or directories as arguments instead of packages. -GO_FILES := $(shell \ - find . '(' -path '*/.*' -o -path './vendor' ')' -prune \ - -o -name '*.go' -print | cut -b3-) +# Directories that we want to track coverage for. +COVER_DIRS = . ./exp .PHONY: all all: lint test .PHONY: lint -lint: $(REVIVE) $(STATICCHECK) - @rm -rf lint.log - @echo "Checking formatting..." - @gofmt -d -s $(GO_FILES) 2>&1 | tee lint.log - @echo "Checking vet..." - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go vet ./... 2>&1) &&) true | tee -a lint.log - @echo "Checking lint..." - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && \ - $(REVIVE) -set_exit_status ./... 2>&1) &&) true | tee -a lint.log - @echo "Checking staticcheck..." - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && $(STATICCHECK) ./... 2>&1) &&) true | tee -a lint.log - @echo "Checking for unresolved FIXMEs..." - @git grep -i fixme | grep -v -e Makefile | tee -a lint.log - @echo "Checking for license headers..." - @./checklicense.sh | tee -a lint.log - @[ ! -s lint.log ] - @echo "Checking 'go mod tidy'..." - @make tidy - @if ! git diff --quiet; then \ - echo "'go mod tidy' resulted in changes or working tree is dirty:"; \ - git --no-pager diff; \ - fi - -$(REVIVE): - cd tools && go install github.com/mgechev/revive +lint: golangci-lint tidy-lint license-lint + +.PHONY: golangci-lint +golangci-lint: + @$(foreach mod,$(MODULE_DIRS), \ + (cd $(mod) && \ + echo "[lint] golangci-lint: $(mod)" && \ + golangci-lint run --path-prefix $(mod)) &&) true + +.PHONY: tidy +tidy: + @$(foreach dir,$(MODULE_DIRS), \ + (cd $(dir) && go mod tidy) &&) true + +.PHONY: tidy-lint +tidy-lint: + @$(foreach mod,$(MODULE_DIRS), \ + (cd $(mod) && \ + echo "[lint] tidy: $(mod)" && \ + go mod tidy && \ + git diff --exit-code -- go.mod go.sum) &&) true + + +.PHONY: license-lint +license-lint: + ./checklicense.sh $(GOVULNCHECK): cd tools && go install golang.org/x/vuln/cmd/govulncheck -$(STATICCHECK): - cd tools && go install honnef.co/go/tools/cmd/staticcheck - .PHONY: test test: @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go test -race ./...) &&) true .PHONY: cover cover: - go test -race -coverprofile=cover.out -coverpkg=./... ./... - go tool cover -html=cover.out -o cover.html + @$(foreach dir,$(COVER_DIRS), ( \ + cd $(dir) && \ + go test -race -coverprofile=cover.out -coverpkg=./... ./... \ + && go tool cover -html=cover.out -o cover.html) &&) true .PHONY: bench BENCH ?= . @@ -73,10 +71,6 @@ updatereadme: rm -f README.md cat .readme.tmpl | go run internal/readme/readme.go > README.md -.PHONY: tidy -tidy: - @$(foreach dir,$(MODULE_DIRS),(cd $(dir) && go mod tidy) &&) true - .PHONY: vulncheck vulncheck: $(GOVULNCHECK) - $(GOVULNCHECK) ./... \ No newline at end of file + $(GOVULNCHECK) ./... diff --git a/vendor/go.uber.org/zap/README.md b/vendor/go.uber.org/zap/README.md index 9de08927b..a17035cb6 100644 --- a/vendor/go.uber.org/zap/README.md +++ b/vendor/go.uber.org/zap/README.md @@ -1,7 +1,16 @@ -# :zap: zap [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] +# :zap: zap + + +
Blazing fast, structured, leveled logging in Go. +![Zap logo](assets/logo.png) + +[![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +
+ ## Installation `go get -u go.uber.org/zap` @@ -66,41 +75,44 @@ Log a message and 10 fields: | Package | Time | Time % to zap | Objects Allocated | | :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 1744 ns/op | +0% | 5 allocs/op -| :zap: zap (sugared) | 2483 ns/op | +42% | 10 allocs/op -| zerolog | 918 ns/op | -47% | 1 allocs/op -| go-kit | 5590 ns/op | +221% | 57 allocs/op -| slog | 5640 ns/op | +223% | 40 allocs/op -| apex/log | 21184 ns/op | +1115% | 63 allocs/op -| logrus | 24338 ns/op | +1296% | 79 allocs/op -| log15 | 26054 ns/op | +1394% | 74 allocs/op +| :zap: zap | 656 ns/op | +0% | 5 allocs/op +| :zap: zap (sugared) | 935 ns/op | +43% | 10 allocs/op +| zerolog | 380 ns/op | -42% | 1 allocs/op +| go-kit | 2249 ns/op | +243% | 57 allocs/op +| slog (LogAttrs) | 2479 ns/op | +278% | 40 allocs/op +| slog | 2481 ns/op | +278% | 42 allocs/op +| apex/log | 9591 ns/op | +1362% | 63 allocs/op +| log15 | 11393 ns/op | +1637% | 75 allocs/op +| logrus | 11654 ns/op | +1677% | 79 allocs/op Log a message with a logger that already has 10 fields of context: | Package | Time | Time % to zap | Objects Allocated | | :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 193 ns/op | +0% | 0 allocs/op -| :zap: zap (sugared) | 227 ns/op | +18% | 1 allocs/op -| zerolog | 81 ns/op | -58% | 0 allocs/op -| slog | 322 ns/op | +67% | 0 allocs/op -| go-kit | 5377 ns/op | +2686% | 56 allocs/op -| apex/log | 19518 ns/op | +10013% | 53 allocs/op -| log15 | 19812 ns/op | +10165% | 70 allocs/op -| logrus | 21997 ns/op | +11297% | 68 allocs/op +| :zap: zap | 67 ns/op | +0% | 0 allocs/op +| :zap: zap (sugared) | 84 ns/op | +25% | 1 allocs/op +| zerolog | 35 ns/op | -48% | 0 allocs/op +| slog | 193 ns/op | +188% | 0 allocs/op +| slog (LogAttrs) | 200 ns/op | +199% | 0 allocs/op +| go-kit | 2460 ns/op | +3572% | 56 allocs/op +| log15 | 9038 ns/op | +13390% | 70 allocs/op +| apex/log | 9068 ns/op | +13434% | 53 allocs/op +| logrus | 10521 ns/op | +15603% | 68 allocs/op Log a static string, without any context or `printf`-style templating: | Package | Time | Time % to zap | Objects Allocated | | :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 165 ns/op | +0% | 0 allocs/op -| :zap: zap (sugared) | 212 ns/op | +28% | 1 allocs/op -| zerolog | 95 ns/op | -42% | 0 allocs/op -| slog | 296 ns/op | +79% | 0 allocs/op -| go-kit | 415 ns/op | +152% | 9 allocs/op -| standard library | 422 ns/op | +156% | 2 allocs/op -| apex/log | 1601 ns/op | +870% | 5 allocs/op -| logrus | 3017 ns/op | +1728% | 23 allocs/op -| log15 | 3469 ns/op | +2002% | 20 allocs/op +| :zap: zap | 63 ns/op | +0% | 0 allocs/op +| :zap: zap (sugared) | 81 ns/op | +29% | 1 allocs/op +| zerolog | 32 ns/op | -49% | 0 allocs/op +| standard library | 124 ns/op | +97% | 1 allocs/op +| slog | 196 ns/op | +211% | 0 allocs/op +| slog (LogAttrs) | 200 ns/op | +217% | 0 allocs/op +| go-kit | 213 ns/op | +238% | 9 allocs/op +| apex/log | 771 ns/op | +1124% | 5 allocs/op +| logrus | 1439 ns/op | +2184% | 23 allocs/op +| log15 | 2069 ns/op | +3184% | 20 allocs/op ## Development Status: Stable @@ -120,7 +132,7 @@ standard.
-Released under the [MIT License](LICENSE.txt). +Released under the [MIT License](LICENSE). 1 In particular, keep in mind that we may be benchmarking against slightly older versions of other packages. Versions are diff --git a/vendor/go.uber.org/zap/array.go b/vendor/go.uber.org/zap/array.go index 5be3704a3..abfccb566 100644 --- a/vendor/go.uber.org/zap/array.go +++ b/vendor/go.uber.org/zap/array.go @@ -21,6 +21,7 @@ package zap import ( + "fmt" "time" "go.uber.org/zap/zapcore" @@ -94,11 +95,137 @@ func Int8s(key string, nums []int8) Field { return Array(key, int8s(nums)) } +// Objects constructs a field with the given key, holding a list of the +// provided objects that can be marshaled by Zap. +// +// Note that these objects must implement zapcore.ObjectMarshaler directly. +// That is, if you're trying to marshal a []Request, the MarshalLogObject +// method must be declared on the Request type, not its pointer (*Request). +// If it's on the pointer, use ObjectValues. +// +// Given an object that implements MarshalLogObject on the value receiver, you +// can log a slice of those objects with Objects like so: +// +// type Author struct{ ... } +// func (a Author) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var authors []Author = ... +// logger.Info("loading article", zap.Objects("authors", authors)) +// +// Similarly, given a type that implements MarshalLogObject on its pointer +// receiver, you can log a slice of pointers to that object with Objects like +// so: +// +// type Request struct{ ... } +// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var requests []*Request = ... +// logger.Info("sending requests", zap.Objects("requests", requests)) +// +// If instead, you have a slice of values of such an object, use the +// ObjectValues constructor. +// +// var requests []Request = ... +// logger.Info("sending requests", zap.ObjectValues("requests", requests)) +func Objects[T zapcore.ObjectMarshaler](key string, values []T) Field { + return Array(key, objects[T](values)) +} + +type objects[T zapcore.ObjectMarshaler] []T + +func (os objects[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for _, o := range os { + if err := arr.AppendObject(o); err != nil { + return err + } + } + return nil +} + +// ObjectMarshalerPtr is a constraint that specifies that the given type +// implements zapcore.ObjectMarshaler on a pointer receiver. +type ObjectMarshalerPtr[T any] interface { + *T + zapcore.ObjectMarshaler +} + +// ObjectValues constructs a field with the given key, holding a list of the +// provided objects, where pointers to these objects can be marshaled by Zap. +// +// Note that pointers to these objects must implement zapcore.ObjectMarshaler. +// That is, if you're trying to marshal a []Request, the MarshalLogObject +// method must be declared on the *Request type, not the value (Request). +// If it's on the value, use Objects. +// +// Given an object that implements MarshalLogObject on the pointer receiver, +// you can log a slice of those objects with ObjectValues like so: +// +// type Request struct{ ... } +// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var requests []Request = ... +// logger.Info("sending requests", zap.ObjectValues("requests", requests)) +// +// If instead, you have a slice of pointers of such an object, use the Objects +// field constructor. +// +// var requests []*Request = ... +// logger.Info("sending requests", zap.Objects("requests", requests)) +func ObjectValues[T any, P ObjectMarshalerPtr[T]](key string, values []T) Field { + return Array(key, objectValues[T, P](values)) +} + +type objectValues[T any, P ObjectMarshalerPtr[T]] []T + +func (os objectValues[T, P]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range os { + // It is necessary for us to explicitly reference the "P" type. + // We cannot simply pass "&os[i]" to AppendObject because its type + // is "*T", which the type system does not consider as + // implementing ObjectMarshaler. + // Only the type "P" satisfies ObjectMarshaler, which we have + // to convert "*T" to explicitly. + var p P = &os[i] + if err := arr.AppendObject(p); err != nil { + return err + } + } + return nil +} + // Strings constructs a field that carries a slice of strings. func Strings(key string, ss []string) Field { return Array(key, stringArray(ss)) } +// Stringers constructs a field with the given key, holding a list of the +// output provided by the value's String method +// +// Given an object that implements String on the value receiver, you +// can log a slice of those objects with Objects like so: +// +// type Request struct{ ... } +// func (a Request) String() string +// +// var requests []Request = ... +// logger.Info("sending requests", zap.Stringers("requests", requests)) +// +// Note that these objects must implement fmt.Stringer directly. +// That is, if you're trying to marshal a []Request, the String method +// must be declared on the Request type, not its pointer (*Request). +func Stringers[T fmt.Stringer](key string, values []T) Field { + return Array(key, stringers[T](values)) +} + +type stringers[T fmt.Stringer] []T + +func (os stringers[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for _, o := range os { + arr.AppendString(o.String()) + } + return nil +} + // Times constructs a field that carries a slice of time.Times. func Times(key string, ts []time.Time) Field { return Array(key, times(ts)) diff --git a/vendor/go.uber.org/zap/array_go118.go b/vendor/go.uber.org/zap/array_go118.go deleted file mode 100644 index d0d2c49d6..000000000 --- a/vendor/go.uber.org/zap/array_go118.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2022 Uber Technologies, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -//go:build go1.18 -// +build go1.18 - -package zap - -import ( - "fmt" - - "go.uber.org/zap/zapcore" -) - -// Objects constructs a field with the given key, holding a list of the -// provided objects that can be marshaled by Zap. -// -// Note that these objects must implement zapcore.ObjectMarshaler directly. -// That is, if you're trying to marshal a []Request, the MarshalLogObject -// method must be declared on the Request type, not its pointer (*Request). -// If it's on the pointer, use ObjectValues. -// -// Given an object that implements MarshalLogObject on the value receiver, you -// can log a slice of those objects with Objects like so: -// -// type Author struct{ ... } -// func (a Author) MarshalLogObject(enc zapcore.ObjectEncoder) error -// -// var authors []Author = ... -// logger.Info("loading article", zap.Objects("authors", authors)) -// -// Similarly, given a type that implements MarshalLogObject on its pointer -// receiver, you can log a slice of pointers to that object with Objects like -// so: -// -// type Request struct{ ... } -// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error -// -// var requests []*Request = ... -// logger.Info("sending requests", zap.Objects("requests", requests)) -// -// If instead, you have a slice of values of such an object, use the -// ObjectValues constructor. -// -// var requests []Request = ... -// logger.Info("sending requests", zap.ObjectValues("requests", requests)) -func Objects[T zapcore.ObjectMarshaler](key string, values []T) Field { - return Array(key, objects[T](values)) -} - -type objects[T zapcore.ObjectMarshaler] []T - -func (os objects[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { - for _, o := range os { - if err := arr.AppendObject(o); err != nil { - return err - } - } - return nil -} - -// ObjectMarshalerPtr is a constraint that specifies that the given type -// implements zapcore.ObjectMarshaler on a pointer receiver. -type ObjectMarshalerPtr[T any] interface { - *T - zapcore.ObjectMarshaler -} - -// ObjectValues constructs a field with the given key, holding a list of the -// provided objects, where pointers to these objects can be marshaled by Zap. -// -// Note that pointers to these objects must implement zapcore.ObjectMarshaler. -// That is, if you're trying to marshal a []Request, the MarshalLogObject -// method must be declared on the *Request type, not the value (Request). -// If it's on the value, use Objects. -// -// Given an object that implements MarshalLogObject on the pointer receiver, -// you can log a slice of those objects with ObjectValues like so: -// -// type Request struct{ ... } -// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error -// -// var requests []Request = ... -// logger.Info("sending requests", zap.ObjectValues("requests", requests)) -// -// If instead, you have a slice of pointers of such an object, use the Objects -// field constructor. -// -// var requests []*Request = ... -// logger.Info("sending requests", zap.Objects("requests", requests)) -func ObjectValues[T any, P ObjectMarshalerPtr[T]](key string, values []T) Field { - return Array(key, objectValues[T, P](values)) -} - -type objectValues[T any, P ObjectMarshalerPtr[T]] []T - -func (os objectValues[T, P]) MarshalLogArray(arr zapcore.ArrayEncoder) error { - for i := range os { - // It is necessary for us to explicitly reference the "P" type. - // We cannot simply pass "&os[i]" to AppendObject because its type - // is "*T", which the type system does not consider as - // implementing ObjectMarshaler. - // Only the type "P" satisfies ObjectMarshaler, which we have - // to convert "*T" to explicitly. - var p P = &os[i] - if err := arr.AppendObject(p); err != nil { - return err - } - } - return nil -} - -// Stringers constructs a field with the given key, holding a list of the -// output provided by the value's String method -// -// Given an object that implements String on the value receiver, you -// can log a slice of those objects with Objects like so: -// -// type Request struct{ ... } -// func (a Request) String() string -// -// var requests []Request = ... -// logger.Info("sending requests", zap.Stringers("requests", requests)) -// -// Note that these objects must implement fmt.Stringer directly. -// That is, if you're trying to marshal a []Request, the String method -// must be declared on the Request type, not its pointer (*Request). -func Stringers[T fmt.Stringer](key string, values []T) Field { - return Array(key, stringers[T](values)) -} - -type stringers[T fmt.Stringer] []T - -func (os stringers[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { - for _, o := range os { - arr.AppendString(o.String()) - } - return nil -} diff --git a/vendor/go.uber.org/zap/buffer/buffer.go b/vendor/go.uber.org/zap/buffer/buffer.go index 9e929cd98..0b8540c21 100644 --- a/vendor/go.uber.org/zap/buffer/buffer.go +++ b/vendor/go.uber.org/zap/buffer/buffer.go @@ -42,6 +42,11 @@ func (b *Buffer) AppendByte(v byte) { b.bs = append(b.bs, v) } +// AppendBytes writes the given slice of bytes to the Buffer. +func (b *Buffer) AppendBytes(v []byte) { + b.bs = append(b.bs, v...) +} + // AppendString writes a string to the Buffer. func (b *Buffer) AppendString(s string) { b.bs = append(b.bs, s...) diff --git a/vendor/go.uber.org/zap/error.go b/vendor/go.uber.org/zap/error.go index 38cb768de..45f7b838d 100644 --- a/vendor/go.uber.org/zap/error.go +++ b/vendor/go.uber.org/zap/error.go @@ -61,9 +61,12 @@ func (errs errArray) MarshalLogArray(arr zapcore.ArrayEncoder) error { // allocating, pool the wrapper type. elem := _errArrayElemPool.Get() elem.error = errs[i] - arr.AppendObject(elem) + err := arr.AppendObject(elem) elem.error = nil _errArrayElemPool.Put(elem) + if err != nil { + return err + } } return nil } diff --git a/vendor/go.uber.org/zap/field.go b/vendor/go.uber.org/zap/field.go index 7f22c5349..6743930b8 100644 --- a/vendor/go.uber.org/zap/field.go +++ b/vendor/go.uber.org/zap/field.go @@ -25,6 +25,7 @@ import ( "math" "time" + "go.uber.org/zap/internal/stacktrace" "go.uber.org/zap/zapcore" ) @@ -374,7 +375,7 @@ func StackSkip(key string, skip int) Field { // from expanding the zapcore.Field union struct to include a byte slice. Since // taking a stacktrace is already so expensive (~10us), the extra allocation // is okay. - return String(key, takeStacktrace(skip+1)) // skip StackSkip + return String(key, stacktrace.Take(skip+1)) // skip StackSkip } // Duration constructs a field with the given key and value. The encoder @@ -410,6 +411,26 @@ func Inline(val zapcore.ObjectMarshaler) Field { } } +// Dict constructs a field containing the provided key-value pairs. +// It acts similar to [Object], but with the fields specified as arguments. +func Dict(key string, val ...Field) Field { + return dictField(key, val) +} + +// We need a function with the signature (string, T) for zap.Any. +func dictField(key string, val []Field) Field { + return Object(key, dictObject(val)) +} + +type dictObject []Field + +func (d dictObject) MarshalLogObject(enc zapcore.ObjectEncoder) error { + for _, f := range d { + f.AddTo(enc) + } + return nil +} + // We discovered an issue where zap.Any can cause a performance degradation // when used in new goroutines. // @@ -439,6 +460,8 @@ func Inline(val zapcore.ObjectMarshaler) Field { // - https://github.com/uber-go/zap/pull/1304 // - https://github.com/uber-go/zap/pull/1305 // - https://github.com/uber-go/zap/pull/1308 +// +// See https://github.com/golang/go/issues/62077 for upstream issue. type anyFieldC[T any] func(string, T) Field func (f anyFieldC[T]) Any(key string, val any) Field { @@ -462,6 +485,8 @@ func Any(key string, value interface{}) Field { c = anyFieldC[zapcore.ObjectMarshaler](Object) case zapcore.ArrayMarshaler: c = anyFieldC[zapcore.ArrayMarshaler](Array) + case []Field: + c = anyFieldC[[]Field](dictField) case bool: c = anyFieldC[bool](Bool) case *bool: diff --git a/vendor/go.uber.org/zap/http_handler.go b/vendor/go.uber.org/zap/http_handler.go index 632b6831a..2be8f6515 100644 --- a/vendor/go.uber.org/zap/http_handler.go +++ b/vendor/go.uber.org/zap/http_handler.go @@ -69,6 +69,13 @@ import ( // // curl -X PUT localhost:8080/log/level -H "Content-Type: application/json" -d '{"level":"debug"}' func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if err := lvl.serveHTTP(w, r); err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "internal error: %v", err) + } +} + +func (lvl AtomicLevel) serveHTTP(w http.ResponseWriter, r *http.Request) error { type errorResponse struct { Error string `json:"error"` } @@ -80,19 +87,20 @@ func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: - enc.Encode(payload{Level: lvl.Level()}) + return enc.Encode(payload{Level: lvl.Level()}) + case http.MethodPut: requestedLvl, err := decodePutRequest(r.Header.Get("Content-Type"), r) if err != nil { w.WriteHeader(http.StatusBadRequest) - enc.Encode(errorResponse{Error: err.Error()}) - return + return enc.Encode(errorResponse{Error: err.Error()}) } lvl.SetLevel(requestedLvl) - enc.Encode(payload{Level: lvl.Level()}) + return enc.Encode(payload{Level: lvl.Level()}) + default: w.WriteHeader(http.StatusMethodNotAllowed) - enc.Encode(errorResponse{ + return enc.Encode(errorResponse{ Error: "Only GET and PUT are supported.", }) } @@ -129,5 +137,4 @@ func decodePutJSON(body io.Reader) (zapcore.Level, error) { return 0, errors.New("must specify logging level") } return *pld.Level, nil - } diff --git a/vendor/go.uber.org/zap/stacktrace.go b/vendor/go.uber.org/zap/internal/stacktrace/stack.go similarity index 75% rename from vendor/go.uber.org/zap/stacktrace.go rename to vendor/go.uber.org/zap/internal/stacktrace/stack.go index 1f152eb1a..82af7551f 100644 --- a/vendor/go.uber.org/zap/stacktrace.go +++ b/vendor/go.uber.org/zap/internal/stacktrace/stack.go @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Uber Technologies, Inc. +// Copyright (c) 2023 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -18,7 +18,9 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -package zap +// Package stacktrace provides support for gathering stack traces +// efficiently. +package stacktrace import ( "runtime" @@ -28,13 +30,14 @@ import ( "go.uber.org/zap/internal/pool" ) -var _stacktracePool = pool.New(func() *stacktrace { - return &stacktrace{ +var _stackPool = pool.New(func() *Stack { + return &Stack{ storage: make([]uintptr, 64), } }) -type stacktrace struct { +// Stack is a captured stack trace. +type Stack struct { pcs []uintptr // program counters; always a subslice of storage frames *runtime.Frames @@ -48,30 +51,30 @@ type stacktrace struct { storage []uintptr } -// stacktraceDepth specifies how deep of a stack trace should be captured. -type stacktraceDepth int +// Depth specifies how deep of a stack trace should be captured. +type Depth int const ( - // stacktraceFirst captures only the first frame. - stacktraceFirst stacktraceDepth = iota + // First captures only the first frame. + First Depth = iota - // stacktraceFull captures the entire call stack, allocating more + // Full captures the entire call stack, allocating more // storage for it if needed. - stacktraceFull + Full ) -// captureStacktrace captures a stack trace of the specified depth, skipping +// Capture captures a stack trace of the specified depth, skipping // the provided number of frames. skip=0 identifies the caller of -// captureStacktrace. +// Capture. // // The caller must call Free on the returned stacktrace after using it. -func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { - stack := _stacktracePool.Get() +func Capture(skip int, depth Depth) *Stack { + stack := _stackPool.Get() switch depth { - case stacktraceFirst: + case First: stack.pcs = stack.storage[:1] - case stacktraceFull: + case Full: stack.pcs = stack.storage } @@ -85,7 +88,7 @@ func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { // runtime.Callers truncates the recorded stacktrace if there is no // room in the provided slice. For the full stack trace, keep expanding // storage until there are fewer frames than there is room. - if depth == stacktraceFull { + if depth == Full { pcs := stack.pcs for numFrames == len(pcs) { pcs = make([]uintptr, len(pcs)*2) @@ -107,50 +110,54 @@ func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { // Free releases resources associated with this stacktrace // and returns it back to the pool. -func (st *stacktrace) Free() { +func (st *Stack) Free() { st.frames = nil st.pcs = nil - _stacktracePool.Put(st) + _stackPool.Put(st) } // Count reports the total number of frames in this stacktrace. // Count DOES NOT change as Next is called. -func (st *stacktrace) Count() int { +func (st *Stack) Count() int { return len(st.pcs) } // Next returns the next frame in the stack trace, // and a boolean indicating whether there are more after it. -func (st *stacktrace) Next() (_ runtime.Frame, more bool) { +func (st *Stack) Next() (_ runtime.Frame, more bool) { return st.frames.Next() } -func takeStacktrace(skip int) string { - stack := captureStacktrace(skip+1, stacktraceFull) +// Take returns a string representation of the current stacktrace. +// +// skip is the number of frames to skip before recording the stack trace. +// skip=0 identifies the caller of Take. +func Take(skip int) string { + stack := Capture(skip+1, Full) defer stack.Free() buffer := bufferpool.Get() defer buffer.Free() - stackfmt := newStackFormatter(buffer) + stackfmt := NewFormatter(buffer) stackfmt.FormatStack(stack) return buffer.String() } -// stackFormatter formats a stack trace into a readable string representation. -type stackFormatter struct { +// Formatter formats a stack trace into a readable string representation. +type Formatter struct { b *buffer.Buffer nonEmpty bool // whehther we've written at least one frame already } -// newStackFormatter builds a new stackFormatter. -func newStackFormatter(b *buffer.Buffer) stackFormatter { - return stackFormatter{b: b} +// NewFormatter builds a new Formatter. +func NewFormatter(b *buffer.Buffer) Formatter { + return Formatter{b: b} } // FormatStack formats all remaining frames in the provided stacktrace -- minus // the final runtime.main/runtime.goexit frame. -func (sf *stackFormatter) FormatStack(stack *stacktrace) { +func (sf *Formatter) FormatStack(stack *Stack) { // Note: On the last iteration, frames.Next() returns false, with a valid // frame, but we ignore this frame. The last frame is a runtime frame which // adds noise, since it's only either runtime.main or runtime.goexit. @@ -160,7 +167,7 @@ func (sf *stackFormatter) FormatStack(stack *stacktrace) { } // FormatFrame formats the given frame. -func (sf *stackFormatter) FormatFrame(frame runtime.Frame) { +func (sf *Formatter) FormatFrame(frame runtime.Frame) { if sf.nonEmpty { sf.b.AppendByte('\n') } diff --git a/vendor/go.uber.org/zap/logger.go b/vendor/go.uber.org/zap/logger.go index 0e9548011..c4d300323 100644 --- a/vendor/go.uber.org/zap/logger.go +++ b/vendor/go.uber.org/zap/logger.go @@ -27,6 +27,7 @@ import ( "strings" "go.uber.org/zap/internal/bufferpool" + "go.uber.org/zap/internal/stacktrace" "go.uber.org/zap/zapcore" ) @@ -42,6 +43,7 @@ type Logger struct { development bool addCaller bool + onPanic zapcore.CheckWriteHook // default is WriteThenPanic onFatal zapcore.CheckWriteHook // default is WriteThenFatal name string @@ -173,7 +175,8 @@ func (log *Logger) WithOptions(opts ...Option) *Logger { } // With creates a child logger and adds structured context to it. Fields added -// to the child don't affect the parent, and vice versa. +// to the child don't affect the parent, and vice versa. Any fields that +// require evaluation (such as Objects) are evaluated upon invocation of With. func (log *Logger) With(fields ...Field) *Logger { if len(fields) == 0 { return log @@ -183,6 +186,28 @@ func (log *Logger) With(fields ...Field) *Logger { return l } +// WithLazy creates a child logger and adds structured context to it lazily. +// +// The fields are evaluated only if the logger is further chained with [With] +// or is written to with any of the log level methods. +// Until that occurs, the logger may retain references to objects inside the fields, +// and logging will reflect the state of an object at the time of logging, +// not the time of WithLazy(). +// +// WithLazy provides a worthwhile performance optimization for contextual loggers +// when the likelihood of using the child logger is low, +// such as error paths and rarely taken branches. +// +// Similar to [With], fields added to the child don't affect the parent, and vice versa. +func (log *Logger) WithLazy(fields ...Field) *Logger { + if len(fields) == 0 { + return log + } + return log.WithOptions(WrapCore(func(core zapcore.Core) zapcore.Core { + return zapcore.NewLazyWith(core, fields) + })) +} + // Level reports the minimum enabled level for this logger. // // For NopLoggers, this is [zapcore.InvalidLevel]. @@ -199,6 +224,8 @@ func (log *Logger) Check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Log logs a message at the specified level. The message includes any fields // passed at the log site, as well as any fields accumulated on the logger. +// Any Fields that require evaluation (such as Objects) are evaluated upon +// invocation of Log. func (log *Logger) Log(lvl zapcore.Level, msg string, fields ...Field) { if ce := log.check(lvl, msg); ce != nil { ce.Write(fields...) @@ -288,8 +315,8 @@ func (log *Logger) Name() string { } func (log *Logger) clone() *Logger { - copy := *log - return © + clone := *log + return &clone } func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { @@ -319,27 +346,12 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Set up any required terminal behavior. switch ent.Level { case zapcore.PanicLevel: - ce = ce.After(ent, zapcore.WriteThenPanic) + ce = ce.After(ent, terminalHookOverride(zapcore.WriteThenPanic, log.onPanic)) case zapcore.FatalLevel: - onFatal := log.onFatal - // nil or WriteThenNoop will lead to continued execution after - // a Fatal log entry, which is unexpected. For example, - // - // f, err := os.Open(..) - // if err != nil { - // log.Fatal("cannot open", zap.Error(err)) - // } - // fmt.Println(f.Name()) - // - // The f.Name() will panic if we continue execution after the - // log.Fatal. - if onFatal == nil || onFatal == zapcore.WriteThenNoop { - onFatal = zapcore.WriteThenFatal - } - ce = ce.After(ent, onFatal) + ce = ce.After(ent, terminalHookOverride(zapcore.WriteThenFatal, log.onFatal)) case zapcore.DPanicLevel: if log.development { - ce = ce.After(ent, zapcore.WriteThenPanic) + ce = ce.After(ent, terminalHookOverride(zapcore.WriteThenPanic, log.onPanic)) } } @@ -360,17 +372,17 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Adding the caller or stack trace requires capturing the callers of // this function. We'll share information between these two. - stackDepth := stacktraceFirst + stackDepth := stacktrace.First if addStack { - stackDepth = stacktraceFull + stackDepth = stacktrace.Full } - stack := captureStacktrace(log.callerSkip+callerSkipOffset, stackDepth) + stack := stacktrace.Capture(log.callerSkip+callerSkipOffset, stackDepth) defer stack.Free() if stack.Count() == 0 { if log.addCaller { fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", ent.Time.UTC()) - log.errorOutput.Sync() + _ = log.errorOutput.Sync() } return ce } @@ -391,7 +403,7 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { buffer := bufferpool.Get() defer buffer.Free() - stackfmt := newStackFormatter(buffer) + stackfmt := stacktrace.NewFormatter(buffer) // We've already extracted the first frame, so format that // separately and defer to stackfmt for the rest. @@ -404,3 +416,20 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { return ce } + +func terminalHookOverride(defaultHook, override zapcore.CheckWriteHook) zapcore.CheckWriteHook { + // A nil or WriteThenNoop hook will lead to continued execution after + // a Panic or Fatal log entry, which is unexpected. For example, + // + // f, err := os.Open(..) + // if err != nil { + // log.Fatal("cannot open", zap.Error(err)) + // } + // fmt.Println(f.Name()) + // + // The f.Name() will panic if we continue execution after the log.Fatal. + if override == nil || override == zapcore.WriteThenNoop { + return defaultHook + } + return override +} diff --git a/vendor/go.uber.org/zap/options.go b/vendor/go.uber.org/zap/options.go index c4f3bca3d..43d357ac9 100644 --- a/vendor/go.uber.org/zap/options.go +++ b/vendor/go.uber.org/zap/options.go @@ -132,6 +132,21 @@ func IncreaseLevel(lvl zapcore.LevelEnabler) Option { }) } +// WithPanicHook sets a CheckWriteHook to run on Panic/DPanic logs. +// Zap will call this hook after writing a log statement with a Panic/DPanic level. +// +// For example, the following builds a logger that will exit the current +// goroutine after writing a Panic/DPanic log message, but it will not start a panic. +// +// zap.New(core, zap.WithPanicHook(zapcore.WriteThenGoexit)) +// +// This is useful for testing Panic/DPanic log output. +func WithPanicHook(hook zapcore.CheckWriteHook) Option { + return optionFunc(func(log *Logger) { + log.onPanic = hook + }) +} + // OnFatal sets the action to take on fatal logs. // // Deprecated: Use [WithFatalHook] instead. diff --git a/vendor/go.uber.org/zap/sink.go b/vendor/go.uber.org/zap/sink.go index 478c9a10f..499772a00 100644 --- a/vendor/go.uber.org/zap/sink.go +++ b/vendor/go.uber.org/zap/sink.go @@ -66,7 +66,8 @@ func newSinkRegistry() *sinkRegistry { factories: make(map[string]func(*url.URL) (Sink, error)), openFile: os.OpenFile, } - sr.RegisterSink(schemeFile, sr.newFileSinkFromURL) + // Infallible operation: the registry is empty, so we can't have a conflict. + _ = sr.RegisterSink(schemeFile, sr.newFileSinkFromURL) return sr } @@ -154,7 +155,7 @@ func (sr *sinkRegistry) newFileSinkFromPath(path string) (Sink, error) { case "stderr": return nopCloserSink{os.Stderr}, nil } - return sr.openFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) + return sr.openFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0o666) } func normalizeScheme(s string) (string, error) { diff --git a/vendor/go.uber.org/zap/sugar.go b/vendor/go.uber.org/zap/sugar.go index 00ac5fe3a..8904cd087 100644 --- a/vendor/go.uber.org/zap/sugar.go +++ b/vendor/go.uber.org/zap/sugar.go @@ -115,6 +115,21 @@ func (s *SugaredLogger) With(args ...interface{}) *SugaredLogger { return &SugaredLogger{base: s.base.With(s.sweetenFields(args)...)} } +// WithLazy adds a variadic number of fields to the logging context lazily. +// The fields are evaluated only if the logger is further chained with [With] +// or is written to with any of the log level methods. +// Until that occurs, the logger may retain references to objects inside the fields, +// and logging will reflect the state of an object at the time of logging, +// not the time of WithLazy(). +// +// Similar to [With], fields added to the child don't affect the parent, +// and vice versa. Also, the keys in key-value pairs should be strings. In development, +// passing a non-string key panics, while in production it logs an error and skips the pair. +// Passing an orphaned key has the same behavior. +func (s *SugaredLogger) WithLazy(args ...interface{}) *SugaredLogger { + return &SugaredLogger{base: s.base.WithLazy(s.sweetenFields(args)...)} +} + // Level reports the minimum enabled level for this logger. // // For NopLoggers, this is [zapcore.InvalidLevel]. @@ -122,6 +137,12 @@ func (s *SugaredLogger) Level() zapcore.Level { return zapcore.LevelOf(s.base.core) } +// Log logs the provided arguments at provided level. +// Spaces are added between arguments when neither is a string. +func (s *SugaredLogger) Log(lvl zapcore.Level, args ...interface{}) { + s.log(lvl, "", args, nil) +} + // Debug logs the provided arguments at [DebugLevel]. // Spaces are added between arguments when neither is a string. func (s *SugaredLogger) Debug(args ...interface{}) { @@ -165,6 +186,12 @@ func (s *SugaredLogger) Fatal(args ...interface{}) { s.log(FatalLevel, "", args, nil) } +// Logf formats the message according to the format specifier +// and logs it at provided level. +func (s *SugaredLogger) Logf(lvl zapcore.Level, template string, args ...interface{}) { + s.log(lvl, template, args, nil) +} + // Debugf formats the message according to the format specifier // and logs it at [DebugLevel]. func (s *SugaredLogger) Debugf(template string, args ...interface{}) { @@ -208,6 +235,12 @@ func (s *SugaredLogger) Fatalf(template string, args ...interface{}) { s.log(FatalLevel, template, args, nil) } +// Logw logs a message with some additional context. The variadic key-value +// pairs are treated as they are in With. +func (s *SugaredLogger) Logw(lvl zapcore.Level, msg string, keysAndValues ...interface{}) { + s.log(lvl, msg, nil, keysAndValues) +} + // Debugw logs a message with some additional context. The variadic key-value // pairs are treated as they are in With. // @@ -255,6 +288,12 @@ func (s *SugaredLogger) Fatalw(msg string, keysAndValues ...interface{}) { s.log(FatalLevel, msg, nil, keysAndValues) } +// Logln logs a message at provided level. +// Spaces are always added between arguments. +func (s *SugaredLogger) Logln(lvl zapcore.Level, args ...interface{}) { + s.logln(lvl, args, nil) +} + // Debugln logs a message at [DebugLevel]. // Spaces are always added between arguments. func (s *SugaredLogger) Debugln(args ...interface{}) { diff --git a/vendor/go.uber.org/zap/writer.go b/vendor/go.uber.org/zap/writer.go index f08728e1e..06768c679 100644 --- a/vendor/go.uber.org/zap/writer.go +++ b/vendor/go.uber.org/zap/writer.go @@ -48,21 +48,21 @@ import ( // os.Stdout and os.Stderr. When specified without a scheme, relative file // paths also work. func Open(paths ...string) (zapcore.WriteSyncer, func(), error) { - writers, close, err := open(paths) + writers, closeAll, err := open(paths) if err != nil { return nil, nil, err } writer := CombineWriteSyncers(writers...) - return writer, close, nil + return writer, closeAll, nil } func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { writers := make([]zapcore.WriteSyncer, 0, len(paths)) closers := make([]io.Closer, 0, len(paths)) - close := func() { + closeAll := func() { for _, c := range closers { - c.Close() + _ = c.Close() } } @@ -77,11 +77,11 @@ func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { closers = append(closers, sink) } if openErr != nil { - close() + closeAll() return nil, nil, openErr } - return writers, close, nil + return writers, closeAll, nil } // CombineWriteSyncers is a utility that combines multiple WriteSyncers into a diff --git a/vendor/go.uber.org/zap/zapcore/console_encoder.go b/vendor/go.uber.org/zap/zapcore/console_encoder.go index 8ca0bfaf5..cc2b4e07b 100644 --- a/vendor/go.uber.org/zap/zapcore/console_encoder.go +++ b/vendor/go.uber.org/zap/zapcore/console_encoder.go @@ -77,7 +77,7 @@ func (c consoleEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, // If this ever becomes a performance bottleneck, we can implement // ArrayEncoder for our plain-text format. arr := getSliceEncoder() - if c.TimeKey != "" && c.EncodeTime != nil { + if c.TimeKey != "" && c.EncodeTime != nil && !ent.Time.IsZero() { c.EncodeTime(ent.Time, arr) } if c.LevelKey != "" && c.EncodeLevel != nil { diff --git a/vendor/go.uber.org/zap/zapcore/core.go b/vendor/go.uber.org/zap/zapcore/core.go index 9dfd64051..776e93f6f 100644 --- a/vendor/go.uber.org/zap/zapcore/core.go +++ b/vendor/go.uber.org/zap/zapcore/core.go @@ -102,9 +102,9 @@ func (c *ioCore) Write(ent Entry, fields []Field) error { return err } if ent.Level > ErrorLevel { - // Since we may be crashing the program, sync the output. Ignore Sync - // errors, pending a clean solution to issue #370. - c.Sync() + // Since we may be crashing the program, sync the output. + // Ignore Sync errors, pending a clean solution to issue #370. + _ = c.Sync() } return nil } diff --git a/vendor/go.uber.org/zap/zapcore/encoder.go b/vendor/go.uber.org/zap/zapcore/encoder.go index 5769ff3e4..044625415 100644 --- a/vendor/go.uber.org/zap/zapcore/encoder.go +++ b/vendor/go.uber.org/zap/zapcore/encoder.go @@ -37,6 +37,9 @@ const DefaultLineEnding = "\n" const OmitKey = "" // A LevelEncoder serializes a Level to a primitive type. +// +// This function must make exactly one call +// to a PrimitiveArrayEncoder's Append* method. type LevelEncoder func(Level, PrimitiveArrayEncoder) // LowercaseLevelEncoder serializes a Level to a lowercase string. For example, @@ -90,6 +93,9 @@ func (e *LevelEncoder) UnmarshalText(text []byte) error { } // A TimeEncoder serializes a time.Time to a primitive type. +// +// This function must make exactly one call +// to a PrimitiveArrayEncoder's Append* method. type TimeEncoder func(time.Time, PrimitiveArrayEncoder) // EpochTimeEncoder serializes a time.Time to a floating-point number of seconds @@ -219,6 +225,9 @@ func (e *TimeEncoder) UnmarshalJSON(data []byte) error { } // A DurationEncoder serializes a time.Duration to a primitive type. +// +// This function must make exactly one call +// to a PrimitiveArrayEncoder's Append* method. type DurationEncoder func(time.Duration, PrimitiveArrayEncoder) // SecondsDurationEncoder serializes a time.Duration to a floating-point number of seconds elapsed. @@ -262,6 +271,9 @@ func (e *DurationEncoder) UnmarshalText(text []byte) error { } // A CallerEncoder serializes an EntryCaller to a primitive type. +// +// This function must make exactly one call +// to a PrimitiveArrayEncoder's Append* method. type CallerEncoder func(EntryCaller, PrimitiveArrayEncoder) // FullCallerEncoder serializes a caller in /full/path/to/package/file:line @@ -292,6 +304,9 @@ func (e *CallerEncoder) UnmarshalText(text []byte) error { // A NameEncoder serializes a period-separated logger name to a primitive // type. +// +// This function must make exactly one call +// to a PrimitiveArrayEncoder's Append* method. type NameEncoder func(string, PrimitiveArrayEncoder) // FullNameEncoder serializes the logger name as-is. diff --git a/vendor/go.uber.org/zap/zapcore/entry.go b/vendor/go.uber.org/zap/zapcore/entry.go index 059844f92..459a5d7ce 100644 --- a/vendor/go.uber.org/zap/zapcore/entry.go +++ b/vendor/go.uber.org/zap/zapcore/entry.go @@ -242,7 +242,7 @@ func (ce *CheckedEntry) Write(fields ...Field) { // CheckedEntry is being used after it was returned to the pool, // the message may be an amalgamation from multiple call sites. fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", ce.Time, ce.Entry) - ce.ErrorOutput.Sync() + _ = ce.ErrorOutput.Sync() // ignore error } return } @@ -254,7 +254,7 @@ func (ce *CheckedEntry) Write(fields ...Field) { } if err != nil && ce.ErrorOutput != nil { fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", ce.Time, err) - ce.ErrorOutput.Sync() + _ = ce.ErrorOutput.Sync() // ignore error } hook := ce.after diff --git a/vendor/go.uber.org/zap/zapcore/error.go b/vendor/go.uber.org/zap/zapcore/error.go index c67dd71df..c40df1326 100644 --- a/vendor/go.uber.org/zap/zapcore/error.go +++ b/vendor/go.uber.org/zap/zapcore/error.go @@ -98,8 +98,11 @@ func (errs errArray) MarshalLogArray(arr ArrayEncoder) error { } el := newErrArrayElem(errs[i]) - arr.AppendObject(el) + err := arr.AppendObject(el) el.Free() + if err != nil { + return err + } } return nil } diff --git a/vendor/go.uber.org/zap/zapcore/field.go b/vendor/go.uber.org/zap/zapcore/field.go index 95bdb0a12..308c9781e 100644 --- a/vendor/go.uber.org/zap/zapcore/field.go +++ b/vendor/go.uber.org/zap/zapcore/field.go @@ -47,7 +47,7 @@ const ( ByteStringType // Complex128Type indicates that the field carries a complex128. Complex128Type - // Complex64Type indicates that the field carries a complex128. + // Complex64Type indicates that the field carries a complex64. Complex64Type // DurationType indicates that the field carries a time.Duration. DurationType diff --git a/vendor/go.uber.org/zap/zapcore/json_encoder.go b/vendor/go.uber.org/zap/zapcore/json_encoder.go index ce6838de2..9685169b2 100644 --- a/vendor/go.uber.org/zap/zapcore/json_encoder.go +++ b/vendor/go.uber.org/zap/zapcore/json_encoder.go @@ -372,7 +372,7 @@ func (enc *jsonEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, final.AppendString(ent.Level.String()) } } - if final.TimeKey != "" { + if final.TimeKey != "" && !ent.Time.IsZero() { final.AddTime(final.TimeKey, ent.Time) } if ent.LoggerName != "" && final.NameKey != "" { @@ -486,73 +486,98 @@ func (enc *jsonEncoder) appendFloat(val float64, bitSize int) { // Unlike the standard library's encoder, it doesn't attempt to protect the // user from browser vulnerabilities or JSONP-related problems. func (enc *jsonEncoder) safeAddString(s string) { - for i := 0; i < len(s); { - if enc.tryAddRuneSelf(s[i]) { - i++ - continue - } - r, size := utf8.DecodeRuneInString(s[i:]) - if enc.tryAddRuneError(r, size) { - i++ - continue - } - enc.buf.AppendString(s[i : i+size]) - i += size - } + safeAppendStringLike( + (*buffer.Buffer).AppendString, + utf8.DecodeRuneInString, + enc.buf, + s, + ) } // safeAddByteString is no-alloc equivalent of safeAddString(string(s)) for s []byte. func (enc *jsonEncoder) safeAddByteString(s []byte) { + safeAppendStringLike( + (*buffer.Buffer).AppendBytes, + utf8.DecodeRune, + enc.buf, + s, + ) +} + +// safeAppendStringLike is a generic implementation of safeAddString and safeAddByteString. +// It appends a string or byte slice to the buffer, escaping all special characters. +func safeAppendStringLike[S []byte | string]( + // appendTo appends this string-like object to the buffer. + appendTo func(*buffer.Buffer, S), + // decodeRune decodes the next rune from the string-like object + // and returns its value and width in bytes. + decodeRune func(S) (rune, int), + buf *buffer.Buffer, + s S, +) { + // The encoding logic below works by skipping over characters + // that can be safely copied as-is, + // until a character is found that needs special handling. + // At that point, we copy everything we've seen so far, + // and then handle that special character. + // + // last is the index of the last byte that was copied to the buffer. + last := 0 for i := 0; i < len(s); { - if enc.tryAddRuneSelf(s[i]) { + if s[i] >= utf8.RuneSelf { + // Character >= RuneSelf may be part of a multi-byte rune. + // They need to be decoded before we can decide how to handle them. + r, size := decodeRune(s[i:]) + if r != utf8.RuneError || size != 1 { + // No special handling required. + // Skip over this rune and continue. + i += size + continue + } + + // Invalid UTF-8 sequence. + // Replace it with the Unicode replacement character. + appendTo(buf, s[last:i]) + buf.AppendString(`\ufffd`) + i++ - continue - } - r, size := utf8.DecodeRune(s[i:]) - if enc.tryAddRuneError(r, size) { + last = i + } else { + // Character < RuneSelf is a single-byte UTF-8 rune. + if s[i] >= 0x20 && s[i] != '\\' && s[i] != '"' { + // No escaping necessary. + // Skip over this character and continue. + i++ + continue + } + + // This character needs to be escaped. + appendTo(buf, s[last:i]) + switch s[i] { + case '\\', '"': + buf.AppendByte('\\') + buf.AppendByte(s[i]) + case '\n': + buf.AppendByte('\\') + buf.AppendByte('n') + case '\r': + buf.AppendByte('\\') + buf.AppendByte('r') + case '\t': + buf.AppendByte('\\') + buf.AppendByte('t') + default: + // Encode bytes < 0x20, except for the escape sequences above. + buf.AppendString(`\u00`) + buf.AppendByte(_hex[s[i]>>4]) + buf.AppendByte(_hex[s[i]&0xF]) + } + i++ - continue + last = i } - enc.buf.Write(s[i : i+size]) - i += size } -} -// tryAddRuneSelf appends b if it is valid UTF-8 character represented in a single byte. -func (enc *jsonEncoder) tryAddRuneSelf(b byte) bool { - if b >= utf8.RuneSelf { - return false - } - if b >= 0x20 && b != '\\' && b != '"' { - enc.buf.AppendByte(b) - return true - } - switch b { - case '\\', '"': - enc.buf.AppendByte('\\') - enc.buf.AppendByte(b) - case '\n': - enc.buf.AppendByte('\\') - enc.buf.AppendByte('n') - case '\r': - enc.buf.AppendByte('\\') - enc.buf.AppendByte('r') - case '\t': - enc.buf.AppendByte('\\') - enc.buf.AppendByte('t') - default: - // Encode bytes < 0x20, except for the escape sequences above. - enc.buf.AppendString(`\u00`) - enc.buf.AppendByte(_hex[b>>4]) - enc.buf.AppendByte(_hex[b&0xF]) - } - return true -} - -func (enc *jsonEncoder) tryAddRuneError(r rune, size int) bool { - if r == utf8.RuneError && size == 1 { - enc.buf.AppendString(`\ufffd`) - return true - } - return false + // add remaining + appendTo(buf, s[last:]) } diff --git a/vendor/go.uber.org/zap/zapcore/lazy_with.go b/vendor/go.uber.org/zap/zapcore/lazy_with.go new file mode 100644 index 000000000..05288d6a8 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/lazy_with.go @@ -0,0 +1,54 @@ +// Copyright (c) 2023 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import "sync" + +type lazyWithCore struct { + Core + sync.Once + fields []Field +} + +// NewLazyWith wraps a Core with a "lazy" Core that will only encode fields if +// the logger is written to (or is further chained in a lon-lazy manner). +func NewLazyWith(core Core, fields []Field) Core { + return &lazyWithCore{ + Core: core, + fields: fields, + } +} + +func (d *lazyWithCore) initOnce() { + d.Once.Do(func() { + d.Core = d.Core.With(d.fields) + }) +} + +func (d *lazyWithCore) With(fields []Field) Core { + d.initOnce() + return d.Core.With(fields) +} + +func (d *lazyWithCore) Check(e Entry, ce *CheckedEntry) *CheckedEntry { + d.initOnce() + return d.Core.Check(e, ce) +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 798d8dc24..a8e0a37c5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -447,7 +447,7 @@ go.mongodb.org/mongo-driver/x/bsonx/bsoncore # go.uber.org/multierr v1.11.0 ## explicit; go 1.19 go.uber.org/multierr -# go.uber.org/zap v1.25.0 +# go.uber.org/zap v1.27.0 ## explicit; go 1.19 go.uber.org/zap go.uber.org/zap/buffer @@ -456,6 +456,7 @@ go.uber.org/zap/internal/bufferpool go.uber.org/zap/internal/color go.uber.org/zap/internal/exit go.uber.org/zap/internal/pool +go.uber.org/zap/internal/stacktrace go.uber.org/zap/zapcore # golang.org/x/crypto v0.18.0 ## explicit; go 1.18 From 3ad72972912397243abbe2cd4736ee3309e5492f Mon Sep 17 00:00:00 2001 From: "tao.yang" Date: Tue, 27 Feb 2024 11:01:59 +0800 Subject: [PATCH 14/34] automatically port the label from the initial cherry-picked PR Signed-off-by: tao.yang --- .github/workflows/auto-cherrypick.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/auto-cherrypick.yaml b/.github/workflows/auto-cherrypick.yaml index 07bb13ba8..ddef549f8 100644 --- a/.github/workflows/auto-cherrypick.yaml +++ b/.github/workflows/auto-cherrypick.yaml @@ -97,19 +97,25 @@ jobs: # echo "=============================== get dest branch from labels ======== " WANT_MERGE_BRANCH_LIST="" + INITIAL_LABEL="" if ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.destBranch != '' }}; then WANT_MERGE_BRANCH_LIST=${{ github.event.inputs.destBranch }} else for LABEL in ${PR_LABEL} ; do echo "checking label $LABEL " PREFIX="${{ env.PR_LABEL_PREFIX_CHERRYPICK }}" - grep -E "^${PREFIX}" <<< "${LABEL}" &>/dev/null || continue + if ! grep -E "^${PREFIX}" <<< "${LABEL}" &>/dev/null; then + INITIAL_LABEL+="${LABEL}," + continue + fi BRANCH_NAME=` sed 's?'"${PREFIX}"'??' <<< "$LABEL" ` WANT_MERGE_BRANCH_LIST+=" $BRANCH_NAME " done fi [ -z "$WANT_MERGE_BRANCH_LIST" ] && echo "no branch to cherry pick" && exit 0 echo "cherry pick to $WANT_MERGE_BRANCH_LIST " + INITIAL_LABEL="${INITIAL_LABEL%,}" + echo "INITIAL_LABEL: ${INITIAL_LABEL}" # # echo "============ begin to cherry pick ============ " @@ -196,7 +202,7 @@ jobs: git push origin ${PR_BRANCH}:${PR_BRANCH} -f gh pr create --title "${PR_TITLE}" \ --assignee "${PR_AUTHOR},${{ env.DEFAULT_REVIEWER }}" \ - --label ${{ env.CHERRYPICK_LABEL }} \ + --label "${{ env.CHERRYPICK_LABEL }},${INITIAL_LABEL}" \ --body "robot cherry pick pr <${PR_URL}> to branch ${BRANCH}, action <${ACTION_URL}> , commits $PR_COMMITS " \ --base ${BRANCH} else From 1bf7b00bdfdd4a93498a34eda2bee05d8217a1ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 10:07:19 +0000 Subject: [PATCH 15/34] build(deps): bump dorny/paths-filter from 3.0.1 to 3.0.2 Bumps [dorny/paths-filter](https://github.com/dorny/paths-filter) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/dorny/paths-filter/releases) - [Changelog](https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md) - [Commits](https://github.com/dorny/paths-filter/compare/v3.0.1...v3.0.2) --- updated-dependencies: - dependency-name: dorny/paths-filter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/auto-pr-ci.yaml | 2 +- .github/workflows/lint-codeowners.yaml | 2 +- .github/workflows/lint-golang.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/auto-pr-ci.yaml b/.github/workflows/auto-pr-ci.yaml index 5ae804ffd..8d86b7452 100644 --- a/.github/workflows/auto-pr-ci.yaml +++ b/.github/workflows/auto-pr-ci.yaml @@ -62,7 +62,7 @@ jobs: JustE2E: ${{ env.RUN_JustE2E }} steps: - name: Check Code Changes - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@v3.0.2 if: ${{ github.event_name == 'pull_request_target' }} id: filter_pr with: diff --git a/.github/workflows/lint-codeowners.yaml b/.github/workflows/lint-codeowners.yaml index f40d9ef3b..38aa3c278 100644 --- a/.github/workflows/lint-codeowners.yaml +++ b/.github/workflows/lint-codeowners.yaml @@ -22,7 +22,7 @@ jobs: codeowners-changed: ${{ steps.changes.outputs.codeowners-changed }} steps: - name: Check code changes - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@v3.0.2 id: changes with: filters: | diff --git a/.github/workflows/lint-golang.yaml b/.github/workflows/lint-golang.yaml index ffbf1891d..877970832 100644 --- a/.github/workflows/lint-golang.yaml +++ b/.github/workflows/lint-golang.yaml @@ -39,7 +39,7 @@ jobs: crd: ${{ env.RUN_CRD_CHECK }} steps: - name: Check Go Code Changes - uses: dorny/paths-filter@v3.0.1 + uses: dorny/paths-filter@v3.0.2 if: ${{ github.event_name == 'pull_request' }} id: filter_pr with: From 2f46b885d35ff6654ae5fc6e9987bda8b2c0c4c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 10:09:49 +0000 Subject: [PATCH 16/34] build(deps): bump github.com/prometheus/client_golang Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.18.0 to 1.19.0. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.18.0...v1.19.0) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 11 +- go.sum | 22 +- .../golang_protobuf_extensions/v2/LICENSE | 201 -- .../golang_protobuf_extensions/v2/NOTICE | 1 - .../v2/pbutil/.gitignore | 1 - .../v2/pbutil/Makefile | 7 - .../v2/pbutil/decode.go | 81 - .../v2/pbutil/doc.go | 16 - .../v2/pbutil/encode.go | 49 - .../prometheus/common/expfmt/decode.go | 27 +- .../prometheus/common/expfmt/encode.go | 78 +- .../prometheus/common/expfmt/expfmt.go | 144 +- .../common/expfmt/openmetrics_create.go | 85 +- .../prometheus/common/expfmt/text_create.go | 118 +- .../prometheus/common/expfmt/text_parse.go | 8 +- .../prometheus/common/model/alert.go | 4 +- .../prometheus/common/model/labels.go | 22 +- .../prometheus/common/model/metadata.go | 28 + .../prometheus/common/model/metric.go | 368 ++- .../prometheus/common/model/signature.go | 6 +- .../prometheus/common/model/silence.go | 2 +- .../prometheus/common/model/value.go | 16 +- .../prometheus/common/model/value_float.go | 14 +- .../encoding/protodelim/protodelim.go | 160 ++ .../protobuf/encoding/prototext/decode.go | 8 +- .../protobuf/encoding/prototext/encode.go | 4 +- .../protobuf/encoding/protowire/wire.go | 28 +- .../protobuf/internal/descfmt/stringer.go | 183 +- .../protobuf/internal/filedesc/desc.go | 47 +- .../protobuf/internal/genid/descriptor_gen.go | 212 +- .../protobuf/internal/impl/codec_gen.go | 113 +- .../protobuf/internal/impl/legacy_message.go | 19 +- .../protobuf/internal/impl/message.go | 17 +- .../protobuf/internal/impl/pointer_reflect.go | 36 + .../protobuf/internal/impl/pointer_unsafe.go | 40 + ...ings_unsafe.go => strings_unsafe_go120.go} | 4 +- .../internal/strs/strings_unsafe_go121.go | 74 + .../protobuf/internal/version/version.go | 2 +- .../protobuf/proto/decode.go | 2 +- .../google.golang.org/protobuf/proto/doc.go | 58 +- .../protobuf/proto/encode.go | 2 +- .../protobuf/proto/extension.go | 2 +- .../google.golang.org/protobuf/proto/merge.go | 2 +- .../google.golang.org/protobuf/proto/proto.go | 18 +- .../protobuf/reflect/protodesc/desc.go | 29 +- .../protobuf/reflect/protodesc/desc_init.go | 24 + .../protobuf/reflect/protodesc/editions.go | 177 ++ .../reflect/protodesc/editions_defaults.binpb | 4 + .../protobuf/reflect/protodesc/proto.go | 18 +- .../protobuf/reflect/protoreflect/proto.go | 83 +- .../reflect/protoreflect/source_gen.go | 62 +- .../protobuf/reflect/protoreflect/type.go | 44 +- .../protobuf/reflect/protoreflect/value.go | 24 +- .../reflect/protoreflect/value_equal.go | 8 +- .../reflect/protoreflect/value_union.go | 44 +- ...{value_unsafe.go => value_unsafe_go120.go} | 4 +- .../protoreflect/value_unsafe_go121.go | 87 + .../reflect/protoregistry/registry.go | 24 +- .../types/descriptorpb/descriptor.pb.go | 2467 ++++++++++++----- .../protobuf/types/known/anypb/any.pb.go | 3 +- vendor/modules.txt | 18 +- 61 files changed, 3926 insertions(+), 1534 deletions(-) delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/v2/LICENSE delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/v2/NOTICE delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/.gitignore delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/Makefile delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/doc.go delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go create mode 100644 vendor/github.com/prometheus/common/model/metadata.go create mode 100644 vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go rename vendor/google.golang.org/protobuf/internal/strs/{strings_unsafe.go => strings_unsafe_go120.go} (96%) create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go121.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/editions.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protodesc/editions_defaults.binpb rename vendor/google.golang.org/protobuf/reflect/protoreflect/{value_unsafe.go => value_unsafe_go120.go} (97%) create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go121.go diff --git a/go.mod b/go.mod index f0c102128..5d978487e 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/onsi/ginkgo/v2 v2.15.0 github.com/onsi/gomega v1.31.1 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.18.0 + github.com/prometheus/client_golang v1.19.0 github.com/sasha-s/go-deadlock v0.3.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 @@ -96,7 +96,6 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mdlayher/packet v1.0.0 // indirect github.com/mdlayher/socket v0.2.1 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -110,7 +109,7 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/projectcalico/api v0.0.0-20230222223746-44aa60c2201f // indirect github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -130,15 +129,15 @@ require ( golang.org/x/crypto v0.18.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/oauth2 v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.5.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.16.1 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 37c06d73b..44a0d48d8 100644 --- a/go.sum +++ b/go.sum @@ -369,8 +369,6 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/mdlayher/arp v0.0.0-20220221190821-c37aaafac7f9 h1:LxldC/UdEeJ+j3i/g5K2iPePYWXOcy6AAhCYs3VREKc= github.com/mdlayher/arp v0.0.0-20220221190821-c37aaafac7f9/go.mod h1:kfOoFJuHWp76v1RgZCb9/gVUc7XdY877S2uVYbNliGc= github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118 h1:2oDp6OOhLxQ9JBoUuysVz9UZ9uI6oLUbvAZu0x8o+vE= @@ -440,13 +438,13 @@ 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/projectcalico/api v0.0.0-20230222223746-44aa60c2201f h1:7+GPMHkGC2rlL/Le/hdDKBkIwhtBuKU467KxgLg8V34= github.com/projectcalico/api v0.0.0-20230222223746-44aa60c2201f/go.mod h1:Avoy1rTN1GfeisnHGf3WhQNqR+BuGOcwfNFsdWX6OHE= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= @@ -652,8 +650,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -666,8 +664,8 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= 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-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -934,8 +932,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/LICENSE b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/LICENSE deleted file mode 100644 index 8dada3eda..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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 {yyyy} {name of copyright owner} - - 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/vendor/github.com/matttproud/golang_protobuf_extensions/v2/NOTICE b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/NOTICE deleted file mode 100644 index 5d8cb5b72..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/NOTICE +++ /dev/null @@ -1 +0,0 @@ -Copyright 2012 Matt T. Proud (matt.proud@gmail.com) diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/.gitignore b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/.gitignore deleted file mode 100644 index e16fb946b..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/.gitignore +++ /dev/null @@ -1 +0,0 @@ -cover.dat diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/Makefile b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/Makefile deleted file mode 100644 index 81be21437..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: - -cover: - go test -cover -v -coverprofile=cover.dat ./... - go tool cover -func cover.dat - -.PHONY: cover diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go deleted file mode 100644 index 7c08e564f..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2013 Matt T. Proud -// -// 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 pbutil - -import ( - "encoding/binary" - "errors" - "io" - - "google.golang.org/protobuf/proto" -) - -// TODO: Give error package name prefix in next minor release. -var errInvalidVarint = errors.New("invalid varint32 encountered") - -// ReadDelimited decodes a message from the provided length-delimited stream, -// where the length is encoded as 32-bit varint prefix to the message body. -// It returns the total number of bytes read and any applicable error. This is -// roughly equivalent to the companion Java API's -// MessageLite#parseDelimitedFrom. As per the reader contract, this function -// calls r.Read repeatedly as required until exactly one message including its -// prefix is read and decoded (or an error has occurred). The function never -// reads more bytes from the stream than required. The function never returns -// an error if a message has been read and decoded correctly, even if the end -// of the stream has been reached in doing so. In that case, any subsequent -// calls return (0, io.EOF). -func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { - // TODO: Consider allowing the caller to specify a decode buffer in the - // next major version. - - // TODO: Consider using error wrapping to annotate error state in pass- - // through cases in the next minor version. - - // Per AbstractParser#parsePartialDelimitedFrom with - // CodedInputStream#readRawVarint32. - var headerBuf [binary.MaxVarintLen32]byte - var bytesRead, varIntBytes int - var messageLength uint64 - for varIntBytes == 0 { // i.e. no varint has been decoded yet. - if bytesRead >= len(headerBuf) { - return bytesRead, errInvalidVarint - } - // We have to read byte by byte here to avoid reading more bytes - // than required. Each read byte is appended to what we have - // read before. - newBytesRead, err := r.Read(headerBuf[bytesRead : bytesRead+1]) - if newBytesRead == 0 { - if err != nil { - return bytesRead, err - } - // A Reader should not return (0, nil); but if it does, it should - // be treated as no-op according to the Reader contract. - continue - } - bytesRead += newBytesRead - // Now present everything read so far to the varint decoder and - // see if a varint can be decoded already. - messageLength, varIntBytes = binary.Uvarint(headerBuf[:bytesRead]) - } - - messageBuf := make([]byte, messageLength) - newBytesRead, err := io.ReadFull(r, messageBuf) - bytesRead += newBytesRead - if err != nil { - return bytesRead, err - } - - return bytesRead, proto.Unmarshal(messageBuf, m) -} diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/doc.go b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/doc.go deleted file mode 100644 index c318385cb..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/doc.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2013 Matt T. Proud -// -// 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 pbutil provides record length-delimited Protocol Buffer streaming. -package pbutil diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go b/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go deleted file mode 100644 index e58dd9d29..000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2013 Matt T. Proud -// -// 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 pbutil - -import ( - "encoding/binary" - "io" - - "google.golang.org/protobuf/proto" -) - -// WriteDelimited encodes and dumps a message to the provided writer prefixed -// with a 32-bit varint indicating the length of the encoded message, producing -// a length-delimited record stream, which can be used to chain together -// encoded messages of the same type together in a file. It returns the total -// number of bytes written and any applicable error. This is roughly -// equivalent to the companion Java API's MessageLite#writeDelimitedTo. -func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) { - // TODO: Consider allowing the caller to specify an encode buffer in the - // next major version. - - buffer, err := proto.Marshal(m) - if err != nil { - return 0, err - } - - var buf [binary.MaxVarintLen32]byte - encodedLength := binary.PutUvarint(buf[:], uint64(len(buffer))) - - sync, err := w.Write(buf[:encodedLength]) - if err != nil { - return sync, err - } - - n, err = w.Write(buffer) - return n + sync, err -} diff --git a/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/prometheus/common/expfmt/decode.go index 0ca86a3dc..b2b89b017 100644 --- a/vendor/github.com/prometheus/common/expfmt/decode.go +++ b/vendor/github.com/prometheus/common/expfmt/decode.go @@ -14,6 +14,7 @@ package expfmt import ( + "bufio" "fmt" "io" "math" @@ -21,8 +22,8 @@ import ( "net/http" dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/encoding/protodelim" - "github.com/matttproud/golang_protobuf_extensions/v2/pbutil" "github.com/prometheus/common/model" ) @@ -44,7 +45,7 @@ func ResponseFormat(h http.Header) Format { mediatype, params, err := mime.ParseMediaType(ct) if err != nil { - return FmtUnknown + return fmtUnknown } const textType = "text/plain" @@ -52,28 +53,28 @@ func ResponseFormat(h http.Header) Format { switch mediatype { case ProtoType: if p, ok := params["proto"]; ok && p != ProtoProtocol { - return FmtUnknown + return fmtUnknown } if e, ok := params["encoding"]; ok && e != "delimited" { - return FmtUnknown + return fmtUnknown } - return FmtProtoDelim + return fmtProtoDelim case textType: if v, ok := params["version"]; ok && v != TextVersion { - return FmtUnknown + return fmtUnknown } - return FmtText + return fmtText } - return FmtUnknown + return fmtUnknown } // NewDecoder returns a new decoder based on the given input format. // If the input format does not imply otherwise, a text format decoder is returned. func NewDecoder(r io.Reader, format Format) Decoder { - switch format { - case FmtProtoDelim: + switch format.FormatType() { + case TypeProtoDelim: return &protoDecoder{r: r} } return &textDecoder{r: r} @@ -86,8 +87,10 @@ type protoDecoder struct { // Decode implements the Decoder interface. func (d *protoDecoder) Decode(v *dto.MetricFamily) error { - _, err := pbutil.ReadDelimited(d.r, v) - if err != nil { + opts := protodelim.UnmarshalOptions{ + MaxSize: -1, + } + if err := opts.UnmarshalFrom(bufio.NewReader(d.r), v); err != nil { return err } if !model.IsValidMetricName(model.LabelValue(v.GetName())) { diff --git a/vendor/github.com/prometheus/common/expfmt/encode.go b/vendor/github.com/prometheus/common/expfmt/encode.go index ca2140600..8fd806184 100644 --- a/vendor/github.com/prometheus/common/expfmt/encode.go +++ b/vendor/github.com/prometheus/common/expfmt/encode.go @@ -18,10 +18,12 @@ import ( "io" "net/http" - "github.com/matttproud/golang_protobuf_extensions/v2/pbutil" - "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" + "google.golang.org/protobuf/encoding/protodelim" "google.golang.org/protobuf/encoding/prototext" + "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" + "github.com/prometheus/common/model" + dto "github.com/prometheus/client_model/go" ) @@ -60,23 +62,32 @@ func (ec encoderCloser) Close() error { // as the support is still experimental. To include the option to negotiate // FmtOpenMetrics, use NegotiateOpenMetrics. func Negotiate(h http.Header) Format { + escapingScheme := Format(fmt.Sprintf("; escaping=%s", Format(model.NameEscapingScheme.String()))) for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" { + switch Format(escapeParam) { + case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues: + escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam)) + default: + // If the escaping parameter is unknown, ignore it. + } + } ver := ac.Params["version"] if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { switch ac.Params["encoding"] { case "delimited": - return FmtProtoDelim + return fmtProtoDelim + escapingScheme case "text": - return FmtProtoText + return fmtProtoText + escapingScheme case "compact-text": - return FmtProtoCompact + return fmtProtoCompact + escapingScheme } } if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { - return FmtText + return fmtText + escapingScheme } } - return FmtText + return fmtText + escapingScheme } // NegotiateIncludingOpenMetrics works like Negotiate but includes @@ -84,29 +95,40 @@ func Negotiate(h http.Header) Format { // temporary and will disappear once FmtOpenMetrics is fully supported and as // such may be negotiated by the normal Negotiate function. func NegotiateIncludingOpenMetrics(h http.Header) Format { + escapingScheme := Format(fmt.Sprintf("; escaping=%s", Format(model.NameEscapingScheme.String()))) for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" { + switch Format(escapeParam) { + case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues: + escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam)) + default: + // If the escaping parameter is unknown, ignore it. + } + } ver := ac.Params["version"] if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { switch ac.Params["encoding"] { case "delimited": - return FmtProtoDelim + return fmtProtoDelim + escapingScheme case "text": - return FmtProtoText + return fmtProtoText + escapingScheme case "compact-text": - return FmtProtoCompact + return fmtProtoCompact + escapingScheme } } if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { - return FmtText + return fmtText + escapingScheme } if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion_0_0_1 || ver == OpenMetricsVersion_1_0_0 || ver == "") { - if ver == OpenMetricsVersion_1_0_0 { - return FmtOpenMetrics_1_0_0 + switch ver { + case OpenMetricsVersion_1_0_0: + return fmtOpenMetrics_1_0_0 + escapingScheme + default: + return fmtOpenMetrics_0_0_1 + escapingScheme } - return FmtOpenMetrics_0_0_1 } } - return FmtText + return fmtText + escapingScheme } // NewEncoder returns a new encoder based on content type negotiation. All @@ -115,44 +137,48 @@ func NegotiateIncludingOpenMetrics(h http.Header) Format { // for FmtOpenMetrics, but a future (breaking) release will add the Close method // to the Encoder interface directly. The current version of the Encoder // interface is kept for backwards compatibility. +// In cases where the Format does not allow for UTF-8 names, the global +// NameEscapingScheme will be applied. func NewEncoder(w io.Writer, format Format) Encoder { - switch format { - case FmtProtoDelim: + escapingScheme := format.ToEscapingScheme() + + switch format.FormatType() { + case TypeProtoDelim: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := pbutil.WriteDelimited(w, v) + _, err := protodelim.MarshalTo(w, v) return err }, close: func() error { return nil }, } - case FmtProtoCompact: + case TypeProtoCompact: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := fmt.Fprintln(w, v.String()) + _, err := fmt.Fprintln(w, model.EscapeMetricFamily(v, escapingScheme).String()) return err }, close: func() error { return nil }, } - case FmtProtoText: + case TypeProtoText: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := fmt.Fprintln(w, prototext.Format(v)) + _, err := fmt.Fprintln(w, prototext.Format(model.EscapeMetricFamily(v, escapingScheme))) return err }, close: func() error { return nil }, } - case FmtText: + case TypeTextPlain: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := MetricFamilyToText(w, v) + _, err := MetricFamilyToText(w, model.EscapeMetricFamily(v, escapingScheme)) return err }, close: func() error { return nil }, } - case FmtOpenMetrics_0_0_1, FmtOpenMetrics_1_0_0: + case TypeOpenMetrics: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := MetricFamilyToOpenMetrics(w, v) + _, err := MetricFamilyToOpenMetrics(w, model.EscapeMetricFamily(v, escapingScheme)) return err }, close: func() error { diff --git a/vendor/github.com/prometheus/common/expfmt/expfmt.go b/vendor/github.com/prometheus/common/expfmt/expfmt.go index c4cb20f0d..6fc9555e3 100644 --- a/vendor/github.com/prometheus/common/expfmt/expfmt.go +++ b/vendor/github.com/prometheus/common/expfmt/expfmt.go @@ -14,30 +14,154 @@ // Package expfmt contains tools for reading and writing Prometheus metrics. package expfmt +import ( + "strings" + + "github.com/prometheus/common/model" +) + // Format specifies the HTTP content type of the different wire protocols. type Format string -// Constants to assemble the Content-Type values for the different wire protocols. +// Constants to assemble the Content-Type values for the different wire +// protocols. The Content-Type strings here are all for the legacy exposition +// formats, where valid characters for metric names and label names are limited. +// Support for arbitrary UTF-8 characters in those names is already partially +// implemented in this module (see model.ValidationScheme), but to actually use +// it on the wire, new content-type strings will have to be agreed upon and +// added here. const ( TextVersion = "0.0.4" ProtoType = `application/vnd.google.protobuf` ProtoProtocol = `io.prometheus.client.MetricFamily` - ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + protoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" OpenMetricsType = `application/openmetrics-text` OpenMetricsVersion_0_0_1 = "0.0.1" OpenMetricsVersion_1_0_0 = "1.0.0" - // The Content-Type values for the different wire protocols. - FmtUnknown Format = `` - FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` - FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` - FmtProtoText Format = ProtoFmt + ` encoding=text` - FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` - FmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8` - FmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8` + // The Content-Type values for the different wire protocols. Note that these + // values are now unexported. If code was relying on comparisons to these + // constants, instead use FormatType(). + fmtUnknown Format = `` + fmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` + fmtProtoDelim Format = protoFmt + ` encoding=delimited` + fmtProtoText Format = protoFmt + ` encoding=text` + fmtProtoCompact Format = protoFmt + ` encoding=compact-text` + fmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8` + fmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8` ) const ( hdrContentType = "Content-Type" hdrAccept = "Accept" ) + +// FormatType is a Go enum representing the overall category for the given +// Format. As the number of Format permutations increases, doing basic string +// comparisons are not feasible, so this enum captures the most useful +// high-level attribute of the Format string. +type FormatType int + +const ( + TypeUnknown = iota + TypeProtoCompact + TypeProtoDelim + TypeProtoText + TypeTextPlain + TypeOpenMetrics +) + +// NewFormat generates a new Format from the type provided. Mostly used for +// tests, most Formats should be generated as part of content negotiation in +// encode.go. +func NewFormat(t FormatType) Format { + switch t { + case TypeProtoCompact: + return fmtProtoCompact + case TypeProtoDelim: + return fmtProtoDelim + case TypeProtoText: + return fmtProtoText + case TypeTextPlain: + return fmtText + case TypeOpenMetrics: + return fmtOpenMetrics_1_0_0 + default: + return fmtUnknown + } +} + +// FormatType deduces an overall FormatType for the given format. +func (f Format) FormatType() FormatType { + toks := strings.Split(string(f), ";") + if len(toks) < 2 { + return TypeUnknown + } + + params := make(map[string]string) + for i, t := range toks { + if i == 0 { + continue + } + args := strings.Split(t, "=") + if len(args) != 2 { + continue + } + params[strings.TrimSpace(args[0])] = strings.TrimSpace(args[1]) + } + + switch strings.TrimSpace(toks[0]) { + case ProtoType: + if params["proto"] != ProtoProtocol { + return TypeUnknown + } + switch params["encoding"] { + case "delimited": + return TypeProtoDelim + case "text": + return TypeProtoText + case "compact-text": + return TypeProtoCompact + default: + return TypeUnknown + } + case OpenMetricsType: + if params["charset"] != "utf-8" { + return TypeUnknown + } + return TypeOpenMetrics + case "text/plain": + v, ok := params["version"] + if !ok { + return TypeTextPlain + } + if v == TextVersion { + return TypeTextPlain + } + return TypeUnknown + default: + return TypeUnknown + } +} + +// ToEscapingScheme returns an EscapingScheme depending on the Format. Iff the +// Format contains a escaping=allow-utf-8 term, it will select NoEscaping. If a valid +// "escaping" term exists, that will be used. Otherwise, the global default will +// be returned. +func (format Format) ToEscapingScheme() model.EscapingScheme { + for _, p := range strings.Split(string(format), ";") { + toks := strings.Split(p, "=") + if len(toks) != 2 { + continue + } + key, value := strings.TrimSpace(toks[0]), strings.TrimSpace(toks[1]) + if key == model.EscapingKey { + scheme, err := model.ToEscapingScheme(value) + if err != nil { + return model.NameEscapingScheme + } + return scheme + } + } + return model.NameEscapingScheme +} diff --git a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go index 21cdddcf0..5622578ed 100644 --- a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go +++ b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go @@ -35,6 +35,18 @@ import ( // sanity checks. If the input contains duplicate metrics or invalid metric or // label names, the conversion will result in invalid text format output. // +// If metric names conform to the legacy validation pattern, they will be placed +// outside the brackets in the traditional way, like `foo{}`. If the metric name +// fails the legacy validation check, it will be placed quoted inside the +// brackets: `{"foo"}`. As stated above, the input is assumed to be santized and +// no error will be thrown in this case. +// +// Similar to metric names, if label names conform to the legacy validation +// pattern, they will be unquoted as normal, like `foo{bar="baz"}`. If the label +// name fails the legacy validation check, it will be quoted: +// `foo{"bar"="baz"}`. As stated above, the input is assumed to be santized and +// no error will be thrown in this case. +// // This function fulfills the type 'expfmt.encoder'. // // Note that OpenMetrics requires a final `# EOF` line. Since this function acts @@ -98,7 +110,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int if err != nil { return } - n, err = w.WriteString(shortName) + n, err = writeName(w, shortName) written += n if err != nil { return @@ -124,7 +136,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int if err != nil { return } - n, err = w.WriteString(shortName) + n, err = writeName(w, shortName) written += n if err != nil { return @@ -303,21 +315,9 @@ func writeOpenMetricsSample( floatValue float64, intValue uint64, useIntValue bool, exemplar *dto.Exemplar, ) (int, error) { - var written int - n, err := w.WriteString(name) - written += n - if err != nil { - return written, err - } - if suffix != "" { - n, err = w.WriteString(suffix) - written += n - if err != nil { - return written, err - } - } - n, err = writeOpenMetricsLabelPairs( - w, metric.Label, additionalLabelName, additionalLabelValue, + written := 0 + n, err := writeOpenMetricsNameAndLabelPairs( + w, name+suffix, metric.Label, additionalLabelName, additionalLabelValue, ) written += n if err != nil { @@ -365,27 +365,58 @@ func writeOpenMetricsSample( return written, nil } -// writeOpenMetricsLabelPairs works like writeOpenMetrics but formats the float -// in OpenMetrics style. -func writeOpenMetricsLabelPairs( +// writeOpenMetricsNameAndLabelPairs works like writeOpenMetricsSample but +// formats the float in OpenMetrics style. +func writeOpenMetricsNameAndLabelPairs( w enhancedWriter, + name string, in []*dto.LabelPair, additionalLabelName string, additionalLabelValue float64, ) (int, error) { - if len(in) == 0 && additionalLabelName == "" { - return 0, nil - } var ( - written int - separator byte = '{' + written int + separator byte = '{' + metricInsideBraces = false ) + + if name != "" { + // If the name does not pass the legacy validity check, we must put the + // metric name inside the braces, quoted. + if !model.IsValidLegacyMetricName(model.LabelValue(name)) { + metricInsideBraces = true + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + separator = ',' + } + + n, err := writeName(w, name) + written += n + if err != nil { + return written, err + } + } + + if len(in) == 0 && additionalLabelName == "" { + if metricInsideBraces { + err := w.WriteByte('}') + written++ + if err != nil { + return written, err + } + } + return written, nil + } + for _, lp := range in { err := w.WriteByte(separator) written++ if err != nil { return written, err } - n, err := w.WriteString(lp.GetName()) + n, err := writeName(w, lp.GetName()) written += n if err != nil { return written, err @@ -451,7 +482,7 @@ func writeExemplar(w enhancedWriter, e *dto.Exemplar) (int, error) { if err != nil { return written, err } - n, err = writeOpenMetricsLabelPairs(w, e.Label, "", 0) + n, err = writeOpenMetricsNameAndLabelPairs(w, "", e.Label, "", 0) written += n if err != nil { return written, err diff --git a/vendor/github.com/prometheus/common/expfmt/text_create.go b/vendor/github.com/prometheus/common/expfmt/text_create.go index 2946b8f1a..f9b8265a9 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_create.go +++ b/vendor/github.com/prometheus/common/expfmt/text_create.go @@ -62,6 +62,18 @@ var ( // contains duplicate metrics or invalid metric or label names, the conversion // will result in invalid text format output. // +// If metric names conform to the legacy validation pattern, they will be placed +// outside the brackets in the traditional way, like `foo{}`. If the metric name +// fails the legacy validation check, it will be placed quoted inside the +// brackets: `{"foo"}`. As stated above, the input is assumed to be santized and +// no error will be thrown in this case. +// +// Similar to metric names, if label names conform to the legacy validation +// pattern, they will be unquoted as normal, like `foo{bar="baz"}`. If the label +// name fails the legacy validation check, it will be quoted: +// `foo{"bar"="baz"}`. As stated above, the input is assumed to be santized and +// no error will be thrown in this case. +// // This method fulfills the type 'prometheus.encoder'. func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err error) { // Fail-fast checks. @@ -98,7 +110,7 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e if err != nil { return } - n, err = w.WriteString(name) + n, err = writeName(w, name) written += n if err != nil { return @@ -124,7 +136,7 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e if err != nil { return } - n, err = w.WriteString(name) + n, err = writeName(w, name) written += n if err != nil { return @@ -280,21 +292,9 @@ func writeSample( additionalLabelName string, additionalLabelValue float64, value float64, ) (int, error) { - var written int - n, err := w.WriteString(name) - written += n - if err != nil { - return written, err - } - if suffix != "" { - n, err = w.WriteString(suffix) - written += n - if err != nil { - return written, err - } - } - n, err = writeLabelPairs( - w, metric.Label, additionalLabelName, additionalLabelValue, + written := 0 + n, err := writeNameAndLabelPairs( + w, name+suffix, metric.Label, additionalLabelName, additionalLabelValue, ) written += n if err != nil { @@ -330,32 +330,64 @@ func writeSample( return written, nil } -// writeLabelPairs converts a slice of LabelPair proto messages plus the -// explicitly given additional label pair into text formatted as required by the -// text format and writes it to 'w'. An empty slice in combination with an empty -// string 'additionalLabelName' results in nothing being written. Otherwise, the -// label pairs are written, escaped as required by the text format, and enclosed -// in '{...}'. The function returns the number of bytes written and any error -// encountered. -func writeLabelPairs( +// writeNameAndLabelPairs converts a slice of LabelPair proto messages plus the +// explicitly given metric name and additional label pair into text formatted as +// required by the text format and writes it to 'w'. An empty slice in +// combination with an empty string 'additionalLabelName' results in nothing +// being written. Otherwise, the label pairs are written, escaped as required by +// the text format, and enclosed in '{...}'. The function returns the number of +// bytes written and any error encountered. If the metric name is not +// legacy-valid, it will be put inside the brackets as well. Legacy-invalid +// label names will also be quoted. +func writeNameAndLabelPairs( w enhancedWriter, + name string, in []*dto.LabelPair, additionalLabelName string, additionalLabelValue float64, ) (int, error) { - if len(in) == 0 && additionalLabelName == "" { - return 0, nil - } var ( - written int - separator byte = '{' + written int + separator byte = '{' + metricInsideBraces = false ) + + if name != "" { + // If the name does not pass the legacy validity check, we must put the + // metric name inside the braces. + if !model.IsValidLegacyMetricName(model.LabelValue(name)) { + metricInsideBraces = true + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + separator = ',' + } + n, err := writeName(w, name) + written += n + if err != nil { + return written, err + } + } + + if len(in) == 0 && additionalLabelName == "" { + if metricInsideBraces { + err := w.WriteByte('}') + written++ + if err != nil { + return written, err + } + } + return written, nil + } + for _, lp := range in { err := w.WriteByte(separator) written++ if err != nil { return written, err } - n, err := w.WriteString(lp.GetName()) + n, err := writeName(w, lp.GetName()) written += n if err != nil { return written, err @@ -462,3 +494,27 @@ func writeInt(w enhancedWriter, i int64) (int, error) { numBufPool.Put(bp) return written, err } + +// writeName writes a string as-is if it complies with the legacy naming +// scheme, or escapes it in double quotes if not. +func writeName(w enhancedWriter, name string) (int, error) { + if model.IsValidLegacyMetricName(model.LabelValue(name)) { + return w.WriteString(name) + } + var written int + var err error + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + var n int + n, err = writeEscapedString(w, name, true) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + return written, err +} diff --git a/vendor/github.com/prometheus/common/expfmt/text_parse.go b/vendor/github.com/prometheus/common/expfmt/text_parse.go index 35db1cc9d..26490211a 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_parse.go +++ b/vendor/github.com/prometheus/common/expfmt/text_parse.go @@ -16,6 +16,7 @@ package expfmt import ( "bufio" "bytes" + "errors" "fmt" "io" "math" @@ -24,8 +25,9 @@ import ( dto "github.com/prometheus/client_model/go" - "github.com/prometheus/common/model" "google.golang.org/protobuf/proto" + + "github.com/prometheus/common/model" ) // A stateFn is a function that represents a state in a state machine. By @@ -112,7 +114,7 @@ func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricF // stream. Turn this error into something nicer and more // meaningful. (io.EOF is often used as a signal for the legitimate end // of an input stream.) - if p.err == io.EOF { + if p.err != nil && errors.Is(p.err, io.EOF) { p.parseError("unexpected end of input stream") } return p.metricFamiliesByName, p.err @@ -146,7 +148,7 @@ func (p *TextParser) startOfLine() stateFn { // which is not an error but the signal that we are done. // Any other error that happens to align with the start of // a line is still an error. - if p.err == io.EOF { + if errors.Is(p.err, io.EOF) { p.err = nil } return nil diff --git a/vendor/github.com/prometheus/common/model/alert.go b/vendor/github.com/prometheus/common/model/alert.go index 35e739c7a..178fdbaf6 100644 --- a/vendor/github.com/prometheus/common/model/alert.go +++ b/vendor/github.com/prometheus/common/model/alert.go @@ -90,13 +90,13 @@ func (a *Alert) Validate() error { return fmt.Errorf("start time must be before end time") } if err := a.Labels.Validate(); err != nil { - return fmt.Errorf("invalid label set: %s", err) + return fmt.Errorf("invalid label set: %w", err) } if len(a.Labels) == 0 { return fmt.Errorf("at least one label pair required") } if err := a.Annotations.Validate(); err != nil { - return fmt.Errorf("invalid annotations: %s", err) + return fmt.Errorf("invalid annotations: %w", err) } return nil } diff --git a/vendor/github.com/prometheus/common/model/labels.go b/vendor/github.com/prometheus/common/model/labels.go index ef8956335..3317ce22f 100644 --- a/vendor/github.com/prometheus/common/model/labels.go +++ b/vendor/github.com/prometheus/common/model/labels.go @@ -97,17 +97,25 @@ var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") // therewith. type LabelName string -// IsValid is true iff the label name matches the pattern of LabelNameRE. This -// method, however, does not use LabelNameRE for the check but a much faster -// hardcoded implementation. +// IsValid returns true iff name matches the pattern of LabelNameRE for legacy +// names, and iff it's valid UTF-8 if NameValidationScheme is set to +// UTF8Validation. For the legacy matching, it does not use LabelNameRE for the +// check but a much faster hardcoded implementation. func (ln LabelName) IsValid() bool { if len(ln) == 0 { return false } - for i, b := range ln { - if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { - return false + switch NameValidationScheme { + case LegacyValidation: + for i, b := range ln { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { + return false + } } + case UTF8Validation: + return utf8.ValidString(string(ln)) + default: + panic(fmt.Sprintf("Invalid name validation scheme requested: %d", NameValidationScheme)) } return true } @@ -164,7 +172,7 @@ func (l LabelNames) String() string { // A LabelValue is an associated value for a LabelName. type LabelValue string -// IsValid returns true iff the string is a valid UTF8. +// IsValid returns true iff the string is a valid UTF-8. func (lv LabelValue) IsValid() bool { return utf8.ValidString(string(lv)) } diff --git a/vendor/github.com/prometheus/common/model/metadata.go b/vendor/github.com/prometheus/common/model/metadata.go new file mode 100644 index 000000000..447ab8ad6 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/metadata.go @@ -0,0 +1,28 @@ +// Copyright 2023 The Prometheus Authors +// 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 model + +// MetricType represents metric type values. +type MetricType string + +const ( + MetricTypeCounter = MetricType("counter") + MetricTypeGauge = MetricType("gauge") + MetricTypeHistogram = MetricType("histogram") + MetricTypeGaugeHistogram = MetricType("gaugehistogram") + MetricTypeSummary = MetricType("summary") + MetricTypeInfo = MetricType("info") + MetricTypeStateset = MetricType("stateset") + MetricTypeUnknown = MetricType("unknown") +) diff --git a/vendor/github.com/prometheus/common/model/metric.go b/vendor/github.com/prometheus/common/model/metric.go index 00804b7fe..0bd29b3a3 100644 --- a/vendor/github.com/prometheus/common/model/metric.go +++ b/vendor/github.com/prometheus/common/model/metric.go @@ -18,15 +18,84 @@ import ( "regexp" "sort" "strings" + "unicode/utf8" + + dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/proto" ) var ( - // MetricNameRE is a regular expression matching valid metric - // names. Note that the IsValidMetricName function performs the same - // check but faster than a match with this regular expression. - MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) + // NameValidationScheme determines the method of name validation to be used by + // all calls to IsValidMetricName() and LabelName IsValid(). Setting UTF-8 mode + // in isolation from other components that don't support UTF-8 may result in + // bugs or other undefined behavior. This value is intended to be set by + // UTF-8-aware binaries as part of their startup. To avoid need for locking, + // this value should be set once, ideally in an init(), before multiple + // goroutines are started. + NameValidationScheme = LegacyValidation + + // NameEscapingScheme defines the default way that names will be + // escaped when presented to systems that do not support UTF-8 names. If the + // Content-Type "escaping" term is specified, that will override this value. + NameEscapingScheme = ValueEncodingEscaping +) + +// ValidationScheme is a Go enum for determining how metric and label names will +// be validated by this library. +type ValidationScheme int + +const ( + // LegacyValidation is a setting that requirets that metric and label names + // conform to the original Prometheus character requirements described by + // MetricNameRE and LabelNameRE. + LegacyValidation ValidationScheme = iota + + // UTF8Validation only requires that metric and label names be valid UTF-8 + // strings. + UTF8Validation +) + +type EscapingScheme int + +const ( + // NoEscaping indicates that a name will not be escaped. Unescaped names that + // do not conform to the legacy validity check will use a new exposition + // format syntax that will be officially standardized in future versions. + NoEscaping EscapingScheme = iota + + // UnderscoreEscaping replaces all legacy-invalid characters with underscores. + UnderscoreEscaping + + // DotsEscaping is similar to UnderscoreEscaping, except that dots are + // converted to `_dot_` and pre-existing underscores are converted to `__`. + DotsEscaping + + // ValueEncodingEscaping prepends the name with `U__` and replaces all invalid + // characters with the unicode value, surrounded by underscores. Single + // underscores are replaced with double underscores. + ValueEncodingEscaping +) + +const ( + // EscapingKey is the key in an Accept or Content-Type header that defines how + // metric and label names that do not conform to the legacy character + // requirements should be escaped when being scraped by a legacy prometheus + // system. If a system does not explicitly pass an escaping parameter in the + // Accept header, the default NameEscapingScheme will be used. + EscapingKey = "escaping" + + // Possible values for Escaping Key: + AllowUTF8 = "allow-utf-8" // No escaping required. + EscapeUnderscores = "underscores" + EscapeDots = "dots" + EscapeValues = "values" ) +// MetricNameRE is a regular expression matching valid metric +// names. Note that the IsValidMetricName function performs the same +// check but faster than a match with this regular expression. +var MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) + // A Metric is similar to a LabelSet, but the key difference is that a Metric is // a singleton and refers to one and only one stream of samples. type Metric LabelSet @@ -86,17 +155,302 @@ func (m Metric) FastFingerprint() Fingerprint { return LabelSet(m).FastFingerprint() } -// IsValidMetricName returns true iff name matches the pattern of MetricNameRE. +// IsValidMetricName returns true iff name matches the pattern of MetricNameRE +// for legacy names, and iff it's valid UTF-8 if the UTF8Validation scheme is +// selected. +func IsValidMetricName(n LabelValue) bool { + switch NameValidationScheme { + case LegacyValidation: + return IsValidLegacyMetricName(n) + case UTF8Validation: + if len(n) == 0 { + return false + } + return utf8.ValidString(string(n)) + default: + panic(fmt.Sprintf("Invalid name validation scheme requested: %d", NameValidationScheme)) + } +} + +// IsValidLegacyMetricName is similar to IsValidMetricName but always uses the +// legacy validation scheme regardless of the value of NameValidationScheme. // This function, however, does not use MetricNameRE for the check but a much // faster hardcoded implementation. -func IsValidMetricName(n LabelValue) bool { +func IsValidLegacyMetricName(n LabelValue) bool { if len(n) == 0 { return false } for i, b := range n { - if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) { + if !isValidLegacyRune(b, i) { return false } } return true } + +// EscapeMetricFamily escapes the given metric names and labels with the given +// escaping scheme. Returns a new object that uses the same pointers to fields +// when possible and creates new escaped versions so as not to mutate the +// input. +func EscapeMetricFamily(v *dto.MetricFamily, scheme EscapingScheme) *dto.MetricFamily { + if v == nil { + return nil + } + + if scheme == NoEscaping { + return v + } + + out := &dto.MetricFamily{ + Help: v.Help, + Type: v.Type, + } + + // If the name is nil, copy as-is, don't try to escape. + if v.Name == nil || IsValidLegacyMetricName(LabelValue(v.GetName())) { + out.Name = v.Name + } else { + out.Name = proto.String(EscapeName(v.GetName(), scheme)) + } + for _, m := range v.Metric { + if !metricNeedsEscaping(m) { + out.Metric = append(out.Metric, m) + continue + } + + escaped := &dto.Metric{ + Gauge: m.Gauge, + Counter: m.Counter, + Summary: m.Summary, + Untyped: m.Untyped, + Histogram: m.Histogram, + TimestampMs: m.TimestampMs, + } + + for _, l := range m.Label { + if l.GetName() == MetricNameLabel { + if l.Value == nil || IsValidLegacyMetricName(LabelValue(l.GetValue())) { + escaped.Label = append(escaped.Label, l) + continue + } + escaped.Label = append(escaped.Label, &dto.LabelPair{ + Name: proto.String(MetricNameLabel), + Value: proto.String(EscapeName(l.GetValue(), scheme)), + }) + continue + } + if l.Name == nil || IsValidLegacyMetricName(LabelValue(l.GetName())) { + escaped.Label = append(escaped.Label, l) + continue + } + escaped.Label = append(escaped.Label, &dto.LabelPair{ + Name: proto.String(EscapeName(l.GetName(), scheme)), + Value: l.Value, + }) + } + out.Metric = append(out.Metric, escaped) + } + return out +} + +func metricNeedsEscaping(m *dto.Metric) bool { + for _, l := range m.Label { + if l.GetName() == MetricNameLabel && !IsValidLegacyMetricName(LabelValue(l.GetValue())) { + return true + } + if !IsValidLegacyMetricName(LabelValue(l.GetName())) { + return true + } + } + return false +} + +const ( + lowerhex = "0123456789abcdef" +) + +// EscapeName escapes the incoming name according to the provided escaping +// scheme. Depending on the rules of escaping, this may cause no change in the +// string that is returned. (Especially NoEscaping, which by definition is a +// noop). This function does not do any validation of the name. +func EscapeName(name string, scheme EscapingScheme) string { + if len(name) == 0 { + return name + } + var escaped strings.Builder + switch scheme { + case NoEscaping: + return name + case UnderscoreEscaping: + if IsValidLegacyMetricName(LabelValue(name)) { + return name + } + for i, b := range name { + if isValidLegacyRune(b, i) { + escaped.WriteRune(b) + } else { + escaped.WriteRune('_') + } + } + return escaped.String() + case DotsEscaping: + // Do not early return for legacy valid names, we still escape underscores. + for i, b := range name { + if b == '_' { + escaped.WriteString("__") + } else if b == '.' { + escaped.WriteString("_dot_") + } else if isValidLegacyRune(b, i) { + escaped.WriteRune(b) + } else { + escaped.WriteRune('_') + } + } + return escaped.String() + case ValueEncodingEscaping: + if IsValidLegacyMetricName(LabelValue(name)) { + return name + } + escaped.WriteString("U__") + for i, b := range name { + if isValidLegacyRune(b, i) { + escaped.WriteRune(b) + } else if !utf8.ValidRune(b) { + escaped.WriteString("_FFFD_") + } else if b < 0x100 { + escaped.WriteRune('_') + for s := 4; s >= 0; s -= 4 { + escaped.WriteByte(lowerhex[b>>uint(s)&0xF]) + } + escaped.WriteRune('_') + } else if b < 0x10000 { + escaped.WriteRune('_') + for s := 12; s >= 0; s -= 4 { + escaped.WriteByte(lowerhex[b>>uint(s)&0xF]) + } + escaped.WriteRune('_') + } + } + return escaped.String() + default: + panic(fmt.Sprintf("invalid escaping scheme %d", scheme)) + } +} + +// lower function taken from strconv.atoi +func lower(c byte) byte { + return c | ('x' - 'X') +} + +// UnescapeName unescapes the incoming name according to the provided escaping +// scheme if possible. Some schemes are partially or totally non-roundtripable. +// If any error is enountered, returns the original input. +func UnescapeName(name string, scheme EscapingScheme) string { + if len(name) == 0 { + return name + } + switch scheme { + case NoEscaping: + return name + case UnderscoreEscaping: + // It is not possible to unescape from underscore replacement. + return name + case DotsEscaping: + name = strings.ReplaceAll(name, "_dot_", ".") + name = strings.ReplaceAll(name, "__", "_") + return name + case ValueEncodingEscaping: + escapedName, found := strings.CutPrefix(name, "U__") + if !found { + return name + } + + var unescaped strings.Builder + TOP: + for i := 0; i < len(escapedName); i++ { + // All non-underscores are treated normally. + if escapedName[i] != '_' { + unescaped.WriteByte(escapedName[i]) + continue + } + i++ + if i >= len(escapedName) { + return name + } + // A double underscore is a single underscore. + if escapedName[i] == '_' { + unescaped.WriteByte('_') + continue + } + // We think we are in a UTF-8 code, process it. + var utf8Val uint + for j := 0; i < len(escapedName); j++ { + // This is too many characters for a utf8 value. + if j > 4 { + return name + } + // Found a closing underscore, convert to a rune, check validity, and append. + if escapedName[i] == '_' { + utf8Rune := rune(utf8Val) + if !utf8.ValidRune(utf8Rune) { + return name + } + unescaped.WriteRune(utf8Rune) + continue TOP + } + r := lower(escapedName[i]) + utf8Val *= 16 + if r >= '0' && r <= '9' { + utf8Val += uint(r) - '0' + } else if r >= 'a' && r <= 'f' { + utf8Val += uint(r) - 'a' + 10 + } else { + return name + } + i++ + } + // Didn't find closing underscore, invalid. + return name + } + return unescaped.String() + default: + panic(fmt.Sprintf("invalid escaping scheme %d", scheme)) + } +} + +func isValidLegacyRune(b rune, i int) bool { + return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0) +} + +func (e EscapingScheme) String() string { + switch e { + case NoEscaping: + return AllowUTF8 + case UnderscoreEscaping: + return EscapeUnderscores + case DotsEscaping: + return EscapeDots + case ValueEncodingEscaping: + return EscapeValues + default: + panic(fmt.Sprintf("unknown format scheme %d", e)) + } +} + +func ToEscapingScheme(s string) (EscapingScheme, error) { + if s == "" { + return NoEscaping, fmt.Errorf("got empty string instead of escaping scheme") + } + switch s { + case AllowUTF8: + return NoEscaping, nil + case EscapeUnderscores: + return UnderscoreEscaping, nil + case EscapeDots: + return DotsEscaping, nil + case EscapeValues: + return ValueEncodingEscaping, nil + default: + return NoEscaping, fmt.Errorf("unknown format scheme " + s) + } +} diff --git a/vendor/github.com/prometheus/common/model/signature.go b/vendor/github.com/prometheus/common/model/signature.go index 8762b13c6..dc8a0026c 100644 --- a/vendor/github.com/prometheus/common/model/signature.go +++ b/vendor/github.com/prometheus/common/model/signature.go @@ -22,10 +22,8 @@ import ( // when calculating their combined hash value (aka signature aka fingerprint). const SeparatorByte byte = 255 -var ( - // cache the signature of an empty label set. - emptyLabelSignature = hashNew() -) +// cache the signature of an empty label set. +var emptyLabelSignature = hashNew() // LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a // given label set. (Collisions are possible but unlikely if the number of label diff --git a/vendor/github.com/prometheus/common/model/silence.go b/vendor/github.com/prometheus/common/model/silence.go index bb99889d2..910b0b71f 100644 --- a/vendor/github.com/prometheus/common/model/silence.go +++ b/vendor/github.com/prometheus/common/model/silence.go @@ -81,7 +81,7 @@ func (s *Silence) Validate() error { } for _, m := range s.Matchers { if err := m.Validate(); err != nil { - return fmt.Errorf("invalid matcher: %s", err) + return fmt.Errorf("invalid matcher: %w", err) } } if s.StartsAt.IsZero() { diff --git a/vendor/github.com/prometheus/common/model/value.go b/vendor/github.com/prometheus/common/model/value.go index 9eb440413..8050637d8 100644 --- a/vendor/github.com/prometheus/common/model/value.go +++ b/vendor/github.com/prometheus/common/model/value.go @@ -21,14 +21,12 @@ import ( "strings" ) -var ( - // ZeroSample is the pseudo zero-value of Sample used to signal a - // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, - // and metric nil. Note that the natural zero value of Sample has a timestamp - // of 0, which is possible to appear in a real Sample and thus not suitable - // to signal a non-existing Sample. - ZeroSample = Sample{Timestamp: Earliest} -) +// ZeroSample is the pseudo zero-value of Sample used to signal a +// non-existing sample. It is a Sample with timestamp Earliest, value 0.0, +// and metric nil. Note that the natural zero value of Sample has a timestamp +// of 0, which is possible to appear in a real Sample and thus not suitable +// to signal a non-existing Sample. +var ZeroSample = Sample{Timestamp: Earliest} // Sample is a sample pair associated with a metric. A single sample must either // define Value or Histogram but not both. Histogram == nil implies the Value @@ -274,7 +272,7 @@ func (s *Scalar) UnmarshalJSON(b []byte) error { value, err := strconv.ParseFloat(f, 64) if err != nil { - return fmt.Errorf("error parsing sample value: %s", err) + return fmt.Errorf("error parsing sample value: %w", err) } s.Value = SampleValue(value) return nil diff --git a/vendor/github.com/prometheus/common/model/value_float.go b/vendor/github.com/prometheus/common/model/value_float.go index 0f615a705..ae35cc2ab 100644 --- a/vendor/github.com/prometheus/common/model/value_float.go +++ b/vendor/github.com/prometheus/common/model/value_float.go @@ -20,14 +20,12 @@ import ( "strconv" ) -var ( - // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a - // non-existing sample pair. It is a SamplePair with timestamp Earliest and - // value 0.0. Note that the natural zero value of SamplePair has a timestamp - // of 0, which is possible to appear in a real SamplePair and thus not - // suitable to signal a non-existing SamplePair. - ZeroSamplePair = SamplePair{Timestamp: Earliest} -) +// ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a +// non-existing sample pair. It is a SamplePair with timestamp Earliest and +// value 0.0. Note that the natural zero value of SamplePair has a timestamp +// of 0, which is possible to appear in a real SamplePair and thus not +// suitable to signal a non-existing SamplePair. +var ZeroSamplePair = SamplePair{Timestamp: Earliest} // A SampleValue is a representation of a value for a given sample at a given // time. diff --git a/vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go b/vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go new file mode 100644 index 000000000..2ef36bbcf --- /dev/null +++ b/vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go @@ -0,0 +1,160 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package protodelim marshals and unmarshals varint size-delimited messages. +package protodelim + +import ( + "bufio" + "encoding/binary" + "fmt" + "io" + + "google.golang.org/protobuf/encoding/protowire" + "google.golang.org/protobuf/internal/errors" + "google.golang.org/protobuf/proto" +) + +// MarshalOptions is a configurable varint size-delimited marshaler. +type MarshalOptions struct{ proto.MarshalOptions } + +// MarshalTo writes a varint size-delimited wire-format message to w. +// If w returns an error, MarshalTo returns it unchanged. +func (o MarshalOptions) MarshalTo(w io.Writer, m proto.Message) (int, error) { + msgBytes, err := o.MarshalOptions.Marshal(m) + if err != nil { + return 0, err + } + + sizeBytes := protowire.AppendVarint(nil, uint64(len(msgBytes))) + sizeWritten, err := w.Write(sizeBytes) + if err != nil { + return sizeWritten, err + } + msgWritten, err := w.Write(msgBytes) + if err != nil { + return sizeWritten + msgWritten, err + } + return sizeWritten + msgWritten, nil +} + +// MarshalTo writes a varint size-delimited wire-format message to w +// with the default options. +// +// See the documentation for [MarshalOptions.MarshalTo]. +func MarshalTo(w io.Writer, m proto.Message) (int, error) { + return MarshalOptions{}.MarshalTo(w, m) +} + +// UnmarshalOptions is a configurable varint size-delimited unmarshaler. +type UnmarshalOptions struct { + proto.UnmarshalOptions + + // MaxSize is the maximum size in wire-format bytes of a single message. + // Unmarshaling a message larger than MaxSize will return an error. + // A zero MaxSize will default to 4 MiB. + // Setting MaxSize to -1 disables the limit. + MaxSize int64 +} + +const defaultMaxSize = 4 << 20 // 4 MiB, corresponds to the default gRPC max request/response size + +// SizeTooLargeError is an error that is returned when the unmarshaler encounters a message size +// that is larger than its configured [UnmarshalOptions.MaxSize]. +type SizeTooLargeError struct { + // Size is the varint size of the message encountered + // that was larger than the provided MaxSize. + Size uint64 + + // MaxSize is the MaxSize limit configured in UnmarshalOptions, which Size exceeded. + MaxSize uint64 +} + +func (e *SizeTooLargeError) Error() string { + return fmt.Sprintf("message size %d exceeded unmarshaler's maximum configured size %d", e.Size, e.MaxSize) +} + +// Reader is the interface expected by [UnmarshalFrom]. +// It is implemented by *[bufio.Reader]. +type Reader interface { + io.Reader + io.ByteReader +} + +// UnmarshalFrom parses and consumes a varint size-delimited wire-format message +// from r. +// The provided message must be mutable (e.g., a non-nil pointer to a message). +// +// The error is [io.EOF] error only if no bytes are read. +// If an EOF happens after reading some but not all the bytes, +// UnmarshalFrom returns a non-io.EOF error. +// In particular if r returns a non-io.EOF error, UnmarshalFrom returns it unchanged, +// and if only a size is read with no subsequent message, [io.ErrUnexpectedEOF] is returned. +func (o UnmarshalOptions) UnmarshalFrom(r Reader, m proto.Message) error { + var sizeArr [binary.MaxVarintLen64]byte + sizeBuf := sizeArr[:0] + for i := range sizeArr { + b, err := r.ReadByte() + if err != nil { + // Immediate EOF is unexpected. + if err == io.EOF && i != 0 { + break + } + return err + } + sizeBuf = append(sizeBuf, b) + if b < 0x80 { + break + } + } + size, n := protowire.ConsumeVarint(sizeBuf) + if n < 0 { + return protowire.ParseError(n) + } + + maxSize := o.MaxSize + if maxSize == 0 { + maxSize = defaultMaxSize + } + if maxSize != -1 && size > uint64(maxSize) { + return errors.Wrap(&SizeTooLargeError{Size: size, MaxSize: uint64(maxSize)}, "") + } + + var b []byte + var err error + if br, ok := r.(*bufio.Reader); ok { + // Use the []byte from the bufio.Reader instead of having to allocate one. + // This reduces CPU usage and allocated bytes. + b, err = br.Peek(int(size)) + if err == nil { + defer br.Discard(int(size)) + } else { + b = nil + } + } + if b == nil { + b = make([]byte, size) + _, err = io.ReadFull(r, b) + } + + if err == io.EOF { + return io.ErrUnexpectedEOF + } + if err != nil { + return err + } + if err := o.Unmarshal(b, m); err != nil { + return err + } + return nil +} + +// UnmarshalFrom parses and consumes a varint size-delimited wire-format message +// from r with the default options. +// The provided message must be mutable (e.g., a non-nil pointer to a message). +// +// See the documentation for [UnmarshalOptions.UnmarshalFrom]. +func UnmarshalFrom(r Reader, m proto.Message) error { + return UnmarshalOptions{}.UnmarshalFrom(r, m) +} diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go index 4921b2d4a..a45f112bc 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go @@ -21,7 +21,7 @@ import ( "google.golang.org/protobuf/reflect/protoregistry" ) -// Unmarshal reads the given []byte into the given proto.Message. +// Unmarshal reads the given []byte into the given [proto.Message]. // The provided message must be mutable (e.g., a non-nil pointer to a message). func Unmarshal(b []byte, m proto.Message) error { return UnmarshalOptions{}.Unmarshal(b, m) @@ -51,7 +51,7 @@ type UnmarshalOptions struct { } } -// Unmarshal reads the given []byte and populates the given proto.Message +// Unmarshal reads the given []byte and populates the given [proto.Message] // using options in the UnmarshalOptions object. // The provided message must be mutable (e.g., a non-nil pointer to a message). func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error { @@ -739,7 +739,9 @@ func (d decoder) skipValue() error { case text.ListClose: return nil case text.MessageOpen: - return d.skipMessageValue() + if err := d.skipMessageValue(); err != nil { + return err + } default: // Skip items. This will not validate whether skipped values are // of the same type or not, same behavior as C++ diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go index 722a7b41d..95967e811 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go @@ -33,7 +33,7 @@ func Format(m proto.Message) string { return MarshalOptions{Multiline: true}.Format(m) } -// Marshal writes the given proto.Message in textproto format using default +// Marshal writes the given [proto.Message] in textproto format using default // options. Do not depend on the output being stable. It may change over time // across different versions of the program. func Marshal(m proto.Message) ([]byte, error) { @@ -97,7 +97,7 @@ func (o MarshalOptions) Format(m proto.Message) string { return string(b) } -// Marshal writes the given proto.Message in textproto format using options in +// Marshal writes the given [proto.Message] in textproto format using options in // MarshalOptions object. Do not depend on the output being stable. It may // change over time across different versions of the program. func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { diff --git a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go index f4b4686cf..e942bc983 100644 --- a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +++ b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go @@ -6,7 +6,7 @@ // See https://protobuf.dev/programming-guides/encoding. // // For marshaling and unmarshaling entire protobuf messages, -// use the "google.golang.org/protobuf/proto" package instead. +// use the [google.golang.org/protobuf/proto] package instead. package protowire import ( @@ -87,7 +87,7 @@ func ParseError(n int) error { // ConsumeField parses an entire field record (both tag and value) and returns // the field number, the wire type, and the total length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). // // The total length includes the tag header and the end group marker (if the // field is a group). @@ -104,8 +104,8 @@ func ConsumeField(b []byte) (Number, Type, int) { } // ConsumeFieldValue parses a field value and returns its length. -// This assumes that the field Number and wire Type have already been parsed. -// This returns a negative length upon an error (see ParseError). +// This assumes that the field [Number] and wire [Type] have already been parsed. +// This returns a negative length upon an error (see [ParseError]). // // When parsing a group, the length includes the end group marker and // the end group is verified to match the starting field number. @@ -164,7 +164,7 @@ func AppendTag(b []byte, num Number, typ Type) []byte { } // ConsumeTag parses b as a varint-encoded tag, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeTag(b []byte) (Number, Type, int) { v, n := ConsumeVarint(b) if n < 0 { @@ -263,7 +263,7 @@ func AppendVarint(b []byte, v uint64) []byte { } // ConsumeVarint parses b as a varint-encoded uint64, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeVarint(b []byte) (v uint64, n int) { var y uint64 if len(b) <= 0 { @@ -384,7 +384,7 @@ func AppendFixed32(b []byte, v uint32) []byte { } // ConsumeFixed32 parses b as a little-endian uint32, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeFixed32(b []byte) (v uint32, n int) { if len(b) < 4 { return 0, errCodeTruncated @@ -412,7 +412,7 @@ func AppendFixed64(b []byte, v uint64) []byte { } // ConsumeFixed64 parses b as a little-endian uint64, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeFixed64(b []byte) (v uint64, n int) { if len(b) < 8 { return 0, errCodeTruncated @@ -432,7 +432,7 @@ func AppendBytes(b []byte, v []byte) []byte { } // ConsumeBytes parses b as a length-prefixed bytes value, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeBytes(b []byte) (v []byte, n int) { m, n := ConsumeVarint(b) if n < 0 { @@ -456,7 +456,7 @@ func AppendString(b []byte, v string) []byte { } // ConsumeString parses b as a length-prefixed bytes value, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeString(b []byte) (v string, n int) { bb, n := ConsumeBytes(b) return string(bb), n @@ -471,7 +471,7 @@ func AppendGroup(b []byte, num Number, v []byte) []byte { // ConsumeGroup parses b as a group value until the trailing end group marker, // and verifies that the end marker matches the provided num. The value v // does not contain the end marker, while the length does contain the end marker. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]). func ConsumeGroup(num Number, b []byte) (v []byte, n int) { n = ConsumeFieldValue(num, StartGroupType, b) if n < 0 { @@ -495,8 +495,8 @@ func SizeGroup(num Number, n int) int { return n + SizeTag(num) } -// DecodeTag decodes the field Number and wire Type from its unified form. -// The Number is -1 if the decoded field number overflows int32. +// DecodeTag decodes the field [Number] and wire [Type] from its unified form. +// The [Number] is -1 if the decoded field number overflows int32. // Other than overflow, this does not check for field number validity. func DecodeTag(x uint64) (Number, Type) { // NOTE: MessageSet allows for larger field numbers than normal. @@ -506,7 +506,7 @@ func DecodeTag(x uint64) (Number, Type) { return Number(x >> 3), Type(x & 7) } -// EncodeTag encodes the field Number and wire Type into its unified form. +// EncodeTag encodes the field [Number] and wire [Type] into its unified form. func EncodeTag(num Number, typ Type) uint64 { return uint64(num)<<3 | uint64(typ&7) } diff --git a/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go b/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go index db5248e1b..a45625c8d 100644 --- a/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +++ b/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go @@ -83,7 +83,13 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { case protoreflect.FileImports: for i := 0; i < vs.Len(); i++ { var rs records - rs.Append(reflect.ValueOf(vs.Get(i)), "Path", "Package", "IsPublic", "IsWeak") + rv := reflect.ValueOf(vs.Get(i)) + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Path"), "Path"}, + {rv.MethodByName("Package"), "Package"}, + {rv.MethodByName("IsPublic"), "IsPublic"}, + {rv.MethodByName("IsWeak"), "IsWeak"}, + }...) ss = append(ss, "{"+rs.Join()+"}") } return start + joinStrings(ss, allowMulti) + end @@ -92,34 +98,26 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { for i := 0; i < vs.Len(); i++ { m := reflect.ValueOf(vs).MethodByName("Get") v := m.Call([]reflect.Value{reflect.ValueOf(i)})[0].Interface() - ss = append(ss, formatDescOpt(v.(protoreflect.Descriptor), false, allowMulti && !isEnumValue)) + ss = append(ss, formatDescOpt(v.(protoreflect.Descriptor), false, allowMulti && !isEnumValue, nil)) } return start + joinStrings(ss, allowMulti && isEnumValue) + end } } -// descriptorAccessors is a list of accessors to print for each descriptor. -// -// Do not print all accessors since some contain redundant information, -// while others are pointers that we do not want to follow since the descriptor -// is actually a cyclic graph. -// -// Using a list allows us to print the accessors in a sensible order. -var descriptorAccessors = map[reflect.Type][]string{ - reflect.TypeOf((*protoreflect.FileDescriptor)(nil)).Elem(): {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"}, - reflect.TypeOf((*protoreflect.MessageDescriptor)(nil)).Elem(): {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"}, - reflect.TypeOf((*protoreflect.FieldDescriptor)(nil)).Elem(): {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "HasPresence", "IsExtension", "IsPacked", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"}, - reflect.TypeOf((*protoreflect.OneofDescriptor)(nil)).Elem(): {"Fields"}, // not directly used; must keep in sync with formatDescOpt - reflect.TypeOf((*protoreflect.EnumDescriptor)(nil)).Elem(): {"Values", "ReservedNames", "ReservedRanges"}, - reflect.TypeOf((*protoreflect.EnumValueDescriptor)(nil)).Elem(): {"Number"}, - reflect.TypeOf((*protoreflect.ServiceDescriptor)(nil)).Elem(): {"Methods"}, - reflect.TypeOf((*protoreflect.MethodDescriptor)(nil)).Elem(): {"Input", "Output", "IsStreamingClient", "IsStreamingServer"}, +type methodAndName struct { + method reflect.Value + name string } func FormatDesc(s fmt.State, r rune, t protoreflect.Descriptor) { - io.WriteString(s, formatDescOpt(t, true, r == 'v' && (s.Flag('+') || s.Flag('#')))) + io.WriteString(s, formatDescOpt(t, true, r == 'v' && (s.Flag('+') || s.Flag('#')), nil)) } -func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { + +func InternalFormatDescOptForTesting(t protoreflect.Descriptor, isRoot, allowMulti bool, record func(string)) string { + return formatDescOpt(t, isRoot, allowMulti, record) +} + +func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool, record func(string)) string { rv := reflect.ValueOf(t) rt := rv.MethodByName("ProtoType").Type().In(0) @@ -129,26 +127,60 @@ func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { } _, isFile := t.(protoreflect.FileDescriptor) - rs := records{allowMulti: allowMulti} + rs := records{ + allowMulti: allowMulti, + record: record, + } if t.IsPlaceholder() { if isFile { - rs.Append(rv, "Path", "Package", "IsPlaceholder") + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Path"), "Path"}, + {rv.MethodByName("Package"), "Package"}, + {rv.MethodByName("IsPlaceholder"), "IsPlaceholder"}, + }...) } else { - rs.Append(rv, "FullName", "IsPlaceholder") + rs.Append(rv, []methodAndName{ + {rv.MethodByName("FullName"), "FullName"}, + {rv.MethodByName("IsPlaceholder"), "IsPlaceholder"}, + }...) } } else { switch { case isFile: - rs.Append(rv, "Syntax") + rs.Append(rv, methodAndName{rv.MethodByName("Syntax"), "Syntax"}) case isRoot: - rs.Append(rv, "Syntax", "FullName") + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Syntax"), "Syntax"}, + {rv.MethodByName("FullName"), "FullName"}, + }...) default: - rs.Append(rv, "Name") + rs.Append(rv, methodAndName{rv.MethodByName("Name"), "Name"}) } switch t := t.(type) { case protoreflect.FieldDescriptor: - for _, s := range descriptorAccessors[rt] { - switch s { + accessors := []methodAndName{ + {rv.MethodByName("Number"), "Number"}, + {rv.MethodByName("Cardinality"), "Cardinality"}, + {rv.MethodByName("Kind"), "Kind"}, + {rv.MethodByName("HasJSONName"), "HasJSONName"}, + {rv.MethodByName("JSONName"), "JSONName"}, + {rv.MethodByName("HasPresence"), "HasPresence"}, + {rv.MethodByName("IsExtension"), "IsExtension"}, + {rv.MethodByName("IsPacked"), "IsPacked"}, + {rv.MethodByName("IsWeak"), "IsWeak"}, + {rv.MethodByName("IsList"), "IsList"}, + {rv.MethodByName("IsMap"), "IsMap"}, + {rv.MethodByName("MapKey"), "MapKey"}, + {rv.MethodByName("MapValue"), "MapValue"}, + {rv.MethodByName("HasDefault"), "HasDefault"}, + {rv.MethodByName("Default"), "Default"}, + {rv.MethodByName("ContainingOneof"), "ContainingOneof"}, + {rv.MethodByName("ContainingMessage"), "ContainingMessage"}, + {rv.MethodByName("Message"), "Message"}, + {rv.MethodByName("Enum"), "Enum"}, + } + for _, s := range accessors { + switch s.name { case "MapKey": if k := t.MapKey(); k != nil { rs.recs = append(rs.recs, [2]string{"MapKey", k.Kind().String()}) @@ -157,20 +189,20 @@ func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { if v := t.MapValue(); v != nil { switch v.Kind() { case protoreflect.EnumKind: - rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Enum().FullName())}) + rs.AppendRecs("MapValue", [2]string{"MapValue", string(v.Enum().FullName())}) case protoreflect.MessageKind, protoreflect.GroupKind: - rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Message().FullName())}) + rs.AppendRecs("MapValue", [2]string{"MapValue", string(v.Message().FullName())}) default: - rs.recs = append(rs.recs, [2]string{"MapValue", v.Kind().String()}) + rs.AppendRecs("MapValue", [2]string{"MapValue", v.Kind().String()}) } } case "ContainingOneof": if od := t.ContainingOneof(); od != nil { - rs.recs = append(rs.recs, [2]string{"Oneof", string(od.Name())}) + rs.AppendRecs("ContainingOneof", [2]string{"Oneof", string(od.Name())}) } case "ContainingMessage": if t.IsExtension() { - rs.recs = append(rs.recs, [2]string{"Extendee", string(t.ContainingMessage().FullName())}) + rs.AppendRecs("ContainingMessage", [2]string{"Extendee", string(t.ContainingMessage().FullName())}) } case "Message": if !t.IsMap() { @@ -187,13 +219,61 @@ func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { ss = append(ss, string(fs.Get(i).Name())) } if len(ss) > 0 { - rs.recs = append(rs.recs, [2]string{"Fields", "[" + joinStrings(ss, false) + "]"}) + rs.AppendRecs("Fields", [2]string{"Fields", "[" + joinStrings(ss, false) + "]"}) } - default: - rs.Append(rv, descriptorAccessors[rt]...) + + case protoreflect.FileDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Path"), "Path"}, + {rv.MethodByName("Package"), "Package"}, + {rv.MethodByName("Imports"), "Imports"}, + {rv.MethodByName("Messages"), "Messages"}, + {rv.MethodByName("Enums"), "Enums"}, + {rv.MethodByName("Extensions"), "Extensions"}, + {rv.MethodByName("Services"), "Services"}, + }...) + + case protoreflect.MessageDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("IsMapEntry"), "IsMapEntry"}, + {rv.MethodByName("Fields"), "Fields"}, + {rv.MethodByName("Oneofs"), "Oneofs"}, + {rv.MethodByName("ReservedNames"), "ReservedNames"}, + {rv.MethodByName("ReservedRanges"), "ReservedRanges"}, + {rv.MethodByName("RequiredNumbers"), "RequiredNumbers"}, + {rv.MethodByName("ExtensionRanges"), "ExtensionRanges"}, + {rv.MethodByName("Messages"), "Messages"}, + {rv.MethodByName("Enums"), "Enums"}, + {rv.MethodByName("Extensions"), "Extensions"}, + }...) + + case protoreflect.EnumDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Values"), "Values"}, + {rv.MethodByName("ReservedNames"), "ReservedNames"}, + {rv.MethodByName("ReservedRanges"), "ReservedRanges"}, + }...) + + case protoreflect.EnumValueDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Number"), "Number"}, + }...) + + case protoreflect.ServiceDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Methods"), "Methods"}, + }...) + + case protoreflect.MethodDescriptor: + rs.Append(rv, []methodAndName{ + {rv.MethodByName("Input"), "Input"}, + {rv.MethodByName("Output"), "Output"}, + {rv.MethodByName("IsStreamingClient"), "IsStreamingClient"}, + {rv.MethodByName("IsStreamingServer"), "IsStreamingServer"}, + }...) } - if rv.MethodByName("GoType").IsValid() { - rs.Append(rv, "GoType") + if m := rv.MethodByName("GoType"); m.IsValid() { + rs.Append(rv, methodAndName{m, "GoType"}) } } return start + rs.Join() + end @@ -202,19 +282,34 @@ func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { type records struct { recs [][2]string allowMulti bool + + // record is a function that will be called for every Append() or + // AppendRecs() call, to be used for testing with the + // InternalFormatDescOptForTesting function. + record func(string) } -func (rs *records) Append(v reflect.Value, accessors ...string) { +func (rs *records) AppendRecs(fieldName string, newRecs [2]string) { + if rs.record != nil { + rs.record(fieldName) + } + rs.recs = append(rs.recs, newRecs) +} + +func (rs *records) Append(v reflect.Value, accessors ...methodAndName) { for _, a := range accessors { + if rs.record != nil { + rs.record(a.name) + } var rv reflect.Value - if m := v.MethodByName(a); m.IsValid() { - rv = m.Call(nil)[0] + if a.method.IsValid() { + rv = a.method.Call(nil)[0] } if v.Kind() == reflect.Struct && !rv.IsValid() { - rv = v.FieldByName(a) + rv = v.FieldByName(a.name) } if !rv.IsValid() { - panic(fmt.Sprintf("unknown accessor: %v.%s", v.Type(), a)) + panic(fmt.Sprintf("unknown accessor: %v.%s", v.Type(), a.name)) } if _, ok := rv.Interface().(protoreflect.Value); ok { rv = rv.MethodByName("Interface").Call(nil)[0] @@ -261,7 +356,7 @@ func (rs *records) Append(v reflect.Value, accessors ...string) { default: s = fmt.Sprint(v) } - rs.recs = append(rs.recs, [2]string{a, s}) + rs.recs = append(rs.recs, [2]string{a.name, s}) } } diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go index 7c3689bae..193c68e8f 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go @@ -21,11 +21,26 @@ import ( "google.golang.org/protobuf/reflect/protoregistry" ) +// Edition is an Enum for proto2.Edition +type Edition int32 + +// These values align with the value of Enum in descriptor.proto which allows +// direct conversion between the proto enum and this enum. +const ( + EditionUnknown Edition = 0 + EditionProto2 Edition = 998 + EditionProto3 Edition = 999 + Edition2023 Edition = 1000 + EditionUnsupported Edition = 100000 +) + // The types in this file may have a suffix: // • L0: Contains fields common to all descriptors (except File) and // must be initialized up front. // • L1: Contains fields specific to a descriptor and -// must be initialized up front. +// must be initialized up front. If the associated proto uses Editions, the +// Editions features must always be resolved. If not explicitly set, the +// appropriate default must be resolved and set. // • L2: Contains fields that are lazily initialized when constructing // from the raw file descriptor. When constructing as a literal, the L2 // fields must be initialized up front. @@ -44,6 +59,7 @@ type ( } FileL1 struct { Syntax protoreflect.Syntax + Edition Edition // Only used if Syntax == Editions Path string Package protoreflect.FullName @@ -51,12 +67,35 @@ type ( Messages Messages Extensions Extensions Services Services + + EditionFeatures FileEditionFeatures } FileL2 struct { Options func() protoreflect.ProtoMessage Imports FileImports Locations SourceLocations } + + FileEditionFeatures struct { + // IsFieldPresence is true if field_presence is EXPLICIT + // https://protobuf.dev/editions/features/#field_presence + IsFieldPresence bool + // IsOpenEnum is true if enum_type is OPEN + // https://protobuf.dev/editions/features/#enum_type + IsOpenEnum bool + // IsPacked is true if repeated_field_encoding is PACKED + // https://protobuf.dev/editions/features/#repeated_field_encoding + IsPacked bool + // IsUTF8Validated is true if utf_validation is VERIFY + // https://protobuf.dev/editions/features/#utf8_validation + IsUTF8Validated bool + // IsDelimitedEncoded is true if message_encoding is DELIMITED + // https://protobuf.dev/editions/features/#message_encoding + IsDelimitedEncoded bool + // IsJSONCompliant is true if json_format is ALLOW + // https://protobuf.dev/editions/features/#json_format + IsJSONCompliant bool + } ) func (fd *File) ParentFile() protoreflect.FileDescriptor { return fd } @@ -210,6 +249,9 @@ type ( ContainingOneof protoreflect.OneofDescriptor // must be consistent with Message.Oneofs.Fields Enum protoreflect.EnumDescriptor Message protoreflect.MessageDescriptor + + // Edition features. + Presence bool } Oneof struct { @@ -273,6 +315,9 @@ func (fd *Field) HasJSONName() bool { return fd.L1.StringNam func (fd *Field) JSONName() string { return fd.L1.StringName.getJSON(fd) } func (fd *Field) TextName() string { return fd.L1.StringName.getText(fd) } func (fd *Field) HasPresence() bool { + if fd.L0.ParentFile.L1.Syntax == protoreflect.Editions { + return fd.L1.Presence || fd.L1.Message != nil || fd.L1.ContainingOneof != nil + } return fd.L1.Cardinality != protoreflect.Repeated && (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 || fd.L1.Message != nil || fd.L1.ContainingOneof != nil) } func (fd *Field) HasOptionalKeyword() bool { diff --git a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go index 136f1b215..8f94230ea 100644 --- a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +++ b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go @@ -12,6 +12,12 @@ import ( const File_google_protobuf_descriptor_proto = "google/protobuf/descriptor.proto" +// Full and short names for google.protobuf.Edition. +const ( + Edition_enum_fullname = "google.protobuf.Edition" + Edition_enum_name = "Edition" +) + // Names for google.protobuf.FileDescriptorSet. const ( FileDescriptorSet_message_name protoreflect.Name = "FileDescriptorSet" @@ -81,7 +87,7 @@ const ( FileDescriptorProto_Options_field_number protoreflect.FieldNumber = 8 FileDescriptorProto_SourceCodeInfo_field_number protoreflect.FieldNumber = 9 FileDescriptorProto_Syntax_field_number protoreflect.FieldNumber = 12 - FileDescriptorProto_Edition_field_number protoreflect.FieldNumber = 13 + FileDescriptorProto_Edition_field_number protoreflect.FieldNumber = 14 ) // Names for google.protobuf.DescriptorProto. @@ -184,10 +190,12 @@ const ( const ( ExtensionRangeOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" ExtensionRangeOptions_Declaration_field_name protoreflect.Name = "declaration" + ExtensionRangeOptions_Features_field_name protoreflect.Name = "features" ExtensionRangeOptions_Verification_field_name protoreflect.Name = "verification" ExtensionRangeOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.uninterpreted_option" ExtensionRangeOptions_Declaration_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.declaration" + ExtensionRangeOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.features" ExtensionRangeOptions_Verification_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.verification" ) @@ -195,6 +203,7 @@ const ( const ( ExtensionRangeOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ExtensionRangeOptions_Declaration_field_number protoreflect.FieldNumber = 2 + ExtensionRangeOptions_Features_field_number protoreflect.FieldNumber = 50 ExtensionRangeOptions_Verification_field_number protoreflect.FieldNumber = 3 ) @@ -212,29 +221,26 @@ const ( // Field names for google.protobuf.ExtensionRangeOptions.Declaration. const ( - ExtensionRangeOptions_Declaration_Number_field_name protoreflect.Name = "number" - ExtensionRangeOptions_Declaration_FullName_field_name protoreflect.Name = "full_name" - ExtensionRangeOptions_Declaration_Type_field_name protoreflect.Name = "type" - ExtensionRangeOptions_Declaration_IsRepeated_field_name protoreflect.Name = "is_repeated" - ExtensionRangeOptions_Declaration_Reserved_field_name protoreflect.Name = "reserved" - ExtensionRangeOptions_Declaration_Repeated_field_name protoreflect.Name = "repeated" + ExtensionRangeOptions_Declaration_Number_field_name protoreflect.Name = "number" + ExtensionRangeOptions_Declaration_FullName_field_name protoreflect.Name = "full_name" + ExtensionRangeOptions_Declaration_Type_field_name protoreflect.Name = "type" + ExtensionRangeOptions_Declaration_Reserved_field_name protoreflect.Name = "reserved" + ExtensionRangeOptions_Declaration_Repeated_field_name protoreflect.Name = "repeated" - ExtensionRangeOptions_Declaration_Number_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.number" - ExtensionRangeOptions_Declaration_FullName_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.full_name" - ExtensionRangeOptions_Declaration_Type_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.type" - ExtensionRangeOptions_Declaration_IsRepeated_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.is_repeated" - ExtensionRangeOptions_Declaration_Reserved_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.reserved" - ExtensionRangeOptions_Declaration_Repeated_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.repeated" + ExtensionRangeOptions_Declaration_Number_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.number" + ExtensionRangeOptions_Declaration_FullName_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.full_name" + ExtensionRangeOptions_Declaration_Type_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.type" + ExtensionRangeOptions_Declaration_Reserved_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.reserved" + ExtensionRangeOptions_Declaration_Repeated_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.repeated" ) // Field numbers for google.protobuf.ExtensionRangeOptions.Declaration. const ( - ExtensionRangeOptions_Declaration_Number_field_number protoreflect.FieldNumber = 1 - ExtensionRangeOptions_Declaration_FullName_field_number protoreflect.FieldNumber = 2 - ExtensionRangeOptions_Declaration_Type_field_number protoreflect.FieldNumber = 3 - ExtensionRangeOptions_Declaration_IsRepeated_field_number protoreflect.FieldNumber = 4 - ExtensionRangeOptions_Declaration_Reserved_field_number protoreflect.FieldNumber = 5 - ExtensionRangeOptions_Declaration_Repeated_field_number protoreflect.FieldNumber = 6 + ExtensionRangeOptions_Declaration_Number_field_number protoreflect.FieldNumber = 1 + ExtensionRangeOptions_Declaration_FullName_field_number protoreflect.FieldNumber = 2 + ExtensionRangeOptions_Declaration_Type_field_number protoreflect.FieldNumber = 3 + ExtensionRangeOptions_Declaration_Reserved_field_number protoreflect.FieldNumber = 5 + ExtensionRangeOptions_Declaration_Repeated_field_number protoreflect.FieldNumber = 6 ) // Names for google.protobuf.FieldDescriptorProto. @@ -478,6 +484,7 @@ const ( FileOptions_PhpNamespace_field_name protoreflect.Name = "php_namespace" FileOptions_PhpMetadataNamespace_field_name protoreflect.Name = "php_metadata_namespace" FileOptions_RubyPackage_field_name protoreflect.Name = "ruby_package" + FileOptions_Features_field_name protoreflect.Name = "features" FileOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" FileOptions_JavaPackage_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_package" @@ -500,6 +507,7 @@ const ( FileOptions_PhpNamespace_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_namespace" FileOptions_PhpMetadataNamespace_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_metadata_namespace" FileOptions_RubyPackage_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.ruby_package" + FileOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.features" FileOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.uninterpreted_option" ) @@ -525,6 +533,7 @@ const ( FileOptions_PhpNamespace_field_number protoreflect.FieldNumber = 41 FileOptions_PhpMetadataNamespace_field_number protoreflect.FieldNumber = 44 FileOptions_RubyPackage_field_number protoreflect.FieldNumber = 45 + FileOptions_Features_field_number protoreflect.FieldNumber = 50 FileOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -547,6 +556,7 @@ const ( MessageOptions_Deprecated_field_name protoreflect.Name = "deprecated" MessageOptions_MapEntry_field_name protoreflect.Name = "map_entry" MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_name protoreflect.Name = "deprecated_legacy_json_field_conflicts" + MessageOptions_Features_field_name protoreflect.Name = "features" MessageOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" MessageOptions_MessageSetWireFormat_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format" @@ -554,6 +564,7 @@ const ( MessageOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated" MessageOptions_MapEntry_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.map_entry" MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated_legacy_json_field_conflicts" + MessageOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.features" MessageOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option" ) @@ -564,6 +575,7 @@ const ( MessageOptions_Deprecated_field_number protoreflect.FieldNumber = 3 MessageOptions_MapEntry_field_number protoreflect.FieldNumber = 7 MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_number protoreflect.FieldNumber = 11 + MessageOptions_Features_field_number protoreflect.FieldNumber = 12 MessageOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -584,8 +596,9 @@ const ( FieldOptions_Weak_field_name protoreflect.Name = "weak" FieldOptions_DebugRedact_field_name protoreflect.Name = "debug_redact" FieldOptions_Retention_field_name protoreflect.Name = "retention" - FieldOptions_Target_field_name protoreflect.Name = "target" FieldOptions_Targets_field_name protoreflect.Name = "targets" + FieldOptions_EditionDefaults_field_name protoreflect.Name = "edition_defaults" + FieldOptions_Features_field_name protoreflect.Name = "features" FieldOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" FieldOptions_Ctype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.ctype" @@ -597,8 +610,9 @@ const ( FieldOptions_Weak_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.weak" FieldOptions_DebugRedact_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.debug_redact" FieldOptions_Retention_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.retention" - FieldOptions_Target_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.target" FieldOptions_Targets_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.targets" + FieldOptions_EditionDefaults_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.edition_defaults" + FieldOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.features" FieldOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.uninterpreted_option" ) @@ -613,8 +627,9 @@ const ( FieldOptions_Weak_field_number protoreflect.FieldNumber = 10 FieldOptions_DebugRedact_field_number protoreflect.FieldNumber = 16 FieldOptions_Retention_field_number protoreflect.FieldNumber = 17 - FieldOptions_Target_field_number protoreflect.FieldNumber = 18 FieldOptions_Targets_field_number protoreflect.FieldNumber = 19 + FieldOptions_EditionDefaults_field_number protoreflect.FieldNumber = 20 + FieldOptions_Features_field_number protoreflect.FieldNumber = 21 FieldOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -642,6 +657,27 @@ const ( FieldOptions_OptionTargetType_enum_name = "OptionTargetType" ) +// Names for google.protobuf.FieldOptions.EditionDefault. +const ( + FieldOptions_EditionDefault_message_name protoreflect.Name = "EditionDefault" + FieldOptions_EditionDefault_message_fullname protoreflect.FullName = "google.protobuf.FieldOptions.EditionDefault" +) + +// Field names for google.protobuf.FieldOptions.EditionDefault. +const ( + FieldOptions_EditionDefault_Edition_field_name protoreflect.Name = "edition" + FieldOptions_EditionDefault_Value_field_name protoreflect.Name = "value" + + FieldOptions_EditionDefault_Edition_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.EditionDefault.edition" + FieldOptions_EditionDefault_Value_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.EditionDefault.value" +) + +// Field numbers for google.protobuf.FieldOptions.EditionDefault. +const ( + FieldOptions_EditionDefault_Edition_field_number protoreflect.FieldNumber = 3 + FieldOptions_EditionDefault_Value_field_number protoreflect.FieldNumber = 2 +) + // Names for google.protobuf.OneofOptions. const ( OneofOptions_message_name protoreflect.Name = "OneofOptions" @@ -650,13 +686,16 @@ const ( // Field names for google.protobuf.OneofOptions. const ( + OneofOptions_Features_field_name protoreflect.Name = "features" OneofOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + OneofOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.OneofOptions.features" OneofOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.OneofOptions.uninterpreted_option" ) // Field numbers for google.protobuf.OneofOptions. const ( + OneofOptions_Features_field_number protoreflect.FieldNumber = 1 OneofOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -671,11 +710,13 @@ const ( EnumOptions_AllowAlias_field_name protoreflect.Name = "allow_alias" EnumOptions_Deprecated_field_name protoreflect.Name = "deprecated" EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_name protoreflect.Name = "deprecated_legacy_json_field_conflicts" + EnumOptions_Features_field_name protoreflect.Name = "features" EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" EnumOptions_AllowAlias_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias" EnumOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated" EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated_legacy_json_field_conflicts" + EnumOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.features" EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option" ) @@ -684,6 +725,7 @@ const ( EnumOptions_AllowAlias_field_number protoreflect.FieldNumber = 2 EnumOptions_Deprecated_field_number protoreflect.FieldNumber = 3 EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_number protoreflect.FieldNumber = 6 + EnumOptions_Features_field_number protoreflect.FieldNumber = 7 EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -696,15 +738,21 @@ const ( // Field names for google.protobuf.EnumValueOptions. const ( EnumValueOptions_Deprecated_field_name protoreflect.Name = "deprecated" + EnumValueOptions_Features_field_name protoreflect.Name = "features" + EnumValueOptions_DebugRedact_field_name protoreflect.Name = "debug_redact" EnumValueOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" EnumValueOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.deprecated" + EnumValueOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.features" + EnumValueOptions_DebugRedact_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.debug_redact" EnumValueOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.uninterpreted_option" ) // Field numbers for google.protobuf.EnumValueOptions. const ( EnumValueOptions_Deprecated_field_number protoreflect.FieldNumber = 1 + EnumValueOptions_Features_field_number protoreflect.FieldNumber = 2 + EnumValueOptions_DebugRedact_field_number protoreflect.FieldNumber = 3 EnumValueOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -716,15 +764,18 @@ const ( // Field names for google.protobuf.ServiceOptions. const ( + ServiceOptions_Features_field_name protoreflect.Name = "features" ServiceOptions_Deprecated_field_name protoreflect.Name = "deprecated" ServiceOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + ServiceOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.features" ServiceOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.deprecated" ServiceOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.uninterpreted_option" ) // Field numbers for google.protobuf.ServiceOptions. const ( + ServiceOptions_Features_field_number protoreflect.FieldNumber = 34 ServiceOptions_Deprecated_field_number protoreflect.FieldNumber = 33 ServiceOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -739,10 +790,12 @@ const ( const ( MethodOptions_Deprecated_field_name protoreflect.Name = "deprecated" MethodOptions_IdempotencyLevel_field_name protoreflect.Name = "idempotency_level" + MethodOptions_Features_field_name protoreflect.Name = "features" MethodOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" MethodOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.deprecated" MethodOptions_IdempotencyLevel_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.idempotency_level" + MethodOptions_Features_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.features" MethodOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.uninterpreted_option" ) @@ -750,6 +803,7 @@ const ( const ( MethodOptions_Deprecated_field_number protoreflect.FieldNumber = 33 MethodOptions_IdempotencyLevel_field_number protoreflect.FieldNumber = 34 + MethodOptions_Features_field_number protoreflect.FieldNumber = 35 MethodOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -816,6 +870,120 @@ const ( UninterpretedOption_NamePart_IsExtension_field_number protoreflect.FieldNumber = 2 ) +// Names for google.protobuf.FeatureSet. +const ( + FeatureSet_message_name protoreflect.Name = "FeatureSet" + FeatureSet_message_fullname protoreflect.FullName = "google.protobuf.FeatureSet" +) + +// Field names for google.protobuf.FeatureSet. +const ( + FeatureSet_FieldPresence_field_name protoreflect.Name = "field_presence" + FeatureSet_EnumType_field_name protoreflect.Name = "enum_type" + FeatureSet_RepeatedFieldEncoding_field_name protoreflect.Name = "repeated_field_encoding" + FeatureSet_Utf8Validation_field_name protoreflect.Name = "utf8_validation" + FeatureSet_MessageEncoding_field_name protoreflect.Name = "message_encoding" + FeatureSet_JsonFormat_field_name protoreflect.Name = "json_format" + + FeatureSet_FieldPresence_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.field_presence" + FeatureSet_EnumType_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.enum_type" + FeatureSet_RepeatedFieldEncoding_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.repeated_field_encoding" + FeatureSet_Utf8Validation_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.utf8_validation" + FeatureSet_MessageEncoding_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.message_encoding" + FeatureSet_JsonFormat_field_fullname protoreflect.FullName = "google.protobuf.FeatureSet.json_format" +) + +// Field numbers for google.protobuf.FeatureSet. +const ( + FeatureSet_FieldPresence_field_number protoreflect.FieldNumber = 1 + FeatureSet_EnumType_field_number protoreflect.FieldNumber = 2 + FeatureSet_RepeatedFieldEncoding_field_number protoreflect.FieldNumber = 3 + FeatureSet_Utf8Validation_field_number protoreflect.FieldNumber = 4 + FeatureSet_MessageEncoding_field_number protoreflect.FieldNumber = 5 + FeatureSet_JsonFormat_field_number protoreflect.FieldNumber = 6 +) + +// Full and short names for google.protobuf.FeatureSet.FieldPresence. +const ( + FeatureSet_FieldPresence_enum_fullname = "google.protobuf.FeatureSet.FieldPresence" + FeatureSet_FieldPresence_enum_name = "FieldPresence" +) + +// Full and short names for google.protobuf.FeatureSet.EnumType. +const ( + FeatureSet_EnumType_enum_fullname = "google.protobuf.FeatureSet.EnumType" + FeatureSet_EnumType_enum_name = "EnumType" +) + +// Full and short names for google.protobuf.FeatureSet.RepeatedFieldEncoding. +const ( + FeatureSet_RepeatedFieldEncoding_enum_fullname = "google.protobuf.FeatureSet.RepeatedFieldEncoding" + FeatureSet_RepeatedFieldEncoding_enum_name = "RepeatedFieldEncoding" +) + +// Full and short names for google.protobuf.FeatureSet.Utf8Validation. +const ( + FeatureSet_Utf8Validation_enum_fullname = "google.protobuf.FeatureSet.Utf8Validation" + FeatureSet_Utf8Validation_enum_name = "Utf8Validation" +) + +// Full and short names for google.protobuf.FeatureSet.MessageEncoding. +const ( + FeatureSet_MessageEncoding_enum_fullname = "google.protobuf.FeatureSet.MessageEncoding" + FeatureSet_MessageEncoding_enum_name = "MessageEncoding" +) + +// Full and short names for google.protobuf.FeatureSet.JsonFormat. +const ( + FeatureSet_JsonFormat_enum_fullname = "google.protobuf.FeatureSet.JsonFormat" + FeatureSet_JsonFormat_enum_name = "JsonFormat" +) + +// Names for google.protobuf.FeatureSetDefaults. +const ( + FeatureSetDefaults_message_name protoreflect.Name = "FeatureSetDefaults" + FeatureSetDefaults_message_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults" +) + +// Field names for google.protobuf.FeatureSetDefaults. +const ( + FeatureSetDefaults_Defaults_field_name protoreflect.Name = "defaults" + FeatureSetDefaults_MinimumEdition_field_name protoreflect.Name = "minimum_edition" + FeatureSetDefaults_MaximumEdition_field_name protoreflect.Name = "maximum_edition" + + FeatureSetDefaults_Defaults_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.defaults" + FeatureSetDefaults_MinimumEdition_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.minimum_edition" + FeatureSetDefaults_MaximumEdition_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.maximum_edition" +) + +// Field numbers for google.protobuf.FeatureSetDefaults. +const ( + FeatureSetDefaults_Defaults_field_number protoreflect.FieldNumber = 1 + FeatureSetDefaults_MinimumEdition_field_number protoreflect.FieldNumber = 4 + FeatureSetDefaults_MaximumEdition_field_number protoreflect.FieldNumber = 5 +) + +// Names for google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault. +const ( + FeatureSetDefaults_FeatureSetEditionDefault_message_name protoreflect.Name = "FeatureSetEditionDefault" + FeatureSetDefaults_FeatureSetEditionDefault_message_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault" +) + +// Field names for google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault. +const ( + FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_name protoreflect.Name = "edition" + FeatureSetDefaults_FeatureSetEditionDefault_Features_field_name protoreflect.Name = "features" + + FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.edition" + FeatureSetDefaults_FeatureSetEditionDefault_Features_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.features" +) + +// Field numbers for google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault. +const ( + FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_number protoreflect.FieldNumber = 3 + FeatureSetDefaults_FeatureSetEditionDefault_Features_field_number protoreflect.FieldNumber = 2 +) + // Names for google.protobuf.SourceCodeInfo. const ( SourceCodeInfo_message_name protoreflect.Name = "SourceCodeInfo" diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go b/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go index 1a509b63e..f55dc01e3 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go @@ -162,11 +162,20 @@ func appendBoolSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions func consumeBoolSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.BoolSlice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growBoolSlice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -732,11 +741,20 @@ func appendInt32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOption func consumeInt32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growInt32Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -1138,11 +1156,20 @@ func appendSint32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptio func consumeSint32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growInt32Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -1544,11 +1571,20 @@ func appendUint32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptio func consumeUint32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Uint32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growUint32Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -1950,11 +1986,20 @@ func appendInt64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOption func consumeInt64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growInt64Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -2356,11 +2401,20 @@ func appendSint64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptio func consumeSint64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growInt64Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -2762,11 +2816,20 @@ func appendUint64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptio func consumeUint64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Uint64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := 0 + for _, v := range b { + if v < 0x80 { + count++ + } + } + if count > 0 { + p.growUint64Slice(count) + } + s := *sp for len(b) > 0 { var v uint64 var n int @@ -3145,11 +3208,15 @@ func appendSfixed32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOpt func consumeSfixed32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed32() + if count > 0 { + p.growInt32Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed32(b) if n < 0 { @@ -3461,11 +3528,15 @@ func appendFixed32Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOpti func consumeFixed32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Uint32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed32() + if count > 0 { + p.growUint32Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed32(b) if n < 0 { @@ -3777,11 +3848,15 @@ func appendFloatSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOption func consumeFloatSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Float32Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed32() + if count > 0 { + p.growFloat32Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed32(b) if n < 0 { @@ -4093,11 +4168,15 @@ func appendSfixed64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOpt func consumeSfixed64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Int64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed64() + if count > 0 { + p.growInt64Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed64(b) if n < 0 { @@ -4409,11 +4488,15 @@ func appendFixed64Slice(b []byte, p pointer, f *coderFieldInfo, opts marshalOpti func consumeFixed64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Uint64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed64() + if count > 0 { + p.growUint64Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed64(b) if n < 0 { @@ -4725,11 +4808,15 @@ func appendDoubleSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptio func consumeDoubleSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { sp := p.Float64Slice() if wtyp == protowire.BytesType { - s := *sp b, n := protowire.ConsumeBytes(b) if n < 0 { return out, errDecode } + count := len(b) / protowire.SizeFixed64() + if count > 0 { + p.growFloat64Slice(count) + } + s := *sp for len(b) > 0 { v, n := protowire.ConsumeFixed64(b) if n < 0 { diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go index 61c483fac..2ab2c6297 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go @@ -206,13 +206,18 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name protoreflect.FullName // Obtain a list of oneof wrapper types. var oneofWrappers []reflect.Type - for _, method := range []string{"XXX_OneofFuncs", "XXX_OneofWrappers"} { - if fn, ok := t.MethodByName(method); ok { - for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) { - if vs, ok := v.Interface().([]interface{}); ok { - for _, v := range vs { - oneofWrappers = append(oneofWrappers, reflect.TypeOf(v)) - } + methods := make([]reflect.Method, 0, 2) + if m, ok := t.MethodByName("XXX_OneofFuncs"); ok { + methods = append(methods, m) + } + if m, ok := t.MethodByName("XXX_OneofWrappers"); ok { + methods = append(methods, m) + } + for _, fn := range methods { + for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) { + if vs, ok := v.Interface().([]interface{}); ok { + for _, v := range vs { + oneofWrappers = append(oneofWrappers, reflect.TypeOf(v)) } } } diff --git a/vendor/google.golang.org/protobuf/internal/impl/message.go b/vendor/google.golang.org/protobuf/internal/impl/message.go index 4f5fb67a0..629bacdce 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message.go @@ -192,12 +192,17 @@ fieldLoop: // Derive a mapping of oneof wrappers to fields. oneofWrappers := mi.OneofWrappers - for _, method := range []string{"XXX_OneofFuncs", "XXX_OneofWrappers"} { - if fn, ok := reflect.PtrTo(t).MethodByName(method); ok { - for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) { - if vs, ok := v.Interface().([]interface{}); ok { - oneofWrappers = vs - } + methods := make([]reflect.Method, 0, 2) + if m, ok := reflect.PtrTo(t).MethodByName("XXX_OneofFuncs"); ok { + methods = append(methods, m) + } + if m, ok := reflect.PtrTo(t).MethodByName("XXX_OneofWrappers"); ok { + methods = append(methods, m) + } + for _, fn := range methods { + for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) { + if vs, ok := v.Interface().([]interface{}); ok { + oneofWrappers = vs } } } diff --git a/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go b/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go index 4c491bdf4..517e94434 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go +++ b/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go @@ -159,6 +159,42 @@ func (p pointer) SetPointer(v pointer) { p.v.Elem().Set(v.v) } +func growSlice(p pointer, addCap int) { + // TODO: Once we only support Go 1.20 and newer, use reflect.Grow. + in := p.v.Elem() + out := reflect.MakeSlice(in.Type(), in.Len(), in.Len()+addCap) + reflect.Copy(out, in) + p.v.Elem().Set(out) +} + +func (p pointer) growBoolSlice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growInt32Slice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growUint32Slice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growInt64Slice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growUint64Slice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growFloat64Slice(addCap int) { + growSlice(p, addCap) +} + +func (p pointer) growFloat32Slice(addCap int) { + growSlice(p, addCap) +} + func (Export) MessageStateOf(p Pointer) *messageState { panic("not supported") } func (ms *messageState) pointer() pointer { panic("not supported") } func (ms *messageState) messageInfo() *MessageInfo { panic("not supported") } diff --git a/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go b/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go index ee0e0573e..4b020e311 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go +++ b/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go @@ -138,6 +138,46 @@ func (p pointer) SetPointer(v pointer) { *(*unsafe.Pointer)(p.p) = (unsafe.Pointer)(v.p) } +func (p pointer) growBoolSlice(addCap int) { + sp := p.BoolSlice() + s := make([]bool, 0, addCap+len(*sp)) + s = s[:len(*sp)] + copy(s, *sp) + *sp = s +} + +func (p pointer) growInt32Slice(addCap int) { + sp := p.Int32Slice() + s := make([]int32, 0, addCap+len(*sp)) + s = s[:len(*sp)] + copy(s, *sp) + *sp = s +} + +func (p pointer) growUint32Slice(addCap int) { + p.growInt32Slice(addCap) +} + +func (p pointer) growFloat32Slice(addCap int) { + p.growInt32Slice(addCap) +} + +func (p pointer) growInt64Slice(addCap int) { + sp := p.Int64Slice() + s := make([]int64, 0, addCap+len(*sp)) + s = s[:len(*sp)] + copy(s, *sp) + *sp = s +} + +func (p pointer) growUint64Slice(addCap int) { + p.growInt64Slice(addCap) +} + +func (p pointer) growFloat64Slice(addCap int) { + p.growInt64Slice(addCap) +} + // Static check that MessageState does not exceed the size of a pointer. const _ = uint(unsafe.Sizeof(unsafe.Pointer(nil)) - unsafe.Sizeof(MessageState{})) diff --git a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go similarity index 96% rename from vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go rename to vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go index 61a84d341..a008acd09 100644 --- a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +++ b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !purego && !appengine -// +build !purego,!appengine +//go:build !purego && !appengine && !go1.21 +// +build !purego,!appengine,!go1.21 package strs diff --git a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go121.go b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go121.go new file mode 100644 index 000000000..60166f2ba --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go121.go @@ -0,0 +1,74 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !purego && !appengine && go1.21 +// +build !purego,!appengine,go1.21 + +package strs + +import ( + "unsafe" + + "google.golang.org/protobuf/reflect/protoreflect" +) + +// UnsafeString returns an unsafe string reference of b. +// The caller must treat the input slice as immutable. +// +// WARNING: Use carefully. The returned result must not leak to the end user +// unless the input slice is provably immutable. +func UnsafeString(b []byte) string { + return unsafe.String(unsafe.SliceData(b), len(b)) +} + +// UnsafeBytes returns an unsafe bytes slice reference of s. +// The caller must treat returned slice as immutable. +// +// WARNING: Use carefully. The returned result must not leak to the end user. +func UnsafeBytes(s string) []byte { + return unsafe.Slice(unsafe.StringData(s), len(s)) +} + +// Builder builds a set of strings with shared lifetime. +// This differs from strings.Builder, which is for building a single string. +type Builder struct { + buf []byte +} + +// AppendFullName is equivalent to protoreflect.FullName.Append, +// but optimized for large batches where each name has a shared lifetime. +func (sb *Builder) AppendFullName(prefix protoreflect.FullName, name protoreflect.Name) protoreflect.FullName { + n := len(prefix) + len(".") + len(name) + if len(prefix) == 0 { + n -= len(".") + } + sb.grow(n) + sb.buf = append(sb.buf, prefix...) + sb.buf = append(sb.buf, '.') + sb.buf = append(sb.buf, name...) + return protoreflect.FullName(sb.last(n)) +} + +// MakeString is equivalent to string(b), but optimized for large batches +// with a shared lifetime. +func (sb *Builder) MakeString(b []byte) string { + sb.grow(len(b)) + sb.buf = append(sb.buf, b...) + return sb.last(len(b)) +} + +func (sb *Builder) grow(n int) { + if cap(sb.buf)-len(sb.buf) >= n { + return + } + + // Unlike strings.Builder, we do not need to copy over the contents + // of the old buffer since our builder provides no API for + // retrieving previously created strings. + sb.buf = make([]byte, 0, 2*(cap(sb.buf)+n)) +} + +func (sb *Builder) last(n int) string { + return UnsafeString(sb.buf[len(sb.buf)-n:]) +} diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index 0999f29d5..d8f48faff 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -51,7 +51,7 @@ import ( // 10. Send out the CL for review and submit it. const ( Major = 1 - Minor = 31 + Minor = 32 Patch = 0 PreRelease = "" ) diff --git a/vendor/google.golang.org/protobuf/proto/decode.go b/vendor/google.golang.org/protobuf/proto/decode.go index 48d47946b..e5b03b567 100644 --- a/vendor/google.golang.org/protobuf/proto/decode.go +++ b/vendor/google.golang.org/protobuf/proto/decode.go @@ -69,7 +69,7 @@ func (o UnmarshalOptions) Unmarshal(b []byte, m Message) error { // UnmarshalState parses a wire-format message and places the result in m. // // This method permits fine-grained control over the unmarshaler. -// Most users should use Unmarshal instead. +// Most users should use [Unmarshal] instead. func (o UnmarshalOptions) UnmarshalState(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { if o.RecursionLimit == 0 { o.RecursionLimit = protowire.DefaultRecursionLimit diff --git a/vendor/google.golang.org/protobuf/proto/doc.go b/vendor/google.golang.org/protobuf/proto/doc.go index ec71e717f..80ed16a0c 100644 --- a/vendor/google.golang.org/protobuf/proto/doc.go +++ b/vendor/google.golang.org/protobuf/proto/doc.go @@ -18,27 +18,27 @@ // This package contains functions to convert to and from the wire format, // an efficient binary serialization of protocol buffers. // -// • Size reports the size of a message in the wire format. +// - [Size] reports the size of a message in the wire format. // -// • Marshal converts a message to the wire format. -// The MarshalOptions type provides more control over wire marshaling. +// - [Marshal] converts a message to the wire format. +// The [MarshalOptions] type provides more control over wire marshaling. // -// • Unmarshal converts a message from the wire format. -// The UnmarshalOptions type provides more control over wire unmarshaling. +// - [Unmarshal] converts a message from the wire format. +// The [UnmarshalOptions] type provides more control over wire unmarshaling. // // # Basic message operations // -// • Clone makes a deep copy of a message. +// - [Clone] makes a deep copy of a message. // -// • Merge merges the content of a message into another. +// - [Merge] merges the content of a message into another. // -// • Equal compares two messages. For more control over comparisons -// and detailed reporting of differences, see package -// "google.golang.org/protobuf/testing/protocmp". +// - [Equal] compares two messages. For more control over comparisons +// and detailed reporting of differences, see package +// [google.golang.org/protobuf/testing/protocmp]. // -// • Reset clears the content of a message. +// - [Reset] clears the content of a message. // -// • CheckInitialized reports whether all required fields in a message are set. +// - [CheckInitialized] reports whether all required fields in a message are set. // // # Optional scalar constructors // @@ -46,9 +46,9 @@ // as pointers to a value. For example, an optional string field has the // Go type *string. // -// • Bool, Int32, Int64, Uint32, Uint64, Float32, Float64, and String -// take a value and return a pointer to a new instance of it, -// to simplify construction of optional field values. +// - [Bool], [Int32], [Int64], [Uint32], [Uint64], [Float32], [Float64], and [String] +// take a value and return a pointer to a new instance of it, +// to simplify construction of optional field values. // // Generated enum types usually have an Enum method which performs the // same operation. @@ -57,29 +57,29 @@ // // # Extension accessors // -// • HasExtension, GetExtension, SetExtension, and ClearExtension -// access extension field values in a protocol buffer message. +// - [HasExtension], [GetExtension], [SetExtension], and [ClearExtension] +// access extension field values in a protocol buffer message. // // Extension fields are only supported in proto2. // // # Related packages // -// • Package "google.golang.org/protobuf/encoding/protojson" converts messages to -// and from JSON. +// - Package [google.golang.org/protobuf/encoding/protojson] converts messages to +// and from JSON. // -// • Package "google.golang.org/protobuf/encoding/prototext" converts messages to -// and from the text format. +// - Package [google.golang.org/protobuf/encoding/prototext] converts messages to +// and from the text format. // -// • Package "google.golang.org/protobuf/reflect/protoreflect" provides a -// reflection interface for protocol buffer data types. +// - Package [google.golang.org/protobuf/reflect/protoreflect] provides a +// reflection interface for protocol buffer data types. // -// • Package "google.golang.org/protobuf/testing/protocmp" provides features -// to compare protocol buffer messages with the "github.com/google/go-cmp/cmp" -// package. +// - Package [google.golang.org/protobuf/testing/protocmp] provides features +// to compare protocol buffer messages with the [github.com/google/go-cmp/cmp] +// package. // -// • Package "google.golang.org/protobuf/types/dynamicpb" provides a dynamic -// message type, suitable for working with messages where the protocol buffer -// type is only known at runtime. +// - Package [google.golang.org/protobuf/types/dynamicpb] provides a dynamic +// message type, suitable for working with messages where the protocol buffer +// type is only known at runtime. // // This module contains additional packages for more specialized use cases. // Consult the individual package documentation for details. diff --git a/vendor/google.golang.org/protobuf/proto/encode.go b/vendor/google.golang.org/protobuf/proto/encode.go index bf7f816d0..4fed202f9 100644 --- a/vendor/google.golang.org/protobuf/proto/encode.go +++ b/vendor/google.golang.org/protobuf/proto/encode.go @@ -129,7 +129,7 @@ func (o MarshalOptions) MarshalAppend(b []byte, m Message) ([]byte, error) { // MarshalState returns the wire-format encoding of a message. // // This method permits fine-grained control over the marshaler. -// Most users should use Marshal instead. +// Most users should use [Marshal] instead. func (o MarshalOptions) MarshalState(in protoiface.MarshalInput) (protoiface.MarshalOutput, error) { return o.marshal(in.Buf, in.Message) } diff --git a/vendor/google.golang.org/protobuf/proto/extension.go b/vendor/google.golang.org/protobuf/proto/extension.go index 5f293cda8..17899a3a7 100644 --- a/vendor/google.golang.org/protobuf/proto/extension.go +++ b/vendor/google.golang.org/protobuf/proto/extension.go @@ -26,7 +26,7 @@ func HasExtension(m Message, xt protoreflect.ExtensionType) bool { } // ClearExtension clears an extension field such that subsequent -// HasExtension calls return false. +// [HasExtension] calls return false. // It panics if m is invalid or if xt does not extend m. func ClearExtension(m Message, xt protoreflect.ExtensionType) { m.ProtoReflect().Clear(xt.TypeDescriptor()) diff --git a/vendor/google.golang.org/protobuf/proto/merge.go b/vendor/google.golang.org/protobuf/proto/merge.go index d761ab331..3c6fe5780 100644 --- a/vendor/google.golang.org/protobuf/proto/merge.go +++ b/vendor/google.golang.org/protobuf/proto/merge.go @@ -21,7 +21,7 @@ import ( // The unknown fields of src are appended to the unknown fields of dst. // // It is semantically equivalent to unmarshaling the encoded form of src -// into dst with the UnmarshalOptions.Merge option specified. +// into dst with the [UnmarshalOptions.Merge] option specified. func Merge(dst, src Message) { // TODO: Should nil src be treated as semantically equivalent to a // untyped, read-only, empty message? What about a nil dst? diff --git a/vendor/google.golang.org/protobuf/proto/proto.go b/vendor/google.golang.org/protobuf/proto/proto.go index 1f0d183b1..7543ee6b2 100644 --- a/vendor/google.golang.org/protobuf/proto/proto.go +++ b/vendor/google.golang.org/protobuf/proto/proto.go @@ -15,18 +15,20 @@ import ( // protobuf module that accept a Message, except where otherwise specified. // // This is the v2 interface definition for protobuf messages. -// The v1 interface definition is "github.com/golang/protobuf/proto".Message. +// The v1 interface definition is [github.com/golang/protobuf/proto.Message]. // -// To convert a v1 message to a v2 message, -// use "github.com/golang/protobuf/proto".MessageV2. -// To convert a v2 message to a v1 message, -// use "github.com/golang/protobuf/proto".MessageV1. +// - To convert a v1 message to a v2 message, +// use [google.golang.org/protobuf/protoadapt.MessageV2Of]. +// - To convert a v2 message to a v1 message, +// use [google.golang.org/protobuf/protoadapt.MessageV1Of]. type Message = protoreflect.ProtoMessage -// Error matches all errors produced by packages in the protobuf module. +// Error matches all errors produced by packages in the protobuf module +// according to [errors.Is]. // -// That is, errors.Is(err, Error) reports whether an error is produced -// by this module. +// Example usage: +// +// if errors.Is(err, proto.Error) { ... } var Error error func init() { diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go index e4dfb1205..baa0cc621 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go @@ -3,11 +3,11 @@ // license that can be found in the LICENSE file. // Package protodesc provides functionality for converting -// FileDescriptorProto messages to/from protoreflect.FileDescriptor values. +// FileDescriptorProto messages to/from [protoreflect.FileDescriptor] values. // // The google.protobuf.FileDescriptorProto is a protobuf message that describes // the type information for a .proto file in a form that is easily serializable. -// The protoreflect.FileDescriptor is a more structured representation of +// The [protoreflect.FileDescriptor] is a more structured representation of // the FileDescriptorProto message where references and remote dependencies // can be directly followed. package protodesc @@ -24,11 +24,11 @@ import ( "google.golang.org/protobuf/types/descriptorpb" ) -// Resolver is the resolver used by NewFile to resolve dependencies. +// Resolver is the resolver used by [NewFile] to resolve dependencies. // The enums and messages provided must belong to some parent file, // which is also registered. // -// It is implemented by protoregistry.Files. +// It is implemented by [protoregistry.Files]. type Resolver interface { FindFileByPath(string) (protoreflect.FileDescriptor, error) FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error) @@ -61,19 +61,19 @@ type FileOptions struct { AllowUnresolvable bool } -// NewFile creates a new protoreflect.FileDescriptor from the provided -// file descriptor message. See FileOptions.New for more information. +// NewFile creates a new [protoreflect.FileDescriptor] from the provided +// file descriptor message. See [FileOptions.New] for more information. func NewFile(fd *descriptorpb.FileDescriptorProto, r Resolver) (protoreflect.FileDescriptor, error) { return FileOptions{}.New(fd, r) } -// NewFiles creates a new protoregistry.Files from the provided -// FileDescriptorSet message. See FileOptions.NewFiles for more information. +// NewFiles creates a new [protoregistry.Files] from the provided +// FileDescriptorSet message. See [FileOptions.NewFiles] for more information. func NewFiles(fd *descriptorpb.FileDescriptorSet) (*protoregistry.Files, error) { return FileOptions{}.NewFiles(fd) } -// New creates a new protoreflect.FileDescriptor from the provided +// New creates a new [protoreflect.FileDescriptor] from the provided // file descriptor message. The file must represent a valid proto file according // to protobuf semantics. The returned descriptor is a deep copy of the input. // @@ -93,9 +93,15 @@ func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (prot f.L1.Syntax = protoreflect.Proto2 case "proto3": f.L1.Syntax = protoreflect.Proto3 + case "editions": + f.L1.Syntax = protoreflect.Editions + f.L1.Edition = fromEditionProto(fd.GetEdition()) default: return nil, errors.New("invalid syntax: %q", fd.GetSyntax()) } + if f.L1.Syntax == protoreflect.Editions && (fd.GetEdition() < SupportedEditionsMinimum || fd.GetEdition() > SupportedEditionsMaximum) { + return nil, errors.New("use of edition %v not yet supported by the Go Protobuf runtime", fd.GetEdition()) + } f.L1.Path = fd.GetName() if f.L1.Path == "" { return nil, errors.New("file path must be populated") @@ -108,6 +114,9 @@ func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (prot opts = proto.Clone(opts).(*descriptorpb.FileOptions) f.L2.Options = func() protoreflect.ProtoMessage { return opts } } + if f.L1.Syntax == protoreflect.Editions { + initFileDescFromFeatureSet(f, fd.GetOptions().GetFeatures()) + } f.L2.Imports = make(filedesc.FileImports, len(fd.GetDependency())) for _, i := range fd.GetPublicDependency() { @@ -231,7 +240,7 @@ func (is importSet) importPublic(imps protoreflect.FileImports) { } } -// NewFiles creates a new protoregistry.Files from the provided +// NewFiles creates a new [protoregistry.Files] from the provided // FileDescriptorSet message. The descriptor set must include only // valid files according to protobuf semantics. The returned descriptors // are a deep copy of the input. diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go index 37efda1af..aff6fd490 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go @@ -137,6 +137,30 @@ func (r descsByName) initFieldsFromDescriptorProto(fds []*descriptorpb.FieldDesc if fd.JsonName != nil { f.L1.StringName.InitJSON(fd.GetJsonName()) } + + if f.Base.L0.ParentFile.Syntax() == protoreflect.Editions { + f.L1.Presence = resolveFeatureHasFieldPresence(f.Base.L0.ParentFile, fd) + // We reuse the existing field because the old option `[packed = + // true]` is mutually exclusive with the editions feature. + if fd.GetLabel() == descriptorpb.FieldDescriptorProto_LABEL_REPEATED { + f.L1.HasPacked = true + f.L1.IsPacked = resolveFeatureRepeatedFieldEncodingPacked(f.Base.L0.ParentFile, fd) + } + + // We pretend this option is always explicitly set because the only + // use of HasEnforceUTF8 is to determine whether to use EnforceUTF8 + // or to return the appropriate default. + // When using editions we either parse the option or resolve the + // appropriate default here (instead of later when this option is + // requested from the descriptor). + // In proto2/proto3 syntax HasEnforceUTF8 might be false. + f.L1.HasEnforceUTF8 = true + f.L1.EnforceUTF8 = resolveFeatureEnforceUTF8(f.Base.L0.ParentFile, fd) + + if f.L1.Kind == protoreflect.MessageKind && resolveFeatureDelimitedEncoding(f.Base.L0.ParentFile, fd) { + f.L1.Kind = protoreflect.GroupKind + } + } } return fs, nil } diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go b/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go new file mode 100644 index 000000000..7352926ca --- /dev/null +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go @@ -0,0 +1,177 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package protodesc + +import ( + _ "embed" + "fmt" + "os" + "sync" + + "google.golang.org/protobuf/internal/filedesc" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/descriptorpb" +) + +const ( + SupportedEditionsMinimum = descriptorpb.Edition_EDITION_PROTO2 + SupportedEditionsMaximum = descriptorpb.Edition_EDITION_2023 +) + +//go:embed editions_defaults.binpb +var binaryEditionDefaults []byte +var defaults = &descriptorpb.FeatureSetDefaults{} +var defaultsCacheMu sync.Mutex +var defaultsCache = make(map[filedesc.Edition]*descriptorpb.FeatureSet) + +func init() { + err := proto.Unmarshal(binaryEditionDefaults, defaults) + if err != nil { + fmt.Fprintf(os.Stderr, "unmarshal editions defaults: %v\n", err) + os.Exit(1) + } +} + +func fromEditionProto(epb descriptorpb.Edition) filedesc.Edition { + return filedesc.Edition(epb) +} + +func toEditionProto(ed filedesc.Edition) descriptorpb.Edition { + switch ed { + case filedesc.EditionUnknown: + return descriptorpb.Edition_EDITION_UNKNOWN + case filedesc.EditionProto2: + return descriptorpb.Edition_EDITION_PROTO2 + case filedesc.EditionProto3: + return descriptorpb.Edition_EDITION_PROTO3 + case filedesc.Edition2023: + return descriptorpb.Edition_EDITION_2023 + default: + panic(fmt.Sprintf("unknown value for edition: %v", ed)) + } +} + +func getFeatureSetFor(ed filedesc.Edition) *descriptorpb.FeatureSet { + defaultsCacheMu.Lock() + defer defaultsCacheMu.Unlock() + if def, ok := defaultsCache[ed]; ok { + return def + } + edpb := toEditionProto(ed) + if defaults.GetMinimumEdition() > edpb || defaults.GetMaximumEdition() < edpb { + // This should never happen protodesc.(FileOptions).New would fail when + // initializing the file descriptor. + // This most likely means the embedded defaults were not updated. + fmt.Fprintf(os.Stderr, "internal error: unsupported edition %v (did you forget to update the embedded defaults (i.e. the bootstrap descriptor proto)?)\n", edpb) + os.Exit(1) + } + fs := defaults.GetDefaults()[0].GetFeatures() + // Using a linear search for now. + // Editions are guaranteed to be sorted and thus we could use a binary search. + // Given that there are only a handful of editions (with one more per year) + // there is not much reason to use a binary search. + for _, def := range defaults.GetDefaults() { + if def.GetEdition() <= edpb { + fs = def.GetFeatures() + } else { + break + } + } + defaultsCache[ed] = fs + return fs +} + +func resolveFeatureHasFieldPresence(fileDesc *filedesc.File, fieldDesc *descriptorpb.FieldDescriptorProto) bool { + fs := fieldDesc.GetOptions().GetFeatures() + if fs == nil || fs.FieldPresence == nil { + return fileDesc.L1.EditionFeatures.IsFieldPresence + } + return fs.GetFieldPresence() == descriptorpb.FeatureSet_LEGACY_REQUIRED || + fs.GetFieldPresence() == descriptorpb.FeatureSet_EXPLICIT +} + +func resolveFeatureRepeatedFieldEncodingPacked(fileDesc *filedesc.File, fieldDesc *descriptorpb.FieldDescriptorProto) bool { + fs := fieldDesc.GetOptions().GetFeatures() + if fs == nil || fs.RepeatedFieldEncoding == nil { + return fileDesc.L1.EditionFeatures.IsPacked + } + return fs.GetRepeatedFieldEncoding() == descriptorpb.FeatureSet_PACKED +} + +func resolveFeatureEnforceUTF8(fileDesc *filedesc.File, fieldDesc *descriptorpb.FieldDescriptorProto) bool { + fs := fieldDesc.GetOptions().GetFeatures() + if fs == nil || fs.Utf8Validation == nil { + return fileDesc.L1.EditionFeatures.IsUTF8Validated + } + return fs.GetUtf8Validation() == descriptorpb.FeatureSet_VERIFY +} + +func resolveFeatureDelimitedEncoding(fileDesc *filedesc.File, fieldDesc *descriptorpb.FieldDescriptorProto) bool { + fs := fieldDesc.GetOptions().GetFeatures() + if fs == nil || fs.MessageEncoding == nil { + return fileDesc.L1.EditionFeatures.IsDelimitedEncoded + } + return fs.GetMessageEncoding() == descriptorpb.FeatureSet_DELIMITED +} + +// initFileDescFromFeatureSet initializes editions related fields in fd based +// on fs. If fs is nil it is assumed to be an empty featureset and all fields +// will be initialized with the appropriate default. fd.L1.Edition must be set +// before calling this function. +func initFileDescFromFeatureSet(fd *filedesc.File, fs *descriptorpb.FeatureSet) { + dfs := getFeatureSetFor(fd.L1.Edition) + if fs == nil { + fs = &descriptorpb.FeatureSet{} + } + + var fieldPresence descriptorpb.FeatureSet_FieldPresence + if fp := fs.FieldPresence; fp != nil { + fieldPresence = *fp + } else { + fieldPresence = *dfs.FieldPresence + } + fd.L1.EditionFeatures.IsFieldPresence = fieldPresence == descriptorpb.FeatureSet_LEGACY_REQUIRED || + fieldPresence == descriptorpb.FeatureSet_EXPLICIT + + var enumType descriptorpb.FeatureSet_EnumType + if et := fs.EnumType; et != nil { + enumType = *et + } else { + enumType = *dfs.EnumType + } + fd.L1.EditionFeatures.IsOpenEnum = enumType == descriptorpb.FeatureSet_OPEN + + var respeatedFieldEncoding descriptorpb.FeatureSet_RepeatedFieldEncoding + if rfe := fs.RepeatedFieldEncoding; rfe != nil { + respeatedFieldEncoding = *rfe + } else { + respeatedFieldEncoding = *dfs.RepeatedFieldEncoding + } + fd.L1.EditionFeatures.IsPacked = respeatedFieldEncoding == descriptorpb.FeatureSet_PACKED + + var isUTF8Validated descriptorpb.FeatureSet_Utf8Validation + if utf8val := fs.Utf8Validation; utf8val != nil { + isUTF8Validated = *utf8val + } else { + isUTF8Validated = *dfs.Utf8Validation + } + fd.L1.EditionFeatures.IsUTF8Validated = isUTF8Validated == descriptorpb.FeatureSet_VERIFY + + var messageEncoding descriptorpb.FeatureSet_MessageEncoding + if me := fs.MessageEncoding; me != nil { + messageEncoding = *me + } else { + messageEncoding = *dfs.MessageEncoding + } + fd.L1.EditionFeatures.IsDelimitedEncoded = messageEncoding == descriptorpb.FeatureSet_DELIMITED + + var jsonFormat descriptorpb.FeatureSet_JsonFormat + if jf := fs.JsonFormat; jf != nil { + jsonFormat = *jf + } else { + jsonFormat = *dfs.JsonFormat + } + fd.L1.EditionFeatures.IsJSONCompliant = jsonFormat == descriptorpb.FeatureSet_ALLOW +} diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/editions_defaults.binpb b/vendor/google.golang.org/protobuf/reflect/protodesc/editions_defaults.binpb new file mode 100644 index 000000000..1a8610a84 --- /dev/null +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/editions_defaults.binpb @@ -0,0 +1,4 @@ + +  (0 +  (0 +  (0 ( \ No newline at end of file diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go b/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go index a7c5ceffc..9d6e05420 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go @@ -16,7 +16,7 @@ import ( "google.golang.org/protobuf/types/descriptorpb" ) -// ToFileDescriptorProto copies a protoreflect.FileDescriptor into a +// ToFileDescriptorProto copies a [protoreflect.FileDescriptor] into a // google.protobuf.FileDescriptorProto message. func ToFileDescriptorProto(file protoreflect.FileDescriptor) *descriptorpb.FileDescriptorProto { p := &descriptorpb.FileDescriptorProto{ @@ -70,13 +70,13 @@ func ToFileDescriptorProto(file protoreflect.FileDescriptor) *descriptorpb.FileD for i, exts := 0, file.Extensions(); i < exts.Len(); i++ { p.Extension = append(p.Extension, ToFieldDescriptorProto(exts.Get(i))) } - if syntax := file.Syntax(); syntax != protoreflect.Proto2 { + if syntax := file.Syntax(); syntax != protoreflect.Proto2 && syntax.IsValid() { p.Syntax = proto.String(file.Syntax().String()) } return p } -// ToDescriptorProto copies a protoreflect.MessageDescriptor into a +// ToDescriptorProto copies a [protoreflect.MessageDescriptor] into a // google.protobuf.DescriptorProto message. func ToDescriptorProto(message protoreflect.MessageDescriptor) *descriptorpb.DescriptorProto { p := &descriptorpb.DescriptorProto{ @@ -119,7 +119,7 @@ func ToDescriptorProto(message protoreflect.MessageDescriptor) *descriptorpb.Des return p } -// ToFieldDescriptorProto copies a protoreflect.FieldDescriptor into a +// ToFieldDescriptorProto copies a [protoreflect.FieldDescriptor] into a // google.protobuf.FieldDescriptorProto message. func ToFieldDescriptorProto(field protoreflect.FieldDescriptor) *descriptorpb.FieldDescriptorProto { p := &descriptorpb.FieldDescriptorProto{ @@ -168,7 +168,7 @@ func ToFieldDescriptorProto(field protoreflect.FieldDescriptor) *descriptorpb.Fi return p } -// ToOneofDescriptorProto copies a protoreflect.OneofDescriptor into a +// ToOneofDescriptorProto copies a [protoreflect.OneofDescriptor] into a // google.protobuf.OneofDescriptorProto message. func ToOneofDescriptorProto(oneof protoreflect.OneofDescriptor) *descriptorpb.OneofDescriptorProto { return &descriptorpb.OneofDescriptorProto{ @@ -177,7 +177,7 @@ func ToOneofDescriptorProto(oneof protoreflect.OneofDescriptor) *descriptorpb.On } } -// ToEnumDescriptorProto copies a protoreflect.EnumDescriptor into a +// ToEnumDescriptorProto copies a [protoreflect.EnumDescriptor] into a // google.protobuf.EnumDescriptorProto message. func ToEnumDescriptorProto(enum protoreflect.EnumDescriptor) *descriptorpb.EnumDescriptorProto { p := &descriptorpb.EnumDescriptorProto{ @@ -200,7 +200,7 @@ func ToEnumDescriptorProto(enum protoreflect.EnumDescriptor) *descriptorpb.EnumD return p } -// ToEnumValueDescriptorProto copies a protoreflect.EnumValueDescriptor into a +// ToEnumValueDescriptorProto copies a [protoreflect.EnumValueDescriptor] into a // google.protobuf.EnumValueDescriptorProto message. func ToEnumValueDescriptorProto(value protoreflect.EnumValueDescriptor) *descriptorpb.EnumValueDescriptorProto { return &descriptorpb.EnumValueDescriptorProto{ @@ -210,7 +210,7 @@ func ToEnumValueDescriptorProto(value protoreflect.EnumValueDescriptor) *descrip } } -// ToServiceDescriptorProto copies a protoreflect.ServiceDescriptor into a +// ToServiceDescriptorProto copies a [protoreflect.ServiceDescriptor] into a // google.protobuf.ServiceDescriptorProto message. func ToServiceDescriptorProto(service protoreflect.ServiceDescriptor) *descriptorpb.ServiceDescriptorProto { p := &descriptorpb.ServiceDescriptorProto{ @@ -223,7 +223,7 @@ func ToServiceDescriptorProto(service protoreflect.ServiceDescriptor) *descripto return p } -// ToMethodDescriptorProto copies a protoreflect.MethodDescriptor into a +// ToMethodDescriptorProto copies a [protoreflect.MethodDescriptor] into a // google.protobuf.MethodDescriptorProto message. func ToMethodDescriptorProto(method protoreflect.MethodDescriptor) *descriptorpb.MethodDescriptorProto { p := &descriptorpb.MethodDescriptorProto{ diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go index 55aa14922..ec6572dfd 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go @@ -10,46 +10,46 @@ // // # Protocol Buffer Descriptors // -// Protobuf descriptors (e.g., EnumDescriptor or MessageDescriptor) +// Protobuf descriptors (e.g., [EnumDescriptor] or [MessageDescriptor]) // are immutable objects that represent protobuf type information. // They are wrappers around the messages declared in descriptor.proto. // Protobuf descriptors alone lack any information regarding Go types. // -// Enums and messages generated by this module implement Enum and ProtoMessage, +// Enums and messages generated by this module implement [Enum] and [ProtoMessage], // where the Descriptor and ProtoReflect.Descriptor accessors respectively // return the protobuf descriptor for the values. // // The protobuf descriptor interfaces are not meant to be implemented by // user code since they might need to be extended in the future to support // additions to the protobuf language. -// The "google.golang.org/protobuf/reflect/protodesc" package converts between +// The [google.golang.org/protobuf/reflect/protodesc] package converts between // google.protobuf.DescriptorProto messages and protobuf descriptors. // // # Go Type Descriptors // -// A type descriptor (e.g., EnumType or MessageType) is a constructor for +// A type descriptor (e.g., [EnumType] or [MessageType]) is a constructor for // a concrete Go type that represents the associated protobuf descriptor. // There is commonly a one-to-one relationship between protobuf descriptors and // Go type descriptors, but it can potentially be a one-to-many relationship. // -// Enums and messages generated by this module implement Enum and ProtoMessage, +// Enums and messages generated by this module implement [Enum] and [ProtoMessage], // where the Type and ProtoReflect.Type accessors respectively // return the protobuf descriptor for the values. // -// The "google.golang.org/protobuf/types/dynamicpb" package can be used to +// The [google.golang.org/protobuf/types/dynamicpb] package can be used to // create Go type descriptors from protobuf descriptors. // // # Value Interfaces // -// The Enum and Message interfaces provide a reflective view over an +// The [Enum] and [Message] interfaces provide a reflective view over an // enum or message instance. For enums, it provides the ability to retrieve // the enum value number for any concrete enum type. For messages, it provides // the ability to access or manipulate fields of the message. // -// To convert a proto.Message to a protoreflect.Message, use the +// To convert a [google.golang.org/protobuf/proto.Message] to a [protoreflect.Message], use the // former's ProtoReflect method. Since the ProtoReflect method is new to the // v2 message interface, it may not be present on older message implementations. -// The "github.com/golang/protobuf/proto".MessageReflect function can be used +// The [github.com/golang/protobuf/proto.MessageReflect] function can be used // to obtain a reflective view on older messages. // // # Relationships @@ -71,12 +71,12 @@ // │ │ // └────────────────── Type() ───────┘ // -// • An EnumType describes a concrete Go enum type. +// • An [EnumType] describes a concrete Go enum type. // It has an EnumDescriptor and can construct an Enum instance. // -// • An EnumDescriptor describes an abstract protobuf enum type. +// • An [EnumDescriptor] describes an abstract protobuf enum type. // -// • An Enum is a concrete enum instance. Generated enums implement Enum. +// • An [Enum] is a concrete enum instance. Generated enums implement Enum. // // ┌──────────────── New() ─────────────────┐ // │ │ @@ -90,24 +90,26 @@ // │ │ // └─────────────────── Type() ─────────┘ // -// • A MessageType describes a concrete Go message type. -// It has a MessageDescriptor and can construct a Message instance. -// Just as how Go's reflect.Type is a reflective description of a Go type, -// a MessageType is a reflective description of a Go type for a protobuf message. +// • A [MessageType] describes a concrete Go message type. +// It has a [MessageDescriptor] and can construct a [Message] instance. +// Just as how Go's [reflect.Type] is a reflective description of a Go type, +// a [MessageType] is a reflective description of a Go type for a protobuf message. // -// • A MessageDescriptor describes an abstract protobuf message type. -// It has no understanding of Go types. In order to construct a MessageType -// from just a MessageDescriptor, you can consider looking up the message type -// in the global registry using protoregistry.GlobalTypes.FindMessageByName -// or constructing a dynamic MessageType using dynamicpb.NewMessageType. +// • A [MessageDescriptor] describes an abstract protobuf message type. +// It has no understanding of Go types. In order to construct a [MessageType] +// from just a [MessageDescriptor], you can consider looking up the message type +// in the global registry using the FindMessageByName method on +// [google.golang.org/protobuf/reflect/protoregistry.GlobalTypes] +// or constructing a dynamic [MessageType] using +// [google.golang.org/protobuf/types/dynamicpb.NewMessageType]. // -// • A Message is a reflective view over a concrete message instance. -// Generated messages implement ProtoMessage, which can convert to a Message. -// Just as how Go's reflect.Value is a reflective view over a Go value, -// a Message is a reflective view over a concrete protobuf message instance. -// Using Go reflection as an analogy, the ProtoReflect method is similar to -// calling reflect.ValueOf, and the Message.Interface method is similar to -// calling reflect.Value.Interface. +// • A [Message] is a reflective view over a concrete message instance. +// Generated messages implement [ProtoMessage], which can convert to a [Message]. +// Just as how Go's [reflect.Value] is a reflective view over a Go value, +// a [Message] is a reflective view over a concrete protobuf message instance. +// Using Go reflection as an analogy, the [ProtoMessage.ProtoReflect] method is similar to +// calling [reflect.ValueOf], and the [Message.Interface] method is similar to +// calling [reflect.Value.Interface]. // // ┌── TypeDescriptor() ──┐ ┌───── Descriptor() ─────┐ // │ V │ V @@ -119,15 +121,15 @@ // │ │ // └────── implements ────────┘ // -// • An ExtensionType describes a concrete Go implementation of an extension. -// It has an ExtensionTypeDescriptor and can convert to/from -// abstract Values and Go values. +// • An [ExtensionType] describes a concrete Go implementation of an extension. +// It has an [ExtensionTypeDescriptor] and can convert to/from +// an abstract [Value] and a Go value. // -// • An ExtensionTypeDescriptor is an ExtensionDescriptor -// which also has an ExtensionType. +// • An [ExtensionTypeDescriptor] is an [ExtensionDescriptor] +// which also has an [ExtensionType]. // -// • An ExtensionDescriptor describes an abstract protobuf extension field and -// may not always be an ExtensionTypeDescriptor. +// • An [ExtensionDescriptor] describes an abstract protobuf extension field and +// may not always be an [ExtensionTypeDescriptor]. package protoreflect import ( @@ -142,7 +144,7 @@ type doNotImplement pragma.DoNotImplement // ProtoMessage is the top-level interface that all proto messages implement. // This is declared in the protoreflect package to avoid a cyclic dependency; -// use the proto.Message type instead, which aliases this type. +// use the [google.golang.org/protobuf/proto.Message] type instead, which aliases this type. type ProtoMessage interface{ ProtoReflect() Message } // Syntax is the language version of the proto file. @@ -151,8 +153,9 @@ type Syntax syntax type syntax int8 // keep exact type opaque as the int type may change const ( - Proto2 Syntax = 2 - Proto3 Syntax = 3 + Proto2 Syntax = 2 + Proto3 Syntax = 3 + Editions Syntax = 4 ) // IsValid reports whether the syntax is valid. @@ -436,7 +439,7 @@ type Names interface { // FullName is a qualified name that uniquely identifies a proto declaration. // A qualified name is the concatenation of the proto package along with the // fully-declared name (i.e., name of parent preceding the name of the child), -// with a '.' delimiter placed between each Name. +// with a '.' delimiter placed between each [Name]. // // This should not have any leading or trailing dots. type FullName string // e.g., "google.protobuf.Field.Kind" @@ -480,7 +483,7 @@ func isLetterDigit(c byte) bool { } // Name returns the short name, which is the last identifier segment. -// A single segment FullName is the Name itself. +// A single segment FullName is the [Name] itself. func (n FullName) Name() Name { if i := strings.LastIndexByte(string(n), '.'); i >= 0 { return Name(n[i+1:]) diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go index 717b106f3..0c045db6a 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go @@ -35,7 +35,7 @@ func (p *SourcePath) appendFileDescriptorProto(b []byte) []byte { b = p.appendSingularField(b, "source_code_info", (*SourcePath).appendSourceCodeInfo) case 12: b = p.appendSingularField(b, "syntax", nil) - case 13: + case 14: b = p.appendSingularField(b, "edition", nil) } return b @@ -180,6 +180,8 @@ func (p *SourcePath) appendFileOptions(b []byte) []byte { b = p.appendSingularField(b, "php_metadata_namespace", nil) case 45: b = p.appendSingularField(b, "ruby_package", nil) + case 50: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -240,6 +242,8 @@ func (p *SourcePath) appendMessageOptions(b []byte) []byte { b = p.appendSingularField(b, "map_entry", nil) case 11: b = p.appendSingularField(b, "deprecated_legacy_json_field_conflicts", nil) + case 12: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -285,6 +289,8 @@ func (p *SourcePath) appendEnumOptions(b []byte) []byte { b = p.appendSingularField(b, "deprecated", nil) case 6: b = p.appendSingularField(b, "deprecated_legacy_json_field_conflicts", nil) + case 7: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -330,6 +336,8 @@ func (p *SourcePath) appendServiceOptions(b []byte) []byte { return b } switch (*p)[0] { + case 34: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 33: b = p.appendSingularField(b, "deprecated", nil) case 999: @@ -361,16 +369,39 @@ func (p *SourcePath) appendFieldOptions(b []byte) []byte { b = p.appendSingularField(b, "debug_redact", nil) case 17: b = p.appendSingularField(b, "retention", nil) - case 18: - b = p.appendSingularField(b, "target", nil) case 19: b = p.appendRepeatedField(b, "targets", nil) + case 20: + b = p.appendRepeatedField(b, "edition_defaults", (*SourcePath).appendFieldOptions_EditionDefault) + case 21: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } return b } +func (p *SourcePath) appendFeatureSet(b []byte) []byte { + if len(*p) == 0 { + return b + } + switch (*p)[0] { + case 1: + b = p.appendSingularField(b, "field_presence", nil) + case 2: + b = p.appendSingularField(b, "enum_type", nil) + case 3: + b = p.appendSingularField(b, "repeated_field_encoding", nil) + case 4: + b = p.appendSingularField(b, "utf8_validation", nil) + case 5: + b = p.appendSingularField(b, "message_encoding", nil) + case 6: + b = p.appendSingularField(b, "json_format", nil) + } + return b +} + func (p *SourcePath) appendUninterpretedOption(b []byte) []byte { if len(*p) == 0 { return b @@ -422,6 +453,8 @@ func (p *SourcePath) appendExtensionRangeOptions(b []byte) []byte { b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) case 2: b = p.appendRepeatedField(b, "declaration", (*SourcePath).appendExtensionRangeOptions_Declaration) + case 50: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 3: b = p.appendSingularField(b, "verification", nil) } @@ -433,6 +466,8 @@ func (p *SourcePath) appendOneofOptions(b []byte) []byte { return b } switch (*p)[0] { + case 1: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -446,6 +481,10 @@ func (p *SourcePath) appendEnumValueOptions(b []byte) []byte { switch (*p)[0] { case 1: b = p.appendSingularField(b, "deprecated", nil) + case 2: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) + case 3: + b = p.appendSingularField(b, "debug_redact", nil) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -461,12 +500,27 @@ func (p *SourcePath) appendMethodOptions(b []byte) []byte { b = p.appendSingularField(b, "deprecated", nil) case 34: b = p.appendSingularField(b, "idempotency_level", nil) + case 35: + b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } return b } +func (p *SourcePath) appendFieldOptions_EditionDefault(b []byte) []byte { + if len(*p) == 0 { + return b + } + switch (*p)[0] { + case 3: + b = p.appendSingularField(b, "edition", nil) + case 2: + b = p.appendSingularField(b, "value", nil) + } + return b +} + func (p *SourcePath) appendUninterpretedOption_NamePart(b []byte) []byte { if len(*p) == 0 { return b @@ -491,8 +545,6 @@ func (p *SourcePath) appendExtensionRangeOptions_Declaration(b []byte) []byte { b = p.appendSingularField(b, "full_name", nil) case 3: b = p.appendSingularField(b, "type", nil) - case 4: - b = p.appendSingularField(b, "is_repeated", nil) case 5: b = p.appendSingularField(b, "reserved", nil) case 6: diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go index 3867470d3..60ff62b4c 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go @@ -12,7 +12,7 @@ package protoreflect // exactly identical. However, it is possible for the same semantically // identical proto type to be represented by multiple type descriptors. // -// For example, suppose we have t1 and t2 which are both MessageDescriptors. +// For example, suppose we have t1 and t2 which are both an [MessageDescriptor]. // If t1 == t2, then the types are definitely equal and all accessors return // the same information. However, if t1 != t2, then it is still possible that // they still represent the same proto type (e.g., t1.FullName == t2.FullName). @@ -115,7 +115,7 @@ type Descriptor interface { // corresponds with the google.protobuf.FileDescriptorProto message. // // Top-level declarations: -// EnumDescriptor, MessageDescriptor, FieldDescriptor, and/or ServiceDescriptor. +// [EnumDescriptor], [MessageDescriptor], [FieldDescriptor], and/or [ServiceDescriptor]. type FileDescriptor interface { Descriptor // Descriptor.FullName is identical to Package @@ -180,8 +180,8 @@ type FileImport struct { // corresponds with the google.protobuf.DescriptorProto message. // // Nested declarations: -// FieldDescriptor, OneofDescriptor, FieldDescriptor, EnumDescriptor, -// and/or MessageDescriptor. +// [FieldDescriptor], [OneofDescriptor], [FieldDescriptor], [EnumDescriptor], +// and/or [MessageDescriptor]. type MessageDescriptor interface { Descriptor @@ -214,7 +214,7 @@ type MessageDescriptor interface { ExtensionRanges() FieldRanges // ExtensionRangeOptions returns the ith extension range options. // - // To avoid a dependency cycle, this method returns a proto.Message value, + // To avoid a dependency cycle, this method returns a proto.Message] value, // which always contains a google.protobuf.ExtensionRangeOptions message. // This method returns a typed nil-pointer if no options are present. // The caller must import the descriptorpb package to use this. @@ -231,9 +231,9 @@ type MessageDescriptor interface { } type isMessageDescriptor interface{ ProtoType(MessageDescriptor) } -// MessageType encapsulates a MessageDescriptor with a concrete Go implementation. +// MessageType encapsulates a [MessageDescriptor] with a concrete Go implementation. // It is recommended that implementations of this interface also implement the -// MessageFieldTypes interface. +// [MessageFieldTypes] interface. type MessageType interface { // New returns a newly allocated empty message. // It may return nil for synthetic messages representing a map entry. @@ -249,19 +249,19 @@ type MessageType interface { Descriptor() MessageDescriptor } -// MessageFieldTypes extends a MessageType by providing type information +// MessageFieldTypes extends a [MessageType] by providing type information // regarding enums and messages referenced by the message fields. type MessageFieldTypes interface { MessageType - // Enum returns the EnumType for the ith field in Descriptor.Fields. + // Enum returns the EnumType for the ith field in MessageDescriptor.Fields. // It returns nil if the ith field is not an enum kind. // It panics if out of bounds. // // Invariant: mt.Enum(i).Descriptor() == mt.Descriptor().Fields(i).Enum() Enum(i int) EnumType - // Message returns the MessageType for the ith field in Descriptor.Fields. + // Message returns the MessageType for the ith field in MessageDescriptor.Fields. // It returns nil if the ith field is not a message or group kind. // It panics if out of bounds. // @@ -286,8 +286,8 @@ type MessageDescriptors interface { // corresponds with the google.protobuf.FieldDescriptorProto message. // // It is used for both normal fields defined within the parent message -// (e.g., MessageDescriptor.Fields) and fields that extend some remote message -// (e.g., FileDescriptor.Extensions or MessageDescriptor.Extensions). +// (e.g., [MessageDescriptor.Fields]) and fields that extend some remote message +// (e.g., [FileDescriptor.Extensions] or [MessageDescriptor.Extensions]). type FieldDescriptor interface { Descriptor @@ -344,7 +344,7 @@ type FieldDescriptor interface { // IsMap reports whether this field represents a map, // where the value type for the associated field is a Map. // It is equivalent to checking whether Cardinality is Repeated, - // that the Kind is MessageKind, and that Message.IsMapEntry reports true. + // that the Kind is MessageKind, and that MessageDescriptor.IsMapEntry reports true. IsMap() bool // MapKey returns the field descriptor for the key in the map entry. @@ -419,7 +419,7 @@ type OneofDescriptor interface { // IsSynthetic reports whether this is a synthetic oneof created to support // proto3 optional semantics. If true, Fields contains exactly one field - // with HasOptionalKeyword specified. + // with FieldDescriptor.HasOptionalKeyword specified. IsSynthetic() bool // Fields is a list of fields belonging to this oneof. @@ -442,10 +442,10 @@ type OneofDescriptors interface { doNotImplement } -// ExtensionDescriptor is an alias of FieldDescriptor for documentation. +// ExtensionDescriptor is an alias of [FieldDescriptor] for documentation. type ExtensionDescriptor = FieldDescriptor -// ExtensionTypeDescriptor is an ExtensionDescriptor with an associated ExtensionType. +// ExtensionTypeDescriptor is an [ExtensionDescriptor] with an associated [ExtensionType]. type ExtensionTypeDescriptor interface { ExtensionDescriptor @@ -470,12 +470,12 @@ type ExtensionDescriptors interface { doNotImplement } -// ExtensionType encapsulates an ExtensionDescriptor with a concrete +// ExtensionType encapsulates an [ExtensionDescriptor] with a concrete // Go implementation. The nested field descriptor must be for a extension field. // // While a normal field is a member of the parent message that it is declared -// within (see Descriptor.Parent), an extension field is a member of some other -// target message (see ExtensionDescriptor.Extendee) and may have no +// within (see [Descriptor.Parent]), an extension field is a member of some other +// target message (see [FieldDescriptor.ContainingMessage]) and may have no // relationship with the parent. However, the full name of an extension field is // relative to the parent that it is declared within. // @@ -532,7 +532,7 @@ type ExtensionType interface { // corresponds with the google.protobuf.EnumDescriptorProto message. // // Nested declarations: -// EnumValueDescriptor. +// [EnumValueDescriptor]. type EnumDescriptor interface { Descriptor @@ -548,7 +548,7 @@ type EnumDescriptor interface { } type isEnumDescriptor interface{ ProtoType(EnumDescriptor) } -// EnumType encapsulates an EnumDescriptor with a concrete Go implementation. +// EnumType encapsulates an [EnumDescriptor] with a concrete Go implementation. type EnumType interface { // New returns an instance of this enum type with its value set to n. New(n EnumNumber) Enum @@ -610,7 +610,7 @@ type EnumValueDescriptors interface { // ServiceDescriptor describes a service and // corresponds with the google.protobuf.ServiceDescriptorProto message. // -// Nested declarations: MethodDescriptor. +// Nested declarations: [MethodDescriptor]. type ServiceDescriptor interface { Descriptor diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go index 37601b781..a7b0d06ff 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go @@ -27,16 +27,16 @@ type Enum interface { // Message is a reflective interface for a concrete message value, // encapsulating both type and value information for the message. // -// Accessor/mutators for individual fields are keyed by FieldDescriptor. +// Accessor/mutators for individual fields are keyed by [FieldDescriptor]. // For non-extension fields, the descriptor must exactly match the // field known by the parent message. -// For extension fields, the descriptor must implement ExtensionTypeDescriptor, -// extend the parent message (i.e., have the same message FullName), and +// For extension fields, the descriptor must implement [ExtensionTypeDescriptor], +// extend the parent message (i.e., have the same message [FullName]), and // be within the parent's extension range. // -// Each field Value can be a scalar or a composite type (Message, List, or Map). -// See Value for the Go types associated with a FieldDescriptor. -// Providing a Value that is invalid or of an incorrect type panics. +// Each field [Value] can be a scalar or a composite type ([Message], [List], or [Map]). +// See [Value] for the Go types associated with a [FieldDescriptor]. +// Providing a [Value] that is invalid or of an incorrect type panics. type Message interface { // Descriptor returns message descriptor, which contains only the protobuf // type information for the message. @@ -152,7 +152,7 @@ type Message interface { // This method may return nil. // // The returned methods type is identical to - // "google.golang.org/protobuf/runtime/protoiface".Methods. + // google.golang.org/protobuf/runtime/protoiface.Methods. // Consult the protoiface package documentation for details. ProtoMethods() *methods } @@ -175,8 +175,8 @@ func (b RawFields) IsValid() bool { } // List is a zero-indexed, ordered list. -// The element Value type is determined by FieldDescriptor.Kind. -// Providing a Value that is invalid or of an incorrect type panics. +// The element [Value] type is determined by [FieldDescriptor.Kind]. +// Providing a [Value] that is invalid or of an incorrect type panics. type List interface { // Len reports the number of entries in the List. // Get, Set, and Truncate panic with out of bound indexes. @@ -226,9 +226,9 @@ type List interface { } // Map is an unordered, associative map. -// The entry MapKey type is determined by FieldDescriptor.MapKey.Kind. -// The entry Value type is determined by FieldDescriptor.MapValue.Kind. -// Providing a MapKey or Value that is invalid or of an incorrect type panics. +// The entry [MapKey] type is determined by [FieldDescriptor.MapKey].Kind. +// The entry [Value] type is determined by [FieldDescriptor.MapValue].Kind. +// Providing a [MapKey] or [Value] that is invalid or of an incorrect type panics. type Map interface { // Len reports the number of elements in the map. Len() int diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go index 591652541..654599d44 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go @@ -24,19 +24,19 @@ import ( // Unlike the == operator, a NaN is equal to another NaN. // // - Enums are equal if they contain the same number. -// Since Value does not contain an enum descriptor, +// Since [Value] does not contain an enum descriptor, // enum values do not consider the type of the enum. // // - Other scalar values are equal if they contain the same value. // -// - Message values are equal if they belong to the same message descriptor, +// - [Message] values are equal if they belong to the same message descriptor, // have the same set of populated known and extension field values, // and the same set of unknown fields values. // -// - Lists are equal if they are the same length and +// - [List] values are equal if they are the same length and // each corresponding element is equal. // -// - Maps are equal if they have the same set of keys and +// - [Map] values are equal if they have the same set of keys and // the corresponding value for each key is equal. func (v1 Value) Equal(v2 Value) bool { return equalValue(v1, v2) diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go index 08e5ef73f..160309731 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go @@ -11,7 +11,7 @@ import ( // Value is a union where only one Go type may be set at a time. // The Value is used to represent all possible values a field may take. -// The following shows which Go type is used to represent each proto Kind: +// The following shows which Go type is used to represent each proto [Kind]: // // ╔════════════╤═════════════════════════════════════╗ // ║ Go type │ Protobuf kind ║ @@ -31,22 +31,22 @@ import ( // // Multiple protobuf Kinds may be represented by a single Go type if the type // can losslessly represent the information for the proto kind. For example, -// Int64Kind, Sint64Kind, and Sfixed64Kind are all represented by int64, +// [Int64Kind], [Sint64Kind], and [Sfixed64Kind] are all represented by int64, // but use different integer encoding methods. // -// The List or Map types are used if the field cardinality is repeated. -// A field is a List if FieldDescriptor.IsList reports true. -// A field is a Map if FieldDescriptor.IsMap reports true. +// The [List] or [Map] types are used if the field cardinality is repeated. +// A field is a [List] if [FieldDescriptor.IsList] reports true. +// A field is a [Map] if [FieldDescriptor.IsMap] reports true. // // Converting to/from a Value and a concrete Go value panics on type mismatch. -// For example, ValueOf("hello").Int() panics because this attempts to +// For example, [ValueOf]("hello").Int() panics because this attempts to // retrieve an int64 from a string. // -// List, Map, and Message Values are called "composite" values. +// [List], [Map], and [Message] Values are called "composite" values. // // A composite Value may alias (reference) memory at some location, // such that changes to the Value updates the that location. -// A composite value acquired with a Mutable method, such as Message.Mutable, +// A composite value acquired with a Mutable method, such as [Message.Mutable], // always references the source object. // // For example: @@ -65,7 +65,7 @@ import ( // // appending to the List here may or may not modify the message. // list.Append(protoreflect.ValueOfInt32(0)) // -// Some operations, such as Message.Get, may return an "empty, read-only" +// Some operations, such as [Message.Get], may return an "empty, read-only" // composite Value. Modifying an empty, read-only value panics. type Value value @@ -306,7 +306,7 @@ func (v Value) Float() float64 { } } -// String returns v as a string. Since this method implements fmt.Stringer, +// String returns v as a string. Since this method implements [fmt.Stringer], // this returns the formatted string value for any non-string type. func (v Value) String() string { switch v.typ { @@ -327,7 +327,7 @@ func (v Value) Bytes() []byte { } } -// Enum returns v as a EnumNumber and panics if the type is not a EnumNumber. +// Enum returns v as a [EnumNumber] and panics if the type is not a [EnumNumber]. func (v Value) Enum() EnumNumber { switch v.typ { case enumType: @@ -337,7 +337,7 @@ func (v Value) Enum() EnumNumber { } } -// Message returns v as a Message and panics if the type is not a Message. +// Message returns v as a [Message] and panics if the type is not a [Message]. func (v Value) Message() Message { switch vi := v.getIface().(type) { case Message: @@ -347,7 +347,7 @@ func (v Value) Message() Message { } } -// List returns v as a List and panics if the type is not a List. +// List returns v as a [List] and panics if the type is not a [List]. func (v Value) List() List { switch vi := v.getIface().(type) { case List: @@ -357,7 +357,7 @@ func (v Value) List() List { } } -// Map returns v as a Map and panics if the type is not a Map. +// Map returns v as a [Map] and panics if the type is not a [Map]. func (v Value) Map() Map { switch vi := v.getIface().(type) { case Map: @@ -367,7 +367,7 @@ func (v Value) Map() Map { } } -// MapKey returns v as a MapKey and panics for invalid MapKey types. +// MapKey returns v as a [MapKey] and panics for invalid [MapKey] types. func (v Value) MapKey() MapKey { switch v.typ { case boolType, int32Type, int64Type, uint32Type, uint64Type, stringType: @@ -378,8 +378,8 @@ func (v Value) MapKey() MapKey { } // MapKey is used to index maps, where the Go type of the MapKey must match -// the specified key Kind (see MessageDescriptor.IsMapEntry). -// The following shows what Go type is used to represent each proto Kind: +// the specified key [Kind] (see [MessageDescriptor.IsMapEntry]). +// The following shows what Go type is used to represent each proto [Kind]: // // ╔═════════╤═════════════════════════════════════╗ // ║ Go type │ Protobuf kind ║ @@ -392,13 +392,13 @@ func (v Value) MapKey() MapKey { // ║ string │ StringKind ║ // ╚═════════╧═════════════════════════════════════╝ // -// A MapKey is constructed and accessed through a Value: +// A MapKey is constructed and accessed through a [Value]: // // k := ValueOf("hash").MapKey() // convert string to MapKey // s := k.String() // convert MapKey to string // -// The MapKey is a strict subset of valid types used in Value; -// converting a Value to a MapKey with an invalid type panics. +// The MapKey is a strict subset of valid types used in [Value]; +// converting a [Value] to a MapKey with an invalid type panics. type MapKey value // IsValid reports whether k is populated with a value. @@ -426,13 +426,13 @@ func (k MapKey) Uint() uint64 { return Value(k).Uint() } -// String returns k as a string. Since this method implements fmt.Stringer, +// String returns k as a string. Since this method implements [fmt.Stringer], // this returns the formatted string value for any non-string type. func (k MapKey) String() string { return Value(k).String() } -// Value returns k as a Value. +// Value returns k as a [Value]. func (k MapKey) Value() Value { return Value(k) } diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go similarity index 97% rename from vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go rename to vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go index 702ddf22a..b1fdbe3e8 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !purego && !appengine -// +build !purego,!appengine +//go:build !purego && !appengine && !go1.21 +// +build !purego,!appengine,!go1.21 package protoreflect diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go121.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go121.go new file mode 100644 index 000000000..435470111 --- /dev/null +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go121.go @@ -0,0 +1,87 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !purego && !appengine && go1.21 +// +build !purego,!appengine,go1.21 + +package protoreflect + +import ( + "unsafe" + + "google.golang.org/protobuf/internal/pragma" +) + +type ( + ifaceHeader struct { + _ [0]interface{} // if interfaces have greater alignment than unsafe.Pointer, this will enforce it. + Type unsafe.Pointer + Data unsafe.Pointer + } +) + +var ( + nilType = typeOf(nil) + boolType = typeOf(*new(bool)) + int32Type = typeOf(*new(int32)) + int64Type = typeOf(*new(int64)) + uint32Type = typeOf(*new(uint32)) + uint64Type = typeOf(*new(uint64)) + float32Type = typeOf(*new(float32)) + float64Type = typeOf(*new(float64)) + stringType = typeOf(*new(string)) + bytesType = typeOf(*new([]byte)) + enumType = typeOf(*new(EnumNumber)) +) + +// typeOf returns a pointer to the Go type information. +// The pointer is comparable and equal if and only if the types are identical. +func typeOf(t interface{}) unsafe.Pointer { + return (*ifaceHeader)(unsafe.Pointer(&t)).Type +} + +// value is a union where only one type can be represented at a time. +// The struct is 24B large on 64-bit systems and requires the minimum storage +// necessary to represent each possible type. +// +// The Go GC needs to be able to scan variables containing pointers. +// As such, pointers and non-pointers cannot be intermixed. +type value struct { + pragma.DoNotCompare // 0B + + // typ stores the type of the value as a pointer to the Go type. + typ unsafe.Pointer // 8B + + // ptr stores the data pointer for a String, Bytes, or interface value. + ptr unsafe.Pointer // 8B + + // num stores a Bool, Int32, Int64, Uint32, Uint64, Float32, Float64, or + // Enum value as a raw uint64. + // + // It is also used to store the length of a String or Bytes value; + // the capacity is ignored. + num uint64 // 8B +} + +func valueOfString(v string) Value { + return Value{typ: stringType, ptr: unsafe.Pointer(unsafe.StringData(v)), num: uint64(len(v))} +} +func valueOfBytes(v []byte) Value { + return Value{typ: bytesType, ptr: unsafe.Pointer(unsafe.SliceData(v)), num: uint64(len(v))} +} +func valueOfIface(v interface{}) Value { + p := (*ifaceHeader)(unsafe.Pointer(&v)) + return Value{typ: p.Type, ptr: p.Data} +} + +func (v Value) getString() string { + return unsafe.String((*byte)(v.ptr), v.num) +} +func (v Value) getBytes() []byte { + return unsafe.Slice((*byte)(v.ptr), v.num) +} +func (v Value) getIface() (x interface{}) { + *(*ifaceHeader)(unsafe.Pointer(&x)) = ifaceHeader{Type: v.typ, Data: v.ptr} + return x +} diff --git a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go index aeb559774..6267dc52a 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +++ b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go @@ -5,12 +5,12 @@ // Package protoregistry provides data structures to register and lookup // protobuf descriptor types. // -// The Files registry contains file descriptors and provides the ability +// The [Files] registry contains file descriptors and provides the ability // to iterate over the files or lookup a specific descriptor within the files. -// Files only contains protobuf descriptors and has no understanding of Go +// [Files] only contains protobuf descriptors and has no understanding of Go // type information that may be associated with each descriptor. // -// The Types registry contains descriptor types for which there is a known +// The [Types] registry contains descriptor types for which there is a known // Go type associated with that descriptor. It provides the ability to iterate // over the registered types or lookup a type by name. package protoregistry @@ -218,7 +218,7 @@ func (r *Files) checkGenProtoConflict(path string) { // FindDescriptorByName looks up a descriptor by the full name. // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Files) FindDescriptorByName(name protoreflect.FullName) (protoreflect.Descriptor, error) { if r == nil { return nil, NotFound @@ -310,7 +310,7 @@ func (s *nameSuffix) Pop() (name protoreflect.Name) { // FindFileByPath looks up a file by the path. // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. // This returns an error if multiple files have the same path. func (r *Files) FindFileByPath(path string) (protoreflect.FileDescriptor, error) { if r == nil { @@ -431,7 +431,7 @@ func rangeTopLevelDescriptors(fd protoreflect.FileDescriptor, f func(protoreflec // A compliant implementation must deterministically return the same type // if no error is encountered. // -// The Types type implements this interface. +// The [Types] type implements this interface. type MessageTypeResolver interface { // FindMessageByName looks up a message by its full name. // E.g., "google.protobuf.Any" @@ -451,7 +451,7 @@ type MessageTypeResolver interface { // A compliant implementation must deterministically return the same type // if no error is encountered. // -// The Types type implements this interface. +// The [Types] type implements this interface. type ExtensionTypeResolver interface { // FindExtensionByName looks up a extension field by the field's full name. // Note that this is the full name of the field as determined by @@ -590,7 +590,7 @@ func (r *Types) register(kind string, desc protoreflect.Descriptor, typ interfac // FindEnumByName looks up an enum by its full name. // E.g., "google.protobuf.Field.Kind". // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Types) FindEnumByName(enum protoreflect.FullName) (protoreflect.EnumType, error) { if r == nil { return nil, NotFound @@ -611,7 +611,7 @@ func (r *Types) FindEnumByName(enum protoreflect.FullName) (protoreflect.EnumTyp // FindMessageByName looks up a message by its full name, // e.g. "google.protobuf.Any". // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Types) FindMessageByName(message protoreflect.FullName) (protoreflect.MessageType, error) { if r == nil { return nil, NotFound @@ -632,7 +632,7 @@ func (r *Types) FindMessageByName(message protoreflect.FullName) (protoreflect.M // FindMessageByURL looks up a message by a URL identifier. // See documentation on google.protobuf.Any.type_url for the URL format. // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Types) FindMessageByURL(url string) (protoreflect.MessageType, error) { // This function is similar to FindMessageByName but // truncates anything before and including '/' in the URL. @@ -662,7 +662,7 @@ func (r *Types) FindMessageByURL(url string) (protoreflect.MessageType, error) { // where the extension is declared and is unrelated to the full name of the // message being extended. // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Types) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) { if r == nil { return nil, NotFound @@ -703,7 +703,7 @@ func (r *Types) FindExtensionByName(field protoreflect.FullName) (protoreflect.E // FindExtensionByNumber looks up a extension field by the field number // within some parent message, identified by full name. // -// This returns (nil, NotFound) if not found. +// This returns (nil, [NotFound]) if not found. func (r *Types) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) { if r == nil { return nil, NotFound diff --git a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go index 04c00f737..38daa858d 100644 --- a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +++ b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go @@ -48,6 +48,94 @@ import ( sync "sync" ) +// The full set of known editions. +type Edition int32 + +const ( + // A placeholder for an unknown edition value. + Edition_EDITION_UNKNOWN Edition = 0 + // Legacy syntax "editions". These pre-date editions, but behave much like + // distinct editions. These can't be used to specify the edition of proto + // files, but feature definitions must supply proto2/proto3 defaults for + // backwards compatibility. + Edition_EDITION_PROTO2 Edition = 998 + Edition_EDITION_PROTO3 Edition = 999 + // Editions that have been released. The specific values are arbitrary and + // should not be depended on, but they will always be time-ordered for easy + // comparison. + Edition_EDITION_2023 Edition = 1000 + // Placeholder editions for testing feature resolution. These should not be + // used or relyed on outside of tests. + Edition_EDITION_1_TEST_ONLY Edition = 1 + Edition_EDITION_2_TEST_ONLY Edition = 2 + Edition_EDITION_99997_TEST_ONLY Edition = 99997 + Edition_EDITION_99998_TEST_ONLY Edition = 99998 + Edition_EDITION_99999_TEST_ONLY Edition = 99999 +) + +// Enum value maps for Edition. +var ( + Edition_name = map[int32]string{ + 0: "EDITION_UNKNOWN", + 998: "EDITION_PROTO2", + 999: "EDITION_PROTO3", + 1000: "EDITION_2023", + 1: "EDITION_1_TEST_ONLY", + 2: "EDITION_2_TEST_ONLY", + 99997: "EDITION_99997_TEST_ONLY", + 99998: "EDITION_99998_TEST_ONLY", + 99999: "EDITION_99999_TEST_ONLY", + } + Edition_value = map[string]int32{ + "EDITION_UNKNOWN": 0, + "EDITION_PROTO2": 998, + "EDITION_PROTO3": 999, + "EDITION_2023": 1000, + "EDITION_1_TEST_ONLY": 1, + "EDITION_2_TEST_ONLY": 2, + "EDITION_99997_TEST_ONLY": 99997, + "EDITION_99998_TEST_ONLY": 99998, + "EDITION_99999_TEST_ONLY": 99999, + } +) + +func (x Edition) Enum() *Edition { + p := new(Edition) + *p = x + return p +} + +func (x Edition) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Edition) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[0].Descriptor() +} + +func (Edition) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[0] +} + +func (x Edition) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Edition) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Edition(num) + return nil +} + +// Deprecated: Use Edition.Descriptor instead. +func (Edition) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{0} +} + // The verification state of the extension range. type ExtensionRangeOptions_VerificationState int32 @@ -80,11 +168,11 @@ func (x ExtensionRangeOptions_VerificationState) String() string { } func (ExtensionRangeOptions_VerificationState) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[0].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[1].Descriptor() } func (ExtensionRangeOptions_VerificationState) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[0] + return &file_google_protobuf_descriptor_proto_enumTypes[1] } func (x ExtensionRangeOptions_VerificationState) Number() protoreflect.EnumNumber { @@ -125,9 +213,10 @@ const ( FieldDescriptorProto_TYPE_BOOL FieldDescriptorProto_Type = 8 FieldDescriptorProto_TYPE_STRING FieldDescriptorProto_Type = 9 // Tag-delimited aggregate. - // Group type is deprecated and not supported in proto3. However, Proto3 + // Group type is deprecated and not supported after google.protobuf. However, Proto3 // implementations should still be able to parse the group wire format and - // treat group fields as unknown fields. + // treat group fields as unknown fields. In Editions, the group wire format + // can be enabled via the `message_encoding` feature. FieldDescriptorProto_TYPE_GROUP FieldDescriptorProto_Type = 10 FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11 // Length-delimited aggregate. // New in version 2. @@ -195,11 +284,11 @@ func (x FieldDescriptorProto_Type) String() string { } func (FieldDescriptorProto_Type) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[1].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[2].Descriptor() } func (FieldDescriptorProto_Type) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[1] + return &file_google_protobuf_descriptor_proto_enumTypes[2] } func (x FieldDescriptorProto_Type) Number() protoreflect.EnumNumber { @@ -226,21 +315,24 @@ type FieldDescriptorProto_Label int32 const ( // 0 is reserved for errors FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1 - FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2 FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3 + // The required label is only allowed in google.protobuf. In proto3 and Editions + // it's explicitly prohibited. In Editions, the `field_presence` feature + // can be used to get this behavior. + FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2 ) // Enum value maps for FieldDescriptorProto_Label. var ( FieldDescriptorProto_Label_name = map[int32]string{ 1: "LABEL_OPTIONAL", - 2: "LABEL_REQUIRED", 3: "LABEL_REPEATED", + 2: "LABEL_REQUIRED", } FieldDescriptorProto_Label_value = map[string]int32{ "LABEL_OPTIONAL": 1, - "LABEL_REQUIRED": 2, "LABEL_REPEATED": 3, + "LABEL_REQUIRED": 2, } ) @@ -255,11 +347,11 @@ func (x FieldDescriptorProto_Label) String() string { } func (FieldDescriptorProto_Label) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[2].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[3].Descriptor() } func (FieldDescriptorProto_Label) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[2] + return &file_google_protobuf_descriptor_proto_enumTypes[3] } func (x FieldDescriptorProto_Label) Number() protoreflect.EnumNumber { @@ -316,11 +408,11 @@ func (x FileOptions_OptimizeMode) String() string { } func (FileOptions_OptimizeMode) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[3].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[4].Descriptor() } func (FileOptions_OptimizeMode) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[3] + return &file_google_protobuf_descriptor_proto_enumTypes[4] } func (x FileOptions_OptimizeMode) Number() protoreflect.EnumNumber { @@ -382,11 +474,11 @@ func (x FieldOptions_CType) String() string { } func (FieldOptions_CType) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[4].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[5].Descriptor() } func (FieldOptions_CType) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[4] + return &file_google_protobuf_descriptor_proto_enumTypes[5] } func (x FieldOptions_CType) Number() protoreflect.EnumNumber { @@ -444,11 +536,11 @@ func (x FieldOptions_JSType) String() string { } func (FieldOptions_JSType) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[5].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[6].Descriptor() } func (FieldOptions_JSType) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[5] + return &file_google_protobuf_descriptor_proto_enumTypes[6] } func (x FieldOptions_JSType) Number() protoreflect.EnumNumber { @@ -506,11 +598,11 @@ func (x FieldOptions_OptionRetention) String() string { } func (FieldOptions_OptionRetention) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[6].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[7].Descriptor() } func (FieldOptions_OptionRetention) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[6] + return &file_google_protobuf_descriptor_proto_enumTypes[7] } func (x FieldOptions_OptionRetention) Number() protoreflect.EnumNumber { @@ -590,11 +682,11 @@ func (x FieldOptions_OptionTargetType) String() string { } func (FieldOptions_OptionTargetType) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[7].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[8].Descriptor() } func (FieldOptions_OptionTargetType) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[7] + return &file_google_protobuf_descriptor_proto_enumTypes[8] } func (x FieldOptions_OptionTargetType) Number() protoreflect.EnumNumber { @@ -652,11 +744,11 @@ func (x MethodOptions_IdempotencyLevel) String() string { } func (MethodOptions_IdempotencyLevel) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[8].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[9].Descriptor() } func (MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[8] + return &file_google_protobuf_descriptor_proto_enumTypes[9] } func (x MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber { @@ -678,6 +770,363 @@ func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{17, 0} } +type FeatureSet_FieldPresence int32 + +const ( + FeatureSet_FIELD_PRESENCE_UNKNOWN FeatureSet_FieldPresence = 0 + FeatureSet_EXPLICIT FeatureSet_FieldPresence = 1 + FeatureSet_IMPLICIT FeatureSet_FieldPresence = 2 + FeatureSet_LEGACY_REQUIRED FeatureSet_FieldPresence = 3 +) + +// Enum value maps for FeatureSet_FieldPresence. +var ( + FeatureSet_FieldPresence_name = map[int32]string{ + 0: "FIELD_PRESENCE_UNKNOWN", + 1: "EXPLICIT", + 2: "IMPLICIT", + 3: "LEGACY_REQUIRED", + } + FeatureSet_FieldPresence_value = map[string]int32{ + "FIELD_PRESENCE_UNKNOWN": 0, + "EXPLICIT": 1, + "IMPLICIT": 2, + "LEGACY_REQUIRED": 3, + } +) + +func (x FeatureSet_FieldPresence) Enum() *FeatureSet_FieldPresence { + p := new(FeatureSet_FieldPresence) + *p = x + return p +} + +func (x FeatureSet_FieldPresence) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FeatureSet_FieldPresence) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[10].Descriptor() +} + +func (FeatureSet_FieldPresence) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[10] +} + +func (x FeatureSet_FieldPresence) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *FeatureSet_FieldPresence) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = FeatureSet_FieldPresence(num) + return nil +} + +// Deprecated: Use FeatureSet_FieldPresence.Descriptor instead. +func (FeatureSet_FieldPresence) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19, 0} +} + +type FeatureSet_EnumType int32 + +const ( + FeatureSet_ENUM_TYPE_UNKNOWN FeatureSet_EnumType = 0 + FeatureSet_OPEN FeatureSet_EnumType = 1 + FeatureSet_CLOSED FeatureSet_EnumType = 2 +) + +// Enum value maps for FeatureSet_EnumType. +var ( + FeatureSet_EnumType_name = map[int32]string{ + 0: "ENUM_TYPE_UNKNOWN", + 1: "OPEN", + 2: "CLOSED", + } + FeatureSet_EnumType_value = map[string]int32{ + "ENUM_TYPE_UNKNOWN": 0, + "OPEN": 1, + "CLOSED": 2, + } +) + +func (x FeatureSet_EnumType) Enum() *FeatureSet_EnumType { + p := new(FeatureSet_EnumType) + *p = x + return p +} + +func (x FeatureSet_EnumType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FeatureSet_EnumType) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[11].Descriptor() +} + +func (FeatureSet_EnumType) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[11] +} + +func (x FeatureSet_EnumType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *FeatureSet_EnumType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = FeatureSet_EnumType(num) + return nil +} + +// Deprecated: Use FeatureSet_EnumType.Descriptor instead. +func (FeatureSet_EnumType) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19, 1} +} + +type FeatureSet_RepeatedFieldEncoding int32 + +const ( + FeatureSet_REPEATED_FIELD_ENCODING_UNKNOWN FeatureSet_RepeatedFieldEncoding = 0 + FeatureSet_PACKED FeatureSet_RepeatedFieldEncoding = 1 + FeatureSet_EXPANDED FeatureSet_RepeatedFieldEncoding = 2 +) + +// Enum value maps for FeatureSet_RepeatedFieldEncoding. +var ( + FeatureSet_RepeatedFieldEncoding_name = map[int32]string{ + 0: "REPEATED_FIELD_ENCODING_UNKNOWN", + 1: "PACKED", + 2: "EXPANDED", + } + FeatureSet_RepeatedFieldEncoding_value = map[string]int32{ + "REPEATED_FIELD_ENCODING_UNKNOWN": 0, + "PACKED": 1, + "EXPANDED": 2, + } +) + +func (x FeatureSet_RepeatedFieldEncoding) Enum() *FeatureSet_RepeatedFieldEncoding { + p := new(FeatureSet_RepeatedFieldEncoding) + *p = x + return p +} + +func (x FeatureSet_RepeatedFieldEncoding) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FeatureSet_RepeatedFieldEncoding) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[12].Descriptor() +} + +func (FeatureSet_RepeatedFieldEncoding) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[12] +} + +func (x FeatureSet_RepeatedFieldEncoding) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *FeatureSet_RepeatedFieldEncoding) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = FeatureSet_RepeatedFieldEncoding(num) + return nil +} + +// Deprecated: Use FeatureSet_RepeatedFieldEncoding.Descriptor instead. +func (FeatureSet_RepeatedFieldEncoding) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19, 2} +} + +type FeatureSet_Utf8Validation int32 + +const ( + FeatureSet_UTF8_VALIDATION_UNKNOWN FeatureSet_Utf8Validation = 0 + FeatureSet_NONE FeatureSet_Utf8Validation = 1 + FeatureSet_VERIFY FeatureSet_Utf8Validation = 2 +) + +// Enum value maps for FeatureSet_Utf8Validation. +var ( + FeatureSet_Utf8Validation_name = map[int32]string{ + 0: "UTF8_VALIDATION_UNKNOWN", + 1: "NONE", + 2: "VERIFY", + } + FeatureSet_Utf8Validation_value = map[string]int32{ + "UTF8_VALIDATION_UNKNOWN": 0, + "NONE": 1, + "VERIFY": 2, + } +) + +func (x FeatureSet_Utf8Validation) Enum() *FeatureSet_Utf8Validation { + p := new(FeatureSet_Utf8Validation) + *p = x + return p +} + +func (x FeatureSet_Utf8Validation) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FeatureSet_Utf8Validation) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[13].Descriptor() +} + +func (FeatureSet_Utf8Validation) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[13] +} + +func (x FeatureSet_Utf8Validation) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *FeatureSet_Utf8Validation) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = FeatureSet_Utf8Validation(num) + return nil +} + +// Deprecated: Use FeatureSet_Utf8Validation.Descriptor instead. +func (FeatureSet_Utf8Validation) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19, 3} +} + +type FeatureSet_MessageEncoding int32 + +const ( + FeatureSet_MESSAGE_ENCODING_UNKNOWN FeatureSet_MessageEncoding = 0 + FeatureSet_LENGTH_PREFIXED FeatureSet_MessageEncoding = 1 + FeatureSet_DELIMITED FeatureSet_MessageEncoding = 2 +) + +// Enum value maps for FeatureSet_MessageEncoding. +var ( + FeatureSet_MessageEncoding_name = map[int32]string{ + 0: "MESSAGE_ENCODING_UNKNOWN", + 1: "LENGTH_PREFIXED", + 2: "DELIMITED", + } + FeatureSet_MessageEncoding_value = map[string]int32{ + "MESSAGE_ENCODING_UNKNOWN": 0, + "LENGTH_PREFIXED": 1, + "DELIMITED": 2, + } +) + +func (x FeatureSet_MessageEncoding) Enum() *FeatureSet_MessageEncoding { + p := new(FeatureSet_MessageEncoding) + *p = x + return p +} + +func (x FeatureSet_MessageEncoding) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FeatureSet_MessageEncoding) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[14].Descriptor() +} + +func (FeatureSet_MessageEncoding) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[14] +} + +func (x FeatureSet_MessageEncoding) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *FeatureSet_MessageEncoding) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = FeatureSet_MessageEncoding(num) + return nil +} + +// Deprecated: Use FeatureSet_MessageEncoding.Descriptor instead. +func (FeatureSet_MessageEncoding) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19, 4} +} + +type FeatureSet_JsonFormat int32 + +const ( + FeatureSet_JSON_FORMAT_UNKNOWN FeatureSet_JsonFormat = 0 + FeatureSet_ALLOW FeatureSet_JsonFormat = 1 + FeatureSet_LEGACY_BEST_EFFORT FeatureSet_JsonFormat = 2 +) + +// Enum value maps for FeatureSet_JsonFormat. +var ( + FeatureSet_JsonFormat_name = map[int32]string{ + 0: "JSON_FORMAT_UNKNOWN", + 1: "ALLOW", + 2: "LEGACY_BEST_EFFORT", + } + FeatureSet_JsonFormat_value = map[string]int32{ + "JSON_FORMAT_UNKNOWN": 0, + "ALLOW": 1, + "LEGACY_BEST_EFFORT": 2, + } +) + +func (x FeatureSet_JsonFormat) Enum() *FeatureSet_JsonFormat { + p := new(FeatureSet_JsonFormat) + *p = x + return p +} + +func (x FeatureSet_JsonFormat) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FeatureSet_JsonFormat) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[15].Descriptor() +} + +func (FeatureSet_JsonFormat) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[15] +} + +func (x FeatureSet_JsonFormat) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *FeatureSet_JsonFormat) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = FeatureSet_JsonFormat(num) + return nil +} + +// Deprecated: Use FeatureSet_JsonFormat.Descriptor instead. +func (FeatureSet_JsonFormat) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19, 5} +} + // Represents the identified object's effect on the element in the original // .proto file. type GeneratedCodeInfo_Annotation_Semantic int32 @@ -716,11 +1165,11 @@ func (x GeneratedCodeInfo_Annotation_Semantic) String() string { } func (GeneratedCodeInfo_Annotation_Semantic) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[9].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[16].Descriptor() } func (GeneratedCodeInfo_Annotation_Semantic) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[9] + return &file_google_protobuf_descriptor_proto_enumTypes[16] } func (x GeneratedCodeInfo_Annotation_Semantic) Number() protoreflect.EnumNumber { @@ -739,7 +1188,7 @@ func (x *GeneratedCodeInfo_Annotation_Semantic) UnmarshalJSON(b []byte) error { // Deprecated: Use GeneratedCodeInfo_Annotation_Semantic.Descriptor instead. func (GeneratedCodeInfo_Annotation_Semantic) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20, 0, 0} + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{22, 0, 0} } // The protocol compiler can output a FileDescriptorSet containing the .proto @@ -822,8 +1271,8 @@ type FileDescriptorProto struct { // // If `edition` is present, this value must be "editions". Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` - // The edition of the proto file, which is an opaque string. - Edition *string `protobuf:"bytes,13,opt,name=edition" json:"edition,omitempty"` + // The edition of the proto file. + Edition *Edition `protobuf:"varint,14,opt,name=edition,enum=google.protobuf.Edition" json:"edition,omitempty"` } func (x *FileDescriptorProto) Reset() { @@ -942,11 +1391,11 @@ func (x *FileDescriptorProto) GetSyntax() string { return "" } -func (x *FileDescriptorProto) GetEdition() string { +func (x *FileDescriptorProto) GetEdition() Edition { if x != nil && x.Edition != nil { return *x.Edition } - return "" + return Edition_EDITION_UNKNOWN } // Describes a message type. @@ -1079,13 +1528,14 @@ type ExtensionRangeOptions struct { // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` - // go/protobuf-stripping-extension-declarations - // Like Metadata, but we use a repeated field to hold all extension - // declarations. This should avoid the size increases of transforming a large - // extension range into small ranges in generated binaries. + // For external users: DO NOT USE. We are in the process of open sourcing + // extension declaration and executing internal cleanups before it can be + // used externally. Declaration []*ExtensionRangeOptions_Declaration `protobuf:"bytes,2,rep,name=declaration" json:"declaration,omitempty"` + // Any features defined in the specific edition. + Features *FeatureSet `protobuf:"bytes,50,opt,name=features" json:"features,omitempty"` // The verification state of the range. - // TODO(b/278783756): flip the default to DECLARATION once all empty ranges + // TODO: flip the default to DECLARATION once all empty ranges // are marked as UNVERIFIED. Verification *ExtensionRangeOptions_VerificationState `protobuf:"varint,3,opt,name=verification,enum=google.protobuf.ExtensionRangeOptions_VerificationState,def=1" json:"verification,omitempty"` } @@ -1141,6 +1591,13 @@ func (x *ExtensionRangeOptions) GetDeclaration() []*ExtensionRangeOptions_Declar return nil } +func (x *ExtensionRangeOptions) GetFeatures() *FeatureSet { + if x != nil { + return x.Features + } + return nil +} + func (x *ExtensionRangeOptions) GetVerification() ExtensionRangeOptions_VerificationState { if x != nil && x.Verification != nil { return *x.Verification @@ -1772,6 +2229,8 @@ type FileOptions struct { // is empty. When this option is not set, the package name will be used for // determining the ruby package. RubyPackage *string `protobuf:"bytes,45,opt,name=ruby_package,json=rubyPackage" json:"ruby_package,omitempty"` + // Any features defined in the specific edition. + Features *FeatureSet `protobuf:"bytes,50,opt,name=features" json:"features,omitempty"` // The parser stores options it doesn't recognize here. // See the documentation for the "Options" section above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` @@ -1963,6 +2422,13 @@ func (x *FileOptions) GetRubyPackage() string { return "" } +func (x *FileOptions) GetFeatures() *FeatureSet { + if x != nil { + return x.Features + } + return nil +} + func (x *FileOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2039,11 +2505,13 @@ type MessageOptions struct { // This should only be used as a temporary measure against broken builds due // to the change in behavior for JSON field name conflicts. // - // TODO(b/261750190) This is legacy behavior we plan to remove once downstream + // TODO This is legacy behavior we plan to remove once downstream // teams have had time to migrate. // // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. DeprecatedLegacyJsonFieldConflicts *bool `protobuf:"varint,11,opt,name=deprecated_legacy_json_field_conflicts,json=deprecatedLegacyJsonFieldConflicts" json:"deprecated_legacy_json_field_conflicts,omitempty"` + // Any features defined in the specific edition. + Features *FeatureSet `protobuf:"bytes,12,opt,name=features" json:"features,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } @@ -2123,6 +2591,13 @@ func (x *MessageOptions) GetDeprecatedLegacyJsonFieldConflicts() bool { return false } +func (x *MessageOptions) GetFeatures() *FeatureSet { + if x != nil { + return x.Features + } + return nil +} + func (x *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2147,7 +2622,9 @@ type FieldOptions struct { // a more efficient representation on the wire. Rather than repeatedly // writing the tag and type for each element, the entire array is encoded as // a single length-delimited blob. In proto3, only explicit setting it to - // false will avoid using packed encoding. + // false will avoid using packed encoding. This option is prohibited in + // Editions, but the `repeated_field_encoding` feature can be used to control + // the behavior. Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"` // The jstype option determines the JavaScript type used for values of the // field. The option is permitted only for 64 bit integral and fixed types @@ -2205,11 +2682,12 @@ type FieldOptions struct { Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` // Indicate that the field value should not be printed out when using debug // formats, e.g. when the field contains sensitive credentials. - DebugRedact *bool `protobuf:"varint,16,opt,name=debug_redact,json=debugRedact,def=0" json:"debug_redact,omitempty"` - Retention *FieldOptions_OptionRetention `protobuf:"varint,17,opt,name=retention,enum=google.protobuf.FieldOptions_OptionRetention" json:"retention,omitempty"` - // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. - Target *FieldOptions_OptionTargetType `protobuf:"varint,18,opt,name=target,enum=google.protobuf.FieldOptions_OptionTargetType" json:"target,omitempty"` - Targets []FieldOptions_OptionTargetType `protobuf:"varint,19,rep,name=targets,enum=google.protobuf.FieldOptions_OptionTargetType" json:"targets,omitempty"` + DebugRedact *bool `protobuf:"varint,16,opt,name=debug_redact,json=debugRedact,def=0" json:"debug_redact,omitempty"` + Retention *FieldOptions_OptionRetention `protobuf:"varint,17,opt,name=retention,enum=google.protobuf.FieldOptions_OptionRetention" json:"retention,omitempty"` + Targets []FieldOptions_OptionTargetType `protobuf:"varint,19,rep,name=targets,enum=google.protobuf.FieldOptions_OptionTargetType" json:"targets,omitempty"` + EditionDefaults []*FieldOptions_EditionDefault `protobuf:"bytes,20,rep,name=edition_defaults,json=editionDefaults" json:"edition_defaults,omitempty"` + // Any features defined in the specific edition. + Features *FeatureSet `protobuf:"bytes,21,opt,name=features" json:"features,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } @@ -2320,17 +2798,23 @@ func (x *FieldOptions) GetRetention() FieldOptions_OptionRetention { return FieldOptions_RETENTION_UNKNOWN } -// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -func (x *FieldOptions) GetTarget() FieldOptions_OptionTargetType { - if x != nil && x.Target != nil { - return *x.Target +func (x *FieldOptions) GetTargets() []FieldOptions_OptionTargetType { + if x != nil { + return x.Targets } - return FieldOptions_TARGET_TYPE_UNKNOWN + return nil } -func (x *FieldOptions) GetTargets() []FieldOptions_OptionTargetType { +func (x *FieldOptions) GetEditionDefaults() []*FieldOptions_EditionDefault { if x != nil { - return x.Targets + return x.EditionDefaults + } + return nil +} + +func (x *FieldOptions) GetFeatures() *FeatureSet { + if x != nil { + return x.Features } return nil } @@ -2348,6 +2832,8 @@ type OneofOptions struct { unknownFields protoimpl.UnknownFields extensionFields protoimpl.ExtensionFields + // Any features defined in the specific edition. + Features *FeatureSet `protobuf:"bytes,1,opt,name=features" json:"features,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } @@ -2384,6 +2870,13 @@ func (*OneofOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{13} } +func (x *OneofOptions) GetFeatures() *FeatureSet { + if x != nil { + return x.Features + } + return nil +} + func (x *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2409,11 +2902,13 @@ type EnumOptions struct { // and strips underscored from the fields before comparison in proto3 only. // The new behavior takes `json_name` into account and applies to proto2 as // well. - // TODO(b/261750190) Remove this legacy behavior once downstream teams have + // TODO Remove this legacy behavior once downstream teams have // had time to migrate. // // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. DeprecatedLegacyJsonFieldConflicts *bool `protobuf:"varint,6,opt,name=deprecated_legacy_json_field_conflicts,json=deprecatedLegacyJsonFieldConflicts" json:"deprecated_legacy_json_field_conflicts,omitempty"` + // Any features defined in the specific edition. + Features *FeatureSet `protobuf:"bytes,7,opt,name=features" json:"features,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } @@ -2477,6 +2972,13 @@ func (x *EnumOptions) GetDeprecatedLegacyJsonFieldConflicts() bool { return false } +func (x *EnumOptions) GetFeatures() *FeatureSet { + if x != nil { + return x.Features + } + return nil +} + func (x *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2495,13 +2997,20 @@ type EnumValueOptions struct { // for the enum value, or it will be completely ignored; in the very least, // this is a formalization for deprecating enum values. Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Any features defined in the specific edition. + Features *FeatureSet `protobuf:"bytes,2,opt,name=features" json:"features,omitempty"` + // Indicate that fields annotated with this enum value should not be printed + // out when using debug formats, e.g. when the field contains sensitive + // credentials. + DebugRedact *bool `protobuf:"varint,3,opt,name=debug_redact,json=debugRedact,def=0" json:"debug_redact,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } // Default values for EnumValueOptions fields. const ( - Default_EnumValueOptions_Deprecated = bool(false) + Default_EnumValueOptions_Deprecated = bool(false) + Default_EnumValueOptions_DebugRedact = bool(false) ) func (x *EnumValueOptions) Reset() { @@ -2543,6 +3052,20 @@ func (x *EnumValueOptions) GetDeprecated() bool { return Default_EnumValueOptions_Deprecated } +func (x *EnumValueOptions) GetFeatures() *FeatureSet { + if x != nil { + return x.Features + } + return nil +} + +func (x *EnumValueOptions) GetDebugRedact() bool { + if x != nil && x.DebugRedact != nil { + return *x.DebugRedact + } + return Default_EnumValueOptions_DebugRedact +} + func (x *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2556,6 +3079,8 @@ type ServiceOptions struct { unknownFields protoimpl.UnknownFields extensionFields protoimpl.ExtensionFields + // Any features defined in the specific edition. + Features *FeatureSet `protobuf:"bytes,34,opt,name=features" json:"features,omitempty"` // Is this service deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the service, or it will be completely ignored; in the very least, @@ -2602,6 +3127,13 @@ func (*ServiceOptions) Descriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{16} } +func (x *ServiceOptions) GetFeatures() *FeatureSet { + if x != nil { + return x.Features + } + return nil +} + func (x *ServiceOptions) GetDeprecated() bool { if x != nil && x.Deprecated != nil { return *x.Deprecated @@ -2628,6 +3160,8 @@ type MethodOptions struct { // this is a formalization for deprecating methods. Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"` + // Any features defined in the specific edition. + Features *FeatureSet `protobuf:"bytes,35,opt,name=features" json:"features,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } @@ -2684,6 +3218,13 @@ func (x *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel { return Default_MethodOptions_IdempotencyLevel } +func (x *MethodOptions) GetFeatures() *FeatureSet { + if x != nil { + return x.Features + } + return nil +} + func (x *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2763,35 +3304,200 @@ func (x *UninterpretedOption) GetPositiveIntValue() uint64 { if x != nil && x.PositiveIntValue != nil { return *x.PositiveIntValue } - return 0 + return 0 +} + +func (x *UninterpretedOption) GetNegativeIntValue() int64 { + if x != nil && x.NegativeIntValue != nil { + return *x.NegativeIntValue + } + return 0 +} + +func (x *UninterpretedOption) GetDoubleValue() float64 { + if x != nil && x.DoubleValue != nil { + return *x.DoubleValue + } + return 0 +} + +func (x *UninterpretedOption) GetStringValue() []byte { + if x != nil { + return x.StringValue + } + return nil +} + +func (x *UninterpretedOption) GetAggregateValue() string { + if x != nil && x.AggregateValue != nil { + return *x.AggregateValue + } + return "" +} + +// TODO Enums in C++ gencode (and potentially other languages) are +// not well scoped. This means that each of the feature enums below can clash +// with each other. The short names we've chosen maximize call-site +// readability, but leave us very open to this scenario. A future feature will +// be designed and implemented to handle this, hopefully before we ever hit a +// conflict here. +type FeatureSet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + FieldPresence *FeatureSet_FieldPresence `protobuf:"varint,1,opt,name=field_presence,json=fieldPresence,enum=google.protobuf.FeatureSet_FieldPresence" json:"field_presence,omitempty"` + EnumType *FeatureSet_EnumType `protobuf:"varint,2,opt,name=enum_type,json=enumType,enum=google.protobuf.FeatureSet_EnumType" json:"enum_type,omitempty"` + RepeatedFieldEncoding *FeatureSet_RepeatedFieldEncoding `protobuf:"varint,3,opt,name=repeated_field_encoding,json=repeatedFieldEncoding,enum=google.protobuf.FeatureSet_RepeatedFieldEncoding" json:"repeated_field_encoding,omitempty"` + Utf8Validation *FeatureSet_Utf8Validation `protobuf:"varint,4,opt,name=utf8_validation,json=utf8Validation,enum=google.protobuf.FeatureSet_Utf8Validation" json:"utf8_validation,omitempty"` + MessageEncoding *FeatureSet_MessageEncoding `protobuf:"varint,5,opt,name=message_encoding,json=messageEncoding,enum=google.protobuf.FeatureSet_MessageEncoding" json:"message_encoding,omitempty"` + JsonFormat *FeatureSet_JsonFormat `protobuf:"varint,6,opt,name=json_format,json=jsonFormat,enum=google.protobuf.FeatureSet_JsonFormat" json:"json_format,omitempty"` +} + +func (x *FeatureSet) Reset() { + *x = FeatureSet{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_descriptor_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FeatureSet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FeatureSet) ProtoMessage() {} + +func (x *FeatureSet) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_descriptor_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FeatureSet.ProtoReflect.Descriptor instead. +func (*FeatureSet) Descriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19} +} + +func (x *FeatureSet) GetFieldPresence() FeatureSet_FieldPresence { + if x != nil && x.FieldPresence != nil { + return *x.FieldPresence + } + return FeatureSet_FIELD_PRESENCE_UNKNOWN +} + +func (x *FeatureSet) GetEnumType() FeatureSet_EnumType { + if x != nil && x.EnumType != nil { + return *x.EnumType + } + return FeatureSet_ENUM_TYPE_UNKNOWN +} + +func (x *FeatureSet) GetRepeatedFieldEncoding() FeatureSet_RepeatedFieldEncoding { + if x != nil && x.RepeatedFieldEncoding != nil { + return *x.RepeatedFieldEncoding + } + return FeatureSet_REPEATED_FIELD_ENCODING_UNKNOWN +} + +func (x *FeatureSet) GetUtf8Validation() FeatureSet_Utf8Validation { + if x != nil && x.Utf8Validation != nil { + return *x.Utf8Validation + } + return FeatureSet_UTF8_VALIDATION_UNKNOWN +} + +func (x *FeatureSet) GetMessageEncoding() FeatureSet_MessageEncoding { + if x != nil && x.MessageEncoding != nil { + return *x.MessageEncoding + } + return FeatureSet_MESSAGE_ENCODING_UNKNOWN +} + +func (x *FeatureSet) GetJsonFormat() FeatureSet_JsonFormat { + if x != nil && x.JsonFormat != nil { + return *x.JsonFormat + } + return FeatureSet_JSON_FORMAT_UNKNOWN +} + +// A compiled specification for the defaults of a set of features. These +// messages are generated from FeatureSet extensions and can be used to seed +// feature resolution. The resolution with this object becomes a simple search +// for the closest matching edition, followed by proto merges. +type FeatureSetDefaults struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Defaults []*FeatureSetDefaults_FeatureSetEditionDefault `protobuf:"bytes,1,rep,name=defaults" json:"defaults,omitempty"` + // The minimum supported edition (inclusive) when this was constructed. + // Editions before this will not have defaults. + MinimumEdition *Edition `protobuf:"varint,4,opt,name=minimum_edition,json=minimumEdition,enum=google.protobuf.Edition" json:"minimum_edition,omitempty"` + // The maximum known edition (inclusive) when this was constructed. Editions + // after this will not have reliable defaults. + MaximumEdition *Edition `protobuf:"varint,5,opt,name=maximum_edition,json=maximumEdition,enum=google.protobuf.Edition" json:"maximum_edition,omitempty"` +} + +func (x *FeatureSetDefaults) Reset() { + *x = FeatureSetDefaults{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_descriptor_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (x *UninterpretedOption) GetNegativeIntValue() int64 { - if x != nil && x.NegativeIntValue != nil { - return *x.NegativeIntValue - } - return 0 +func (x *FeatureSetDefaults) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *UninterpretedOption) GetDoubleValue() float64 { - if x != nil && x.DoubleValue != nil { - return *x.DoubleValue +func (*FeatureSetDefaults) ProtoMessage() {} + +func (x *FeatureSetDefaults) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_descriptor_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *UninterpretedOption) GetStringValue() []byte { +// Deprecated: Use FeatureSetDefaults.ProtoReflect.Descriptor instead. +func (*FeatureSetDefaults) Descriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20} +} + +func (x *FeatureSetDefaults) GetDefaults() []*FeatureSetDefaults_FeatureSetEditionDefault { if x != nil { - return x.StringValue + return x.Defaults } return nil } -func (x *UninterpretedOption) GetAggregateValue() string { - if x != nil && x.AggregateValue != nil { - return *x.AggregateValue +func (x *FeatureSetDefaults) GetMinimumEdition() Edition { + if x != nil && x.MinimumEdition != nil { + return *x.MinimumEdition } - return "" + return Edition_EDITION_UNKNOWN +} + +func (x *FeatureSetDefaults) GetMaximumEdition() Edition { + if x != nil && x.MaximumEdition != nil { + return *x.MaximumEdition + } + return Edition_EDITION_UNKNOWN } // Encapsulates information about the original source file from which a @@ -2855,7 +3561,7 @@ type SourceCodeInfo struct { func (x *SourceCodeInfo) Reset() { *x = SourceCodeInfo{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[19] + mi := &file_google_protobuf_descriptor_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2868,7 +3574,7 @@ func (x *SourceCodeInfo) String() string { func (*SourceCodeInfo) ProtoMessage() {} func (x *SourceCodeInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[19] + mi := &file_google_protobuf_descriptor_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2881,7 +3587,7 @@ func (x *SourceCodeInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceCodeInfo.ProtoReflect.Descriptor instead. func (*SourceCodeInfo) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19} + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{21} } func (x *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { @@ -2907,7 +3613,7 @@ type GeneratedCodeInfo struct { func (x *GeneratedCodeInfo) Reset() { *x = GeneratedCodeInfo{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[20] + mi := &file_google_protobuf_descriptor_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2920,7 +3626,7 @@ func (x *GeneratedCodeInfo) String() string { func (*GeneratedCodeInfo) ProtoMessage() {} func (x *GeneratedCodeInfo) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[20] + mi := &file_google_protobuf_descriptor_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2933,7 +3639,7 @@ func (x *GeneratedCodeInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GeneratedCodeInfo.ProtoReflect.Descriptor instead. func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20} + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{22} } func (x *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { @@ -2956,7 +3662,7 @@ type DescriptorProto_ExtensionRange struct { func (x *DescriptorProto_ExtensionRange) Reset() { *x = DescriptorProto_ExtensionRange{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[21] + mi := &file_google_protobuf_descriptor_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2969,7 +3675,7 @@ func (x *DescriptorProto_ExtensionRange) String() string { func (*DescriptorProto_ExtensionRange) ProtoMessage() {} func (x *DescriptorProto_ExtensionRange) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[21] + mi := &file_google_protobuf_descriptor_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3021,7 +3727,7 @@ type DescriptorProto_ReservedRange struct { func (x *DescriptorProto_ReservedRange) Reset() { *x = DescriptorProto_ReservedRange{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[22] + mi := &file_google_protobuf_descriptor_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3034,7 +3740,7 @@ func (x *DescriptorProto_ReservedRange) String() string { func (*DescriptorProto_ReservedRange) ProtoMessage() {} func (x *DescriptorProto_ReservedRange) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[22] + mi := &file_google_protobuf_descriptor_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3078,10 +3784,6 @@ type ExtensionRangeOptions_Declaration struct { // Metadata.type, Declaration.type must have a leading dot for messages // and enums. Type *string `protobuf:"bytes,3,opt,name=type" json:"type,omitempty"` - // Deprecated. Please use "repeated". - // - // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. - IsRepeated *bool `protobuf:"varint,4,opt,name=is_repeated,json=isRepeated" json:"is_repeated,omitempty"` // If true, indicates that the number is reserved in the extension range, // and any extension field with the number will fail to compile. Set this // when a declared extension field is deleted. @@ -3094,7 +3796,7 @@ type ExtensionRangeOptions_Declaration struct { func (x *ExtensionRangeOptions_Declaration) Reset() { *x = ExtensionRangeOptions_Declaration{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[23] + mi := &file_google_protobuf_descriptor_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3107,7 +3809,7 @@ func (x *ExtensionRangeOptions_Declaration) String() string { func (*ExtensionRangeOptions_Declaration) ProtoMessage() {} func (x *ExtensionRangeOptions_Declaration) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[23] + mi := &file_google_protobuf_descriptor_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3144,14 +3846,6 @@ func (x *ExtensionRangeOptions_Declaration) GetType() string { return "" } -// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. -func (x *ExtensionRangeOptions_Declaration) GetIsRepeated() bool { - if x != nil && x.IsRepeated != nil { - return *x.IsRepeated - } - return false -} - func (x *ExtensionRangeOptions_Declaration) GetReserved() bool { if x != nil && x.Reserved != nil { return *x.Reserved @@ -3184,7 +3878,7 @@ type EnumDescriptorProto_EnumReservedRange struct { func (x *EnumDescriptorProto_EnumReservedRange) Reset() { *x = EnumDescriptorProto_EnumReservedRange{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[24] + mi := &file_google_protobuf_descriptor_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3197,7 +3891,7 @@ func (x *EnumDescriptorProto_EnumReservedRange) String() string { func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {} func (x *EnumDescriptorProto_EnumReservedRange) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[24] + mi := &file_google_protobuf_descriptor_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3227,6 +3921,61 @@ func (x *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { return 0 } +type FieldOptions_EditionDefault struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Edition *Edition `protobuf:"varint,3,opt,name=edition,enum=google.protobuf.Edition" json:"edition,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` // Textproto value. +} + +func (x *FieldOptions_EditionDefault) Reset() { + *x = FieldOptions_EditionDefault{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_descriptor_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FieldOptions_EditionDefault) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FieldOptions_EditionDefault) ProtoMessage() {} + +func (x *FieldOptions_EditionDefault) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_descriptor_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FieldOptions_EditionDefault.ProtoReflect.Descriptor instead. +func (*FieldOptions_EditionDefault) Descriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 0} +} + +func (x *FieldOptions_EditionDefault) GetEdition() Edition { + if x != nil && x.Edition != nil { + return *x.Edition + } + return Edition_EDITION_UNKNOWN +} + +func (x *FieldOptions_EditionDefault) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value + } + return "" +} + // The name of the uninterpreted option. Each string represents a segment in // a dot-separated name. is_extension is true iff a segment represents an // extension (denoted with parentheses in options specs in .proto files). @@ -3244,7 +3993,7 @@ type UninterpretedOption_NamePart struct { func (x *UninterpretedOption_NamePart) Reset() { *x = UninterpretedOption_NamePart{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[25] + mi := &file_google_protobuf_descriptor_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3257,7 +4006,7 @@ func (x *UninterpretedOption_NamePart) String() string { func (*UninterpretedOption_NamePart) ProtoMessage() {} func (x *UninterpretedOption_NamePart) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[25] + mi := &file_google_protobuf_descriptor_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3287,6 +4036,65 @@ func (x *UninterpretedOption_NamePart) GetIsExtension() bool { return false } +// A map from every known edition with a unique set of defaults to its +// defaults. Not all editions may be contained here. For a given edition, +// the defaults at the closest matching edition ordered at or before it should +// be used. This field must be in strict ascending order by edition. +type FeatureSetDefaults_FeatureSetEditionDefault struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Edition *Edition `protobuf:"varint,3,opt,name=edition,enum=google.protobuf.Edition" json:"edition,omitempty"` + Features *FeatureSet `protobuf:"bytes,2,opt,name=features" json:"features,omitempty"` +} + +func (x *FeatureSetDefaults_FeatureSetEditionDefault) Reset() { + *x = FeatureSetDefaults_FeatureSetEditionDefault{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_descriptor_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FeatureSetDefaults_FeatureSetEditionDefault) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FeatureSetDefaults_FeatureSetEditionDefault) ProtoMessage() {} + +func (x *FeatureSetDefaults_FeatureSetEditionDefault) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_descriptor_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FeatureSetDefaults_FeatureSetEditionDefault.ProtoReflect.Descriptor instead. +func (*FeatureSetDefaults_FeatureSetEditionDefault) Descriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20, 0} +} + +func (x *FeatureSetDefaults_FeatureSetEditionDefault) GetEdition() Edition { + if x != nil && x.Edition != nil { + return *x.Edition + } + return Edition_EDITION_UNKNOWN +} + +func (x *FeatureSetDefaults_FeatureSetEditionDefault) GetFeatures() *FeatureSet { + if x != nil { + return x.Features + } + return nil +} + type SourceCodeInfo_Location struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3388,7 +4196,7 @@ type SourceCodeInfo_Location struct { func (x *SourceCodeInfo_Location) Reset() { *x = SourceCodeInfo_Location{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[26] + mi := &file_google_protobuf_descriptor_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3401,7 +4209,7 @@ func (x *SourceCodeInfo_Location) String() string { func (*SourceCodeInfo_Location) ProtoMessage() {} func (x *SourceCodeInfo_Location) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[26] + mi := &file_google_protobuf_descriptor_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3414,7 +4222,7 @@ func (x *SourceCodeInfo_Location) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceCodeInfo_Location.ProtoReflect.Descriptor instead. func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{19, 0} + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{21, 0} } func (x *SourceCodeInfo_Location) GetPath() []int32 { @@ -3475,7 +4283,7 @@ type GeneratedCodeInfo_Annotation struct { func (x *GeneratedCodeInfo_Annotation) Reset() { *x = GeneratedCodeInfo_Annotation{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[27] + mi := &file_google_protobuf_descriptor_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3488,7 +4296,7 @@ func (x *GeneratedCodeInfo_Annotation) String() string { func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} func (x *GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[27] + mi := &file_google_protobuf_descriptor_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3501,7 +4309,7 @@ func (x *GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message { // Deprecated: Use GeneratedCodeInfo_Annotation.ProtoReflect.Descriptor instead. func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) { - return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20, 0} + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{22, 0} } func (x *GeneratedCodeInfo_Annotation) GetPath() []int32 { @@ -3550,7 +4358,7 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x04, 0x66, 0x69, - 0x6c, 0x65, 0x22, 0xfe, 0x04, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x6c, 0x65, 0x22, 0x98, 0x05, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, @@ -3588,527 +4396,687 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x06, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, - 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, + 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x07, 0x65, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x06, + 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, - 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, - 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, - 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, + 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, + 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, + 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, - 0xad, 0x04, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, - 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0x88, 0x01, - 0x02, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, - 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x0a, - 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xb3, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x63, - 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x23, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x69, 0x73, 0x52, 0x65, - 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x34, - 0x0a, 0x11, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, 0x43, 0x4c, 0x41, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x01, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, - 0xc1, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, - 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, - 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, - 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, - 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, - 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, - 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x05, - 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, - 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, - 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, - 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, - 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, - 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, - 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, - 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, - 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, - 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, - 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x12, 0x22, 0x43, - 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, - 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, - 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, - 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x45, - 0x44, 0x10, 0x03, 0x22, 0x63, 0x0a, 0x14, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x13, 0x45, 0x6e, 0x75, - 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5d, 0x0a, - 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x6e, 0x75, 0x6d, - 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, + 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, + 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x52, 0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, + 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x83, - 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, + 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x37, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xc7, 0x04, 0x0a, 0x15, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, + 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, + 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0x88, 0x01, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x63, + 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x12, 0x68, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x3a, 0x0a, 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x52, 0x0c, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x94, 0x01, 0x0a, 0x0b, + 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x04, + 0x10, 0x05, 0x22, 0x34, 0x0a, 0x11, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, 0x43, 0x4c, 0x41, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x4e, 0x56, 0x45, + 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, + 0x80, 0x80, 0x02, 0x22, 0xc1, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x64, 0x65, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x65, + 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, + 0x73, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, + 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, + 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, + 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, + 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, + 0x33, 0x32, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, + 0x45, 0x44, 0x36, 0x34, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, + 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, + 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, + 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, + 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, + 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, + 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, + 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x45, + 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, + 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x22, 0x63, 0x0a, 0x14, 0x4f, 0x6e, 0x65, 0x6f, 0x66, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe3, 0x02, 0x0a, + 0x13, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, + 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x5d, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, + 0x6e, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x89, - 0x02, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, + 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x89, 0x02, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x10, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x10, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x22, 0xca, + 0x09, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, + 0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x6a, 0x61, 0x76, 0x61, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, + 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6a, 0x61, 0x76, 0x61, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1d, 0x6a, 0x61, + 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x71, 0x75, 0x61, + 0x6c, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x19, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x3a, 0x0a, 0x16, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, + 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x74, 0x66, 0x38, 0x12, 0x53, 0x0a, 0x0c, + 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x05, 0x53, + 0x50, 0x45, 0x45, 0x44, 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, + 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x12, 0x35, 0x0a, 0x13, 0x63, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x63, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x15, 0x6a, 0x61, 0x76, 0x61, 0x5f, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, + 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x35, 0x0a, 0x13, 0x70, 0x79, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x3a, + 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x70, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, + 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x68, 0x70, + 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, + 0x70, 0x68, 0x70, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, + 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x41, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, + 0x63, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x18, 0x27, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, + 0x68, 0x70, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, + 0x0d, 0x70, 0x68, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x14, 0x70, 0x68, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, + 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x72, 0x75, 0x62, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x66, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x10, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x22, 0x91, 0x09, 0x0a, 0x0b, 0x46, - 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x61, - 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, - 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6a, 0x61, 0x76, - 0x61, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x35, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, - 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6a, 0x61, 0x76, 0x61, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1d, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x5f, 0x61, - 0x6e, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x19, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, - 0x71, 0x75, 0x61, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x16, - 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x55, 0x74, 0x66, 0x38, 0x12, 0x53, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, - 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x1d, 0x0a, - 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x13, - 0x63, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x52, 0x11, 0x63, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x15, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x35, - 0x0a, 0x13, 0x70, 0x79, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x52, 0x11, 0x70, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x68, 0x70, 0x5f, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x2a, 0x20, - 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, 0x70, 0x68, 0x70, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x25, - 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x3a, - 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, - 0x72, 0x65, 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, 0x63, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x73, 0x68, - 0x61, 0x72, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x27, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, - 0x28, 0x0a, 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x68, 0x70, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x68, 0x70, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x34, - 0x0a, 0x16, 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x70, 0x68, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, 0x5f, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x62, 0x79, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, - 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, - 0x49, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x09, 0x08, - 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x22, 0xbb, - 0x03, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x3c, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, - 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x53, 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, - 0x4c, 0x0a, 0x1f, 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, - 0x1c, 0x6e, 0x6f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, 0x25, 0x0a, - 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, - 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, - 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, - 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0x85, 0x09, 0x0a, - 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, - 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, - 0x65, 0x3a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x52, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, - 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x52, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x19, 0x0a, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, - 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x12, 0x2e, 0x0a, 0x0f, - 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x75, 0x6e, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, - 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x28, - 0x0a, 0x0c, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x62, - 0x75, 0x67, 0x52, 0x65, 0x64, 0x61, 0x63, 0x74, 0x12, 0x4b, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x48, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x13, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, - 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, - 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x22, 0x55, 0x0a, - 0x0f, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, - 0x0a, 0x10, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x10, 0x02, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, - 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, - 0x4e, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, - 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x45, 0x4f, 0x46, 0x10, 0x05, - 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x06, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, - 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x54, - 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, - 0x44, 0x10, 0x09, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, - 0x08, 0x04, 0x10, 0x05, 0x22, 0x73, 0x0a, 0x0c, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, - 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x98, 0x02, 0x0a, 0x0b, 0x45, 0x6e, - 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x09, + 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x44, + 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x54, 0x45, + 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, + 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x22, 0xf4, 0x03, 0x0a, 0x0e, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, + 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, + 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, + 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, + 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x4c, 0x0a, 0x1f, + 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x1c, 0x6e, 0x6f, + 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, - 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, - 0x08, 0x05, 0x10, 0x06, 0x22, 0x9e, 0x01, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, - 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, - 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, - 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x56, + 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x65, 0x67, + 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, - 0x80, 0x80, 0x80, 0x02, 0x22, 0xe0, 0x02, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, - 0x11, 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, - 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, - 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x64, - 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, - 0x0a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x4f, 0x5f, 0x53, 0x49, - 0x44, 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, - 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, - 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, 0x0a, 0x13, 0x55, 0x6e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, + 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, + 0x10, 0x0a, 0x22, 0xad, 0x0a, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x52, + 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x47, + 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, + 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x52, + 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x61, + 0x7a, 0x79, 0x12, 0x2e, 0x0a, 0x0f, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x52, 0x0e, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4c, 0x61, + 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, + 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x04, 0x77, 0x65, 0x61, + 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, + 0x77, 0x65, 0x61, 0x6b, 0x12, 0x28, 0x0a, 0x0c, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, + 0x64, 0x61, 0x63, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x52, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x52, 0x65, 0x64, 0x61, 0x63, 0x74, 0x12, 0x4b, + 0x0a, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x57, 0x0a, 0x10, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x0f, 0x65, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x37, + 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x1a, 0x5a, 0x0a, 0x0e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2f, 0x0a, + 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, + 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, + 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x35, + 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, + 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x53, 0x54, + 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x55, 0x4d, + 0x42, 0x45, 0x52, 0x10, 0x02, 0x22, 0x55, 0x0a, 0x0f, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, + 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4e, + 0x54, 0x49, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x02, 0x22, 0x8c, 0x02, 0x0a, + 0x10, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, + 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x01, + 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, + 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, + 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, + 0x04, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4f, 0x4e, 0x45, 0x4f, 0x46, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, + 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x06, 0x12, 0x1a, + 0x0a, 0x16, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, + 0x55, 0x4d, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, + 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x10, 0x09, 0x2a, 0x09, 0x08, 0xe8, 0x07, + 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x12, + 0x10, 0x13, 0x22, 0xac, 0x01, 0x0a, 0x0c, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, + 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, + 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, + 0x02, 0x22, 0xd1, 0x02, 0x0a, 0x0b, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, + 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, + 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, + 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, + 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, + 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, + 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, + 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x81, 0x02, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, + 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, + 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0c, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x52, 0x65, + 0x64, 0x61, 0x63, 0x74, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, + 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, + 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0xd5, 0x01, 0x0a, 0x0e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x08, + 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x14, + 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, + 0x02, 0x22, 0x99, 0x03, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, 0x11, 0x69, 0x64, + 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, + 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, + 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, + 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, 0x69, 0x64, 0x65, + 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x37, 0x0a, + 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x50, 0x0a, 0x10, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, 0x0a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, + 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, + 0x0f, 0x4e, 0x4f, 0x5f, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, + 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, + 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, + 0x0a, 0x13, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, + 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, + 0x72, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, + 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, + 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, + 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xfc, 0x09, 0x0a, 0x0a, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, 0x8b, 0x01, 0x0a, 0x0e, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x39, 0x88, + 0x01, 0x01, 0x98, 0x01, 0x04, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x45, 0x58, 0x50, + 0x4c, 0x49, 0x43, 0x49, 0x54, 0x18, 0xe6, 0x07, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x49, 0x4d, 0x50, + 0x4c, 0x49, 0x43, 0x49, 0x54, 0x18, 0xe7, 0x07, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x45, 0x58, 0x50, + 0x4c, 0x49, 0x43, 0x49, 0x54, 0x18, 0xe8, 0x07, 0x52, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x66, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, + 0x42, 0x23, 0x88, 0x01, 0x01, 0x98, 0x01, 0x06, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x0b, 0x12, 0x06, + 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x18, 0xe6, 0x07, 0xa2, 0x01, 0x09, 0x12, 0x04, 0x4f, 0x50, + 0x45, 0x4e, 0x18, 0xe7, 0x07, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x92, 0x01, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x42, 0x27, 0x88, 0x01, 0x01, 0x98, 0x01, 0x04, 0x98, 0x01, 0x01, 0xa2, + 0x01, 0x0d, 0x12, 0x08, 0x45, 0x58, 0x50, 0x41, 0x4e, 0x44, 0x45, 0x44, 0x18, 0xe6, 0x07, 0xa2, + 0x01, 0x0b, 0x12, 0x06, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x44, 0x18, 0xe7, 0x07, 0x52, 0x15, 0x72, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x78, 0x0a, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x55, 0x74, 0x66, 0x38, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x23, 0x88, 0x01, 0x01, 0x98, 0x01, + 0x04, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x09, 0x12, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x18, 0xe6, 0x07, + 0xa2, 0x01, 0x0b, 0x12, 0x06, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x18, 0xe7, 0x07, 0x52, 0x0e, + 0x75, 0x74, 0x66, 0x38, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x78, + 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x20, 0x88, 0x01, 0x01, 0x98, 0x01, 0x04, 0x98, 0x01, 0x01, + 0xa2, 0x01, 0x14, 0x12, 0x0f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x5f, 0x50, 0x52, 0x45, 0x46, + 0x49, 0x58, 0x45, 0x44, 0x18, 0xe6, 0x07, 0x52, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x7c, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, + 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, - 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6e, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, - 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, - 0x50, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x72, - 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, - 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, - 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x01, - 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, - 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x65, - 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, - 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, - 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd0, - 0x02, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0xeb, 0x01, 0x0a, 0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, - 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, - 0x65, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, - 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x65, 0x6e, 0x64, 0x12, 0x52, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x52, 0x08, 0x73, - 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x22, 0x28, 0x0a, 0x08, 0x53, 0x65, 0x6d, 0x61, 0x6e, - 0x74, 0x69, 0x63, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, - 0x03, 0x53, 0x45, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x49, 0x41, 0x53, 0x10, - 0x02, 0x42, 0x7e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x48, 0x01, 0x5a, 0x2d, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x70, 0x62, 0xf8, 0x01, 0x01, 0xa2, 0x02, - 0x03, 0x47, 0x50, 0x42, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, 0x33, 0x88, 0x01, 0x01, 0x98, 0x01, 0x03, 0x98, 0x01, 0x06, + 0x98, 0x01, 0x01, 0xa2, 0x01, 0x17, 0x12, 0x12, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x42, + 0x45, 0x53, 0x54, 0x5f, 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, 0x18, 0xe6, 0x07, 0xa2, 0x01, 0x0a, + 0x12, 0x05, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x18, 0xe7, 0x07, 0x52, 0x0a, 0x6a, 0x73, 0x6f, 0x6e, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x5c, 0x0a, 0x0d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x46, 0x49, 0x45, 0x4c, 0x44, + 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x50, 0x4c, 0x49, 0x43, 0x49, 0x54, 0x10, + 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x43, 0x49, 0x54, 0x10, 0x02, 0x12, + 0x13, 0x0a, 0x0f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, + 0x45, 0x44, 0x10, 0x03, 0x22, 0x37, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x15, 0x0a, 0x11, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x50, 0x45, 0x4e, 0x10, + 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x02, 0x22, 0x56, 0x0a, + 0x15, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, + 0x45, 0x44, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, + 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x50, 0x41, 0x4e, + 0x44, 0x45, 0x44, 0x10, 0x02, 0x22, 0x43, 0x0a, 0x0e, 0x55, 0x74, 0x66, 0x38, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x54, 0x46, 0x38, 0x5f, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x0a, + 0x0a, 0x06, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x10, 0x02, 0x22, 0x53, 0x0a, 0x0f, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, + 0x18, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, + 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, + 0x45, 0x4e, 0x47, 0x54, 0x48, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x45, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x10, 0x02, 0x22, + 0x48, 0x0a, 0x0a, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x17, 0x0a, + 0x13, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x10, + 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x42, 0x45, 0x53, 0x54, + 0x5f, 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, 0x10, 0x02, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xe9, + 0x07, 0x2a, 0x06, 0x08, 0xe9, 0x07, 0x10, 0xea, 0x07, 0x2a, 0x06, 0x08, 0x8b, 0x4e, 0x10, 0x90, + 0x4e, 0x4a, 0x06, 0x08, 0xe7, 0x07, 0x10, 0xe8, 0x07, 0x22, 0xfe, 0x02, 0x0a, 0x12, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x12, 0x58, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, + 0x65, 0x74, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0f, 0x6d, 0x69, + 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6d, + 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, + 0x0f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0x87, 0x01, 0x0a, 0x18, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x45, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x32, 0x0a, + 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, + 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, + 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, + 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, + 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, + 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xeb, 0x01, 0x0a, 0x0a, 0x41, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x52, 0x0a, 0x08, 0x73, 0x65, 0x6d, + 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, + 0x74, 0x69, 0x63, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x22, 0x28, 0x0a, + 0x08, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, + 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, + 0x41, 0x4c, 0x49, 0x41, 0x53, 0x10, 0x02, 0x2a, 0xea, 0x01, 0x0a, 0x07, 0x45, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0e, 0x45, 0x44, 0x49, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x32, 0x10, 0xe6, 0x07, 0x12, 0x13, 0x0a, + 0x0e, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x33, 0x10, + 0xe7, 0x07, 0x12, 0x11, 0x0a, 0x0c, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x32, 0x30, + 0x32, 0x33, 0x10, 0xe8, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x31, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x17, + 0x0a, 0x13, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x32, 0x5f, 0x54, 0x45, 0x53, 0x54, + 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x17, 0x45, 0x44, 0x49, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x39, 0x39, 0x39, 0x39, 0x37, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, + 0x4c, 0x59, 0x10, 0x9d, 0x8d, 0x06, 0x12, 0x1d, 0x0a, 0x17, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x39, 0x39, 0x39, 0x39, 0x38, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, + 0x59, 0x10, 0x9e, 0x8d, 0x06, 0x12, 0x1d, 0x0a, 0x17, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x39, 0x39, 0x39, 0x39, 0x39, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, + 0x10, 0x9f, 0x8d, 0x06, 0x42, 0x7e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x48, 0x01, 0x5a, + 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, + 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x70, 0x62, 0xf8, 0x01, + 0x01, 0xa2, 0x02, 0x03, 0x47, 0x50, 0x42, 0xaa, 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, } var ( @@ -4123,103 +5091,136 @@ func file_google_protobuf_descriptor_proto_rawDescGZIP() []byte { return file_google_protobuf_descriptor_proto_rawDescData } -var file_google_protobuf_descriptor_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_google_protobuf_descriptor_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_google_protobuf_descriptor_proto_enumTypes = make([]protoimpl.EnumInfo, 17) +var file_google_protobuf_descriptor_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_google_protobuf_descriptor_proto_goTypes = []interface{}{ - (ExtensionRangeOptions_VerificationState)(0), // 0: google.protobuf.ExtensionRangeOptions.VerificationState - (FieldDescriptorProto_Type)(0), // 1: google.protobuf.FieldDescriptorProto.Type - (FieldDescriptorProto_Label)(0), // 2: google.protobuf.FieldDescriptorProto.Label - (FileOptions_OptimizeMode)(0), // 3: google.protobuf.FileOptions.OptimizeMode - (FieldOptions_CType)(0), // 4: google.protobuf.FieldOptions.CType - (FieldOptions_JSType)(0), // 5: google.protobuf.FieldOptions.JSType - (FieldOptions_OptionRetention)(0), // 6: google.protobuf.FieldOptions.OptionRetention - (FieldOptions_OptionTargetType)(0), // 7: google.protobuf.FieldOptions.OptionTargetType - (MethodOptions_IdempotencyLevel)(0), // 8: google.protobuf.MethodOptions.IdempotencyLevel - (GeneratedCodeInfo_Annotation_Semantic)(0), // 9: google.protobuf.GeneratedCodeInfo.Annotation.Semantic - (*FileDescriptorSet)(nil), // 10: google.protobuf.FileDescriptorSet - (*FileDescriptorProto)(nil), // 11: google.protobuf.FileDescriptorProto - (*DescriptorProto)(nil), // 12: google.protobuf.DescriptorProto - (*ExtensionRangeOptions)(nil), // 13: google.protobuf.ExtensionRangeOptions - (*FieldDescriptorProto)(nil), // 14: google.protobuf.FieldDescriptorProto - (*OneofDescriptorProto)(nil), // 15: google.protobuf.OneofDescriptorProto - (*EnumDescriptorProto)(nil), // 16: google.protobuf.EnumDescriptorProto - (*EnumValueDescriptorProto)(nil), // 17: google.protobuf.EnumValueDescriptorProto - (*ServiceDescriptorProto)(nil), // 18: google.protobuf.ServiceDescriptorProto - (*MethodDescriptorProto)(nil), // 19: google.protobuf.MethodDescriptorProto - (*FileOptions)(nil), // 20: google.protobuf.FileOptions - (*MessageOptions)(nil), // 21: google.protobuf.MessageOptions - (*FieldOptions)(nil), // 22: google.protobuf.FieldOptions - (*OneofOptions)(nil), // 23: google.protobuf.OneofOptions - (*EnumOptions)(nil), // 24: google.protobuf.EnumOptions - (*EnumValueOptions)(nil), // 25: google.protobuf.EnumValueOptions - (*ServiceOptions)(nil), // 26: google.protobuf.ServiceOptions - (*MethodOptions)(nil), // 27: google.protobuf.MethodOptions - (*UninterpretedOption)(nil), // 28: google.protobuf.UninterpretedOption - (*SourceCodeInfo)(nil), // 29: google.protobuf.SourceCodeInfo - (*GeneratedCodeInfo)(nil), // 30: google.protobuf.GeneratedCodeInfo - (*DescriptorProto_ExtensionRange)(nil), // 31: google.protobuf.DescriptorProto.ExtensionRange - (*DescriptorProto_ReservedRange)(nil), // 32: google.protobuf.DescriptorProto.ReservedRange - (*ExtensionRangeOptions_Declaration)(nil), // 33: google.protobuf.ExtensionRangeOptions.Declaration - (*EnumDescriptorProto_EnumReservedRange)(nil), // 34: google.protobuf.EnumDescriptorProto.EnumReservedRange - (*UninterpretedOption_NamePart)(nil), // 35: google.protobuf.UninterpretedOption.NamePart - (*SourceCodeInfo_Location)(nil), // 36: google.protobuf.SourceCodeInfo.Location - (*GeneratedCodeInfo_Annotation)(nil), // 37: google.protobuf.GeneratedCodeInfo.Annotation + (Edition)(0), // 0: google.protobuf.Edition + (ExtensionRangeOptions_VerificationState)(0), // 1: google.protobuf.ExtensionRangeOptions.VerificationState + (FieldDescriptorProto_Type)(0), // 2: google.protobuf.FieldDescriptorProto.Type + (FieldDescriptorProto_Label)(0), // 3: google.protobuf.FieldDescriptorProto.Label + (FileOptions_OptimizeMode)(0), // 4: google.protobuf.FileOptions.OptimizeMode + (FieldOptions_CType)(0), // 5: google.protobuf.FieldOptions.CType + (FieldOptions_JSType)(0), // 6: google.protobuf.FieldOptions.JSType + (FieldOptions_OptionRetention)(0), // 7: google.protobuf.FieldOptions.OptionRetention + (FieldOptions_OptionTargetType)(0), // 8: google.protobuf.FieldOptions.OptionTargetType + (MethodOptions_IdempotencyLevel)(0), // 9: google.protobuf.MethodOptions.IdempotencyLevel + (FeatureSet_FieldPresence)(0), // 10: google.protobuf.FeatureSet.FieldPresence + (FeatureSet_EnumType)(0), // 11: google.protobuf.FeatureSet.EnumType + (FeatureSet_RepeatedFieldEncoding)(0), // 12: google.protobuf.FeatureSet.RepeatedFieldEncoding + (FeatureSet_Utf8Validation)(0), // 13: google.protobuf.FeatureSet.Utf8Validation + (FeatureSet_MessageEncoding)(0), // 14: google.protobuf.FeatureSet.MessageEncoding + (FeatureSet_JsonFormat)(0), // 15: google.protobuf.FeatureSet.JsonFormat + (GeneratedCodeInfo_Annotation_Semantic)(0), // 16: google.protobuf.GeneratedCodeInfo.Annotation.Semantic + (*FileDescriptorSet)(nil), // 17: google.protobuf.FileDescriptorSet + (*FileDescriptorProto)(nil), // 18: google.protobuf.FileDescriptorProto + (*DescriptorProto)(nil), // 19: google.protobuf.DescriptorProto + (*ExtensionRangeOptions)(nil), // 20: google.protobuf.ExtensionRangeOptions + (*FieldDescriptorProto)(nil), // 21: google.protobuf.FieldDescriptorProto + (*OneofDescriptorProto)(nil), // 22: google.protobuf.OneofDescriptorProto + (*EnumDescriptorProto)(nil), // 23: google.protobuf.EnumDescriptorProto + (*EnumValueDescriptorProto)(nil), // 24: google.protobuf.EnumValueDescriptorProto + (*ServiceDescriptorProto)(nil), // 25: google.protobuf.ServiceDescriptorProto + (*MethodDescriptorProto)(nil), // 26: google.protobuf.MethodDescriptorProto + (*FileOptions)(nil), // 27: google.protobuf.FileOptions + (*MessageOptions)(nil), // 28: google.protobuf.MessageOptions + (*FieldOptions)(nil), // 29: google.protobuf.FieldOptions + (*OneofOptions)(nil), // 30: google.protobuf.OneofOptions + (*EnumOptions)(nil), // 31: google.protobuf.EnumOptions + (*EnumValueOptions)(nil), // 32: google.protobuf.EnumValueOptions + (*ServiceOptions)(nil), // 33: google.protobuf.ServiceOptions + (*MethodOptions)(nil), // 34: google.protobuf.MethodOptions + (*UninterpretedOption)(nil), // 35: google.protobuf.UninterpretedOption + (*FeatureSet)(nil), // 36: google.protobuf.FeatureSet + (*FeatureSetDefaults)(nil), // 37: google.protobuf.FeatureSetDefaults + (*SourceCodeInfo)(nil), // 38: google.protobuf.SourceCodeInfo + (*GeneratedCodeInfo)(nil), // 39: google.protobuf.GeneratedCodeInfo + (*DescriptorProto_ExtensionRange)(nil), // 40: google.protobuf.DescriptorProto.ExtensionRange + (*DescriptorProto_ReservedRange)(nil), // 41: google.protobuf.DescriptorProto.ReservedRange + (*ExtensionRangeOptions_Declaration)(nil), // 42: google.protobuf.ExtensionRangeOptions.Declaration + (*EnumDescriptorProto_EnumReservedRange)(nil), // 43: google.protobuf.EnumDescriptorProto.EnumReservedRange + (*FieldOptions_EditionDefault)(nil), // 44: google.protobuf.FieldOptions.EditionDefault + (*UninterpretedOption_NamePart)(nil), // 45: google.protobuf.UninterpretedOption.NamePart + (*FeatureSetDefaults_FeatureSetEditionDefault)(nil), // 46: google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault + (*SourceCodeInfo_Location)(nil), // 47: google.protobuf.SourceCodeInfo.Location + (*GeneratedCodeInfo_Annotation)(nil), // 48: google.protobuf.GeneratedCodeInfo.Annotation } var file_google_protobuf_descriptor_proto_depIdxs = []int32{ - 11, // 0: google.protobuf.FileDescriptorSet.file:type_name -> google.protobuf.FileDescriptorProto - 12, // 1: google.protobuf.FileDescriptorProto.message_type:type_name -> google.protobuf.DescriptorProto - 16, // 2: google.protobuf.FileDescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto - 18, // 3: google.protobuf.FileDescriptorProto.service:type_name -> google.protobuf.ServiceDescriptorProto - 14, // 4: google.protobuf.FileDescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto - 20, // 5: google.protobuf.FileDescriptorProto.options:type_name -> google.protobuf.FileOptions - 29, // 6: google.protobuf.FileDescriptorProto.source_code_info:type_name -> google.protobuf.SourceCodeInfo - 14, // 7: google.protobuf.DescriptorProto.field:type_name -> google.protobuf.FieldDescriptorProto - 14, // 8: google.protobuf.DescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto - 12, // 9: google.protobuf.DescriptorProto.nested_type:type_name -> google.protobuf.DescriptorProto - 16, // 10: google.protobuf.DescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto - 31, // 11: google.protobuf.DescriptorProto.extension_range:type_name -> google.protobuf.DescriptorProto.ExtensionRange - 15, // 12: google.protobuf.DescriptorProto.oneof_decl:type_name -> google.protobuf.OneofDescriptorProto - 21, // 13: google.protobuf.DescriptorProto.options:type_name -> google.protobuf.MessageOptions - 32, // 14: google.protobuf.DescriptorProto.reserved_range:type_name -> google.protobuf.DescriptorProto.ReservedRange - 28, // 15: google.protobuf.ExtensionRangeOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 33, // 16: google.protobuf.ExtensionRangeOptions.declaration:type_name -> google.protobuf.ExtensionRangeOptions.Declaration - 0, // 17: google.protobuf.ExtensionRangeOptions.verification:type_name -> google.protobuf.ExtensionRangeOptions.VerificationState - 2, // 18: google.protobuf.FieldDescriptorProto.label:type_name -> google.protobuf.FieldDescriptorProto.Label - 1, // 19: google.protobuf.FieldDescriptorProto.type:type_name -> google.protobuf.FieldDescriptorProto.Type - 22, // 20: google.protobuf.FieldDescriptorProto.options:type_name -> google.protobuf.FieldOptions - 23, // 21: google.protobuf.OneofDescriptorProto.options:type_name -> google.protobuf.OneofOptions - 17, // 22: google.protobuf.EnumDescriptorProto.value:type_name -> google.protobuf.EnumValueDescriptorProto - 24, // 23: google.protobuf.EnumDescriptorProto.options:type_name -> google.protobuf.EnumOptions - 34, // 24: google.protobuf.EnumDescriptorProto.reserved_range:type_name -> google.protobuf.EnumDescriptorProto.EnumReservedRange - 25, // 25: google.protobuf.EnumValueDescriptorProto.options:type_name -> google.protobuf.EnumValueOptions - 19, // 26: google.protobuf.ServiceDescriptorProto.method:type_name -> google.protobuf.MethodDescriptorProto - 26, // 27: google.protobuf.ServiceDescriptorProto.options:type_name -> google.protobuf.ServiceOptions - 27, // 28: google.protobuf.MethodDescriptorProto.options:type_name -> google.protobuf.MethodOptions - 3, // 29: google.protobuf.FileOptions.optimize_for:type_name -> google.protobuf.FileOptions.OptimizeMode - 28, // 30: google.protobuf.FileOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 28, // 31: google.protobuf.MessageOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 4, // 32: google.protobuf.FieldOptions.ctype:type_name -> google.protobuf.FieldOptions.CType - 5, // 33: google.protobuf.FieldOptions.jstype:type_name -> google.protobuf.FieldOptions.JSType - 6, // 34: google.protobuf.FieldOptions.retention:type_name -> google.protobuf.FieldOptions.OptionRetention - 7, // 35: google.protobuf.FieldOptions.target:type_name -> google.protobuf.FieldOptions.OptionTargetType - 7, // 36: google.protobuf.FieldOptions.targets:type_name -> google.protobuf.FieldOptions.OptionTargetType - 28, // 37: google.protobuf.FieldOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 28, // 38: google.protobuf.OneofOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 28, // 39: google.protobuf.EnumOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 28, // 40: google.protobuf.EnumValueOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 28, // 41: google.protobuf.ServiceOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 8, // 42: google.protobuf.MethodOptions.idempotency_level:type_name -> google.protobuf.MethodOptions.IdempotencyLevel - 28, // 43: google.protobuf.MethodOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 35, // 44: google.protobuf.UninterpretedOption.name:type_name -> google.protobuf.UninterpretedOption.NamePart - 36, // 45: google.protobuf.SourceCodeInfo.location:type_name -> google.protobuf.SourceCodeInfo.Location - 37, // 46: google.protobuf.GeneratedCodeInfo.annotation:type_name -> google.protobuf.GeneratedCodeInfo.Annotation - 13, // 47: google.protobuf.DescriptorProto.ExtensionRange.options:type_name -> google.protobuf.ExtensionRangeOptions - 9, // 48: google.protobuf.GeneratedCodeInfo.Annotation.semantic:type_name -> google.protobuf.GeneratedCodeInfo.Annotation.Semantic - 49, // [49:49] is the sub-list for method output_type - 49, // [49:49] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name + 18, // 0: google.protobuf.FileDescriptorSet.file:type_name -> google.protobuf.FileDescriptorProto + 19, // 1: google.protobuf.FileDescriptorProto.message_type:type_name -> google.protobuf.DescriptorProto + 23, // 2: google.protobuf.FileDescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto + 25, // 3: google.protobuf.FileDescriptorProto.service:type_name -> google.protobuf.ServiceDescriptorProto + 21, // 4: google.protobuf.FileDescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto + 27, // 5: google.protobuf.FileDescriptorProto.options:type_name -> google.protobuf.FileOptions + 38, // 6: google.protobuf.FileDescriptorProto.source_code_info:type_name -> google.protobuf.SourceCodeInfo + 0, // 7: google.protobuf.FileDescriptorProto.edition:type_name -> google.protobuf.Edition + 21, // 8: google.protobuf.DescriptorProto.field:type_name -> google.protobuf.FieldDescriptorProto + 21, // 9: google.protobuf.DescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto + 19, // 10: google.protobuf.DescriptorProto.nested_type:type_name -> google.protobuf.DescriptorProto + 23, // 11: google.protobuf.DescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto + 40, // 12: google.protobuf.DescriptorProto.extension_range:type_name -> google.protobuf.DescriptorProto.ExtensionRange + 22, // 13: google.protobuf.DescriptorProto.oneof_decl:type_name -> google.protobuf.OneofDescriptorProto + 28, // 14: google.protobuf.DescriptorProto.options:type_name -> google.protobuf.MessageOptions + 41, // 15: google.protobuf.DescriptorProto.reserved_range:type_name -> google.protobuf.DescriptorProto.ReservedRange + 35, // 16: google.protobuf.ExtensionRangeOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 42, // 17: google.protobuf.ExtensionRangeOptions.declaration:type_name -> google.protobuf.ExtensionRangeOptions.Declaration + 36, // 18: google.protobuf.ExtensionRangeOptions.features:type_name -> google.protobuf.FeatureSet + 1, // 19: google.protobuf.ExtensionRangeOptions.verification:type_name -> google.protobuf.ExtensionRangeOptions.VerificationState + 3, // 20: google.protobuf.FieldDescriptorProto.label:type_name -> google.protobuf.FieldDescriptorProto.Label + 2, // 21: google.protobuf.FieldDescriptorProto.type:type_name -> google.protobuf.FieldDescriptorProto.Type + 29, // 22: google.protobuf.FieldDescriptorProto.options:type_name -> google.protobuf.FieldOptions + 30, // 23: google.protobuf.OneofDescriptorProto.options:type_name -> google.protobuf.OneofOptions + 24, // 24: google.protobuf.EnumDescriptorProto.value:type_name -> google.protobuf.EnumValueDescriptorProto + 31, // 25: google.protobuf.EnumDescriptorProto.options:type_name -> google.protobuf.EnumOptions + 43, // 26: google.protobuf.EnumDescriptorProto.reserved_range:type_name -> google.protobuf.EnumDescriptorProto.EnumReservedRange + 32, // 27: google.protobuf.EnumValueDescriptorProto.options:type_name -> google.protobuf.EnumValueOptions + 26, // 28: google.protobuf.ServiceDescriptorProto.method:type_name -> google.protobuf.MethodDescriptorProto + 33, // 29: google.protobuf.ServiceDescriptorProto.options:type_name -> google.protobuf.ServiceOptions + 34, // 30: google.protobuf.MethodDescriptorProto.options:type_name -> google.protobuf.MethodOptions + 4, // 31: google.protobuf.FileOptions.optimize_for:type_name -> google.protobuf.FileOptions.OptimizeMode + 36, // 32: google.protobuf.FileOptions.features:type_name -> google.protobuf.FeatureSet + 35, // 33: google.protobuf.FileOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 36, // 34: google.protobuf.MessageOptions.features:type_name -> google.protobuf.FeatureSet + 35, // 35: google.protobuf.MessageOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 5, // 36: google.protobuf.FieldOptions.ctype:type_name -> google.protobuf.FieldOptions.CType + 6, // 37: google.protobuf.FieldOptions.jstype:type_name -> google.protobuf.FieldOptions.JSType + 7, // 38: google.protobuf.FieldOptions.retention:type_name -> google.protobuf.FieldOptions.OptionRetention + 8, // 39: google.protobuf.FieldOptions.targets:type_name -> google.protobuf.FieldOptions.OptionTargetType + 44, // 40: google.protobuf.FieldOptions.edition_defaults:type_name -> google.protobuf.FieldOptions.EditionDefault + 36, // 41: google.protobuf.FieldOptions.features:type_name -> google.protobuf.FeatureSet + 35, // 42: google.protobuf.FieldOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 36, // 43: google.protobuf.OneofOptions.features:type_name -> google.protobuf.FeatureSet + 35, // 44: google.protobuf.OneofOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 36, // 45: google.protobuf.EnumOptions.features:type_name -> google.protobuf.FeatureSet + 35, // 46: google.protobuf.EnumOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 36, // 47: google.protobuf.EnumValueOptions.features:type_name -> google.protobuf.FeatureSet + 35, // 48: google.protobuf.EnumValueOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 36, // 49: google.protobuf.ServiceOptions.features:type_name -> google.protobuf.FeatureSet + 35, // 50: google.protobuf.ServiceOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 9, // 51: google.protobuf.MethodOptions.idempotency_level:type_name -> google.protobuf.MethodOptions.IdempotencyLevel + 36, // 52: google.protobuf.MethodOptions.features:type_name -> google.protobuf.FeatureSet + 35, // 53: google.protobuf.MethodOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 45, // 54: google.protobuf.UninterpretedOption.name:type_name -> google.protobuf.UninterpretedOption.NamePart + 10, // 55: google.protobuf.FeatureSet.field_presence:type_name -> google.protobuf.FeatureSet.FieldPresence + 11, // 56: google.protobuf.FeatureSet.enum_type:type_name -> google.protobuf.FeatureSet.EnumType + 12, // 57: google.protobuf.FeatureSet.repeated_field_encoding:type_name -> google.protobuf.FeatureSet.RepeatedFieldEncoding + 13, // 58: google.protobuf.FeatureSet.utf8_validation:type_name -> google.protobuf.FeatureSet.Utf8Validation + 14, // 59: google.protobuf.FeatureSet.message_encoding:type_name -> google.protobuf.FeatureSet.MessageEncoding + 15, // 60: google.protobuf.FeatureSet.json_format:type_name -> google.protobuf.FeatureSet.JsonFormat + 46, // 61: google.protobuf.FeatureSetDefaults.defaults:type_name -> google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault + 0, // 62: google.protobuf.FeatureSetDefaults.minimum_edition:type_name -> google.protobuf.Edition + 0, // 63: google.protobuf.FeatureSetDefaults.maximum_edition:type_name -> google.protobuf.Edition + 47, // 64: google.protobuf.SourceCodeInfo.location:type_name -> google.protobuf.SourceCodeInfo.Location + 48, // 65: google.protobuf.GeneratedCodeInfo.annotation:type_name -> google.protobuf.GeneratedCodeInfo.Annotation + 20, // 66: google.protobuf.DescriptorProto.ExtensionRange.options:type_name -> google.protobuf.ExtensionRangeOptions + 0, // 67: google.protobuf.FieldOptions.EditionDefault.edition:type_name -> google.protobuf.Edition + 0, // 68: google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.edition:type_name -> google.protobuf.Edition + 36, // 69: google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.features:type_name -> google.protobuf.FeatureSet + 16, // 70: google.protobuf.GeneratedCodeInfo.Annotation.semantic:type_name -> google.protobuf.GeneratedCodeInfo.Annotation.Semantic + 71, // [71:71] is the sub-list for method output_type + 71, // [71:71] is the sub-list for method input_type + 71, // [71:71] is the sub-list for extension type_name + 71, // [71:71] is the sub-list for extension extendee + 0, // [0:71] is the sub-list for field type_name } func init() { file_google_protobuf_descriptor_proto_init() } @@ -4475,19 +5476,21 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceCodeInfo); i { + switch v := v.(*FeatureSet); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields + case 3: + return &v.extensionFields default: return nil } } file_google_protobuf_descriptor_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratedCodeInfo); i { + switch v := v.(*FeatureSetDefaults); i { case 0: return &v.state case 1: @@ -4499,7 +5502,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DescriptorProto_ExtensionRange); i { + switch v := v.(*SourceCodeInfo); i { case 0: return &v.state case 1: @@ -4511,7 +5514,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DescriptorProto_ReservedRange); i { + switch v := v.(*GeneratedCodeInfo); i { case 0: return &v.state case 1: @@ -4523,7 +5526,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionRangeOptions_Declaration); i { + switch v := v.(*DescriptorProto_ExtensionRange); i { case 0: return &v.state case 1: @@ -4535,7 +5538,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnumDescriptorProto_EnumReservedRange); i { + switch v := v.(*DescriptorProto_ReservedRange); i { case 0: return &v.state case 1: @@ -4547,7 +5550,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UninterpretedOption_NamePart); i { + switch v := v.(*ExtensionRangeOptions_Declaration); i { case 0: return &v.state case 1: @@ -4559,7 +5562,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceCodeInfo_Location); i { + switch v := v.(*EnumDescriptorProto_EnumReservedRange); i { case 0: return &v.state case 1: @@ -4571,6 +5574,54 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FieldOptions_EditionDefault); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_google_protobuf_descriptor_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UninterpretedOption_NamePart); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_google_protobuf_descriptor_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FeatureSetDefaults_FeatureSetEditionDefault); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_google_protobuf_descriptor_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SourceCodeInfo_Location); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_google_protobuf_descriptor_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GeneratedCodeInfo_Annotation); i { case 0: return &v.state @@ -4588,8 +5639,8 @@ func file_google_protobuf_descriptor_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_protobuf_descriptor_proto_rawDesc, - NumEnums: 10, - NumMessages: 28, + NumEnums: 17, + NumMessages: 32, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go b/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go index 580b232f4..9de51be54 100644 --- a/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go @@ -237,7 +237,8 @@ type Any struct { // // Note: this functionality is not currently available in the official // protobuf release, and it is not used for type URLs beginning with - // type.googleapis.com. + // type.googleapis.com. As of May 2023, there are no widely used type server + // implementations and no plans to implement one. // // Schemes other than `http`, `https` (or the empty scheme) might be // used with implementation specific semantics. diff --git a/vendor/modules.txt b/vendor/modules.txt index 2d368d4b3..309cb3a3d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -246,9 +246,6 @@ github.com/mattn/go-colorable # github.com/mattn/go-isatty v0.0.17 ## explicit; go 1.15 github.com/mattn/go-isatty -# github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 -## explicit; go 1.19 -github.com/matttproud/golang_protobuf_extensions/v2/pbutil # github.com/mdlayher/arp v0.0.0-20220221190821-c37aaafac7f9 ## explicit; go 1.12 github.com/mdlayher/arp @@ -341,8 +338,8 @@ github.com/pmezard/go-difflib/difflib # github.com/projectcalico/api v0.0.0-20230222223746-44aa60c2201f ## explicit; go 1.16 github.com/projectcalico/api/pkg/lib/numorstring -# github.com/prometheus/client_golang v1.18.0 -## explicit; go 1.19 +# github.com/prometheus/client_golang v1.19.0 +## explicit; go 1.20 github.com/prometheus/client_golang/prometheus github.com/prometheus/client_golang/prometheus/collectors github.com/prometheus/client_golang/prometheus/internal @@ -350,7 +347,7 @@ github.com/prometheus/client_golang/prometheus/promhttp # github.com/prometheus/client_model v0.5.0 ## explicit; go 1.19 github.com/prometheus/client_model/go -# github.com/prometheus/common v0.45.0 +# github.com/prometheus/common v0.48.0 ## explicit; go 1.20 github.com/prometheus/common/expfmt github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg @@ -477,7 +474,7 @@ golang.org/x/exp/slog/internal/buffer golang.org/x/mod/internal/lazyregexp golang.org/x/mod/module golang.org/x/mod/semver -# golang.org/x/net v0.19.0 +# golang.org/x/net v0.20.0 ## explicit; go 1.18 golang.org/x/net/bpf golang.org/x/net/context @@ -495,7 +492,7 @@ golang.org/x/net/internal/socks golang.org/x/net/ipv4 golang.org/x/net/ipv6 golang.org/x/net/proxy -# golang.org/x/oauth2 v0.15.0 +# golang.org/x/oauth2 v0.16.0 ## explicit; go 1.18 golang.org/x/oauth2 golang.org/x/oauth2/internal @@ -576,8 +573,9 @@ google.golang.org/appengine/internal/log google.golang.org/appengine/internal/remote_api google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/urlfetch -# google.golang.org/protobuf v1.31.0 -## explicit; go 1.11 +# google.golang.org/protobuf v1.32.0 +## explicit; go 1.17 +google.golang.org/protobuf/encoding/protodelim google.golang.org/protobuf/encoding/prototext google.golang.org/protobuf/encoding/protowire google.golang.org/protobuf/internal/descfmt From a853146340e31e89cb38d86da4ea8c330d970f4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 10:09:55 +0000 Subject: [PATCH 17/34] build(deps): bump github.com/stretchr/testify from 1.8.4 to 1.9.0 Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.4 to 1.9.0. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.4...v1.9.0) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 +- .../testify/assert/assertion_compare.go | 28 ++- .../assert/assertion_compare_can_convert.go | 16 -- .../assert/assertion_compare_legacy.go | 16 -- .../testify/assert/assertion_format.go | 32 ++- .../testify/assert/assertion_forward.go | 59 +++-- .../stretchr/testify/assert/assertions.go | 207 +++++++++++------- .../testify/assert/http_assertions.go | 27 ++- vendor/modules.txt | 4 +- 10 files changed, 236 insertions(+), 158 deletions(-) delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go diff --git a/go.mod b/go.mod index f0c102128..f403461ab 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.18.2 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/tigera/operator v1.33.0 github.com/vishvananda/netlink v1.2.1-beta.2.0.20230130171208-05506ada9f99 go.uber.org/zap v1.27.0 diff --git a/go.sum b/go.sum index 37c06d73b..835090f8f 100644 --- a/go.sum +++ b/go.sum @@ -503,8 +503,9 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare.go b/vendor/github.com/stretchr/testify/assert/assertion_compare.go index b774da88d..4d4b4aad6 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_compare.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare.go @@ -28,6 +28,8 @@ var ( uint32Type = reflect.TypeOf(uint32(1)) uint64Type = reflect.TypeOf(uint64(1)) + uintptrType = reflect.TypeOf(uintptr(1)) + float32Type = reflect.TypeOf(float32(1)) float64Type = reflect.TypeOf(float64(1)) @@ -308,11 +310,11 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { case reflect.Struct: { // All structs enter here. We're not interested in most types. - if !canConvert(obj1Value, timeType) { + if !obj1Value.CanConvert(timeType) { break } - // time.Time can compared! + // time.Time can be compared! timeObj1, ok := obj1.(time.Time) if !ok { timeObj1 = obj1Value.Convert(timeType).Interface().(time.Time) @@ -328,7 +330,7 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { case reflect.Slice: { // We only care about the []byte type. - if !canConvert(obj1Value, bytesType) { + if !obj1Value.CanConvert(bytesType) { break } @@ -345,6 +347,26 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { return CompareType(bytes.Compare(bytesObj1, bytesObj2)), true } + case reflect.Uintptr: + { + uintptrObj1, ok := obj1.(uintptr) + if !ok { + uintptrObj1 = obj1Value.Convert(uintptrType).Interface().(uintptr) + } + uintptrObj2, ok := obj2.(uintptr) + if !ok { + uintptrObj2 = obj2Value.Convert(uintptrType).Interface().(uintptr) + } + if uintptrObj1 > uintptrObj2 { + return compareGreater, true + } + if uintptrObj1 == uintptrObj2 { + return compareEqual, true + } + if uintptrObj1 < uintptrObj2 { + return compareLess, true + } + } } return compareEqual, false diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go b/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go deleted file mode 100644 index da867903e..000000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build go1.17 -// +build go1.17 - -// TODO: once support for Go 1.16 is dropped, this file can be -// merged/removed with assertion_compare_go1.17_test.go and -// assertion_compare_legacy.go - -package assert - -import "reflect" - -// Wrapper around reflect.Value.CanConvert, for compatibility -// reasons. -func canConvert(value reflect.Value, to reflect.Type) bool { - return value.CanConvert(to) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go b/vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go deleted file mode 100644 index 1701af2a3..000000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build !go1.17 -// +build !go1.17 - -// TODO: once support for Go 1.16 is dropped, this file can be -// merged/removed with assertion_compare_go1.17_test.go and -// assertion_compare_can_convert.go - -package assert - -import "reflect" - -// Older versions of Go does not have the reflect.Value.CanConvert -// method. -func canConvert(value reflect.Value, to reflect.Type) bool { - return false -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go index 84dbd6c79..3ddab109a 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -1,7 +1,4 @@ -/* -* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen -* THIS FILE MUST NOT BE EDITED BY HAND - */ +// Code generated with github.com/stretchr/testify/_codegen; DO NOT EDIT. package assert @@ -107,7 +104,7 @@ func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, return EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...) } -// EqualValuesf asserts that two objects are equal or convertable to the same types +// EqualValuesf asserts that two objects are equal or convertible to the same types // and equal. // // assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") @@ -616,6 +613,16 @@ func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interf return NotErrorIs(t, err, target, append([]interface{}{msg}, args...)...) } +// NotImplementsf asserts that an object does not implement the specified interface. +// +// assert.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotImplements(t, interfaceObject, object, append([]interface{}{msg}, args...)...) +} + // NotNilf asserts that the specified object is not nil. // // assert.NotNilf(t, err, "error message %s", "formatted") @@ -660,10 +667,12 @@ func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, return NotSame(t, expected, actual, append([]interface{}{msg}, args...)...) } -// NotSubsetf asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). +// NotSubsetf asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. // -// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted") +// assert.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted") func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -747,10 +756,11 @@ func Samef(t TestingT, expected interface{}, actual interface{}, msg string, arg return Same(t, expected, actual, append([]interface{}{msg}, args...)...) } -// Subsetf asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). +// Subsetf asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. // -// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// assert.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted") +// assert.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted") func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index b1d94aec5..a84e09bd4 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -1,7 +1,4 @@ -/* -* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen -* THIS FILE MUST NOT BE EDITED BY HAND - */ +// Code generated with github.com/stretchr/testify/_codegen; DO NOT EDIT. package assert @@ -189,7 +186,7 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface return EqualExportedValuesf(a.t, expected, actual, msg, args...) } -// EqualValues asserts that two objects are equal or convertable to the same types +// EqualValues asserts that two objects are equal or convertible to the same types // and equal. // // a.EqualValues(uint32(123), int32(123)) @@ -200,7 +197,7 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn return EqualValues(a.t, expected, actual, msgAndArgs...) } -// EqualValuesf asserts that two objects are equal or convertable to the same types +// EqualValuesf asserts that two objects are equal or convertible to the same types // and equal. // // a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") @@ -1221,6 +1218,26 @@ func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...in return NotErrorIsf(a.t, err, target, msg, args...) } +// NotImplements asserts that an object does not implement the specified interface. +// +// a.NotImplements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) NotImplements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotImplements(a.t, interfaceObject, object, msgAndArgs...) +} + +// NotImplementsf asserts that an object does not implement the specified interface. +// +// a.NotImplementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +func (a *Assertions) NotImplementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotImplementsf(a.t, interfaceObject, object, msg, args...) +} + // NotNil asserts that the specified object is not nil. // // a.NotNil(err) @@ -1309,10 +1326,12 @@ func (a *Assertions) NotSamef(expected interface{}, actual interface{}, msg stri return NotSamef(a.t, expected, actual, msg, args...) } -// NotSubset asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). +// NotSubset asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. // -// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// a.NotSubset([1, 3, 4], [1, 2]) +// a.NotSubset({"x": 1, "y": 2}, {"z": 3}) func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1320,10 +1339,12 @@ func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs return NotSubset(a.t, list, subset, msgAndArgs...) } -// NotSubsetf asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). +// NotSubsetf asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. // -// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// a.NotSubsetf([1, 3, 4], [1, 2], "error message %s", "formatted") +// a.NotSubsetf({"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted") func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1483,10 +1504,11 @@ func (a *Assertions) Samef(expected interface{}, actual interface{}, msg string, return Samef(a.t, expected, actual, msg, args...) } -// Subset asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). +// Subset asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. // -// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// a.Subset([1, 2, 3], [1, 2]) +// a.Subset({"x": 1, "y": 2}, {"x": 1}) func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1494,10 +1516,11 @@ func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ... return Subset(a.t, list, subset, msgAndArgs...) } -// Subsetf asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). +// Subsetf asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. // -// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// a.Subsetf([1, 2, 3], [1, 2], "error message %s", "formatted") +// a.Subsetf({"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted") func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index a55d1bba9..0b7570f21 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -19,7 +19,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/pmezard/go-difflib/difflib" - yaml "gopkg.in/yaml.v3" + "gopkg.in/yaml.v3" ) //go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl" @@ -110,7 +110,12 @@ func copyExportedFields(expected interface{}) interface{} { return result.Interface() case reflect.Array, reflect.Slice: - result := reflect.MakeSlice(expectedType, expectedValue.Len(), expectedValue.Len()) + var result reflect.Value + if expectedKind == reflect.Array { + result = reflect.New(reflect.ArrayOf(expectedValue.Len(), expectedType.Elem())).Elem() + } else { + result = reflect.MakeSlice(expectedType, expectedValue.Len(), expectedValue.Len()) + } for i := 0; i < expectedValue.Len(); i++ { index := expectedValue.Index(i) if isNil(index) { @@ -140,6 +145,8 @@ func copyExportedFields(expected interface{}) interface{} { // structures. // // This function does no assertion of any kind. +// +// Deprecated: Use [EqualExportedValues] instead. func ObjectsExportedFieldsAreEqual(expected, actual interface{}) bool { expectedCleaned := copyExportedFields(expected) actualCleaned := copyExportedFields(actual) @@ -153,17 +160,40 @@ func ObjectsAreEqualValues(expected, actual interface{}) bool { return true } - actualType := reflect.TypeOf(actual) - if actualType == nil { + expectedValue := reflect.ValueOf(expected) + actualValue := reflect.ValueOf(actual) + if !expectedValue.IsValid() || !actualValue.IsValid() { return false } - expectedValue := reflect.ValueOf(expected) - if expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) { + + expectedType := expectedValue.Type() + actualType := actualValue.Type() + if !expectedType.ConvertibleTo(actualType) { + return false + } + + if !isNumericType(expectedType) || !isNumericType(actualType) { // Attempt comparison after type conversion - return reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), actual) + return reflect.DeepEqual( + expectedValue.Convert(actualType).Interface(), actual, + ) } - return false + // If BOTH values are numeric, there are chances of false positives due + // to overflow or underflow. So, we need to make sure to always convert + // the smaller type to a larger type before comparing. + if expectedType.Size() >= actualType.Size() { + return actualValue.Convert(expectedType).Interface() == expected + } + + return expectedValue.Convert(actualType).Interface() == actual +} + +// isNumericType returns true if the type is one of: +// int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, +// float32, float64, complex64, complex128 +func isNumericType(t reflect.Type) bool { + return t.Kind() >= reflect.Int && t.Kind() <= reflect.Complex128 } /* CallerInfo is necessary because the assert functions use the testing object @@ -266,7 +296,7 @@ func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { // Aligns the provided message so that all lines after the first line start at the same location as the first line. // Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab). -// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the +// The longestLabelLen parameter specifies the length of the longest label in the output (required because this is the // basis on which the alignment occurs). func indentMessageLines(message string, longestLabelLen int) string { outBuf := new(bytes.Buffer) @@ -382,6 +412,25 @@ func Implements(t TestingT, interfaceObject interface{}, object interface{}, msg return true } +// NotImplements asserts that an object does not implement the specified interface. +// +// assert.NotImplements(t, (*MyInterface)(nil), new(MyObject)) +func NotImplements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + interfaceType := reflect.TypeOf(interfaceObject).Elem() + + if object == nil { + return Fail(t, fmt.Sprintf("Cannot check if nil does not implement %v", interfaceType), msgAndArgs...) + } + if reflect.TypeOf(object).Implements(interfaceType) { + return Fail(t, fmt.Sprintf("%T implements %v", object, interfaceType), msgAndArgs...) + } + + return true +} + // IsType asserts that the specified objects are of the same type. func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -496,7 +545,7 @@ func samePointers(first, second interface{}) bool { // representations appropriate to be presented to the user. // // If the values are not of like type, the returned strings will be prefixed -// with the type name, and the value will be enclosed in parenthesis similar +// with the type name, and the value will be enclosed in parentheses similar // to a type conversion in the Go grammar. func formatUnequalValues(expected, actual interface{}) (e string, a string) { if reflect.TypeOf(expected) != reflect.TypeOf(actual) { @@ -523,7 +572,7 @@ func truncatingFormat(data interface{}) string { return value } -// EqualValues asserts that two objects are equal or convertable to the same types +// EqualValues asserts that two objects are equal or convertible to the same types // and equal. // // assert.EqualValues(t, uint32(123), int32(123)) @@ -566,12 +615,19 @@ func EqualExportedValues(t TestingT, expected, actual interface{}, msgAndArgs .. return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...) } + if aType.Kind() == reflect.Ptr { + aType = aType.Elem() + } + if bType.Kind() == reflect.Ptr { + bType = bType.Elem() + } + if aType.Kind() != reflect.Struct { - return Fail(t, fmt.Sprintf("Types expected to both be struct \n\t%v != %v", aType.Kind(), reflect.Struct), msgAndArgs...) + return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", aType.Kind(), reflect.Struct), msgAndArgs...) } if bType.Kind() != reflect.Struct { - return Fail(t, fmt.Sprintf("Types expected to both be struct \n\t%v != %v", bType.Kind(), reflect.Struct), msgAndArgs...) + return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", bType.Kind(), reflect.Struct), msgAndArgs...) } expected = copyExportedFields(expected) @@ -620,17 +676,6 @@ func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { return Fail(t, "Expected value not to be nil.", msgAndArgs...) } -// containsKind checks if a specified kind in the slice of kinds. -func containsKind(kinds []reflect.Kind, kind reflect.Kind) bool { - for i := 0; i < len(kinds); i++ { - if kind == kinds[i] { - return true - } - } - - return false -} - // isNil checks if a specified object is nil or not, without Failing. func isNil(object interface{}) bool { if object == nil { @@ -638,16 +683,13 @@ func isNil(object interface{}) bool { } value := reflect.ValueOf(object) - kind := value.Kind() - isNilableKind := containsKind( - []reflect.Kind{ - reflect.Chan, reflect.Func, - reflect.Interface, reflect.Map, - reflect.Ptr, reflect.Slice, reflect.UnsafePointer}, - kind) - - if isNilableKind && value.IsNil() { - return true + switch value.Kind() { + case + reflect.Chan, reflect.Func, + reflect.Interface, reflect.Map, + reflect.Ptr, reflect.Slice, reflect.UnsafePointer: + + return value.IsNil() } return false @@ -731,16 +773,14 @@ func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { } -// getLen try to get length of object. -// return (false, 0) if impossible. -func getLen(x interface{}) (ok bool, length int) { +// getLen tries to get the length of an object. +// It returns (0, false) if impossible. +func getLen(x interface{}) (length int, ok bool) { v := reflect.ValueOf(x) defer func() { - if e := recover(); e != nil { - ok = false - } + ok = recover() == nil }() - return true, v.Len() + return v.Len(), true } // Len asserts that the specified object has specific length. @@ -751,13 +791,13 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) if h, ok := t.(tHelper); ok { h.Helper() } - ok, l := getLen(object) + l, ok := getLen(object) if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...) + return Fail(t, fmt.Sprintf("\"%v\" could not be applied builtin len()", object), msgAndArgs...) } if l != length { - return Fail(t, fmt.Sprintf("\"%s\" should have %d item(s), but has %d", object, length, l), msgAndArgs...) + return Fail(t, fmt.Sprintf("\"%v\" should have %d item(s), but has %d", object, length, l), msgAndArgs...) } return true } @@ -919,10 +959,11 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) } -// Subset asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). +// Subset asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. // -// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// assert.Subset(t, [1, 2, 3], [1, 2]) +// assert.Subset(t, {"x": 1, "y": 2}, {"x": 1}) func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { if h, ok := t.(tHelper); ok { h.Helper() @@ -975,10 +1016,12 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok return true } -// NotSubset asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). +// NotSubset asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. // -// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// assert.NotSubset(t, [1, 3, 4], [1, 2]) +// assert.NotSubset(t, {"x": 1, "y": 2}, {"z": 3}) func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1439,7 +1482,7 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd h.Helper() } if math.IsNaN(epsilon) { - return Fail(t, "epsilon must not be NaN") + return Fail(t, "epsilon must not be NaN", msgAndArgs...) } actualEpsilon, err := calcRelativeError(expected, actual) if err != nil { @@ -1458,19 +1501,26 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m if h, ok := t.(tHelper); ok { h.Helper() } - if expected == nil || actual == nil || - reflect.TypeOf(actual).Kind() != reflect.Slice || - reflect.TypeOf(expected).Kind() != reflect.Slice { + + if expected == nil || actual == nil { return Fail(t, "Parameters must be slice", msgAndArgs...) } - actualSlice := reflect.ValueOf(actual) expectedSlice := reflect.ValueOf(expected) + actualSlice := reflect.ValueOf(actual) - for i := 0; i < actualSlice.Len(); i++ { - result := InEpsilon(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), epsilon) - if !result { - return result + if expectedSlice.Type().Kind() != reflect.Slice { + return Fail(t, "Expected value must be slice", msgAndArgs...) + } + + expectedLen := expectedSlice.Len() + if !IsType(t, expected, actual) || !Len(t, actual, expectedLen) { + return false + } + + for i := 0; i < expectedLen; i++ { + if !InEpsilon(t, expectedSlice.Index(i).Interface(), actualSlice.Index(i).Interface(), epsilon, "at index %d", i) { + return false } } @@ -1870,23 +1920,18 @@ func (c *CollectT) Errorf(format string, args ...interface{}) { } // FailNow panics. -func (c *CollectT) FailNow() { +func (*CollectT) FailNow() { panic("Assertion failed") } -// Reset clears the collected errors. -func (c *CollectT) Reset() { - c.errors = nil +// Deprecated: That was a method for internal usage that should not have been published. Now just panics. +func (*CollectT) Reset() { + panic("Reset() is deprecated") } -// Copy copies the collected errors to the supplied t. -func (c *CollectT) Copy(t TestingT) { - if tt, ok := t.(tHelper); ok { - tt.Helper() - } - for _, err := range c.errors { - t.Errorf("%v", err) - } +// Deprecated: That was a method for internal usage that should not have been published. Now just panics. +func (*CollectT) Copy(TestingT) { + panic("Copy() is deprecated") } // EventuallyWithT asserts that given condition will be met in waitFor time, @@ -1912,8 +1957,8 @@ func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time h.Helper() } - collect := new(CollectT) - ch := make(chan bool, 1) + var lastFinishedTickErrs []error + ch := make(chan []error, 1) timer := time.NewTimer(waitFor) defer timer.Stop() @@ -1924,19 +1969,25 @@ func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time for tick := ticker.C; ; { select { case <-timer.C: - collect.Copy(t) + for _, err := range lastFinishedTickErrs { + t.Errorf("%v", err) + } return Fail(t, "Condition never satisfied", msgAndArgs...) case <-tick: tick = nil - collect.Reset() go func() { + collect := new(CollectT) + defer func() { + ch <- collect.errors + }() condition(collect) - ch <- len(collect.errors) == 0 }() - case v := <-ch: - if v { + case errs := <-ch: + if len(errs) == 0 { return true } + // Keep the errors from the last ended condition, so that they can be copied to t if timeout is reached. + lastFinishedTickErrs = errs tick = ticker.C } } diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go index d8038c28a..861ed4b7c 100644 --- a/vendor/github.com/stretchr/testify/assert/http_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -12,7 +12,7 @@ import ( // an error if building a new request fails. func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) { w := httptest.NewRecorder() - req, err := http.NewRequest(method, url, nil) + req, err := http.NewRequest(method, url, http.NoBody) if err != nil { return -1, err } @@ -32,12 +32,12 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value } code, err := httpCode(handler, method, url, values) if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err), msgAndArgs...) } isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent if !isSuccessCode { - Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code)) + Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code), msgAndArgs...) } return isSuccessCode @@ -54,12 +54,12 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu } code, err := httpCode(handler, method, url, values) if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err), msgAndArgs...) } isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect if !isRedirectCode { - Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code)) + Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code), msgAndArgs...) } return isRedirectCode @@ -76,12 +76,12 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values } code, err := httpCode(handler, method, url, values) if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err), msgAndArgs...) } isErrorCode := code >= http.StatusBadRequest if !isErrorCode { - Fail(t, fmt.Sprintf("Expected HTTP error status code for %q but received %d", url+"?"+values.Encode(), code)) + Fail(t, fmt.Sprintf("Expected HTTP error status code for %q but received %d", url+"?"+values.Encode(), code), msgAndArgs...) } return isErrorCode @@ -98,12 +98,12 @@ func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, va } code, err := httpCode(handler, method, url, values) if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err), msgAndArgs...) } successful := code == statuscode if !successful { - Fail(t, fmt.Sprintf("Expected HTTP status code %d for %q but received %d", statuscode, url+"?"+values.Encode(), code)) + Fail(t, fmt.Sprintf("Expected HTTP status code %d for %q but received %d", statuscode, url+"?"+values.Encode(), code), msgAndArgs...) } return successful @@ -113,7 +113,10 @@ func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, va // empty string if building a new request fails. func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { w := httptest.NewRecorder() - req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) + if len(values) > 0 { + url += "?" + values.Encode() + } + req, err := http.NewRequest(method, url, http.NoBody) if err != nil { return "" } @@ -135,7 +138,7 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, contains := strings.Contains(body, fmt.Sprint(str)) if !contains { - Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body), msgAndArgs...) } return contains @@ -155,7 +158,7 @@ func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url strin contains := strings.Contains(body, fmt.Sprint(str)) if contains { - Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body), msgAndArgs...) } return !contains diff --git a/vendor/modules.txt b/vendor/modules.txt index 2d368d4b3..d6e312de2 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -410,8 +410,8 @@ github.com/spf13/viper/internal/encoding/json github.com/spf13/viper/internal/encoding/toml github.com/spf13/viper/internal/encoding/yaml github.com/spf13/viper/internal/features -# github.com/stretchr/testify v1.8.4 -## explicit; go 1.20 +# github.com/stretchr/testify v1.9.0 +## explicit; go 1.17 github.com/stretchr/testify/assert # github.com/subosito/gotenv v1.6.0 ## explicit; go 1.18 From 28cbdfacbae5b4f46144e64a8048d0a6a9c79726 Mon Sep 17 00:00:00 2001 From: lou-lan Date: Tue, 5 Mar 2024 10:09:40 +0800 Subject: [PATCH 18/34] Update roadmap Signed-off-by: lou-lan --- docs/develop/Roadmap.en.md | 83 +++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/docs/develop/Roadmap.en.md b/docs/develop/Roadmap.en.md index 0f372dc83..8f924bb8b 100644 --- a/docs/develop/Roadmap.en.md +++ b/docs/develop/Roadmap.en.md @@ -1,49 +1,48 @@ | Kind | Feature | Schedule | Status | |------------------|------------------------------------------------------------------------------------------|----------|--------| -| Gateway | support multiple instances of gateway class | | doing | -| | support for namespace | | doing | -| | support default gateway class | | doing | -| | all data stream could load-balance to all gateway node | | doing | -| | when a gateway node breakdown , all data stream could to to healthy gateway node | | doing | -| | could specify the node interface for tunnel, by hand, or auto select a reasonable one | | doing | -| Tunnel protocol | vxlan | | doing | -| | geneve | | | -| Encryption | ipsec | | | -| | wireGuard | | | -| Destination CIDR | could auto distinguish internal CIDR (calico, flannel etc, or by hand) and outside CIDR | | doing | -| | could specify the outside CIDR by hands | | doing | -| Data protocol | tcp | | doing | -| | udp | | doing | -| | websocket | | | +| Gateway | Support multiple instances of gateway class | | v0.4.0 | +| | Support for namespace | | | +| | Support default gateway class | | v0.4.0 | +| | All data stream could load-balance to all gateway node | | v0.4.0 | +| | When a gateway node breakdown , all data stream could to to healthy gateway node | | v0.4.0 | +| | Could specify the node interface for tunnel, by hand, or auto select a reasonable one | | v0.4.0 | +| Tunnel protocol | VXLAN | | v0.4.0 | +| | Geneve | | | +| Encryption | IPSec | | | +| | WireGuard | | | +| Destination CIDR | Could auto distinguish internal CIDR (calico, flannel etc, or by hand) and outside CIDR | | v0.4.0 | +| | Could specify the outside CIDR by hands | | v0.4.0 | +| Data protocol | TCP | | v0.4.0 | +| | UDP | | v0.4.0 | +| | WebSocket | | v0.4.0 | | | sctp | | | -| | multicast | | | -| Policy | support priority | | doing | -| | support cluster scope policy | | doing | -| | support namespace scope policy | | doing | -| Support CNI | calico | | doing | -| | flannel | | doing | -| | weave | | doing | +| | Multicast | | | +| Policy | Support priority | | | +| | Support cluster scope policy | | v0.4.0 | +| | Support namespace scope policy | | v0.4.0 | +| Support CNI | Calico | | v0.4.0 | +| | Flannel | | v0.4.0 | +| | Weave | | v0.4.0 | | | macvlan+spiderpool | | v0.3.0 | -| IP Stack | ipv4-only | | doing | -| | ipv6-only | | doing | -| | dual stack | | doing | -| Source IP | support EIP for application | | doing | -| | support EIP for namespace | | doing | -| | use node ip | | doing | -| Datapath | iptables with low and high version | | doing | +| IP Stack | IPv4-only | | v0.4.0 | +| | IPv6-only | | v0.4.0 | +| | Dual stack | | v0.4.0 | +| Source IP | Support EIP for application | | v0.4.0 | +| | Support EIP for namespace | | v0.4.0 | +| | Use node IP | | v0.4.0 | +| Datapath | Iptables with low and high version | | v0.4.0 | | | ebpf | | | -| Performance | big cluster, with lots of gateway nodes | | | -| | big cluster, with lots of nodes | | | -| | big cluster, with lots of pods | | | -| | when gateway node down, the whole cluster could change to healthy gateway node within 2s | | | -| | after apply or modify lots of policy, it could quick take effect in a big cluster | | | -| | after apply or modify gateway node, it could quick take effect in a big cluster | | | -| | forward throughput of each gateway node | | | +| Performance | Big cluster, with lots of gateway nodes | | | +| | Big cluster, with lots of nodes | | | +| | Big cluster, with lots of pods | | | +| | When gateway node down, the whole cluster could change to healthy gateway node within 2s | | | +| | After apply or modify lots of policy, it could quick take effect in a big cluster | | | +| | After apply or modify gateway node, it could quick take effect in a big cluster | | | +| | Forward throughput of each gateway node | | | | | CPU and memory usage under pressure | | | -| HA | all component pods could recovery quickly and serve after breakdown | | | -| | all pods could run for one week without failure | | | -| Insight | metrics | | | -| | log | | | -| Doc | design, usage, debug docs | | | -| Architecture | amd and arm | | | +| HA | All component pods could recovery quickly and serve after breakdown | | v0.4.0 | +| | All pods could run for one week without failure | | v0.4.0 | +| Insight | Metrics | | v0.4.0 | +| | Log | | v0.4.0 | +| Architecture | AMD, ARM | | v0.4.0 | From b9918cc8bb84a453d4a3b0708be26fc1682a0214 Mon Sep 17 00:00:00 2001 From: lou-lan Date: Wed, 6 Mar 2024 14:53:04 +0800 Subject: [PATCH 19/34] Optimize egress gateway controller reconcile logic (#1243) Signed-off-by: lou-lan --- pkg/controller/controller.go | 22 +- .../policy/egress_cluster_policy.go | 125 - pkg/controller/policy/egress_policy.go | 129 -- pkg/egressgateway/egress_gateway.go | 2010 +++++++++-------- pkg/k8s/apis/v1beta1/egressgateway_types.go | 10 + pkg/k8s/apis/v1beta1/egresstunnel_types.go | 12 + 6 files changed, 1087 insertions(+), 1221 deletions(-) delete mode 100644 pkg/controller/policy/egress_cluster_policy.go delete mode 100644 pkg/controller/policy/egress_policy.go diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 8dab79988..1850f844b 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -6,9 +6,6 @@ package controller import ( "context" "fmt" - "github.com/spidernet-io/egressgateway/pkg/controller/endpoint" - "github.com/spidernet-io/egressgateway/pkg/controller/policy" - "github.com/spidernet-io/egressgateway/pkg/controller/tunnel" "github.com/go-logr/logr" ctrl "sigs.k8s.io/controller-runtime" @@ -19,7 +16,9 @@ import ( "github.com/spidernet-io/egressgateway/pkg/config" egressclusterinfo "github.com/spidernet-io/egressgateway/pkg/controller/egress_cluster_info" + "github.com/spidernet-io/egressgateway/pkg/controller/endpoint" "github.com/spidernet-io/egressgateway/pkg/controller/metrics" + "github.com/spidernet-io/egressgateway/pkg/controller/tunnel" "github.com/spidernet-io/egressgateway/pkg/controller/webhook" "github.com/spidernet-io/egressgateway/pkg/egressgateway" "github.com/spidernet-io/egressgateway/pkg/logger" @@ -61,27 +60,22 @@ func New(cfg *config.Config) (types.Service, error) { return nil, fmt.Errorf("failed to create manager: %w", err) } + cli, err := client.New(cfg.KubeConfig, client.Options{Scheme: schema.GetScheme()}) + if err != nil { + return nil, err + } + if err = setManger(mgr, cfg, log); err != nil { return nil, err } metrics.RegisterMetricCollectors() - err = egressgateway.NewEgressGatewayController(mgr, log, cfg) + err = egressgateway.NewEgressGatewayController(mgr, log, cfg, cli) if err != nil { return nil, fmt.Errorf("failed to create egress gateway controller: %w", err) } - err = policy.NewEgressPolicyController(mgr, log, cfg) - if err != nil { - return nil, fmt.Errorf("failed to create egress policy controller: %w", err) - } - - err = policy.NewEgressClusterPolicyController(mgr, log, cfg) - if err != nil { - return nil, fmt.Errorf("failed to create egress cluster policy controller: %w", err) - } - err = tunnel.NewEgressTunnelController(mgr, log, cfg) if err != nil { return nil, fmt.Errorf("failed to create egress tunnel controller: %w", err) diff --git a/pkg/controller/policy/egress_cluster_policy.go b/pkg/controller/policy/egress_cluster_policy.go deleted file mode 100644 index 33298e696..000000000 --- a/pkg/controller/policy/egress_cluster_policy.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2022 Authors of spidernet-io -// SPDX-License-Identifier: Apache-2.0 - -package policy - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - "k8s.io/apimachinery/pkg/api/errors" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" - - "github.com/spidernet-io/egressgateway/pkg/config" - "github.com/spidernet-io/egressgateway/pkg/egressgateway" - "github.com/spidernet-io/egressgateway/pkg/k8s/apis/v1beta1" - "github.com/spidernet-io/egressgateway/pkg/utils" -) - -type egcpReconciler struct { - client client.Client - log logr.Logger - config *config.Config -} - -func (r *egcpReconciler) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) { - kind, newReq, err := utils.ParseKindWithReq(req) - if err != nil { - return reconcile.Result{}, err - } - - log := r.log.WithValues("name", newReq.Name, "kind", kind) - log.Info("reconciling") - switch kind { - case "EgressGateway": - return r.reconcileEGW(ctx, newReq, log) - default: - return reconcile.Result{}, nil - } -} - -// reconcileEN reconcile egressgateway -// goal: -// - update egressclusterpolicy -func (r *egcpReconciler) reconcileEGW(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { - deleted := false - egw := new(v1beta1.EgressGateway) - err := r.client.Get(ctx, req.NamespacedName, egw) - if err != nil { - if !errors.IsNotFound(err) { - return reconcile.Result{Requeue: true}, err - } - deleted = true - } - deleted = deleted || !egw.GetDeletionTimestamp().IsZero() - - if deleted { - return reconcile.Result{Requeue: false}, nil - } - - egcpList := &v1beta1.EgressClusterPolicyList{} - if err := r.client.List(ctx, egcpList); err != nil { - log.Error(err, "failed to list") - return reconcile.Result{Requeue: true}, err - } - - for _, item := range egcpList.Items { - if item.Spec.EgressGatewayName == egw.Name { - newEGCP := item.DeepCopy() - - newEGCP.Status.Eip.Ipv4 = "" - newEGCP.Status.Eip.Ipv6 = "" - newEGCP.Status.Node = "" - - policy := v1beta1.Policy{Name: item.Name, Namespace: item.Namespace} - eipStatus, isExist := egressgateway.GetEIPStatusByPolicy(policy, *egw) - if isExist { - for _, eip := range eipStatus.Eips { - for _, p := range eip.Policies { - if p == policy { - newEGCP.Status.Eip.Ipv4 = eip.IPv4 - newEGCP.Status.Eip.Ipv6 = eip.IPv6 - newEGCP.Status.Node = eipStatus.Name - } - } - } - } - - log.V(1).Info("update egressclusterpolicy status", "status", newEGCP.Status) - err = r.client.Status().Update(ctx, newEGCP) - if err != nil { - log.Error(err, "update egressclusterpolicy status", "status", newEGCP.Status) - return reconcile.Result{Requeue: true}, err - } - } - } - - return reconcile.Result{Requeue: false}, nil -} - -func NewEgressClusterPolicyController(mgr manager.Manager, log logr.Logger, cfg *config.Config) error { - if cfg == nil { - return fmt.Errorf("cfg can not be nil") - } - - log.Info("new egressclusterpolicy controller") - - r := &egcpReconciler{client: mgr.GetClient(), log: log, config: cfg} - c, err := controller.New("egressclusterpolicy", mgr, controller.Options{Reconciler: r}) - if err != nil { - return err - } - - if err := c.Watch(source.Kind(mgr.GetCache(), &v1beta1.EgressGateway{}), - handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("EgressGateway"))); err != nil { - return fmt.Errorf("failed to watch EgressGateway: %w", err) - } - - return nil -} diff --git a/pkg/controller/policy/egress_policy.go b/pkg/controller/policy/egress_policy.go deleted file mode 100644 index 963028c66..000000000 --- a/pkg/controller/policy/egress_policy.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2022 Authors of spidernet-io -// SPDX-License-Identifier: Apache-2.0 - -package policy - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - "k8s.io/apimachinery/pkg/api/errors" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" - - "github.com/spidernet-io/egressgateway/pkg/config" - "github.com/spidernet-io/egressgateway/pkg/egressgateway" - "github.com/spidernet-io/egressgateway/pkg/k8s/apis/v1beta1" - "github.com/spidernet-io/egressgateway/pkg/utils" -) - -type egpReconciler struct { - client client.Client - log logr.Logger - config *config.Config -} - -func (r *egpReconciler) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) { - kind, newReq, err := utils.ParseKindWithReq(req) - if err != nil { - return reconcile.Result{}, err - } - - log := r.log.WithValues("name", newReq.Name, "kind", kind) - log.V(1).Info("reconciling") - switch kind { - case "EgressGateway": - return r.reconcileEGW(ctx, newReq, log) - default: - return reconcile.Result{}, nil - } -} - -// reconcileEN reconcile EgressGateway -// goal: -// - update EgressPolicy -func (r *egpReconciler) reconcileEGW(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { - deleted := false - egw := new(v1beta1.EgressGateway) - err := r.client.Get(ctx, req.NamespacedName, egw) - if err != nil { - if !errors.IsNotFound(err) { - return reconcile.Result{Requeue: true}, err - } - deleted = true - } - deleted = deleted || !egw.GetDeletionTimestamp().IsZero() - - if deleted { - return reconcile.Result{Requeue: false}, nil - } - - egpList := &v1beta1.EgressPolicyList{} - if err := r.client.List(ctx, egpList); err != nil { - log.Error(err, "failed to list") - return reconcile.Result{Requeue: true}, err - } - - for _, item := range egpList.Items { - if item.Spec.EgressGatewayName == egw.Name { - newEGP := item.DeepCopy() - - newEGP.Status.Eip.Ipv4 = "" - newEGP.Status.Eip.Ipv6 = "" - newEGP.Status.Node = "" - - policy := v1beta1.Policy{Name: item.Name, Namespace: item.Namespace} - eipStatus, isExist := egressgateway.GetEIPStatusByPolicy(policy, *egw) - if isExist { - for _, eip := range eipStatus.Eips { - for _, p := range eip.Policies { - if p == policy { - newEGP.Status.Eip.Ipv4 = eip.IPv4 - newEGP.Status.Eip.Ipv6 = eip.IPv6 - newEGP.Status.Node = eipStatus.Name - } - } - } - } - - log.V(1).Info("update EgressPolicy status", "status", newEGP.Status) - err = r.client.Status().Update(ctx, newEGP) - if err != nil { - log.Error(err, "update EgressPolicy status", "status", newEGP.Status) - return reconcile.Result{Requeue: true}, err - } - } - } - - return reconcile.Result{Requeue: false}, nil -} - -func NewEgressPolicyController(mgr manager.Manager, log logr.Logger, cfg *config.Config) error { - if cfg == nil { - return fmt.Errorf("cfg can not be nil") - } - - r := &egpReconciler{ - client: mgr.GetClient(), - log: log, - config: cfg, - } - - log.Info("new egress policy controller") - c, err := controller.New("egresspolicy", mgr, controller.Options{Reconciler: r}) - if err != nil { - return err - } - - if err := c.Watch(source.Kind(mgr.GetCache(), &v1beta1.EgressGateway{}), - handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("EgressGateway"))); err != nil { - return fmt.Errorf("failed to watch EgressGateway: %w", err) - } - - return nil -} diff --git a/pkg/egressgateway/egress_gateway.go b/pkg/egressgateway/egress_gateway.go index 704ac5583..15b7af345 100644 --- a/pkg/egressgateway/egress_gateway.go +++ b/pkg/egressgateway/egress_gateway.go @@ -8,6 +8,7 @@ import ( "fmt" "math/rand" "net" + "reflect" "time" "github.com/go-logr/logr" @@ -18,6 +19,7 @@ import ( "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -35,19 +37,10 @@ type egnReconciler struct { client client.Client log logr.Logger config *config.Config + cli client.Client } -type policyInfo struct { - egw string - ipv4 string - ipv6 string - node string - policy egress.Policy - isUseNodeIP bool - allocatorPolicy string -} - -func (r egnReconciler) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) { +func (r *egnReconciler) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) { kind, newReq, err := utils.ParseKindWithReq(req) if err != nil { return reconcile.Result{}, err @@ -57,284 +50,228 @@ func (r egnReconciler) Reconcile(ctx context.Context, req reconcile.Request) (re switch kind { case "EgressGateway": - return r.reconcileEGW(ctx, newReq, log) + return r.reconcileGateway(ctx, newReq, log) case "EgressClusterPolicy": - fallthrough + return r.reconcileEgressClusterPolicy(ctx, newReq, log) case "EgressPolicy": - return r.reconcileEGP(ctx, newReq, log) + return r.reconcileEgressPolicy(ctx, newReq, log) case "Node": return r.reconcileNode(ctx, newReq, log) case "EgressTunnel": - return r.reconcileEGT(ctx, newReq, log) + return r.reconcileTunnel(ctx, newReq, log) default: return reconcile.Result{}, nil } } -// reconcileNode reconcile node -func (r egnReconciler) reconcileNode(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { +func (r *egnReconciler) reconcileTunnel(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { deleted := false - node := new(corev1.Node) - err := r.client.Get(ctx, req.NamespacedName, node) + tunnel := &egress.EgressTunnel{} + err := r.client.Get(ctx, req.NamespacedName, tunnel) if err != nil { if !errors.IsNotFound(err) { - return reconcile.Result{}, err + return reconcile.Result{Requeue: true}, err } deleted = true } - deleted = deleted || !node.GetDeletionTimestamp().IsZero() + deleted = deleted || !tunnel.GetDeletionTimestamp().IsZero() - egwList := &egress.EgressGatewayList{} - if err := r.client.List(ctx, egwList); err != nil { - return reconcile.Result{Requeue: true}, nil - } - - // Node NoReady event, complete in reconcile EgressTunnel event if deleted { - r.log.Info("request item is deleted") - err := r.deleteNodeFromEGs(ctx, log, req.Name, egwList) - if err != nil { - return reconcile.Result{Requeue: true}, nil - } - - return reconcile.Result{}, nil - } + // case 1, tunnel delete + // move ip - // Checking the node label - for _, egw := range egwList.Items { - selNode, err := metav1.LabelSelectorAsSelector(egw.Spec.NodeSelector.Selector) + egwList := new(egress.EgressGatewayList) + err := r.cli.List(ctx, egwList) if err != nil { - return reconcile.Result{Requeue: true}, nil - } - isMatch := selNode.Matches(labels.Set(node.Labels)) - if isMatch { - // If the tag matches, check whether information about the node exists. If it does not exist, add an empty one - _, isExist := GetPoliciesByNode(node.Name, egw) - if !isExist { - egt := new(egress.EgressTunnel) - err := r.client.Get(ctx, types.NamespacedName{Name: node.Name}, egt) - if err == nil { - egw.Status.NodeList = append(egw.Status.NodeList, egress.EgressIPStatus{Name: node.Name, Status: string(egt.Status.Phase)}) - } else { - egw.Status.NodeList = append(egw.Status.NodeList, egress.EgressIPStatus{Name: node.Name, Status: string(egress.EgressTunnelFailed)}) - } + return reconcile.Result{Requeue: true}, err + } - ipv4sFree, ipv6sFree, ipv4sTotal, ipv6sTotal, err := countGatewayIP(&egw) - if err != nil { - r.log.Error(err, "count egress gateway ippools", "nodeList", egw.Status.NodeList) - return reconcile.Result{Requeue: true}, nil + for _, egw := range egwList.Items { + var needMoveIPs []egress.Eips + needUpdate := false + for nodeIndex, node := range egw.Status.NodeList { + if node.Name == req.Name { + needUpdate = true + needMoveIPs = append(needMoveIPs, node.Eips...) + egw.Status.NodeList = append(egw.Status.NodeList[:nodeIndex], egw.Status.NodeList[nodeIndex+1:]...) + break } - egw.Status.IPUsage.IPv4Free = ipv4sFree - egw.Status.IPUsage.IPv4Total = ipv4sTotal - egw.Status.IPUsage.IPv6Free = ipv6sFree - egw.Status.IPUsage.IPv6Total = ipv6sTotal - - r.log.V(1).Info("update egress gateway status", "status", egw.Status) - err = r.client.Status().Update(ctx, &egw) + } + if len(needMoveIPs) > 0 { + moveEipToReadyNode(&egw, needMoveIPs) + } + if needUpdate { + err := updateGatewayStatusWithUsage(ctx, r.client, &egw) if err != nil { - r.log.Error(err, "update egress gateway status", "status", egw.Status) - return reconcile.Result{Requeue: true}, nil + return reconcile.Result{Requeue: true}, err } - } - } else { - // Labels do not match. If there is a node in status, delete the node from status and reallocate the policy - _, isExist := GetPoliciesByNode(node.Name, egw) - if isExist { - err := r.deleteNodeFromEG(ctx, log, node.Name, egw) + // sync all policy status + err = updateAllPolicyStatus(ctx, r.client, &egw) if err != nil { - return reconcile.Result{Requeue: true}, nil + return reconcile.Result{Requeue: true}, err } } } + return reconcile.Result{}, nil } - return reconcile.Result{}, nil -} + fmt.Println("update tunnel") -// reconcileEGW reconcile egress gateway -func (r egnReconciler) reconcileEGW(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { - deleted := false - isUpdate := false - egw := &egress.EgressGateway{} - err := r.client.Get(ctx, req.NamespacedName, egw) + egwList := new(egress.EgressGatewayList) + err = r.cli.List(ctx, egwList) if err != nil { - if !errors.IsNotFound(err) { - return reconcile.Result{Requeue: true}, err - } - deleted = true + return reconcile.Result{Requeue: true}, err } - deleted = deleted || !egw.GetDeletionTimestamp().IsZero() - if deleted { - log.Info("request item is deleted") - p, err := getEgressGatewayPolicies(r.client, ctx, egw) - if err != nil { - log.Error(err, "getEgressGatewayPolicies when delete egressgateway") - return reconcile.Result{Requeue: true}, err + for _, egw := range egwList.Items { + var needMoveIPs []egress.Eips + needUpdate := false + for nodeIndex, node := range egw.Status.NodeList { + // case 2, tunnel update + if node.Name == req.Name { + if tunnel.Status.Phase == egress.EgressTunnelReady { + // case 2.1: other status (e.g. NodeNotReady) -> Ready + if tunnel.Status.Phase.IsNotEqual(node.Status) { + needUpdate = true + egw.Status.NodeList[nodeIndex].Status = tunnel.Status.Phase.String() + if egw.Status.ReadyCount() == 1 { + // if it is the first tunnel in the node list, + // we need do more (list all policy, recheck all) + res, err := r.checkAndUpdateAllPolicyIfNeedWhenFirstNodeReady(ctx, req, log, &egw) + if err != nil { + return res, err + } + } + } + } else { + // case 2.2: ready -> not ready / statue not sync + // move ip + if len(node.Eips) > 0 { + // need move ip + needUpdate = true + needMoveIPs = append(needMoveIPs, node.Eips...) + egw.Status.NodeList[nodeIndex].Eips = make([]egress.Eips, 0) + } + // check state are sync + if tunnel.Status.Phase.IsNotEqual(node.Status) { + needUpdate = true + egw.Status.NodeList[nodeIndex].Status = tunnel.Status.Phase.String() + } + } + break + } } - if containsEgressGatewayFinalizer(egw, egressGatewayFinalizers) && len(p) == 0 { - log.Info("remove the egressGatewayFinalizer") - removeEgressGatewayFinalizer(egw) - log.V(1).Info("remove the egressGatewayFinalizer", "ObjectMeta", egw.ObjectMeta) - - err = r.client.Update(ctx, egw) + if len(needMoveIPs) > 0 { + moveEipToReadyNode(&egw, needMoveIPs) + } + if needUpdate { + err := updateGatewayStatusWithUsage(ctx, r.client, &egw) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + // sync all policy status + err = updateAllPolicyStatus(ctx, r.client, &egw) if err != nil { - log.Error(err, "remove the egressGatewayFinalizer", "ObjectMeta", egw.ObjectMeta) return reconcile.Result{Requeue: true}, err } } - return reconcile.Result{Requeue: false}, nil - } - - if egw.Spec.NodeSelector.Selector == nil { - log.Info("nodeSelector is nil, skip reconcile") - return reconcile.Result{}, nil } - // Obtain the latest node that meets the conditions - newNodeList := &corev1.NodeList{} - selNodes, err := metav1.LabelSelectorAsSelector(egw.Spec.NodeSelector.Selector) - if err != nil { - return reconcile.Result{}, err - } - err = r.client.List(ctx, newNodeList, &client.ListOptions{ - LabelSelector: selNodes, - }) - if err != nil { - return reconcile.Result{}, err - } - - log.Info("obtained nodes", - "numberOfNodes", len(newNodeList.Items), - "selector", egw.Spec.NodeSelector.Selector.String()) + return reconcile.Result{}, nil +} - // Get the node you want to delete - delNodeMap := make(map[string]egress.EgressIPStatus) - for _, oldNode := range egw.Status.NodeList { - delNodeMap[oldNode.Name] = oldNode - } +func (r *egnReconciler) checkAndUpdateAllPolicyIfNeedWhenFirstNodeReady(ctx context.Context, + req reconcile.Request, log logr.Logger, egw *egress.EgressGateway) (reconcile.Result, error) { - for _, newNode := range newNodeList.Items { - delete(delNodeMap, newNode.Name) - } - - perNodeMap := make(map[string]egress.EgressIPStatus) - for _, node := range egw.Status.NodeList { - _, ok := delNodeMap[node.Name] - if !ok { - perNodeMap[node.Name] = node - } + clusterPolicy := new(egress.EgressClusterPolicyList) + err := r.client.List(ctx, clusterPolicy) + if err != nil { + return reconcile.Result{Requeue: true}, err } - - for _, node := range newNodeList.Items { - _, ok := perNodeMap[node.Name] - if !ok { - egt := new(egress.EgressTunnel) - err := r.client.Get(ctx, types.NamespacedName{Name: node.Name}, egt) - if err == nil { - perNodeMap[node.Name] = egress.EgressIPStatus{Name: node.Name, Status: string(egt.Status.Phase)} - } else { - perNodeMap[node.Name] = egress.EgressIPStatus{Name: node.Name, Status: string(egress.EgressTunnelFailed)} + for _, p := range clusterPolicy.Items { + if p.Spec.EgressGatewayName == egw.Name { + res, err := r.reAssignEgressClusterPolicyIP(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{Namespace: p.Namespace, Name: p.Name}, + }, egw, &p) + if err != nil { + return res, err } - isUpdate = true } } - - if len(egw.Status.NodeList) != len(newNodeList.Items) { - isUpdate = true + policy := new(egress.EgressPolicyList) + err = r.client.List(ctx, policy) + if err != nil { + return reconcile.Result{Requeue: true}, err } - - log.Info("deleted gateway nodes", "delNodeMap", delNodeMap) - - if len(delNodeMap) != 0 { - // Select a gateway node for the policy again - var reSetPolicies []egress.Policy - for _, item := range delNodeMap { - for _, eip := range item.Eips { - reSetPolicies = append(reSetPolicies, eip.Policies...) - } - } - - for _, policy := range reSetPolicies { - if err = r.reAllocatorPolicy(ctx, log, policy, egw, perNodeMap); err != nil { - log.Error(err, "failed to reallocate a gateway node for EgressPolicy", - "policy", policy, - "egressGateway", egw.Name, - "namespace", egw.Namespace) - return reconcile.Result{Requeue: true}, err + for _, p := range policy.Items { + if p.Spec.EgressGatewayName == egw.Name { + res, err := r.reAssignEgressPolicyIP(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{Namespace: p.Namespace, Name: p.Name}, + }, egw, &p) + if err != nil { + return res, err } } - - isUpdate = true } + return reconcile.Result{}, nil +} + +func (r *egnReconciler) reAssignEgressPolicyIP(ctx context.Context, + req reconcile.Request, gateway *egress.EgressGateway, policy *egress.EgressPolicy) (reconcile.Result, error) { - // When the first gateway node of an egw recovers, you need to rebind the policy that references the egw - readyNum := 0 - policyNum := 0 - for _, node := range perNodeMap { - if node.Status == string(egress.EgressTunnelReady) { - readyNum++ - policyNum += len(node.Eips) + var err error + assignedIP := getAssignedIP(gateway, req.Namespace, req.Name) + if assignedIP == nil { + assignedIP, err = assignIP(gateway, req, policy.Spec.EgressIP) + if err != nil { + return reconcile.Result{Requeue: true}, err } - } - if readyNum == 1 && policyNum == 0 { - var policies []egress.Policy - egpList := &egress.EgressPolicyList{} - if err := r.client.List(ctx, egpList); err != nil { - log.Error(err, "list EgressPolicy failed") + if assignedIP == nil { + return reconcile.Result{Requeue: true}, fmt.Errorf("not enough ip") + } + err = updateGatewayStatusWithUsage(ctx, r.client, gateway) + if err != nil { return reconcile.Result{Requeue: true}, err } - - for _, egp := range egpList.Items { - if egp.Spec.EgressGatewayName == egw.Name { - policies = append(policies, egress.Policy{Name: egp.Name, Namespace: egp.Namespace}) - } + //err = updateEgressPolicyIfNeed(ctx, r.client, policy, assignedIP) + //if err != nil { + // return reconcile.Result{Requeue: true}, err + //} + err := updateEgressPolicyStatusIfNeed(ctx, r.client, policy, assignedIP) + if err != nil { + return reconcile.Result{Requeue: true}, err } - - egcpList := &egress.EgressClusterPolicyList{} - if err := r.client.List(ctx, egcpList); err != nil { - log.Error(err, "list EgressClusterPolicy failed") + } else { + err := updateEgressPolicyStatusIfNeed(ctx, r.client, policy, assignedIP) + if err != nil { return reconcile.Result{Requeue: true}, err } + } - for _, egcp := range egcpList.Items { - if egcp.Spec.EgressGatewayName == egw.Name { - policies = append(policies, egress.Policy{Name: egcp.Name}) - } - } + return reconcile.Result{}, nil +} - for _, policy := range policies { - err = r.reAllocatorPolicy(ctx, log, policy, egw, perNodeMap) - if err != nil { - log.Error(err, "failed to reassign a gateway node for EgressPolicy", "policy", policy) - return reconcile.Result{Requeue: true}, err - } - } +func (r *egnReconciler) reAssignEgressClusterPolicyIP(ctx context.Context, + req reconcile.Request, gateway *egress.EgressGateway, policy *egress.EgressClusterPolicy) (reconcile.Result, error) { - isUpdate = true - } + var err error - if isUpdate { - var perNodeList []egress.EgressIPStatus - for _, node := range perNodeMap { - perNodeList = append(perNodeList, node) + assignedIP := getAssignedIP(gateway, req.Namespace, req.Name) + if assignedIP == nil { + assignedIP, err = assignIP(gateway, req, policy.Spec.EgressIP) + if err != nil { + return reconcile.Result{Requeue: true}, err } - egw.Status.NodeList = perNodeList - - ipv4sFree, ipv6sFree, ipv4sTotal, ipv6sTotal, err := countGatewayIP(egw) + if assignedIP == nil { + return reconcile.Result{Requeue: true}, fmt.Errorf("not enough ip") + } + err := updateEgressClusterPolicyStatusIfNeed(ctx, r.client, policy, assignedIP) if err != nil { - r.log.Error(err, "count egress gateway ippools", "nodeList", egw.Status.NodeList) - return reconcile.Result{Requeue: true}, nil + return reconcile.Result{Requeue: true}, err } - egw.Status.IPUsage.IPv4Free = ipv4sFree - egw.Status.IPUsage.IPv4Total = ipv4sTotal - egw.Status.IPUsage.IPv6Free = ipv6sFree - egw.Status.IPUsage.IPv6Total = ipv6sTotal - - log.V(1).Info("update egress gateway status", "status", egw.Status) - err = r.client.Status().Update(ctx, egw) + } else { + err := updateEgressClusterPolicyStatusIfNeed(ctx, r.client, policy, assignedIP) if err != nil { - log.Error(err, "update egress gateway status", "status", egw.Status) return reconcile.Result{Requeue: true}, err } } @@ -342,714 +279,906 @@ func (r egnReconciler) reconcileEGW(ctx context.Context, req reconcile.Request, return reconcile.Result{}, nil } -// reconcileEG reconcile egress tunnel -func (r egnReconciler) reconcileEGT(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { +func (r *egnReconciler) reconcileNode(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { deleted := false - egt := new(egress.EgressTunnel) - egt.Name = req.Name - err := r.client.Get(ctx, req.NamespacedName, egt) + node := &corev1.Node{} + err := r.client.Get(ctx, req.NamespacedName, node) if err != nil { if !errors.IsNotFound(err) { return reconcile.Result{Requeue: true}, err } + deleted = true } - deleted = deleted || !egt.GetDeletionTimestamp().IsZero() + deleted = deleted || !node.GetDeletionTimestamp().IsZero() - // The node deletion event has already been handled, so there is no need to do that here if deleted { - log.Info("request item is deleted") + // case1: do nothing return reconcile.Result{}, nil } - egwList := &egress.EgressGatewayList{} - - if err := r.client.List(context.Background(), egwList); err != nil { - return reconcile.Result{Requeue: true}, nil + // case2: node label update + egwList := new(egress.EgressGatewayList) + err = r.cli.List(ctx, egwList) + if err != nil { + return reconcile.Result{Requeue: true}, err } - for _, item := range egwList.Items { - policies, isExist := GetPoliciesByNode(egt.Name, item) - if isExist { - perNodeMap := make(map[string]egress.EgressIPStatus) - egw := item.DeepCopy() - - // If the node is not in success state, the policy on the node is reassigned - if egt.Status.Phase != egress.EgressTunnelReady { - for _, node := range egw.Status.NodeList { - if node.Name != egt.Name { - perNodeMap[node.Name] = node - } else { - perNodeMap[node.Name] = egress.EgressIPStatus{Name: node.Name, Status: string(egt.Status.Phase)} - } + for _, egw := range egwList.Items { + selector, err := metav1.LabelSelectorAsSelector(egw.Spec.NodeSelector.Selector) + if err != nil { + return reconcile.Result{}, err + } + // + needUpdate := false + if selector.Matches(labels.Set(node.Labels)) { + // case2.1: label match + // case2.1.1: not in list, add it + // case2.1.1: already int list, do nothing + var find bool + for _, item := range egw.Status.NodeList { + if item.Name == node.Name { + find = true + break } - - for _, policy := range policies { - err = r.reAllocatorPolicy(ctx, log, policy, egw, perNodeMap) - if err != nil { - log.Error(err, "failed to reassign a gateway node for EgressPolicy", "policy", policy) - return reconcile.Result{Requeue: true}, err + } + if !find { + needUpdate = true + status := egress.EgressTunnelPending.String() + tunnel := new(egress.EgressTunnel) + err := r.client.Get(ctx, types.NamespacedName{Name: node.Name}, tunnel) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{}, err } + } else { + status = tunnel.Status.Phase.String() } - } else { - for _, node := range egw.Status.NodeList { - if node.Name == egt.Name { - for _, node := range egw.Status.NodeList { - perNodeMap[node.Name] = node - } - - if node.Status != string(egress.EgressTunnelReady) { - perNodeMap[node.Name] = egress.EgressIPStatus{Name: node.Name, Eips: node.Eips, Status: string(egress.EgressTunnelReady)} - - // When the first gateway node of an egw recovers, you need to rebind the policy that references the egw - readyNum := 0 - policyNum := 0 - for _, node := range perNodeMap { - if node.Status == string(egress.EgressTunnelReady) { - readyNum++ - policyNum += len(node.Eips) - } - } - if readyNum == 1 && policyNum == 0 { - var policies []egress.Policy - egpList := &egress.EgressPolicyList{} - if err := r.client.List(ctx, egpList); err != nil { - log.Error(err, "list EgressPolicy failed") - return reconcile.Result{Requeue: true}, err - } - - for _, egp := range egpList.Items { - if egp.Spec.EgressGatewayName == egw.Name { - policies = append(policies, egress.Policy{Name: egp.Name, Namespace: egp.Namespace}) - } - } - - egcpList := &egress.EgressClusterPolicyList{} - if err := r.client.List(ctx, egpList); err != nil { - log.Error(err, "list EgressClusterPolicy failed") - return reconcile.Result{Requeue: true}, err - } - - for _, egcp := range egcpList.Items { - if egcp.Spec.EgressGatewayName == egw.Name { - policies = append(policies, egress.Policy{Name: egcp.Name}) - } - } - - for _, policy := range policies { - err = r.reAllocatorPolicy(ctx, log, policy, egw, perNodeMap) - if err != nil { - log.Error(err, "failed to reassign a gateway node for EgressPolicy", "policy", policy) - return reconcile.Result{Requeue: true}, err - } - } - } - break - } - return reconcile.Result{Requeue: false}, nil - } + egw.Status.NodeList = append(egw.Status.NodeList, egress.EgressIPStatus{ + Name: node.Name, + Eips: make([]egress.Eips, 0), + Status: status, + }) + // if it is the first ready + // if it is the first tunnel in the node list, + // we need do more (list all policy, recheck all) + res, err := r.checkAndUpdateAllPolicyIfNeedWhenFirstNodeReady(ctx, req, log, &egw) + if err != nil { + return res, err } } - - var perNodeList []egress.EgressIPStatus - for _, node := range perNodeMap { - perNodeList = append(perNodeList, node) + } else { + // case2.2: label not match + // case2.2.1: not in list, do nothing + // case2.2.1: already int list, delete it + var needMoveIPs []egress.Eips + for nodeIndex, item := range egw.Status.NodeList { + if item.Name == node.Name { + needUpdate = true + needMoveIPs = item.Eips + egw.Status.NodeList = append(egw.Status.NodeList[:nodeIndex], egw.Status.NodeList[nodeIndex+1:]...) + break + } } - - egw.Status.NodeList = perNodeList - ipv4sFree, ipv6sFree, ipv4sTotal, ipv6sTotal, err := countGatewayIP(egw) + if len(needMoveIPs) > 0 { + moveEipToReadyNode(&egw, needMoveIPs) + } + } + if needUpdate { + err := updateGatewayStatusWithUsage(ctx, r.client, &egw) if err != nil { - r.log.Error(err, "count egress gateway ippools", "nodeList", egw.Status.NodeList) - return reconcile.Result{Requeue: true}, nil + return reconcile.Result{Requeue: true}, err } - egw.Status.IPUsage.IPv4Free = ipv4sFree - egw.Status.IPUsage.IPv4Total = ipv4sTotal - egw.Status.IPUsage.IPv6Free = ipv6sFree - egw.Status.IPUsage.IPv6Total = ipv6sTotal - - log.V(1).Info("update egress gateway status", "status", egw.Status) - err = r.client.Status().Update(ctx, egw) + // sync all policy status + err = updateAllPolicyStatus(ctx, r.client, &egw) if err != nil { - log.Error(err, "update egress gateway status", "status", egw.Status) return reconcile.Result{Requeue: true}, err } } } - return reconcile.Result{}, nil } -// reconcileEN reconcile EgressPolicy and EgressClusterPolicy -func (r egnReconciler) reconcileEGP(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { - if req.Namespace == "" { - log = log.WithValues("name", req.Name) - } else { - log = log.WithValues("name", req.Name, "namespace", req.Namespace) - } - log.V(1).Info("reconciling") - - deleted := false - isUpdate := false - egp := &egress.EgressPolicy{} - egcp := &egress.EgressClusterPolicy{} - pi := policyInfo{} - - if len(req.Namespace) == 0 { - err := r.client.Get(ctx, req.NamespacedName, egcp) - if err != nil { - if !errors.IsNotFound(err) { - log.Error(err, "retrieves an obj from the k8s") - return reconcile.Result{}, err +func updateAllPolicyStatus(ctx context.Context, cli client.Client, egw *egress.EgressGateway) error { + for _, node := range egw.Status.NodeList { + for _, eip := range node.Eips { + assignedIP := &AssignedIP{ + Node: node.Name, + IPv4: eip.IPv4, + IPv6: eip.IPv6, + UseNodeIP: false, } - deleted = true - } - deleted = deleted || !egcp.GetDeletionTimestamp().IsZero() - pi.policy = egress.Policy{Name: req.Name} - if !deleted { - if len(egcp.Spec.EgressIP.IPv4) != 0 { - pi.ipv4 = egcp.Spec.EgressIP.IPv4 - } else { - pi.ipv4 = egcp.Status.Eip.Ipv4 + if assignedIP.IPv4 == "" && assignedIP.IPv6 == "" { + assignedIP.UseNodeIP = true } - - if len(egcp.Spec.EgressIP.IPv6) != 0 { - pi.ipv6 = egcp.Spec.EgressIP.IPv6 - } else { - pi.ipv6 = egcp.Status.Eip.Ipv6 + for _, p := range eip.Policies { + if p.Namespace != "" { + policy := new(egress.EgressPolicy) + err := cli.Get(ctx, types.NamespacedName{Namespace: p.Namespace, Name: p.Name}, policy) + if err != nil { + return err + } + err = updateEgressPolicyStatusIfNeed(ctx, cli, policy, assignedIP) + if err != nil { + return err + } + } else { + policy := new(egress.EgressClusterPolicy) + err := cli.Get(ctx, types.NamespacedName{Namespace: p.Namespace, Name: p.Name}, policy) + if err != nil { + return err + } + err = updateEgressClusterPolicyStatusIfNeed(ctx, cli, policy, assignedIP) + if err != nil { + return err + } + } } + } + } + return nil +} - pi.isUseNodeIP = egcp.Spec.EgressIP.UseNodeIP - pi.egw = egcp.Spec.EgressGatewayName +func (r *egnReconciler) reconcileGateway(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { + deleted := false + egw := &egress.EgressGateway{} + err := r.cli.Get(ctx, req.NamespacedName, egw) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{Requeue: true}, err } - } else { - err := r.client.Get(ctx, req.NamespacedName, egp) + deleted = true + } + deleted = deleted || !egw.GetDeletionTimestamp().IsZero() + + if deleted { + // case 1 + log.Info("request item is deleted") + count, err := getPolicyCountByGatewayName(ctx, r.client, req.Name) if err != nil { - if !errors.IsNotFound(err) { - log.Error(err, "retrieves an obj from the k8s") - return reconcile.Result{}, err - } - deleted = true + return reconcile.Result{Requeue: true}, err } - deleted = deleted || !egp.GetDeletionTimestamp().IsZero() - pi.policy = egress.Policy{Name: req.Name, Namespace: req.Namespace} - if !deleted { - if len(egp.Spec.EgressIP.IPv4) != 0 { - pi.ipv4 = egp.Spec.EgressIP.IPv4 - } else { - pi.ipv4 = egp.Status.Eip.Ipv4 + if count == 0 && egw.Name != "" { + log.Info("remove the egressGatewayFinalizer") + removeEgressGatewayFinalizer(egw) + log.V(1).Info("remove the egressGatewayFinalizer", "ObjectMeta", egw.ObjectMeta) + err = r.client.Update(ctx, egw) + if err != nil { + log.Error(err, "remove the egressGatewayFinalizer", "ObjectMeta", egw.ObjectMeta) + return reconcile.Result{Requeue: true}, err } + } + return reconcile.Result{Requeue: false}, nil + } - if len(egp.Spec.EgressIP.IPv6) != 0 { - pi.ipv6 = egp.Spec.EgressIP.IPv6 - } else { - pi.ipv6 = egp.Status.Eip.Ipv6 - } + // case2: egw match label update + k8sNodeList := &corev1.NodeList{} + selector, err := metav1.LabelSelectorAsSelector(egw.Spec.NodeSelector.Selector) + if err != nil { + return reconcile.Result{}, err + } + opt := &client.ListOptions{LabelSelector: selector} + err = r.client.List(ctx, k8sNodeList, opt) + if err != nil { + return reconcile.Result{}, err + } - pi.isUseNodeIP = egp.Spec.EgressIP.UseNodeIP - pi.egw = egp.Spec.EgressGatewayName - } + // + k8sNodeMap := make(map[string]struct{}) + for _, node := range k8sNodeList.Items { + k8sNodeMap[node.Name] = struct{}{} } - policy := pi.policy - if deleted { - egwList := &egress.EgressGatewayList{} - if err := r.client.List(ctx, egwList); err != nil { - return reconcile.Result{Requeue: true}, nil - } - for _, egw := range egwList.Items { - _, isExist := GetEIPStatusByPolicy(policy, egw) - if isExist { - log.Info("delete policy", "policy", policy, "egw", egw.Name) - // Delete the policy from the EgressGateway. If the referenced EIP is not used by any other policy, - // the system reclaims the EIP. - DeletePolicyFromEG(log, policy, &egw) - - ipv4sFree, ipv6sFree, ipv4sTotal, ipv6sTotal, err := countGatewayIP(&egw) - if err != nil { - r.log.Error(err, "count egress gateway ippools", "nodeList", egw.Status.NodeList) - return reconcile.Result{Requeue: true}, nil - } - egw.Status.IPUsage.IPv4Free = ipv4sFree - egw.Status.IPUsage.IPv4Total = ipv4sTotal - egw.Status.IPUsage.IPv6Free = ipv6sFree - egw.Status.IPUsage.IPv6Total = ipv6sTotal + needUpdate := false - log.V(1).Info("update egress gateway status", "status", egw.Status) - err = r.client.Status().Update(ctx, &egw) - if err != nil { - log.Error(err, "update egress gateway status", "status", egw.Status) - return reconcile.Result{Requeue: true}, err + // need to move eips + var needMoveIPs []egress.Eips + + for i := 0; i < len(egw.Status.NodeList); { + node := egw.Status.NodeList[i] + if _, ok := k8sNodeMap[node.Name]; ok { + delete(k8sNodeMap, node.Name) + tunnel := new(egress.EgressTunnel) + err := r.client.Get(ctx, types.NamespacedName{Name: node.Name}, tunnel) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{}, err } - return reconcile.Result{}, nil + // case 1.1: node exists, but tunnel not exists, set statue to pending + if egress.EgressTunnelPending.IsNotEqual(node.Status) { + needMoveIPs = append(needMoveIPs, node.Eips...) + // sync status + egw.Status.NodeList[i].Status = egress.EgressTunnelPending.String() + egw.Status.NodeList[i].Eips = []egress.Eips{} + needUpdate = true + } + continue + } + // case 1.2: node exists, but node status not equal tunnel statue + // just sync it + if tunnel.Status.Phase.IsNotEqual(node.Status) { + egw.Status.NodeList[i].Status = egress.EgressTunnelPending.String() + needUpdate = true + } + // case 1.3: status has been synchronized, do nothing + i++ + } else { + needMoveIPs = append(needMoveIPs, node.Eips...) + needUpdate = true + // Remove the element by shifting the subsequent elements forward and reducing the length of the slice. + copy(egw.Status.NodeList[i:], egw.Status.NodeList[i+1:]) + egw.Status.NodeList = egw.Status.NodeList[:len(egw.Status.NodeList)-1] + } + } + + // add k8s nodes to gateway match list + beforeReadyCount := egw.Status.ReadyCount() + for node := range k8sNodeMap { + fmt.Println("") + needUpdate = true + status := egress.EgressTunnelPending.String() + tunnel := new(egress.EgressTunnel) + err := r.client.Get(ctx, types.NamespacedName{Name: node}, tunnel) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{}, err } + } else { + status = tunnel.Status.Phase.String() } - return reconcile.Result{}, nil + egw.Status.NodeList = append(egw.Status.NodeList, egress.EgressIPStatus{ + Name: node, + Eips: make([]egress.Eips, 0), + Status: status, + }) } - egwName := pi.egw - egw := &egress.EgressGateway{} - err := r.client.Get(ctx, types.NamespacedName{Name: egwName}, egw) - if err != nil { - if errors.IsNotFound(err) { - return reconcile.Result{}, err - } - log.Error(err, "get EgressGateway") - return reconcile.Result{Requeue: true}, err + if len(needMoveIPs) > 0 { + moveEipToReadyNode(egw, needMoveIPs) } - // Assigned if the policy does not have a gateway node - eipStatus, isExist := GetEIPStatusByPolicy(policy, *egw) - if !isExist { - perNodeMap := make(map[string]egress.EgressIPStatus) - for _, item := range egw.Status.NodeList { - perNodeMap[item.Name] = item + if beforeReadyCount == 0 { + res, err := r.checkAndUpdateAllPolicyIfNeedWhenFirstNodeReady(ctx, req, log, egw) + if err != nil { + return res, err } + } - err := r.reAllocatorPolicy(ctx, log, policy, egw, perNodeMap) + if needUpdate { + // update + err := updateGatewayStatusWithUsage(ctx, r.client, egw) if err != nil { - r.log.Error(err, "reallocator Failed to reassign a gateway node for EgressPolicy", "policy", policy) return reconcile.Result{Requeue: true}, err } - - var perNodeList []egress.EgressIPStatus - for _, node := range perNodeMap { - perNodeList = append(perNodeList, node) + // sync all policy status + err = updateAllPolicyStatus(ctx, r.client, egw) + if err != nil { + return reconcile.Result{Requeue: true}, err } - egw.Status.NodeList = perNodeList + } - isUpdate = true - } else { - // Check whether the EIP is correct - for i, eip := range eipStatus.Eips { - for j, p := range eip.Policies { - if p == policy { - isReAllocatorPolicy := false - if pi.isUseNodeIP && (eip.IPv4 != "" || eip.IPv6 != "") { - isReAllocatorPolicy = true - } else if pi.ipv4 != "" && pi.ipv4 != eip.IPv4 { - log.Info("policy", policy, ", pi.ipv4=", pi.ipv4, ", eip.IPv4", "=", eip.IPv4) - isReAllocatorPolicy = true - } else if pi.ipv6 != "" && pi.ipv6 != eip.IPv6 { - log.Info("policy", policy, ", pi.ipv6=", pi.ipv6, ", eip.IPv6", "=", eip.IPv6) - isReAllocatorPolicy = true - } + return reconcile.Result{}, nil +} - if isReAllocatorPolicy { - eipStatus.Eips[i].Policies = append(eipStatus.Eips[i].Policies[:j], eipStatus.Eips[i].Policies[j+1:]...) - perNodeMap := make(map[string]egress.EgressIPStatus) - for _, node := range egw.Status.NodeList { - if node.Name == eipStatus.Name { - perNodeMap[node.Name] = eipStatus - } else { - perNodeMap[node.Name] = node - } - } - err := r.reAllocatorPolicy(ctx, log, policy, egw, perNodeMap) - if err != nil { - log.Error(err, "failed to reassign a gateway node for EgressPolicy", - "policy", policy, - "egressGateway", egw.Name, - "namespace", egw.Namespace) - - return reconcile.Result{Requeue: true}, err - } +func moveEipToReadyNode(gateway *egress.EgressGateway, needMoveIPs []egress.Eips) { + if gateway.Status.ReadyCount() <= 0 { + return + } - var perNodeList []egress.EgressIPStatus - for _, node := range perNodeMap { - perNodeList = append(perNodeList, node) - } - egw.Status.NodeList = perNodeList - } else { - // check policy status - var policyStatus egress.EgressPolicyStatus - policyStatus.Eip.Ipv4 = eip.IPv4 - policyStatus.Eip.Ipv6 = eip.IPv6 - policyStatus.Node = eipStatus.Name - - if len(policy.Namespace) == 0 { - if len(egcp.Status.Node) == 0 { - egcp.Status = policyStatus - log.V(1).Info("update egressclusterpolicy status", "status", egcp.Status) - err = r.client.Status().Update(ctx, egcp) - if err != nil { - log.Error(err, "update egressclusterpolicy status", "status", egcp.Status) - return reconcile.Result{Requeue: true}, err - } - } - } else { - if len(egp.Status.Node) == 0 { - egp.Status = policyStatus - log.V(1).Info("update egresspolicy status", "status", egp.Status) - err = r.client.Status().Update(ctx, egp) - if err != nil { - log.Error(err, "update egresspolicy status", "status", egp.Status) - return reconcile.Result{Requeue: true}, err - } - } - } - } + minEipNodeIndex := -1 + minEipCount := -1 + useNodeIPIndex := -1 - isUpdate = true - goto update + for i, node := range gateway.Status.NodeList { + if node.Status == "Ready" { + eipCount := len(node.Eips) + if minEipCount == -1 || eipCount < minEipCount { + minEipNodeIndex = i + minEipCount = eipCount + for tmp, eip := range node.Eips { + if eip.IPv4 == "" && eip.IPv6 == "" { + useNodeIPIndex = tmp + } } } } - } -update: - if isUpdate { - ipv4sFree, ipv6sFree, ipv4sTotal, ipv6sTotal, err := countGatewayIP(egw) - if err != nil { - r.log.Error(err, "count egress gateway ippools", "nodeList", egw.Status.NodeList) - return reconcile.Result{Requeue: true}, nil - } - egw.Status.IPUsage.IPv4Free = ipv4sFree - egw.Status.IPUsage.IPv4Total = ipv4sTotal - egw.Status.IPUsage.IPv6Free = ipv6sFree - egw.Status.IPUsage.IPv6Total = ipv6sTotal - r.log.V(1).Info("update egress gateway status", "status", egw.Status) - err = r.client.Status().Update(ctx, egw) - if err != nil { - r.log.Error(err, "update egress gateway status", "status", egw.Status) - return reconcile.Result{Requeue: true}, err - } - } - return reconcile.Result{}, nil -} - -func (r egnReconciler) deleteNodeFromEGs(ctx context.Context, log logr.Logger, nodeName string, egwList *egress.EgressGatewayList) error { - for _, egw := range egwList.Items { - for _, eipStatus := range egw.Status.NodeList { - if nodeName == eipStatus.Name { - err := r.deleteNodeFromEG(ctx, log, nodeName, egw) - if err != nil { - return err + if minEipNodeIndex != -1 { + for _, eip := range needMoveIPs { + if eip.IPv4 == "" && eip.IPv6 == "" { + // case 1: move user node ip case + if useNodeIPIndex != -1 { + // case: append policy to target node + gateway.Status.NodeList[minEipNodeIndex].Eips[useNodeIPIndex].Policies = append( + gateway.Status.NodeList[minEipNodeIndex].Eips[useNodeIPIndex].Policies, + eip.Policies..., + ) + } else { + // case: need create new + useNodeIPIndex = len(gateway.Status.NodeList[minEipNodeIndex].Eips) + gateway.Status.NodeList[minEipNodeIndex].Eips = append( + gateway.Status.NodeList[minEipNodeIndex].Eips, + egress.Eips{IPv4: "", IPv6: "", Policies: eip.Policies}, + ) } - break + } else { + // case 2: move eip case + gateway.Status.NodeList[minEipNodeIndex].Eips = append(gateway.Status.NodeList[minEipNodeIndex].Eips, eip) } } } - return nil + // case: no healthy nodes to move(migrate) eip, do nothing } -// Delete the node from the EgressGateway -func (r egnReconciler) deleteNodeFromEG(ctx context.Context, log logr.Logger, nodeName string, egw egress.EgressGateway) error { - // Get the policy that needs to be reassigned - policies, isExist := GetPoliciesByNode(nodeName, egw) +func (r *egnReconciler) reconcileEgressClusterPolicy(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { + deleted := false + policy := new(egress.EgressClusterPolicy) + err := r.client.Get(ctx, req.NamespacedName, policy) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{Requeue: true}, err + } + deleted = true + } + deleted = deleted || !policy.GetDeletionTimestamp().IsZero() + if deleted { + return r.reconcileDeletePolicy(ctx, req, policy.Spec.EgressGatewayName, log) + } - if isExist { - perNodeMap := make(map[string]egress.EgressIPStatus) - for _, item := range egw.Status.NodeList { - if nodeName != item.Name { - perNodeMap[item.Name] = item + if policy != nil && policy.Name != "" && policy.Spec.EgressGatewayName != "" { + gateway := new(egress.EgressGateway) + gatewayName := policy.Spec.EgressGatewayName + err := r.cli.Get(ctx, types.NamespacedName{Name: gatewayName}, gateway) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{Requeue: true}, err } + return reconcile.Result{Requeue: false}, fmt.Errorf("reconcile EgressPolicy %s, not found egress gateway: %s", req, gatewayName) } - - // Redistribute network gateway nodes - for _, policy := range policies { - err := r.reAllocatorPolicy(ctx, log, policy, &egw, perNodeMap) + assignedIP := getAssignedIP(gateway, req.Namespace, req.Name) + if assignedIP == nil { + assignedIP, err = assignIP(gateway, req, policy.Spec.EgressIP) if err != nil { - r.log.Error(err, "failed to reassign a gateway node for EgressPolicy", "policy", policy) - return err + return reconcile.Result{Requeue: true}, err + } + if assignedIP == nil { + return reconcile.Result{Requeue: true}, fmt.Errorf("not enough ip") + } + err = updateGatewayStatusWithUsage(ctx, r.client, gateway) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + err := updateEgressClusterPolicyStatusIfNeed(ctx, r.client, policy, assignedIP) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + } else { + err := updateEgressClusterPolicyStatusIfNeed(ctx, r.client, policy, assignedIP) + if err != nil { + return reconcile.Result{Requeue: true}, err } } + } + return reconcile.Result{}, nil +} - var perNodeList []egress.EgressIPStatus - for _, node := range perNodeMap { - perNodeList = append(perNodeList, node) - } - - egw.Status.NodeList = perNodeList - ipv4sFree, ipv6sFree, ipv4sTotal, ipv6sTotal, err := countGatewayIP(&egw) +func (r *egnReconciler) reconcileDeletePolicy(ctx context.Context, req reconcile.Request, egwName string, log logr.Logger) (reconcile.Result, error) { + if egwName == "" { + gatewayList := new(egress.EgressGatewayList) + err := r.cli.List(ctx, gatewayList) if err != nil { - r.log.Error(err, "count egress gateway ippools", "nodeList", egw.Status.NodeList) - return err + if !errors.IsNotFound(err) { + return reconcile.Result{Requeue: true}, err + } + return reconcile.Result{Requeue: false}, nil } - egw.Status.IPUsage.IPv4Free = ipv4sFree - egw.Status.IPUsage.IPv4Total = ipv4sTotal - egw.Status.IPUsage.IPv6Free = ipv6sFree - egw.Status.IPUsage.IPv6Total = ipv6sTotal - - r.log.V(1).Info("update egress gateway status", "status", egw.Status) - err = r.client.Status().Update(ctx, &egw) + if len(gatewayList.Items) == 0 { + return reconcile.Result{Requeue: false}, nil + } + for _, gateway := range gatewayList.Items { + update, err := deleteEgressPolicy(&gateway, req.Namespace, req.Name) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + if update { + err := updateGatewayStatusWithUsage(ctx, r.client, &gateway) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + break + } + } + } else { + gateway := new(egress.EgressGateway) + err := r.cli.Get(ctx, types.NamespacedName{Name: egwName}, gateway) if err != nil { - r.log.Error(err, "update egress gateway status", "status", egw.Status) - return err + if !errors.IsNotFound(err) { + return reconcile.Result{Requeue: true}, err + } + return reconcile.Result{Requeue: false}, nil + } + if gateway.Name != "" { + update, err := deleteEgressPolicy(gateway, req.Namespace, req.Name) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + if update { + err := updateGatewayStatusWithUsage(ctx, r.client, gateway) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + } } } - - return nil + return reconcile.Result{Requeue: false}, nil } -func (r egnReconciler) reAllocatorPolicy(ctx context.Context, log logr.Logger, policy egress.Policy, egw *egress.EgressGateway, nodeMap map[string]egress.EgressIPStatus) error { - var perNode string - var ipv4, ipv6 string - var err error - pi := policyInfo{} - pi.policy = policy - - if len(nodeMap) == 0 { - r.log.Info("egw: ", egw.Name, " does not have a matching node") - return nil +func (r *egnReconciler) reconcileEgressPolicy(ctx context.Context, req reconcile.Request, log logr.Logger) (reconcile.Result, error) { + deleted := false + policy := new(egress.EgressPolicy) + err := r.client.Get(ctx, req.NamespacedName, policy) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{Requeue: true}, err + } + deleted = true } + deleted = deleted || !policy.GetDeletionTimestamp().IsZero() - if len(pi.policy.Namespace) == 0 { - egcp := &egress.EgressClusterPolicy{} - err := r.client.Get(ctx, types.NamespacedName{Name: pi.policy.Name}, egcp) - if err != nil { - return err + if deleted { + egwName := "" + if policy != nil && policy.Spec.EgressGatewayName != "" { + egwName = policy.Spec.EgressGatewayName } - - if len(egcp.Spec.EgressIP.IPv4) != 0 { - pi.ipv4 = egcp.Spec.EgressIP.IPv4 + if egwName == "" { + gatewayList := new(egress.EgressGatewayList) + err := r.cli.List(ctx, gatewayList) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{Requeue: true}, err + } + return reconcile.Result{Requeue: false}, nil + } + if len(gatewayList.Items) == 0 { + return reconcile.Result{Requeue: false}, nil + } + for _, gateway := range gatewayList.Items { + update, err := deleteEgressPolicy(&gateway, req.Namespace, req.Name) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + if update { + err := updateGatewayStatusWithUsage(ctx, r.client, &gateway) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + break + } + } } else { - pi.ipv4 = egcp.Status.Eip.Ipv4 + gateway := new(egress.EgressGateway) + err := r.cli.Get(ctx, types.NamespacedName{Name: egwName}, gateway) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{Requeue: true}, err + } + return reconcile.Result{Requeue: false}, nil + } + if gateway.Name != "" { + update, err := deleteEgressPolicy(gateway, req.Namespace, req.Name) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + if update { + err := updateGatewayStatusWithUsage(ctx, r.client, gateway) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + } + } } + return reconcile.Result{Requeue: false}, nil + } - if len(egcp.Spec.EgressIP.IPv6) != 0 { - pi.ipv6 = egcp.Spec.EgressIP.IPv6 + if policy != nil && policy.Name != "" && policy.Spec.EgressGatewayName != "" { + gateway := new(egress.EgressGateway) + gatewayName := policy.Spec.EgressGatewayName + err := r.cli.Get(ctx, types.NamespacedName{Name: gatewayName}, gateway) + if err != nil { + if !errors.IsNotFound(err) { + return reconcile.Result{Requeue: true}, err + } + return reconcile.Result{Requeue: false}, fmt.Errorf("reconcile EgressPolicy %s, not found egress gateway: %s", req, gatewayName) + } + assignedIP := getAssignedIP(gateway, req.Namespace, req.Name) + if assignedIP == nil { + assignedIP, err = assignIP(gateway, req, policy.Spec.EgressIP) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + if assignedIP == nil { + return reconcile.Result{Requeue: true}, fmt.Errorf("not enough ip") + } + err = updateGatewayStatusWithUsage(ctx, r.client, gateway) + if err != nil { + return reconcile.Result{Requeue: true}, err + } + //err = updateEgressPolicyIfNeed(ctx, r.client, policy, assignedIP) + //if err != nil { + // return reconcile.Result{Requeue: true}, err + //} + err := updateEgressPolicyStatusIfNeed(ctx, r.client, policy, assignedIP) + if err != nil { + return reconcile.Result{Requeue: true}, err + } } else { - pi.ipv6 = egcp.Status.Eip.Ipv6 + err := updateEgressPolicyStatusIfNeed(ctx, r.client, policy, assignedIP) + if err != nil { + return reconcile.Result{Requeue: true}, err + } } + } - pi.isUseNodeIP = egcp.Spec.EgressIP.UseNodeIP - pi.egw = egcp.Spec.EgressGatewayName - pi.allocatorPolicy = egcp.Spec.EgressIP.AllocatorPolicy - } else { - egp := &egress.EgressPolicy{} - err := r.client.Get(ctx, types.NamespacedName{Namespace: pi.policy.Namespace, Name: pi.policy.Name}, egp) - if err != nil { - return err - } + return reconcile.Result{}, nil +} - if len(egp.Spec.EgressIP.IPv4) != 0 { - pi.ipv4 = egp.Spec.EgressIP.IPv4 - } else { - pi.ipv4 = egp.Status.Eip.Ipv4 +func assignIP(from *egress.EgressGateway, req reconcile.Request, specEgressIP egress.EgressIP) (*AssignedIP, error) { + // apply node policy to select node + nIndex := -1 + eipNum := -1 + for nodeIndex, node := range from.Status.NodeList { + if node.Status != string(egress.EgressTunnelReady) { + continue } - - if len(egp.Spec.EgressIP.IPv6) != 0 { - pi.ipv6 = egp.Spec.EgressIP.IPv6 - } else { - pi.ipv6 = egp.Status.Eip.Ipv6 + if eipNum == -1 { + eipNum = len(node.Eips) + nIndex = nodeIndex + } else if eipNum > len(node.Eips) { + eipNum = len(node.Eips) + nIndex = nodeIndex + } + } + + // case1 + if specEgressIP.UseNodeIP { + if nIndex != -1 { + for eipIndex, eip := range from.Status.NodeList[nIndex].Eips { + if eip.IPv4 == "" && eip.IPv6 == "" { + from.Status.NodeList[nIndex].Eips[eipIndex].Policies = append( + from.Status.NodeList[nIndex].Eips[eipIndex].Policies, + egress.Policy{Name: req.Name, Namespace: req.Namespace}, + ) + return &AssignedIP{ + Node: from.Status.NodeList[nIndex].Name, + UseNodeIP: true, + }, nil + } + } + // not found + from.Status.NodeList[nIndex].Eips = append( + from.Status.NodeList[nIndex].Eips, + egress.Eips{ + IPv4: "", IPv6: "", + Policies: []egress.Policy{{Name: req.Name, Namespace: req.Namespace}}, + }, + ) + return &AssignedIP{ + Node: from.Status.NodeList[nIndex].Name, + UseNodeIP: true, + }, nil + } + return nil, nil + } + + // case2 reuse eip + if specEgressIP.IPv4 != "" || specEgressIP.IPv6 != "" { + // check + for nodeIndex, node := range from.Status.NodeList { + for eipIndex, eip := range node.Eips { + if eip.IPv4 == specEgressIP.IPv4 || eip.IPv6 == specEgressIP.IPv6 { + from.Status.NodeList[nodeIndex].Eips[eipIndex].Policies = append( + from.Status.NodeList[nodeIndex].Eips[eipIndex].Policies, egress.Policy{ + Name: req.Name, + Namespace: req.Namespace, + }) + return &AssignedIP{ + Node: node.Name, + IPv4: eip.IPv4, + IPv6: eip.IPv6, + UseNodeIP: false, + }, nil + } + } } - - pi.isUseNodeIP = egp.Spec.EgressIP.UseNodeIP - pi.egw = egp.Spec.EgressGatewayName - pi.allocatorPolicy = egp.Spec.EgressIP.AllocatorPolicy } - ipv4 = pi.ipv4 - if len(ipv4) != 0 { - perNode = GetNodeByIP(ipv4, *egw) - if nodeMap[perNode].Status != string(egress.EgressTunnelReady) { - perNode = "" + // case3 assign new IP use eip assign policy + // + if specEgressIP.AllocatorPolicy == egress.EipAllocatorRR { + randObj := rand.New(rand.NewSource(time.Now().UnixNano())) + assignedIP := &AssignedIP{ + Node: "", + IPv4: "", + IPv6: "", + UseNodeIP: false, } - - if len(perNode) == 0 { - perNode, err = r.allocatorNode("rr", nodeMap) + if len(from.Spec.Ippools.IPv4) > 0 { + ipv4Ranges, err := ip.MergeIPRanges(constant.IPv4, from.Spec.Ippools.IPv4) if err != nil { - return err + return nil, fmt.Errorf("assignIP MergeIPRanges with error: %s", err) + } + // user specify ipv4 + if specEgressIP.IPv4 != "" { + ok, err := ip.IsIPIncludedRange(constant.IPv4, specEgressIP.IPv4, ipv4Ranges) + if err != nil { + return nil, fmt.Errorf("encountered an error while trying to check if the Egress IP of Policy %s/%s exists in the ippool: %v", req.Namespace, req.Name, err) + } + if !ok { + return nil, fmt.Errorf("the specified egress IPv4 %s is not in the gateway's ippool", specEgressIP.IPv4) + } + assignedIP.IPv4 = specEgressIP.IPv4 + } else { + ipv4s, err := ip.ParseIPRanges(constant.IPv4, ipv4Ranges) + if err != nil { + return nil, err + } + var useIpv4s []net.IP + for _, node := range from.Status.NodeList { + for _, eip := range node.Eips { + if len(eip.IPv4) != 0 { + useIpv4s = append(useIpv4s, net.ParseIP(eip.IPv4)) + } + } + } + freeIpv4s := ip.IPsDiffSet(ipv4s, useIpv4s, false) + if len(freeIpv4s) == 0 { + return nil, fmt.Errorf("EgressGateway %s does not have enough IPs to allocate for Policy %s/%s", from.Name, req.Namespace, req.Name) + } + assignedIP.IPv4 = freeIpv4s[randObj.Intn(len(freeIpv4s))].String() } } - ipv4, ipv6, err = r.allocatorEIP("", perNode, pi, *egw) - if err != nil { - return err - } - } else { - allocatorPolicy := pi.allocatorPolicy - if allocatorPolicy == egress.EipAllocatorRR { - perNode, err = r.allocatorNode("rr", nodeMap) + if len(from.Spec.Ippools.IPv6) > 0 { + ipv6Ranges, err := ip.MergeIPRanges(constant.IPv6, from.Spec.Ippools.IPv6) if err != nil { - return err + return nil, fmt.Errorf("assignIP MergeIPRanges with error: %s", err) } - - ipv4, ipv6, err = r.allocatorEIP("", perNode, pi, *egw) - if err != nil { - return err + // user specify ipv6 + if specEgressIP.IPv6 != "" { + ok, err := ip.IsIPIncludedRange(constant.IPv6, specEgressIP.IPv6, ipv6Ranges) + if err != nil { + return nil, fmt.Errorf("encountered an error while trying to check if the Egress IP of Policy %s/%s exists in the ippool: %v", req.Namespace, req.Name, err) + } + if !ok { + return nil, fmt.Errorf("the specified egress IPv6 %s is not in the gateway's ippool", specEgressIP.IPv6) + } + assignedIP.IPv6 = specEgressIP.IPv6 + } else { + ipv6s, err := ip.ParseIPRanges(constant.IPv6, ipv6Ranges) + if err != nil { + return nil, err + } + var useIpv6s []net.IP + for _, node := range from.Status.NodeList { + for _, eip := range node.Eips { + if len(eip.IPv6) != 0 { + useIpv6s = append(useIpv6s, net.ParseIP(eip.IPv6)) + } + } + } + freeIpv6s := ip.IPsDiffSet(ipv6s, useIpv6s, false) + if len(freeIpv6s) == 0 { + return nil, fmt.Errorf("EgressGateway %s does not have enough IPs to allocate for Policy %s/%s", from.Name, req.Namespace, req.Name) + } + assignedIP.IPv6 = freeIpv6s[randObj.Intn(len(freeIpv6s))].String() } - } else { - ipv4 = egw.Spec.Ippools.Ipv4DefaultEIP - ipv6 = egw.Spec.Ippools.Ipv6DefaultEIP + } - perNode = GetNodeByIP(ipv4, *egw) - if nodeMap[perNode].Status != string(egress.EgressTunnelReady) { - perNode = "" + assignedIP.Node = from.Status.NodeList[nIndex].Name + // append assignedIP to egw + from.Status.NodeList[nIndex].Eips = append( + from.Status.NodeList[nIndex].Eips, + egress.Eips{ + IPv4: assignedIP.IPv4, + IPv6: assignedIP.IPv6, + Policies: []egress.Policy{{Name: req.Name, Namespace: req.Namespace}}, + }, + ) + return assignedIP, nil + } else { + assignedIP := &AssignedIP{ + Node: "", + IPv4: from.Spec.Ippools.Ipv4DefaultEIP, + IPv6: from.Spec.Ippools.Ipv6DefaultEIP, + UseNodeIP: false, + } + defaultEipIndex := -1 + for i, node := range from.Status.NodeList { + for _, eip := range node.Eips { + if eip.IPv4 != "" && eip.IPv4 == from.Spec.Ippools.Ipv4DefaultEIP { + defaultEipIndex = i + break + } + if eip.IPv6 != "" && eip.IPv6 == from.Spec.Ippools.Ipv6DefaultEIP { + defaultEipIndex = i + break + } } - - if len(perNode) == 0 { - perNode, err = r.allocatorNode("rr", nodeMap) - if err != nil { - return err + if defaultEipIndex != -1 { + assignedIP.Node = node.Name + break + } + } + if defaultEipIndex == -1 { + for i, node := range from.Status.NodeList { + if node.Status != string(egress.EgressTunnelReady) { + continue } + from.Status.NodeList[i].Eips = append( + from.Status.NodeList[i].Eips, + egress.Eips{ + IPv4: from.Spec.Ippools.Ipv4DefaultEIP, + IPv6: from.Spec.Ippools.Ipv6DefaultEIP, + Policies: []egress.Policy{{Name: req.Name, Namespace: req.Namespace}}, + }, + ) } } - } - - log.Info("reAllocatorPolicy", " policy=", pi.policy, " perNode=", perNode, " ipv4=", ipv4, " ipv6=", ipv6) + if assignedIP.Node == "" { + return nil, fmt.Errorf("EgressGateway %s does not have an available Node", from.Name) + } - err = setEipStatus(ipv4, ipv6, perNode, pi.policy, nodeMap) - if err != nil { - return err + return assignedIP, nil } - - return nil } -func (r egnReconciler) allocatorNode(selNodePolicy string, nodeMap map[string]egress.EgressIPStatus) (string, error) { - - if len(nodeMap) == 0 { - err := fmt.Errorf("nodeList is empty") - return "", err - } +type AssignedIP struct { + Node string + IPv4 string + IPv6 string + UseNodeIP bool +} - var perNode string - perNodePolicyNum := 0 - i := 0 - for _, node := range nodeMap { - if node.Status != string(egress.EgressTunnelReady) { - continue +func updateEgressPolicyIfNeed(ctx context.Context, cli client.Client, policy *egress.EgressPolicy, assignedIP *AssignedIP) error { + if policy.Spec.EgressIP.IPv4 != assignedIP.IPv4 || policy.Spec.EgressIP.IPv4 != assignedIP.IPv6 { + policy.Spec.EgressIP.IPv4 = assignedIP.IPv4 + policy.Spec.EgressIP.IPv6 = assignedIP.IPv6 + err := cli.Update(ctx, policy) + if err != nil { + return err } + } + return nil +} - policyNum := 0 +func getAssignedIP(from *egress.EgressGateway, policyNs, policyName string) *AssignedIP { + for _, node := range from.Status.NodeList { for _, eip := range node.Eips { - policyNum += len(eip.Policies) - } - - if i == 0 { - i++ - perNode = node.Name - perNodePolicyNum = policyNum - } else if policyNum <= perNodePolicyNum { - perNode = node.Name - perNodePolicyNum = policyNum + for _, policy := range eip.Policies { + if policy.Name == policyName && policy.Namespace == policyNs { + return &AssignedIP{Node: node.Name, IPv4: eip.IPv4, IPv6: eip.IPv6} + } + } } } - - return perNode, nil + return nil } -func (r egnReconciler) allocatorEIP(selEipLolicy string, nodeName string, pi policyInfo, egw egress.EgressGateway) (string, string, error) { +func updateEgressPolicyStatusIfNeed(ctx context.Context, cli client.Client, policy *egress.EgressPolicy, assignedIP *AssignedIP) error { + if policy.Status.Eip.Ipv4 != assignedIP.IPv4 || policy.Status.Eip.Ipv6 != assignedIP.IPv6 || policy.Status.Node != assignedIP.Node { + policy.Status.Eip.Ipv4 = assignedIP.IPv4 + policy.Status.Eip.Ipv6 = assignedIP.IPv6 + policy.Status.Node = assignedIP.Node - if pi.isUseNodeIP || len(nodeName) == 0 { - return "", "", nil - } - var perIpv4 string - var perIpv6 string - rander := rand.New(rand.NewSource(time.Now().UnixNano())) - - if len(egw.Spec.Ippools.IPv4) > 0 { - var useIpv4s []net.IP - - ipv4Ranges, _ := ip.MergeIPRanges(constant.IPv4, egw.Spec.Ippools.IPv4) - perIpv4 = pi.ipv4 - if len(perIpv4) != 0 { - result, err := ip.IsIPIncludedRange(constant.IPv4, perIpv4, ipv4Ranges) - if err != nil { - return "", "", err - } - if !result { - return "", "", fmt.Errorf("%v is not within the EIP range of EgressGateway %v", perIpv4, egw.Name) - } - } else { - for _, node := range egw.Status.NodeList { - for _, eip := range node.Eips { - if len(eip.IPv4) != 0 { - useIpv4s = append(useIpv4s, net.ParseIP(eip.IPv4)) + err := cli.Status().Update(ctx, policy) + if err != nil { + if errors.IsConflict(err) { + newPolicy := new(egress.EgressPolicy) + err := cli.Get(ctx, types.NamespacedName{Namespace: policy.Namespace, Name: policy.Name}, policy) + if err != nil { + if !errors.IsNotFound(err) { + return nil } + return err + } + newPolicy.Status = policy.Status + err = cli.Status().Update(ctx, policy) + if err != nil { + return err } } - - ipv4s, _ := ip.ParseIPRanges(constant.IPv4, ipv4Ranges) - freeIpv4s := ip.IPsDiffSet(ipv4s, useIpv4s, false) - - if len(freeIpv4s) == 0 { - return "", "", fmt.Errorf("No Egress IPV4 is available; policy=%v egw=%v", pi.policy, egw.Name) - - // save it for later policy - // var useIpv4sByNode []net.IP - // for _, node := range egw.Status.NodeList { - // if node.Name == nodeName { - // for _, eip := range node.Eips { - // if len(eip.IPv4) != 0 { - // useIpv4sByNode = append(useIpv4sByNode, net.ParseIP(eip.IPv4)) - // } - // } - // } - // } - - // if len(useIpv4sByNode) == 0 { - // return "", "", fmt.Errorf("No EIP meeting requirements is found on node %v; EG %v", nodeName, egw.Name) - // } - - // perIpv4 = useIpv4sByNode[rander.Intn(len(useIpv4sByNode))].String() - } else { - perIpv4 = freeIpv4s[rander.Intn(len(freeIpv4s))].String() - } + return err } } + return nil +} - if len(egw.Spec.Ippools.IPv6) > 0 { - if len(perIpv4) != 0 && len(GetEipByIPV4(perIpv4, egw).IPv6) != 0 { - return perIpv4, GetEipByIPV4(perIpv4, egw).IPv6, nil +func updateEgressClusterPolicyStatusIfNeed(ctx context.Context, cli client.Client, policy *egress.EgressClusterPolicy, assignedIP *AssignedIP) error { + if policy.Status.Eip.Ipv4 != assignedIP.IPv4 || policy.Status.Eip.Ipv6 != assignedIP.IPv6 || policy.Status.Node != assignedIP.Node { + policy.Status.Eip.Ipv4 = assignedIP.IPv4 + policy.Status.Eip.Ipv6 = assignedIP.IPv6 + policy.Status.Node = assignedIP.Node + err := cli.Status().Update(ctx, policy) + if err != nil { + if errors.IsConflict(err) { + newPolicy := new(egress.EgressPolicy) + err := cli.Get(ctx, types.NamespacedName{Namespace: policy.Namespace, Name: policy.Name}, policy) + if err != nil { + if !errors.IsNotFound(err) { + return nil + } + return err + } + newPolicy.Status = policy.Status + err = cli.Status().Update(ctx, policy) + if err != nil { + return err + } + } + return err } + } + return nil +} - var useIpv6s []net.IP - - ipv6Ranges, _ := ip.MergeIPRanges(constant.IPv6, egw.Spec.Ippools.IPv6) +func updateGatewayStatusWithUsage(ctx context.Context, cli client.Client, gateway *egress.EgressGateway) error { + if gateway == nil { + return fmt.Errorf("gateway is nil") + } + ipv4sFree, ipv6sFree, ipv4sTotal, ipv6sTotal, err := countGatewayIP(gateway) + if err != nil { + return fmt.Errorf("failed to calculate gateway ip usage") + } + gateway.Status.IPUsage.IPv4Free = ipv4sFree + gateway.Status.IPUsage.IPv6Free = ipv6sFree + gateway.Status.IPUsage.IPv4Total = ipv4sTotal + gateway.Status.IPUsage.IPv6Total = ipv6sTotal + err = cli.Status().Update(ctx, gateway) + if err != nil { + return err + } + return nil +} - perIpv6 = pi.ipv6 - if len(perIpv6) != 0 { - result, err := ip.IsIPIncludedRange(constant.IPv6, perIpv6, ipv6Ranges) - if err != nil { - return "", "", err - } - if !result { - return "", "", fmt.Errorf("%v is not within the EIP range of EgressGateway %v", perIpv6, egw.Name) - } - } else { - for _, node := range egw.Status.NodeList { - for _, eip := range node.Eips { - if len(eip.IPv6) != 0 { - useIpv6s = append(useIpv6s, net.ParseIP(eip.IPv6)) +func deleteEgressPolicy(gateway *egress.EgressGateway, policyNs, policyName string) (bool, error) { + if gateway == nil { + return false, fmt.Errorf("gateway is nil") + } + + policyFound := false + + for nodeIndex, node := range gateway.Status.NodeList { + for eipIndex, eip := range node.Eips { + for policyIndex, policy := range eip.Policies { + if policy.Name == policyName && policy.Namespace == policyNs { + gateway.Status.NodeList[nodeIndex].Eips[eipIndex].Policies = append( + gateway.Status.NodeList[nodeIndex].Eips[eipIndex].Policies[:policyIndex], + gateway.Status.NodeList[nodeIndex].Eips[eipIndex].Policies[policyIndex+1:]..., + ) + // if it is the latest policy, we delete this eip + if len(gateway.Status.NodeList[nodeIndex].Eips[eipIndex].Policies) == 0 { + gateway.Status.NodeList[nodeIndex].Eips = append( + gateway.Status.NodeList[nodeIndex].Eips[:eipIndex], + gateway.Status.NodeList[nodeIndex].Eips[eipIndex+1:]..., + ) } + policyFound = true + break } } - - ipv6s, _ := ip.ParseIPRanges(constant.IPv6, ipv6Ranges) - freeIpv6s := ip.IPsDiffSet(ipv6s, useIpv6s, false) - - if len(freeIpv6s) == 0 { - return "", "", fmt.Errorf("No Egress IPV6 is available; policy=%v egw=%v", pi.policy, egw.Name) - - // save it for later policy - // var useIpv6sByNode []net.IP - // for _, node := range egw.Status.NodeList { - // if node.Name == nodeName { - // for _, eip := range node.Eips { - // if len(eip.IPv6) != 0 { - // useIpv6sByNode = append(useIpv6sByNode, net.ParseIP(eip.IPv6)) - // } - // } - // } - // } - - // if len(useIpv6sByNode) == 0 { - // return "", "", fmt.Errorf("No EIP meeting requirements is found on node %v; EG %v", nodeName, egw.Name) - // } - // perIpv6 = useIpv6sByNode[rander.Intn(len(useIpv6sByNode))].String() - } else { - perIpv6 = freeIpv6s[rander.Intn(len(freeIpv6s))].String() + if policyFound { + break } } + if policyFound { + break + } } - - return perIpv4, perIpv6, nil + return policyFound, nil } -func NewEgressGatewayController(mgr manager.Manager, log logr.Logger, cfg *config.Config) error { +func NewEgressGatewayController(mgr manager.Manager, log logr.Logger, cfg *config.Config, client client.Client) error { if cfg == nil { return fmt.Errorf("cfg can not be nil") } @@ -1057,6 +1186,7 @@ func NewEgressGatewayController(mgr manager.Manager, log logr.Logger, cfg *confi client: mgr.GetClient(), log: log, config: cfg, + cli: client, } c, err := controller.New("egressGateway", mgr, @@ -1066,27 +1196,27 @@ func NewEgressGatewayController(mgr manager.Manager, log logr.Logger, cfg *confi } if err = c.Watch(source.Kind(mgr.GetCache(), &egress.EgressGateway{}), - handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("EgressGateway"))); err != nil { + handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("EgressGateway")), egressGatewayPredicate{}); err != nil { return fmt.Errorf("failed to watch EgressGateway: %w", err) } if err = c.Watch(source.Kind(mgr.GetCache(), &corev1.Node{}), - handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("Node"))); err != nil { + handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("Node")), nodePredicate{}); err != nil { return fmt.Errorf("failed to watch Node: %w", err) } if err = c.Watch(source.Kind(mgr.GetCache(), &egress.EgressPolicy{}), - handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("EgressPolicy"))); err != nil { + handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("EgressPolicy")), egressPolicyPredicate{}); err != nil { return fmt.Errorf("failed to watch EgressPolicy: %w", err) } if err = c.Watch(source.Kind(mgr.GetCache(), &egress.EgressClusterPolicy{}), - handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("EgressClusterPolicy"))); err != nil { + handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("EgressClusterPolicy")), egressClusterPolicyPredicate{}); err != nil { return fmt.Errorf("failed to watch EgressClusterPolicy: %w", err) } if err = c.Watch(source.Kind(mgr.GetCache(), &egress.EgressTunnel{}), - handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("EgressTunnel"))); err != nil { + handler.EnqueueRequestsFromMapFunc(utils.KindToMapFlat("EgressTunnel")), egressTunnelPredicate{}); err != nil { return fmt.Errorf("failed to watch EgressTunnel: %w", err) } @@ -1119,144 +1249,6 @@ func GetEipByIPV6(ipv6 string, egw egress.EgressGateway) egress.Eips { return eipInfo } -func GetNodeByIP(ipv4 string, egw egress.EgressGateway) string { - var nodeName string - for _, node := range egw.Status.NodeList { - for _, eip := range node.Eips { - if eip.IPv4 == ipv4 { - nodeName = node.Name - } - } - } - - return nodeName -} - -func setEipStatus(ipv4, ipv6 string, nodeName string, policy egress.Policy, nodeMap map[string]egress.EgressIPStatus) error { - if len(nodeName) == 0 { - return nil - } - - eipStatus, ok := nodeMap[nodeName] - if !ok { - return fmt.Errorf("the %v node is not a gateway node", nodeName) - } - isExist := false - newEipStatus := egress.EgressIPStatus{} - - for _, eip := range eipStatus.Eips { - if (len(ipv4) != 0 && ipv4 == eip.IPv4) || (len(ipv6) != 0 && ipv6 == eip.IPv6) { - eip.Policies = append(eip.Policies, policy) - - isExist = true - } - newEipStatus.Eips = append(newEipStatus.Eips, eip) - } - - if !isExist { - newEip := egress.Eips{} - newEip.IPv4 = ipv4 - newEip.IPv6 = ipv6 - newEip.Policies = append(newEip.Policies, policy) - eipStatus.Eips = append(eipStatus.Eips, newEip) - nodeMap[nodeName] = eipStatus - } else { - newEipStatus.Name = nodeName - newEipStatus.Status = eipStatus.Status - nodeMap[nodeName] = newEipStatus - } - - return nil -} - -func GetPoliciesByNode(nodeName string, egw egress.EgressGateway) ([]egress.Policy, bool) { - - var eipStatus egress.EgressIPStatus - var policies []egress.Policy - isExist := false - for _, node := range egw.Status.NodeList { - if node.Name == nodeName { - eipStatus = node - isExist = true - } - } - - if isExist { - for _, eip := range eipStatus.Eips { - policies = append(policies, eip.Policies...) - } - } - - return policies, isExist -} - -func GetEIPStatusByPolicy(policy egress.Policy, egw egress.EgressGateway) (egress.EgressIPStatus, bool) { - var eipStatus egress.EgressIPStatus - isExist := false - - for _, item := range egw.Status.NodeList { - for _, eip := range item.Eips { - for _, p := range eip.Policies { - if p == policy { - eipStatus = item - isExist = true - } - } - } - } - - return eipStatus, isExist -} - -func DeletePolicyFromEG(log logr.Logger, policy egress.Policy, egw *egress.EgressGateway) { - var policies []egress.Policy - var eips []egress.Eips - for i, node := range egw.Status.NodeList { - for j, eip := range node.Eips { - for k, item := range eip.Policies { - if item == policy { - policies = append(eip.Policies[:k], eip.Policies[k+1:]...) - - if len(policies) == 0 { - // Release EIP - for x, e := range node.Eips { - if (len(eip.IPv4) != 0 && eip.IPv4 == e.IPv4) || (len(eip.IPv6) != 0 && eip.IPv6 == e.IPv6) { - eips = append(node.Eips[:x], node.Eips[x+1:]...) - log.Info("release", " EIP= ", node.Eips[x], " policy=", policy) - break - } - } - egw.Status.NodeList[i].Eips = eips - } else { - egw.Status.NodeList[i].Eips[j].Policies = policies - } - goto breakHere - } - } - } - } -breakHere: - return -} - -func egwIpsCount(status egress.EgressGatewayStatus) (int, int) { - ipv4Usage := 0 - ipv6Usage := 0 - for i := range status.NodeList { - for j := range status.NodeList[i].Eips { - if len(status.NodeList[i].Eips[j].IPv4) != 0 { - ipv4Usage++ - } - - if len(status.NodeList[i].Eips[j].IPv6) != 0 { - ipv6Usage++ - } - } - } - - return ipv4Usage, ipv6Usage -} - func countGatewayIP(egw *egress.EgressGateway) (ipv4sFree, ipv6sFree, ipv4sTotal, ipv6sTotal int, err error) { ipv4s, err := ip.ConvertCidrOrIPrangeToIPs(egw.Spec.Ippools.IPv4, constant.IPv4) if err != nil { @@ -1288,38 +1280,37 @@ func countGatewayIP(egw *egress.EgressGateway) (ipv4sFree, ipv6sFree, ipv4sTotal // removeEgressGatewayFinalizer if the egress gateway is being deleted func removeEgressGatewayFinalizer(egw *egress.EgressGateway) { - if !egw.DeletionTimestamp.IsZero() { - if containsEgressGatewayFinalizer(egw, egressGatewayFinalizers) { - egw.Finalizers = slice.RemoveElement(egw.Finalizers, egressGatewayFinalizers) - } + if containsEgressGatewayFinalizer(egw, egressGatewayFinalizers) { + egw.Finalizers = slice.RemoveElement(egw.Finalizers, egressGatewayFinalizers) } } -func getEgressGatewayPolicies(client client.Client, ctx context.Context, egw *egress.EgressGateway) ([]egress.Policy, error) { - policies := make([]egress.Policy, 0) - // list policy - policyList := &egress.EgressPolicyList{} - err := client.List(ctx, policyList) +func getPolicyCountByGatewayName(ctx context.Context, client client.Client, name string) (int, error) { + var num int + + list := new(egress.EgressPolicyList) + err := client.List(ctx, list) if err != nil { - return nil, err + return num, err } - for _, p := range policyList.Items { - if p.Spec.EgressGatewayName == egw.Name { - policies = append(policies, egress.Policy{Name: p.Name, Namespace: p.Namespace}) + for _, p := range list.Items { + if p.Spec.EgressGatewayName == name { + num++ } } - // list cluster policy - clusterPolicyList := &egress.EgressClusterPolicyList{} - err = client.List(ctx, clusterPolicyList) + + policyList := new(egress.EgressClusterPolicyList) + err = client.List(ctx, list) if err != nil { - return nil, err + return num, err } - for _, cp := range clusterPolicyList.Items { - if cp.Spec.EgressGatewayName == egw.Name { - policies = append(policies, egress.Policy{Name: cp.Name, Namespace: cp.Namespace}) + for _, p := range policyList.Items { + if p.Spec.EgressGatewayName == name { + num++ } } - return policies, nil + + return num, nil } func containsEgressGatewayFinalizer(gateway *egress.EgressGateway, finalizer string) bool { @@ -1330,3 +1321,116 @@ func containsEgressGatewayFinalizer(gateway *egress.EgressGateway, finalizer str } return false } + +type egressPolicyPredicate struct{} + +func (p egressPolicyPredicate) Create(_ event.CreateEvent) bool { return true } +func (p egressPolicyPredicate) Delete(_ event.DeleteEvent) bool { return true } +func (p egressPolicyPredicate) Update(updateEvent event.UpdateEvent) bool { + oldObj, ok := updateEvent.ObjectOld.(*egress.EgressPolicy) + if !ok { + return false + } + newObj, ok := updateEvent.ObjectNew.(*egress.EgressPolicy) + if !ok { + return false + } + if !reflect.DeepEqual(oldObj.Spec, newObj.Spec) { + return true + } + return false +} +func (p egressPolicyPredicate) Generic(_ event.GenericEvent) bool { return true } + +type egressClusterPolicyPredicate struct{} + +func (p egressClusterPolicyPredicate) Create(_ event.CreateEvent) bool { return true } +func (p egressClusterPolicyPredicate) Delete(_ event.DeleteEvent) bool { return true } +func (p egressClusterPolicyPredicate) Update(updateEvent event.UpdateEvent) bool { + oldObj, ok := updateEvent.ObjectOld.(*egress.EgressClusterPolicy) + if !ok { + return false + } + newObj, ok := updateEvent.ObjectNew.(*egress.EgressClusterPolicy) + if !ok { + return false + } + if !reflect.DeepEqual(oldObj.Spec, newObj.Spec) { + return true + } + return false +} +func (p egressClusterPolicyPredicate) Generic(_ event.GenericEvent) bool { return true } + +type egressGatewayPredicate struct{} + +func (p egressGatewayPredicate) Create(_ event.CreateEvent) bool { return true } +func (p egressGatewayPredicate) Delete(_ event.DeleteEvent) bool { return true } +func (p egressGatewayPredicate) Update(updateEvent event.UpdateEvent) bool { + oldObj, ok := updateEvent.ObjectOld.(*egress.EgressGateway) + if !ok { + return false + } + newObj, ok := updateEvent.ObjectNew.(*egress.EgressGateway) + if !ok { + return false + } + if !reflect.DeepEqual(oldObj.Spec, newObj.Spec) { + return true + } + return false +} +func (p egressGatewayPredicate) Generic(_ event.GenericEvent) bool { return true } + +type nodePredicate struct{} + +func (p nodePredicate) Create(_ event.CreateEvent) bool { return true } +func (p nodePredicate) Delete(_ event.DeleteEvent) bool { return true } +func (p nodePredicate) Update(updateEvent event.UpdateEvent) bool { + oldObj, ok := updateEvent.ObjectOld.(*corev1.Node) + if !ok { + return false + } + newObj, ok := updateEvent.ObjectNew.(*corev1.Node) + if !ok { + return false + } + if areMapsEqual(oldObj.Labels, newObj.Labels) { + return false + } + return true +} + +func areMapsEqual(mapA, mapB map[string]string) bool { + if len(mapA) != len(mapB) { + return false + } + for key, valueA := range mapA { + if valueB, ok := mapB[key]; !ok || valueA != valueB { + return false + } + } + return true +} + +func (p nodePredicate) Generic(_ event.GenericEvent) bool { return true } + +type egressTunnelPredicate struct{} + +func (p egressTunnelPredicate) Create(_ event.CreateEvent) bool { return true } +func (p egressTunnelPredicate) Delete(_ event.DeleteEvent) bool { return true } +func (p egressTunnelPredicate) Update(updateEvent event.UpdateEvent) bool { + oldEgressTunnel, ok := updateEvent.ObjectOld.(*egress.EgressTunnel) + if !ok { + return false + } + newEgressTunnel, ok := updateEvent.ObjectNew.(*egress.EgressTunnel) + if !ok { + return false + } + if oldEgressTunnel.Status.Phase != newEgressTunnel.Status.Phase { + return true + } + return false +} +func (p egressTunnelPredicate) Generic(_ event.GenericEvent) bool { return true } diff --git a/pkg/k8s/apis/v1beta1/egressgateway_types.go b/pkg/k8s/apis/v1beta1/egressgateway_types.go index 52aba8dc7..318fc0351 100644 --- a/pkg/k8s/apis/v1beta1/egressgateway_types.go +++ b/pkg/k8s/apis/v1beta1/egressgateway_types.go @@ -99,6 +99,16 @@ type EgressIPStatus struct { Status string `json:"status,omitempty"` } +func (status *EgressGatewayStatus) ReadyCount() int { + res := 0 + for _, node := range status.NodeList { + if EgressTunnelReady.IsEqual(node.Status) { + res++ + } + } + return res +} + type Eips struct { // +kubebuilder:validation:Optional IPv4 string `json:"ipv4,omitempty"` diff --git a/pkg/k8s/apis/v1beta1/egresstunnel_types.go b/pkg/k8s/apis/v1beta1/egresstunnel_types.go index 5e75dbb0e..a76cd0c1e 100644 --- a/pkg/k8s/apis/v1beta1/egresstunnel_types.go +++ b/pkg/k8s/apis/v1beta1/egresstunnel_types.go @@ -68,6 +68,18 @@ type Parent struct { type EgressTunnelPhase string +func (e EgressTunnelPhase) String() string { + return string(e) +} + +func (e EgressTunnelPhase) IsEqual(s string) bool { + return string(e) == s +} + +func (e EgressTunnelPhase) IsNotEqual(s string) bool { + return string(e) != s +} + const ( // EgressTunnelPending wait for tunnel address available EgressTunnelPending EgressTunnelPhase = "Pending" From adb95d8d3ca6ecf5ae26adf09bd31302736ad286 Mon Sep 17 00:00:00 2001 From: lou-lan Date: Thu, 7 Mar 2024 15:28:08 +0800 Subject: [PATCH 20/34] Fix make clean effort for e2e_init Signed-off-by: lou-lan --- test/Makefile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/Makefile b/test/Makefile index 83cd4619a..81a1d4a38 100644 --- a/test/Makefile +++ b/test/Makefile @@ -23,7 +23,7 @@ init_kind_env: init_one_kind: KIND_CONFIG_PATH ?= init_one_kind: KIND_CLUSTER_NAME ?= init_one_kind: KIND_KUBECONFIG ?= -init_one_kind: checkBin clean +init_one_kind: checkBin cleanCluster @echo "================== init kind cluster $(KIND_CLUSTER_NAME) KIND_CONFIG_PATH=$(KIND_CONFIG_PATH) KIND_KUBECONFIG=$(KIND_KUBECONFIG) E2E_IP_FAMILY=$(E2E_IP_FAMILY)" [ -n $(KIND_CLUSTER_NAME) ] || { echo "error, miss KIND_CLUSTER_NAME " ; exit 1 ; } [ -f $(KIND_CONFIG_PATH) ] || { echo "error, miss file KIND_CONFIG_PATH=$(KIND_CONFIG_PATH)" ; exit 1 ; } @@ -315,11 +315,16 @@ install_example_app: .PHONY: clean -clean: +clean: cleanCluster cleanImage + +.PHONY: cleanCluster +cleanCluster: -@ kind delete cluster --name $(E2E_KIND_CLUSTER_NAME) -@ rm -rf $(E2E_RUNTIME_DIR) -@ docker stop $(PYROSCOPE_CONTAINER_NAME) &>/dev/null -@ docker rm $(PYROSCOPE_CONTAINER_NAME) &>/dev/null + +cleanImage: -@ docker images | grep egressgateway | awk '{print $$3}' | xargs -I {} docker rmi {} From 4991e89000fdf9d88d188caaaa305fe8393eebc6 Mon Sep 17 00:00:00 2001 From: lou-lan Date: Thu, 7 Mar 2024 17:26:46 +0800 Subject: [PATCH 21/34] Refactor RemoveFinalizers to improve code reusability Signed-off-by: lou-lan (cherry picked from commit a6b5f3197fc8664689958a194968c760f91f7ffb) --- pkg/controller/tunnel/egress_tunnel.go | 10 +--- pkg/controller/tunnel/egress_tunnel_test.go | 31 ---------- pkg/egressgateway/egress_gateway.go | 23 ++------ pkg/utils/finalizers.go | 17 ++++++ pkg/utils/finalizers_test.go | 63 +++++++++++++++++++++ 5 files changed, 85 insertions(+), 59 deletions(-) create mode 100644 pkg/utils/finalizers.go create mode 100644 pkg/utils/finalizers_test.go diff --git a/pkg/controller/tunnel/egress_tunnel.go b/pkg/controller/tunnel/egress_tunnel.go index cc964ccbe..7bb575c91 100644 --- a/pkg/controller/tunnel/egress_tunnel.go +++ b/pkg/controller/tunnel/egress_tunnel.go @@ -133,7 +133,7 @@ func (r *egReconciler) reconcileEGN(ctx context.Context, req reconcile.Request, // For the existence of Node, when the user manually deletes EgressTunnel, // we first release the EgressTunnel and then regenerate it. err := r.releaseEgressTunnel(*egresstunnel, log, func() error { - cleanFinalizers(egresstunnel) + utils.RemoveFinalizers(&egresstunnel.ObjectMeta, egressTunnelFinalizers) err = r.client.Update(context.Background(), egresstunnel) if err != nil { return err @@ -156,14 +156,6 @@ func (r *egReconciler) reconcileEGN(ctx context.Context, req reconcile.Request, return reconcile.Result{Requeue: false}, nil } -func cleanFinalizers(node *egressv1.EgressTunnel) { - for i, item := range node.Finalizers { - if item == egressTunnelFinalizers { - node.Finalizers = append(node.Finalizers[:i], node.Finalizers[i+1:]...) - } - } -} - // reconcileNode reconcile node // not goal: // - add node diff --git a/pkg/controller/tunnel/egress_tunnel_test.go b/pkg/controller/tunnel/egress_tunnel_test.go index 4b83b28cf..7f0469614 100644 --- a/pkg/controller/tunnel/egress_tunnel_test.go +++ b/pkg/controller/tunnel/egress_tunnel_test.go @@ -194,37 +194,6 @@ func TestEgressTunnelCtrlForNode(t *testing.T) { } } -func TestCleanFinalizers(t *testing.T) { - tests := []struct { - name string - node *egressv1.EgressTunnel - wantFinalizers []string - }{ - { - name: "remove egressTunnelFinalizers", - node: &egressv1.EgressTunnel{ - ObjectMeta: v1.ObjectMeta{ - Finalizers: []string{ - "keep-this", - "keep-that", - "egressgateway.spidernet.io/egresstunnel", - }, - }, - }, - wantFinalizers: []string{"keep-this", "keep-that"}, - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - cleanFinalizers(tc.node) - if !slicesEqual(tc.node.Finalizers, tc.wantFinalizers) { - t.Errorf("cleanFinalizers() got = %v, want %v", tc.node.Finalizers, tc.wantFinalizers) - } - }) - } -} - func slicesEqual(a, b []string) bool { if len(a) != len(b) { return false diff --git a/pkg/egressgateway/egress_gateway.go b/pkg/egressgateway/egress_gateway.go index 15b7af345..fd4c75531 100644 --- a/pkg/egressgateway/egress_gateway.go +++ b/pkg/egressgateway/egress_gateway.go @@ -30,7 +30,6 @@ import ( egress "github.com/spidernet-io/egressgateway/pkg/k8s/apis/v1beta1" "github.com/spidernet-io/egressgateway/pkg/utils" "github.com/spidernet-io/egressgateway/pkg/utils/ip" - "github.com/spidernet-io/egressgateway/pkg/utils/slice" ) type egnReconciler struct { @@ -438,9 +437,8 @@ func (r *egnReconciler) reconcileGateway(ctx context.Context, req reconcile.Requ return reconcile.Result{Requeue: true}, err } if count == 0 && egw.Name != "" { - log.Info("remove the egressGatewayFinalizer") - removeEgressGatewayFinalizer(egw) log.V(1).Info("remove the egressGatewayFinalizer", "ObjectMeta", egw.ObjectMeta) + utils.RemoveFinalizers(&egw.ObjectMeta, egressGatewayFinalizers) err = r.client.Update(ctx, egw) if err != nil { log.Error(err, "remove the egressGatewayFinalizer", "ObjectMeta", egw.ObjectMeta) @@ -1278,13 +1276,6 @@ func countGatewayIP(egw *egress.EgressGateway) (ipv4sFree, ipv6sFree, ipv4sTotal return } -// removeEgressGatewayFinalizer if the egress gateway is being deleted -func removeEgressGatewayFinalizer(egw *egress.EgressGateway) { - if containsEgressGatewayFinalizer(egw, egressGatewayFinalizers) { - egw.Finalizers = slice.RemoveElement(egw.Finalizers, egressGatewayFinalizers) - } -} - func getPolicyCountByGatewayName(ctx context.Context, client client.Client, name string) (int, error) { var num int @@ -1313,15 +1304,6 @@ func getPolicyCountByGatewayName(ctx context.Context, client client.Client, name return num, nil } -func containsEgressGatewayFinalizer(gateway *egress.EgressGateway, finalizer string) bool { - for _, f := range gateway.ObjectMeta.Finalizers { - if f == finalizer { - return true - } - } - return false -} - type egressPolicyPredicate struct{} func (p egressPolicyPredicate) Create(_ event.CreateEvent) bool { return true } @@ -1375,6 +1357,9 @@ func (p egressGatewayPredicate) Update(updateEvent event.UpdateEvent) bool { if !ok { return false } + if !reflect.DeepEqual(oldObj.ObjectMeta, newObj.ObjectMeta) { + return true + } if !reflect.DeepEqual(oldObj.Spec, newObj.Spec) { return true } diff --git a/pkg/utils/finalizers.go b/pkg/utils/finalizers.go new file mode 100644 index 000000000..8357cdbc3 --- /dev/null +++ b/pkg/utils/finalizers.go @@ -0,0 +1,17 @@ +// Copyright 2022 Authors of spidernet-io +// SPDX-License-Identifier: Apache-2.0 + +package utils + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +func RemoveFinalizers(objMeta *metav1.ObjectMeta, finalizers ...string) { + for _, f := range finalizers { + for i := len(objMeta.Finalizers) - 1; i >= 0; i-- { + if objMeta.Finalizers[i] == f { + objMeta.Finalizers = append(objMeta.Finalizers[:i], objMeta.Finalizers[i+1:]...) + break + } + } + } +} diff --git a/pkg/utils/finalizers_test.go b/pkg/utils/finalizers_test.go new file mode 100644 index 000000000..18b4bd10f --- /dev/null +++ b/pkg/utils/finalizers_test.go @@ -0,0 +1,63 @@ +// Copyright 2022 Authors of spidernet-io +// SPDX-License-Identifier: Apache-2.0 + +package utils + +import ( + "reflect" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// TestRemoveFinalizers tests the RemoveFinalizers function. +func TestRemoveFinalizers(t *testing.T) { + tests := []struct { + name string + objMeta metav1.ObjectMeta + finalizers []string + want []string + }{ + { + name: "remove single finalizer", + objMeta: metav1.ObjectMeta{ + Finalizers: []string{"finalize1", "finalize2", "finalize3"}, + }, + finalizers: []string{"finalize2"}, + want: []string{"finalize1", "finalize3"}, + }, + { + name: "remove multiple finalizers", + objMeta: metav1.ObjectMeta{ + Finalizers: []string{"finalize1", "finalize2", "finalize3", "finalize4"}, + }, + finalizers: []string{"finalize2", "finalize4"}, + want: []string{"finalize1", "finalize3"}, + }, + { + name: "remove non-existent finalizer", + objMeta: metav1.ObjectMeta{ + Finalizers: []string{"finalize1", "finalize2"}, + }, + finalizers: []string{"finalize3"}, + want: []string{"finalize1", "finalize2"}, + }, + { + name: "remove all finalizers", + objMeta: metav1.ObjectMeta{ + Finalizers: []string{"finalize1", "finalize2"}, + }, + finalizers: []string{"finalize1", "finalize2"}, + want: []string{}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + RemoveFinalizers(&tt.objMeta, tt.finalizers...) + if !reflect.DeepEqual(tt.objMeta.Finalizers, tt.want) { + t.Errorf("RemoveFinalizers() got = %v, want %v", tt.objMeta.Finalizers, tt.want) + } + }) + } +} From f81d18c67a99fa88aad1a83c815f05db4afa359d Mon Sep 17 00:00:00 2001 From: lou-lan Date: Thu, 7 Mar 2024 19:02:39 +0800 Subject: [PATCH 22/34] Fix create egress gateway when allocate policy empty Signed-off-by: lou-lan --- pkg/egressgateway/egress_gateway.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/egressgateway/egress_gateway.go b/pkg/egressgateway/egress_gateway.go index 15b7af345..3910a009d 100644 --- a/pkg/egressgateway/egress_gateway.go +++ b/pkg/egressgateway/egress_gateway.go @@ -1023,6 +1023,8 @@ func assignIP(from *egress.EgressGateway, req reconcile.Request, specEgressIP eg Policies: []egress.Policy{{Name: req.Name, Namespace: req.Namespace}}, }, ) + assignedIP.Node = node.Name + break } } if assignedIP.Node == "" { From 6d601368705974e11765d20afd8d77eedffd6382 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 10:34:26 +0000 Subject: [PATCH 23/34] build(deps): bump sigs.k8s.io/cluster-api-provider-azure Bumps [sigs.k8s.io/cluster-api-provider-azure](https://github.com/kubernetes-sigs/cluster-api-provider-azure) from 1.11.5 to 1.14.0. - [Release notes](https://github.com/kubernetes-sigs/cluster-api-provider-azure/releases) - [Commits](https://github.com/kubernetes-sigs/cluster-api-provider-azure/compare/v1.11.5...v1.14.0) --- updated-dependencies: - dependency-name: sigs.k8s.io/cluster-api-provider-azure dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 38 +- go.sum | 80 +- .../github.com/evanphx/json-patch/README.md | 4 +- vendor/github.com/evanphx/json-patch/patch.go | 46 +- .../json-patch/v5/internal/json/decode.go | 1385 +++++++++++++++ .../json-patch/v5/internal/json/encode.go | 1486 +++++++++++++++++ .../json-patch/v5/internal/json/fold.go | 141 ++ .../json-patch/v5/internal/json/fuzz.go | 42 + .../json-patch/v5/internal/json/indent.go | 143 ++ .../json-patch/v5/internal/json/scanner.go | 610 +++++++ .../json-patch/v5/internal/json/stream.go | 495 ++++++ .../json-patch/v5/internal/json/tables.go | 218 +++ .../json-patch/v5/internal/json/tags.go | 38 + .../github.com/evanphx/json-patch/v5/merge.go | 110 +- .../github.com/evanphx/json-patch/v5/patch.go | 436 +++-- vendor/github.com/fatih/color/color.go | 56 +- .../github.com/felixge/httpsnoop/.travis.yml | 6 - vendor/github.com/felixge/httpsnoop/Makefile | 2 +- vendor/github.com/felixge/httpsnoop/README.md | 4 +- .../felixge/httpsnoop/capture_metrics.go | 2 +- .../httpsnoop/wrap_generated_gteq_1.8.go | 2 +- .../httpsnoop/wrap_generated_lt_1.8.go | 2 +- .../go-openapi/jsonpointer/pointer.go | 147 +- vendor/github.com/google/uuid/CHANGELOG.md | 13 + vendor/github.com/google/uuid/hash.go | 6 + vendor/github.com/google/uuid/version7.go | 39 +- .../github.com/imdario/mergo/CONTRIBUTING.md | 112 ++ vendor/github.com/imdario/mergo/README.md | 25 +- vendor/github.com/imdario/mergo/SECURITY.md | 14 + vendor/github.com/imdario/mergo/map.go | 6 +- vendor/github.com/imdario/mergo/merge.go | 59 +- vendor/github.com/imdario/mergo/mergo.go | 11 +- .../github.com/mattn/go-isatty/isatty_bsd.go | 3 +- .../mattn/go-isatty/isatty_others.go | 5 +- .../mattn/go-isatty/isatty_tcgets.go | 3 +- .../prometheus/client_model/go/metrics.pb.go | 195 ++- vendor/golang.org/x/net/html/token.go | 12 +- vendor/golang.org/x/net/http2/frame.go | 11 +- .../appengine/internal/api.go | 347 ++-- .../appengine/internal/api_classic.go | 29 +- .../appengine/internal/api_common.go | 50 +- .../appengine/internal/identity.go | 7 +- .../appengine/internal/identity_classic.go | 23 +- .../appengine/internal/identity_flex.go | 1 + .../appengine/internal/identity_vm.go | 20 +- .../appengine/internal/main.go | 1 + .../appengine/internal/main_vm.go | 3 +- .../appengine/internal/transaction.go | 10 +- .../appengine/urlfetch/urlfetch.go | 9 +- vendor/modules.txt | 43 +- .../controller-runtime/pkg/cache/cache.go | 48 +- .../pkg/cache/multi_namespace_cache.go | 4 + .../pkg/client/apiutil/errors.go | 54 + .../pkg/client/apiutil/restmapper.go | 92 +- .../pkg/client/fake/client.go | 57 +- .../pkg/client/interfaces.go | 1 + .../controller-runtime/pkg/client/options.go | 3 +- .../controller-runtime/pkg/manager/manager.go | 18 +- 58 files changed, 6095 insertions(+), 732 deletions(-) create mode 100644 vendor/github.com/evanphx/json-patch/v5/internal/json/decode.go create mode 100644 vendor/github.com/evanphx/json-patch/v5/internal/json/encode.go create mode 100644 vendor/github.com/evanphx/json-patch/v5/internal/json/fold.go create mode 100644 vendor/github.com/evanphx/json-patch/v5/internal/json/fuzz.go create mode 100644 vendor/github.com/evanphx/json-patch/v5/internal/json/indent.go create mode 100644 vendor/github.com/evanphx/json-patch/v5/internal/json/scanner.go create mode 100644 vendor/github.com/evanphx/json-patch/v5/internal/json/stream.go create mode 100644 vendor/github.com/evanphx/json-patch/v5/internal/json/tables.go create mode 100644 vendor/github.com/evanphx/json-patch/v5/internal/json/tags.go delete mode 100644 vendor/github.com/felixge/httpsnoop/.travis.yml create mode 100644 vendor/github.com/imdario/mergo/CONTRIBUTING.md create mode 100644 vendor/github.com/imdario/mergo/SECURITY.md create mode 100644 vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/errors.go diff --git a/go.mod b/go.mod index 7252123f1..91ab09752 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/go-logr/logr v1.4.1 github.com/go-swagger/go-swagger v0.30.4 github.com/google/gops v0.3.27 - github.com/google/uuid v1.5.0 + github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.1 github.com/grafana/pyroscope-go v1.1.0 github.com/mdlayher/arp v0.0.0-20220221190821-c37aaafac7f9 @@ -38,8 +38,8 @@ require ( k8s.io/client-go v0.29.2 k8s.io/utils v0.0.0-20230726121419-3b25d923346b modernc.org/memory v1.7.2 - sigs.k8s.io/cluster-api-provider-azure v1.11.5 - sigs.k8s.io/controller-runtime v0.16.1 + sigs.k8s.io/cluster-api-provider-azure v1.14.0 + sigs.k8s.io/controller-runtime v0.16.5 sigs.k8s.io/controller-tools v0.12.1 sigs.k8s.io/yaml v1.4.0 ) @@ -52,16 +52,16 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/evanphx/json-patch v5.7.0+incompatible // indirect + github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/fatih/color v1.16.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/zapr v1.2.4 // indirect github.com/go-openapi/analysis v0.21.4 // indirect github.com/go-openapi/errors v0.20.4 // indirect github.com/go-openapi/inflect v0.19.0 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/loads v0.21.2 // indirect github.com/go-openapi/runtime v0.26.0 // indirect @@ -83,7 +83,7 @@ require ( github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.4.0 // indirect - github.com/imdario/mergo v0.3.13 // indirect + github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jessevdk/go-flags v1.5.0 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -95,7 +95,7 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mdlayher/packet v1.0.0 // indirect github.com/mdlayher/socket v0.2.1 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -108,7 +108,7 @@ require ( github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/projectcalico/api v0.0.0-20230222223746-44aa60c2201f // indirect - github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect @@ -126,23 +126,23 @@ require ( gitlab.com/golang-commonmark/puny v0.0.0-20191124015043-9f83538fa04f // indirect go.mongodb.org/mongo-driver v1.11.3 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/crypto v0.20.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/mod v0.15.0 // indirect + golang.org/x/net v0.21.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.5.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/term v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.16.1 // indirect - google.golang.org/appengine v1.6.7 // indirect + google.golang.org/appengine v1.6.8 // indirect google.golang.org/protobuf v1.32.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiextensions-apiserver v0.28.0 // indirect - k8s.io/component-base v0.28.1 // indirect + k8s.io/apiextensions-apiserver v0.28.4 // indirect + k8s.io/component-base v0.28.4 // indirect k8s.io/klog/v2 v2.110.1 // indirect k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/go.sum b/go.sum index dbd2c797e..331e8c6e4 100644 --- a/go.sum +++ b/go.sum @@ -95,15 +95,15 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +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.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -139,8 +139,9 @@ github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNP github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.4-0.20191224164422-1f9748e5f45e/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= @@ -284,8 +285,8 @@ github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a/go.mod h1:czg5+yv1E0Z github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.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/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= @@ -317,12 +318,11 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= @@ -367,8 +367,8 @@ github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kN github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mdlayher/arp v0.0.0-20220221190821-c37aaafac7f9 h1:LxldC/UdEeJ+j3i/g5K2iPePYWXOcy6AAhCYs3VREKc= github.com/mdlayher/arp v0.0.0-20220221190821-c37aaafac7f9/go.mod h1:kfOoFJuHWp76v1RgZCb9/gVUc7XdY877S2uVYbNliGc= github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118 h1:2oDp6OOhLxQ9JBoUuysVz9UZ9uI6oLUbvAZu0x8o+vE= @@ -441,8 +441,8 @@ github.com/projectcalico/api v0.0.0-20230222223746-44aa60c2201f/go.mod h1:Avoy1r github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= @@ -547,7 +547,7 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/mock v0.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= @@ -567,8 +567,8 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -579,8 +579,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -606,8 +606,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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= @@ -651,8 +651,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -743,14 +743,15 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220804214406-8e32c043e418/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -760,6 +761,7 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= @@ -860,8 +862,9 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -960,7 +963,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -973,16 +975,16 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 k8s.io/api v0.23.2/go.mod h1:sYuDb3flCtRPI8ghn6qFrcK5ZBu2mhbElxRE95qpwlI= k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A= k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= -k8s.io/apiextensions-apiserver v0.28.0 h1:CszgmBL8CizEnj4sj7/PtLGey6Na3YgWyGCPONv7E9E= -k8s.io/apiextensions-apiserver v0.28.0/go.mod h1:uRdYiwIuu0SyqJKriKmqEN2jThIJPhVmOWETm8ud1VE= +k8s.io/apiextensions-apiserver v0.28.4 h1:AZpKY/7wQ8n+ZYDtNHbAJBb+N4AXXJvyZx6ww6yAJvU= +k8s.io/apiextensions-apiserver v0.28.4/go.mod h1:pgQIZ1U8eJSMQcENew/0ShUTlePcSGFq6dxSxf2mwPM= k8s.io/apimachinery v0.23.2/go.mod h1:zDqeV0AK62LbCI0CI7KbWCAYdLg+E+8UXJ0rIz5gmS8= k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8= k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= k8s.io/client-go v0.23.2/go.mod h1:k3YbsWg6GWdHF1THHTQP88X9RhB1DWPo3Dq7KfU/D1c= k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= -k8s.io/component-base v0.28.1 h1:LA4AujMlK2mr0tZbQDZkjWbdhTV5bRyEyAFe0TJxlWg= -k8s.io/component-base v0.28.1/go.mod h1:jI11OyhbX21Qtbav7JkhehyBsIRfnO8oEgoAR12ArIU= +k8s.io/component-base v0.28.4 h1:c/iQLWPdUgI90O+T9TeECg8o7N3YJTiuz2sKxILYcYo= +k8s.io/component-base v0.28.4/go.mod h1:m9hR0uvqXDybiGL2nf/3Lf0MerAfQXzkfWhUY58JUbU= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= @@ -1002,10 +1004,10 @@ modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/cluster-api-provider-azure v1.11.5 h1:6WlOeBfZ7xHCWLNzDxE+4Mp0vaQCH841Bzkf4JgIWvQ= -sigs.k8s.io/cluster-api-provider-azure v1.11.5/go.mod h1:qorEKujuxG9S/fpUhqWn5WTBYfLGIaTw/t8+elEedTQ= -sigs.k8s.io/controller-runtime v0.16.1 h1:+15lzrmHsE0s2kNl0Dl8cTchI5Cs8qofo5PGcPrV9z0= -sigs.k8s.io/controller-runtime v0.16.1/go.mod h1:vpMu3LpI5sYWtujJOa2uPK61nB5rbwlN7BAB8aSLvGU= +sigs.k8s.io/cluster-api-provider-azure v1.14.0 h1:6HLG0J4aBqN5QnAdyUjuHLoWpszkxTlqAdqzGI7CF2c= +sigs.k8s.io/cluster-api-provider-azure v1.14.0/go.mod h1:ME+Se/3CbsdPOA1XFA0fV4ptHK1uDxOqgnKm5+KYRts= +sigs.k8s.io/controller-runtime v0.16.5 h1:yr1cEJbX08xsTW6XEIzT13KHHmIyX8Umvme2cULvFZw= +sigs.k8s.io/controller-runtime v0.16.5/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= sigs.k8s.io/controller-tools v0.12.1 h1:GyQqxzH5wksa4n3YDIJdJJOopztR5VDM+7qsyg5yE4U= sigs.k8s.io/controller-tools v0.12.1/go.mod h1:rXlpTfFHZMpZA8aGq9ejArgZiieHd+fkk/fTatY8A2M= sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= diff --git a/vendor/github.com/evanphx/json-patch/README.md b/vendor/github.com/evanphx/json-patch/README.md index 28e351693..97e319b21 100644 --- a/vendor/github.com/evanphx/json-patch/README.md +++ b/vendor/github.com/evanphx/json-patch/README.md @@ -4,7 +4,7 @@ well as for calculating & applying [RFC7396 JSON merge patches](https://tools.ietf.org/html/rfc7396). [![GoDoc](https://godoc.org/github.com/evanphx/json-patch?status.svg)](http://godoc.org/github.com/evanphx/json-patch) -[![Build Status](https://travis-ci.org/evanphx/json-patch.svg?branch=master)](https://travis-ci.org/evanphx/json-patch) +[![Build Status](https://github.com/evanphx/json-patch/actions/workflows/go.yml/badge.svg)](https://github.com/evanphx/json-patch/actions/workflows/go.yml) [![Report Card](https://goreportcard.com/badge/github.com/evanphx/json-patch)](https://goreportcard.com/report/github.com/evanphx/json-patch) # Get It! @@ -314,4 +314,4 @@ go test -cover ./... ``` Builds for pull requests are tested automatically -using [TravisCI](https://travis-ci.org/evanphx/json-patch). +using [GitHub Actions](https://github.com/evanphx/json-patch/actions/workflows/go.yml). diff --git a/vendor/github.com/evanphx/json-patch/patch.go b/vendor/github.com/evanphx/json-patch/patch.go index 4bce5936d..cd0274e1e 100644 --- a/vendor/github.com/evanphx/json-patch/patch.go +++ b/vendor/github.com/evanphx/json-patch/patch.go @@ -359,7 +359,7 @@ func findObject(pd *container, path string) (container, string) { next, ok := doc.get(decodePatchKey(part)) - if next == nil || ok != nil { + if next == nil || ok != nil || next.raw == nil { return nil, "" } @@ -568,6 +568,29 @@ func (p Patch) replace(doc *container, op Operation) error { return errors.Wrapf(err, "replace operation failed to decode path") } + if path == "" { + val := op.value() + + if val.which == eRaw { + if !val.tryDoc() { + if !val.tryAry() { + return errors.Wrapf(err, "replace operation value must be object or array") + } + } + } + + switch val.which { + case eAry: + *doc = &val.ary + case eDoc: + *doc = &val.doc + case eRaw: + return errors.Wrapf(err, "replace operation hit impossible case") + } + + return nil + } + con, key := findObject(doc, path) if con == nil { @@ -634,6 +657,25 @@ func (p Patch) test(doc *container, op Operation) error { return errors.Wrapf(err, "test operation failed to decode path") } + if path == "" { + var self lazyNode + + switch sv := (*doc).(type) { + case *partialDoc: + self.doc = *sv + self.which = eDoc + case *partialArray: + self.ary = *sv + self.which = eAry + } + + if self.equal(op.value()) { + return nil + } + + return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) + } + con, key := findObject(doc, path) if con == nil { @@ -646,7 +688,7 @@ func (p Patch) test(doc *container, op Operation) error { } if val == nil { - if op.value().raw == nil { + if op.value() == nil || op.value().raw == nil { return nil } return errors.Wrapf(ErrTestFailed, "testing value %s failed", path) diff --git a/vendor/github.com/evanphx/json-patch/v5/internal/json/decode.go b/vendor/github.com/evanphx/json-patch/v5/internal/json/decode.go new file mode 100644 index 000000000..e9bb0efe7 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/internal/json/decode.go @@ -0,0 +1,1385 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Represents JSON data structure using native Go types: booleans, floats, +// strings, arrays, and maps. + +package json + +import ( + "encoding" + "encoding/base64" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + "unicode" + "unicode/utf16" + "unicode/utf8" +) + +// Unmarshal parses the JSON-encoded data and stores the result +// in the value pointed to by v. If v is nil or not a pointer, +// Unmarshal returns an InvalidUnmarshalError. +// +// Unmarshal uses the inverse of the encodings that +// Marshal uses, allocating maps, slices, and pointers as necessary, +// with the following additional rules: +// +// To unmarshal JSON into a pointer, Unmarshal first handles the case of +// the JSON being the JSON literal null. In that case, Unmarshal sets +// the pointer to nil. Otherwise, Unmarshal unmarshals the JSON into +// the value pointed at by the pointer. If the pointer is nil, Unmarshal +// allocates a new value for it to point to. +// +// To unmarshal JSON into a value implementing the Unmarshaler interface, +// Unmarshal calls that value's UnmarshalJSON method, including +// when the input is a JSON null. +// Otherwise, if the value implements encoding.TextUnmarshaler +// and the input is a JSON quoted string, Unmarshal calls that value's +// UnmarshalText method with the unquoted form of the string. +// +// To unmarshal JSON into a struct, Unmarshal matches incoming object +// keys to the keys used by Marshal (either the struct field name or its tag), +// preferring an exact match but also accepting a case-insensitive match. By +// default, object keys which don't have a corresponding struct field are +// ignored (see Decoder.DisallowUnknownFields for an alternative). +// +// To unmarshal JSON into an interface value, +// Unmarshal stores one of these in the interface value: +// +// bool, for JSON booleans +// float64, for JSON numbers +// string, for JSON strings +// []interface{}, for JSON arrays +// map[string]interface{}, for JSON objects +// nil for JSON null +// +// To unmarshal a JSON array into a slice, Unmarshal resets the slice length +// to zero and then appends each element to the slice. +// As a special case, to unmarshal an empty JSON array into a slice, +// Unmarshal replaces the slice with a new empty slice. +// +// To unmarshal a JSON array into a Go array, Unmarshal decodes +// JSON array elements into corresponding Go array elements. +// If the Go array is smaller than the JSON array, +// the additional JSON array elements are discarded. +// If the JSON array is smaller than the Go array, +// the additional Go array elements are set to zero values. +// +// To unmarshal a JSON object into a map, Unmarshal first establishes a map to +// use. If the map is nil, Unmarshal allocates a new map. Otherwise Unmarshal +// reuses the existing map, keeping existing entries. Unmarshal then stores +// key-value pairs from the JSON object into the map. The map's key type must +// either be any string type, an integer, implement json.Unmarshaler, or +// implement encoding.TextUnmarshaler. +// +// If the JSON-encoded data contain a syntax error, Unmarshal returns a SyntaxError. +// +// If a JSON value is not appropriate for a given target type, +// or if a JSON number overflows the target type, Unmarshal +// skips that field and completes the unmarshaling as best it can. +// If no more serious errors are encountered, Unmarshal returns +// an UnmarshalTypeError describing the earliest such error. In any +// case, it's not guaranteed that all the remaining fields following +// the problematic one will be unmarshaled into the target object. +// +// The JSON null value unmarshals into an interface, map, pointer, or slice +// by setting that Go value to nil. Because null is often used in JSON to mean +// “not present,” unmarshaling a JSON null into any other Go type has no effect +// on the value and produces no error. +// +// When unmarshaling quoted strings, invalid UTF-8 or +// invalid UTF-16 surrogate pairs are not treated as an error. +// Instead, they are replaced by the Unicode replacement +// character U+FFFD. +func Unmarshal(data []byte, v any) error { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + err := checkValid(data, &d.scan) + if err != nil { + return err + } + + d.init(data) + return d.unmarshal(v) +} + +var ds = sync.Pool{ + New: func() any { + return new(decodeState) + }, +} + +func UnmarshalWithKeys(data []byte, v any) ([]string, error) { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + err := checkValid(data, &d.scan) + if err != nil { + return nil, err + } + + d.init(data) + err = d.unmarshal(v) + if err != nil { + return nil, err + } + + return d.lastKeys, nil +} + +func UnmarshalValid(data []byte, v any) error { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + + d.init(data) + return d.unmarshal(v) +} + +func UnmarshalValidWithKeys(data []byte, v any) ([]string, error) { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + + d.init(data) + err := d.unmarshal(v) + if err != nil { + return nil, err + } + + return d.lastKeys, nil +} + +// Unmarshaler is the interface implemented by types +// that can unmarshal a JSON description of themselves. +// The input can be assumed to be a valid encoding of +// a JSON value. UnmarshalJSON must copy the JSON data +// if it wishes to retain the data after returning. +// +// By convention, to approximate the behavior of Unmarshal itself, +// Unmarshalers implement UnmarshalJSON([]byte("null")) as a no-op. +type Unmarshaler interface { + UnmarshalJSON([]byte) error +} + +// An UnmarshalTypeError describes a JSON value that was +// not appropriate for a value of a specific Go type. +type UnmarshalTypeError struct { + Value string // description of JSON value - "bool", "array", "number -5" + Type reflect.Type // type of Go value it could not be assigned to + Offset int64 // error occurred after reading Offset bytes + Struct string // name of the struct type containing the field + Field string // the full path from root node to the field +} + +func (e *UnmarshalTypeError) Error() string { + if e.Struct != "" || e.Field != "" { + return "json: cannot unmarshal " + e.Value + " into Go struct field " + e.Struct + "." + e.Field + " of type " + e.Type.String() + } + return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String() +} + +// An UnmarshalFieldError describes a JSON object key that +// led to an unexported (and therefore unwritable) struct field. +// +// Deprecated: No longer used; kept for compatibility. +type UnmarshalFieldError struct { + Key string + Type reflect.Type + Field reflect.StructField +} + +func (e *UnmarshalFieldError) Error() string { + return "json: cannot unmarshal object key " + strconv.Quote(e.Key) + " into unexported field " + e.Field.Name + " of type " + e.Type.String() +} + +// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal. +// (The argument to Unmarshal must be a non-nil pointer.) +type InvalidUnmarshalError struct { + Type reflect.Type +} + +func (e *InvalidUnmarshalError) Error() string { + if e.Type == nil { + return "json: Unmarshal(nil)" + } + + if e.Type.Kind() != reflect.Pointer { + return "json: Unmarshal(non-pointer " + e.Type.String() + ")" + } + return "json: Unmarshal(nil " + e.Type.String() + ")" +} + +func (d *decodeState) unmarshal(v any) error { + rv := reflect.ValueOf(v) + if rv.Kind() != reflect.Pointer || rv.IsNil() { + return &InvalidUnmarshalError{reflect.TypeOf(v)} + } + + d.scan.reset() + d.scanWhile(scanSkipSpace) + // We decode rv not rv.Elem because the Unmarshaler interface + // test must be applied at the top level of the value. + err := d.value(rv) + if err != nil { + return d.addErrorContext(err) + } + return d.savedError +} + +// A Number represents a JSON number literal. +type Number string + +// String returns the literal text of the number. +func (n Number) String() string { return string(n) } + +// Float64 returns the number as a float64. +func (n Number) Float64() (float64, error) { + return strconv.ParseFloat(string(n), 64) +} + +// Int64 returns the number as an int64. +func (n Number) Int64() (int64, error) { + return strconv.ParseInt(string(n), 10, 64) +} + +// An errorContext provides context for type errors during decoding. +type errorContext struct { + Struct reflect.Type + FieldStack []string +} + +// decodeState represents the state while decoding a JSON value. +type decodeState struct { + data []byte + off int // next read offset in data + opcode int // last read result + scan scanner + errorContext *errorContext + savedError error + useNumber bool + disallowUnknownFields bool + lastKeys []string +} + +// readIndex returns the position of the last byte read. +func (d *decodeState) readIndex() int { + return d.off - 1 +} + +// phasePanicMsg is used as a panic message when we end up with something that +// shouldn't happen. It can indicate a bug in the JSON decoder, or that +// something is editing the data slice while the decoder executes. +const phasePanicMsg = "JSON decoder out of sync - data changing underfoot?" + +func (d *decodeState) init(data []byte) *decodeState { + d.data = data + d.off = 0 + d.savedError = nil + if d.errorContext != nil { + d.errorContext.Struct = nil + // Reuse the allocated space for the FieldStack slice. + d.errorContext.FieldStack = d.errorContext.FieldStack[:0] + } + return d +} + +// saveError saves the first err it is called with, +// for reporting at the end of the unmarshal. +func (d *decodeState) saveError(err error) { + if d.savedError == nil { + d.savedError = d.addErrorContext(err) + } +} + +// addErrorContext returns a new error enhanced with information from d.errorContext +func (d *decodeState) addErrorContext(err error) error { + if d.errorContext != nil && (d.errorContext.Struct != nil || len(d.errorContext.FieldStack) > 0) { + switch err := err.(type) { + case *UnmarshalTypeError: + err.Struct = d.errorContext.Struct.Name() + err.Field = strings.Join(d.errorContext.FieldStack, ".") + } + } + return err +} + +// skip scans to the end of what was started. +func (d *decodeState) skip() { + s, data, i := &d.scan, d.data, d.off + depth := len(s.parseState) + for { + op := s.step(s, data[i]) + i++ + if len(s.parseState) < depth { + d.off = i + d.opcode = op + return + } + } +} + +// scanNext processes the byte at d.data[d.off]. +func (d *decodeState) scanNext() { + if d.off < len(d.data) { + d.opcode = d.scan.step(&d.scan, d.data[d.off]) + d.off++ + } else { + d.opcode = d.scan.eof() + d.off = len(d.data) + 1 // mark processed EOF with len+1 + } +} + +// scanWhile processes bytes in d.data[d.off:] until it +// receives a scan code not equal to op. +func (d *decodeState) scanWhile(op int) { + s, data, i := &d.scan, d.data, d.off + for i < len(data) { + newOp := s.step(s, data[i]) + i++ + if newOp != op { + d.opcode = newOp + d.off = i + return + } + } + + d.off = len(data) + 1 // mark processed EOF with len+1 + d.opcode = d.scan.eof() +} + +// rescanLiteral is similar to scanWhile(scanContinue), but it specialises the +// common case where we're decoding a literal. The decoder scans the input +// twice, once for syntax errors and to check the length of the value, and the +// second to perform the decoding. +// +// Only in the second step do we use decodeState to tokenize literals, so we +// know there aren't any syntax errors. We can take advantage of that knowledge, +// and scan a literal's bytes much more quickly. +func (d *decodeState) rescanLiteral() { + data, i := d.data, d.off +Switch: + switch data[i-1] { + case '"': // string + for ; i < len(data); i++ { + switch data[i] { + case '\\': + i++ // escaped char + case '"': + i++ // tokenize the closing quote too + break Switch + } + } + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': // number + for ; i < len(data); i++ { + switch data[i] { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '.', 'e', 'E', '+', '-': + default: + break Switch + } + } + case 't': // true + i += len("rue") + case 'f': // false + i += len("alse") + case 'n': // null + i += len("ull") + } + if i < len(data) { + d.opcode = stateEndValue(&d.scan, data[i]) + } else { + d.opcode = scanEnd + } + d.off = i + 1 +} + +// value consumes a JSON value from d.data[d.off-1:], decoding into v, and +// reads the following byte ahead. If v is invalid, the value is discarded. +// The first byte of the value has been read already. +func (d *decodeState) value(v reflect.Value) error { + switch d.opcode { + default: + panic(phasePanicMsg) + + case scanBeginArray: + if v.IsValid() { + if err := d.array(v); err != nil { + return err + } + } else { + d.skip() + } + d.scanNext() + + case scanBeginObject: + if v.IsValid() { + if err := d.object(v); err != nil { + return err + } + } else { + d.skip() + } + d.scanNext() + + case scanBeginLiteral: + // All bytes inside literal return scanContinue op code. + start := d.readIndex() + d.rescanLiteral() + + if v.IsValid() { + if err := d.literalStore(d.data[start:d.readIndex()], v, false); err != nil { + return err + } + } + } + return nil +} + +type unquotedValue struct{} + +// valueQuoted is like value but decodes a +// quoted string literal or literal null into an interface value. +// If it finds anything other than a quoted string literal or null, +// valueQuoted returns unquotedValue{}. +func (d *decodeState) valueQuoted() any { + switch d.opcode { + default: + panic(phasePanicMsg) + + case scanBeginArray, scanBeginObject: + d.skip() + d.scanNext() + + case scanBeginLiteral: + v := d.literalInterface() + switch v.(type) { + case nil, string: + return v + } + } + return unquotedValue{} +} + +// indirect walks down v allocating pointers as needed, +// until it gets to a non-pointer. +// If it encounters an Unmarshaler, indirect stops and returns that. +// If decodingNull is true, indirect stops at the first settable pointer so it +// can be set to nil. +func indirect(v reflect.Value, decodingNull bool) (Unmarshaler, encoding.TextUnmarshaler, reflect.Value) { + // Issue #24153 indicates that it is generally not a guaranteed property + // that you may round-trip a reflect.Value by calling Value.Addr().Elem() + // and expect the value to still be settable for values derived from + // unexported embedded struct fields. + // + // The logic below effectively does this when it first addresses the value + // (to satisfy possible pointer methods) and continues to dereference + // subsequent pointers as necessary. + // + // After the first round-trip, we set v back to the original value to + // preserve the original RW flags contained in reflect.Value. + v0 := v + haveAddr := false + + // If v is a named type and is addressable, + // start with its address, so that if the type has pointer methods, + // we find them. + if v.Kind() != reflect.Pointer && v.Type().Name() != "" && v.CanAddr() { + haveAddr = true + v = v.Addr() + } + for { + // Load value from interface, but only if the result will be + // usefully addressable. + if v.Kind() == reflect.Interface && !v.IsNil() { + e := v.Elem() + if e.Kind() == reflect.Pointer && !e.IsNil() && (!decodingNull || e.Elem().Kind() == reflect.Pointer) { + haveAddr = false + v = e + continue + } + } + + if v.Kind() != reflect.Pointer { + break + } + + if decodingNull && v.CanSet() { + break + } + + // Prevent infinite loop if v is an interface pointing to its own address: + // var v interface{} + // v = &v + if v.Elem().Kind() == reflect.Interface && v.Elem().Elem() == v { + v = v.Elem() + break + } + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + if v.Type().NumMethod() > 0 && v.CanInterface() { + if u, ok := v.Interface().(Unmarshaler); ok { + return u, nil, reflect.Value{} + } + if !decodingNull { + if u, ok := v.Interface().(encoding.TextUnmarshaler); ok { + return nil, u, reflect.Value{} + } + } + } + + if haveAddr { + v = v0 // restore original value after round-trip Value.Addr().Elem() + haveAddr = false + } else { + v = v.Elem() + } + } + return nil, nil, v +} + +// array consumes an array from d.data[d.off-1:], decoding into v. +// The first byte of the array ('[') has been read already. +func (d *decodeState) array(v reflect.Value) error { + // Check for unmarshaler. + u, ut, pv := indirect(v, false) + if u != nil { + start := d.readIndex() + d.skip() + return u.UnmarshalJSON(d.data[start:d.off]) + } + if ut != nil { + d.saveError(&UnmarshalTypeError{Value: "array", Type: v.Type(), Offset: int64(d.off)}) + d.skip() + return nil + } + v = pv + + // Check type of target. + switch v.Kind() { + case reflect.Interface: + if v.NumMethod() == 0 { + // Decoding into nil interface? Switch to non-reflect code. + ai := d.arrayInterface() + v.Set(reflect.ValueOf(ai)) + return nil + } + // Otherwise it's invalid. + fallthrough + default: + d.saveError(&UnmarshalTypeError{Value: "array", Type: v.Type(), Offset: int64(d.off)}) + d.skip() + return nil + case reflect.Array, reflect.Slice: + break + } + + i := 0 + for { + // Look ahead for ] - can only happen on first iteration. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndArray { + break + } + + // Get element of array, growing if necessary. + if v.Kind() == reflect.Slice { + // Grow slice if necessary + if i >= v.Cap() { + newcap := v.Cap() + v.Cap()/2 + if newcap < 4 { + newcap = 4 + } + newv := reflect.MakeSlice(v.Type(), v.Len(), newcap) + reflect.Copy(newv, v) + v.Set(newv) + } + if i >= v.Len() { + v.SetLen(i + 1) + } + } + + if i < v.Len() { + // Decode into element. + if err := d.value(v.Index(i)); err != nil { + return err + } + } else { + // Ran out of fixed array: skip. + if err := d.value(reflect.Value{}); err != nil { + return err + } + } + i++ + + // Next token must be , or ]. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode == scanEndArray { + break + } + if d.opcode != scanArrayValue { + panic(phasePanicMsg) + } + } + + if i < v.Len() { + if v.Kind() == reflect.Array { + // Array. Zero the rest. + z := reflect.Zero(v.Type().Elem()) + for ; i < v.Len(); i++ { + v.Index(i).Set(z) + } + } else { + v.SetLen(i) + } + } + if i == 0 && v.Kind() == reflect.Slice { + v.Set(reflect.MakeSlice(v.Type(), 0, 0)) + } + return nil +} + +var nullLiteral = []byte("null") +var textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() + +// object consumes an object from d.data[d.off-1:], decoding into v. +// The first byte ('{') of the object has been read already. +func (d *decodeState) object(v reflect.Value) error { + // Check for unmarshaler. + u, ut, pv := indirect(v, false) + if u != nil { + start := d.readIndex() + d.skip() + return u.UnmarshalJSON(d.data[start:d.off]) + } + if ut != nil { + d.saveError(&UnmarshalTypeError{Value: "object", Type: v.Type(), Offset: int64(d.off)}) + d.skip() + return nil + } + v = pv + t := v.Type() + + // Decoding into nil interface? Switch to non-reflect code. + if v.Kind() == reflect.Interface && v.NumMethod() == 0 { + oi := d.objectInterface() + v.Set(reflect.ValueOf(oi)) + return nil + } + + var fields structFields + + // Check type of target: + // struct or + // map[T1]T2 where T1 is string, an integer type, + // or an encoding.TextUnmarshaler + switch v.Kind() { + case reflect.Map: + // Map key must either have string kind, have an integer kind, + // or be an encoding.TextUnmarshaler. + switch t.Key().Kind() { + case reflect.String, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + default: + if !reflect.PointerTo(t.Key()).Implements(textUnmarshalerType) { + d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)}) + d.skip() + return nil + } + } + if v.IsNil() { + v.Set(reflect.MakeMap(t)) + } + case reflect.Struct: + fields = cachedTypeFields(t) + // ok + default: + d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)}) + d.skip() + return nil + } + + var mapElem reflect.Value + var origErrorContext errorContext + if d.errorContext != nil { + origErrorContext = *d.errorContext + } + + var keys []string + + for { + // Read opening " of string key or closing }. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndObject { + // closing } - can only happen on first iteration. + break + } + if d.opcode != scanBeginLiteral { + panic(phasePanicMsg) + } + + // Read key. + start := d.readIndex() + d.rescanLiteral() + item := d.data[start:d.readIndex()] + key, ok := unquoteBytes(item) + if !ok { + panic(phasePanicMsg) + } + + keys = append(keys, string(key)) + + // Figure out field corresponding to key. + var subv reflect.Value + destring := false // whether the value is wrapped in a string to be decoded first + + if v.Kind() == reflect.Map { + elemType := t.Elem() + if !mapElem.IsValid() { + mapElem = reflect.New(elemType).Elem() + } else { + mapElem.Set(reflect.Zero(elemType)) + } + subv = mapElem + } else { + var f *field + if i, ok := fields.nameIndex[string(key)]; ok { + // Found an exact name match. + f = &fields.list[i] + } else { + // Fall back to the expensive case-insensitive + // linear search. + for i := range fields.list { + ff := &fields.list[i] + if ff.equalFold(ff.nameBytes, key) { + f = ff + break + } + } + } + if f != nil { + subv = v + destring = f.quoted + for _, i := range f.index { + if subv.Kind() == reflect.Pointer { + if subv.IsNil() { + // If a struct embeds a pointer to an unexported type, + // it is not possible to set a newly allocated value + // since the field is unexported. + // + // See https://golang.org/issue/21357 + if !subv.CanSet() { + d.saveError(fmt.Errorf("json: cannot set embedded pointer to unexported struct: %v", subv.Type().Elem())) + // Invalidate subv to ensure d.value(subv) skips over + // the JSON value without assigning it to subv. + subv = reflect.Value{} + destring = false + break + } + subv.Set(reflect.New(subv.Type().Elem())) + } + subv = subv.Elem() + } + subv = subv.Field(i) + } + if d.errorContext == nil { + d.errorContext = new(errorContext) + } + d.errorContext.FieldStack = append(d.errorContext.FieldStack, f.name) + d.errorContext.Struct = t + } else if d.disallowUnknownFields { + d.saveError(fmt.Errorf("json: unknown field %q", key)) + } + } + + // Read : before value. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode != scanObjectKey { + panic(phasePanicMsg) + } + d.scanWhile(scanSkipSpace) + + if destring { + switch qv := d.valueQuoted().(type) { + case nil: + if err := d.literalStore(nullLiteral, subv, false); err != nil { + return err + } + case string: + if err := d.literalStore([]byte(qv), subv, true); err != nil { + return err + } + default: + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal unquoted value into %v", subv.Type())) + } + } else { + if err := d.value(subv); err != nil { + return err + } + } + + // Write value back to map; + // if using struct, subv points into struct already. + if v.Kind() == reflect.Map { + kt := t.Key() + var kv reflect.Value + switch { + case reflect.PointerTo(kt).Implements(textUnmarshalerType): + kv = reflect.New(kt) + if err := d.literalStore(item, kv, true); err != nil { + return err + } + kv = kv.Elem() + case kt.Kind() == reflect.String: + kv = reflect.ValueOf(key).Convert(kt) + default: + switch kt.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + s := string(key) + n, err := strconv.ParseInt(s, 10, 64) + if err != nil || reflect.Zero(kt).OverflowInt(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)}) + break + } + kv = reflect.ValueOf(n).Convert(kt) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + s := string(key) + n, err := strconv.ParseUint(s, 10, 64) + if err != nil || reflect.Zero(kt).OverflowUint(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)}) + break + } + kv = reflect.ValueOf(n).Convert(kt) + default: + panic("json: Unexpected key type") // should never occur + } + } + if kv.IsValid() { + v.SetMapIndex(kv, subv) + } + } + + // Next token must be , or }. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.errorContext != nil { + // Reset errorContext to its original state. + // Keep the same underlying array for FieldStack, to reuse the + // space and avoid unnecessary allocs. + d.errorContext.FieldStack = d.errorContext.FieldStack[:len(origErrorContext.FieldStack)] + d.errorContext.Struct = origErrorContext.Struct + } + if d.opcode == scanEndObject { + break + } + if d.opcode != scanObjectValue { + panic(phasePanicMsg) + } + } + + if v.Kind() == reflect.Map { + d.lastKeys = keys + } + return nil +} + +// convertNumber converts the number literal s to a float64 or a Number +// depending on the setting of d.useNumber. +func (d *decodeState) convertNumber(s string) (any, error) { + if d.useNumber { + return Number(s), nil + } + f, err := strconv.ParseFloat(s, 64) + if err != nil { + return nil, &UnmarshalTypeError{Value: "number " + s, Type: reflect.TypeOf(0.0), Offset: int64(d.off)} + } + return f, nil +} + +var numberType = reflect.TypeOf(Number("")) + +// literalStore decodes a literal stored in item into v. +// +// fromQuoted indicates whether this literal came from unwrapping a +// string from the ",string" struct tag option. this is used only to +// produce more helpful error messages. +func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool) error { + // Check for unmarshaler. + if len(item) == 0 { + //Empty string given + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + return nil + } + isNull := item[0] == 'n' // null + u, ut, pv := indirect(v, isNull) + if u != nil { + return u.UnmarshalJSON(item) + } + if ut != nil { + if item[0] != '"' { + if fromQuoted { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + return nil + } + val := "number" + switch item[0] { + case 'n': + val = "null" + case 't', 'f': + val = "bool" + } + d.saveError(&UnmarshalTypeError{Value: val, Type: v.Type(), Offset: int64(d.readIndex())}) + return nil + } + s, ok := unquoteBytes(item) + if !ok { + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + panic(phasePanicMsg) + } + return ut.UnmarshalText(s) + } + + v = pv + + switch c := item[0]; c { + case 'n': // null + // The main parser checks that only true and false can reach here, + // but if this was a quoted string input, it could be anything. + if fromQuoted && string(item) != "null" { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + break + } + switch v.Kind() { + case reflect.Interface, reflect.Pointer, reflect.Map, reflect.Slice: + v.Set(reflect.Zero(v.Type())) + // otherwise, ignore null for primitives/string + } + case 't', 'f': // true, false + value := item[0] == 't' + // The main parser checks that only true and false can reach here, + // but if this was a quoted string input, it could be anything. + if fromQuoted && string(item) != "true" && string(item) != "false" { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + break + } + switch v.Kind() { + default: + if fromQuoted { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + } else { + d.saveError(&UnmarshalTypeError{Value: "bool", Type: v.Type(), Offset: int64(d.readIndex())}) + } + case reflect.Bool: + v.SetBool(value) + case reflect.Interface: + if v.NumMethod() == 0 { + v.Set(reflect.ValueOf(value)) + } else { + d.saveError(&UnmarshalTypeError{Value: "bool", Type: v.Type(), Offset: int64(d.readIndex())}) + } + } + + case '"': // string + s, ok := unquoteBytes(item) + if !ok { + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + panic(phasePanicMsg) + } + switch v.Kind() { + default: + d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())}) + case reflect.Slice: + if v.Type().Elem().Kind() != reflect.Uint8 { + d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + b := make([]byte, base64.StdEncoding.DecodedLen(len(s))) + n, err := base64.StdEncoding.Decode(b, s) + if err != nil { + d.saveError(err) + break + } + v.SetBytes(b[:n]) + case reflect.String: + if v.Type() == numberType && !isValidNumber(string(s)) { + return fmt.Errorf("json: invalid number literal, trying to unmarshal %q into Number", item) + } + v.SetString(string(s)) + case reflect.Interface: + if v.NumMethod() == 0 { + v.Set(reflect.ValueOf(string(s))) + } else { + d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())}) + } + } + + default: // number + if c != '-' && (c < '0' || c > '9') { + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + panic(phasePanicMsg) + } + s := string(item) + switch v.Kind() { + default: + if v.Kind() == reflect.String && v.Type() == numberType { + // s must be a valid number, because it's + // already been tokenized. + v.SetString(s) + break + } + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + d.saveError(&UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())}) + case reflect.Interface: + n, err := d.convertNumber(s) + if err != nil { + d.saveError(err) + break + } + if v.NumMethod() != 0 { + d.saveError(&UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.Set(reflect.ValueOf(n)) + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + n, err := strconv.ParseInt(s, 10, 64) + if err != nil || v.OverflowInt(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.SetInt(n) + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + n, err := strconv.ParseUint(s, 10, 64) + if err != nil || v.OverflowUint(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.SetUint(n) + + case reflect.Float32, reflect.Float64: + n, err := strconv.ParseFloat(s, v.Type().Bits()) + if err != nil || v.OverflowFloat(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.SetFloat(n) + } + } + return nil +} + +// The xxxInterface routines build up a value to be stored +// in an empty interface. They are not strictly necessary, +// but they avoid the weight of reflection in this common case. + +// valueInterface is like value but returns interface{} +func (d *decodeState) valueInterface() (val any) { + switch d.opcode { + default: + panic(phasePanicMsg) + case scanBeginArray: + val = d.arrayInterface() + d.scanNext() + case scanBeginObject: + val = d.objectInterface() + d.scanNext() + case scanBeginLiteral: + val = d.literalInterface() + } + return +} + +// arrayInterface is like array but returns []interface{}. +func (d *decodeState) arrayInterface() []any { + var v = make([]any, 0) + for { + // Look ahead for ] - can only happen on first iteration. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndArray { + break + } + + v = append(v, d.valueInterface()) + + // Next token must be , or ]. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode == scanEndArray { + break + } + if d.opcode != scanArrayValue { + panic(phasePanicMsg) + } + } + return v +} + +// objectInterface is like object but returns map[string]interface{}. +func (d *decodeState) objectInterface() map[string]any { + m := make(map[string]any) + for { + // Read opening " of string key or closing }. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndObject { + // closing } - can only happen on first iteration. + break + } + if d.opcode != scanBeginLiteral { + panic(phasePanicMsg) + } + + // Read string key. + start := d.readIndex() + d.rescanLiteral() + item := d.data[start:d.readIndex()] + key, ok := unquote(item) + if !ok { + panic(phasePanicMsg) + } + + // Read : before value. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode != scanObjectKey { + panic(phasePanicMsg) + } + d.scanWhile(scanSkipSpace) + + // Read value. + m[key] = d.valueInterface() + + // Next token must be , or }. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode == scanEndObject { + break + } + if d.opcode != scanObjectValue { + panic(phasePanicMsg) + } + } + return m +} + +// literalInterface consumes and returns a literal from d.data[d.off-1:] and +// it reads the following byte ahead. The first byte of the literal has been +// read already (that's how the caller knows it's a literal). +func (d *decodeState) literalInterface() any { + // All bytes inside literal return scanContinue op code. + start := d.readIndex() + d.rescanLiteral() + + item := d.data[start:d.readIndex()] + + switch c := item[0]; c { + case 'n': // null + return nil + + case 't', 'f': // true, false + return c == 't' + + case '"': // string + s, ok := unquote(item) + if !ok { + panic(phasePanicMsg) + } + return s + + default: // number + if c != '-' && (c < '0' || c > '9') { + panic(phasePanicMsg) + } + n, err := d.convertNumber(string(item)) + if err != nil { + d.saveError(err) + } + return n + } +} + +// getu4 decodes \uXXXX from the beginning of s, returning the hex value, +// or it returns -1. +func getu4(s []byte) rune { + if len(s) < 6 || s[0] != '\\' || s[1] != 'u' { + return -1 + } + var r rune + for _, c := range s[2:6] { + switch { + case '0' <= c && c <= '9': + c = c - '0' + case 'a' <= c && c <= 'f': + c = c - 'a' + 10 + case 'A' <= c && c <= 'F': + c = c - 'A' + 10 + default: + return -1 + } + r = r*16 + rune(c) + } + return r +} + +// unquote converts a quoted JSON string literal s into an actual string t. +// The rules are different than for Go, so cannot use strconv.Unquote. +func unquote(s []byte) (t string, ok bool) { + s, ok = unquoteBytes(s) + t = string(s) + return +} + +func unquoteBytes(s []byte) (t []byte, ok bool) { + if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' { + return + } + s = s[1 : len(s)-1] + + // Check for unusual characters. If there are none, + // then no unquoting is needed, so return a slice of the + // original bytes. + r := 0 + for r < len(s) { + c := s[r] + if c == '\\' || c == '"' || c < ' ' { + break + } + if c < utf8.RuneSelf { + r++ + continue + } + rr, size := utf8.DecodeRune(s[r:]) + if rr == utf8.RuneError && size == 1 { + break + } + r += size + } + if r == len(s) { + return s, true + } + + b := make([]byte, len(s)+2*utf8.UTFMax) + w := copy(b, s[0:r]) + for r < len(s) { + // Out of room? Can only happen if s is full of + // malformed UTF-8 and we're replacing each + // byte with RuneError. + if w >= len(b)-2*utf8.UTFMax { + nb := make([]byte, (len(b)+utf8.UTFMax)*2) + copy(nb, b[0:w]) + b = nb + } + switch c := s[r]; { + case c == '\\': + r++ + if r >= len(s) { + return + } + switch s[r] { + default: + return + case '"', '\\', '/', '\'': + b[w] = s[r] + r++ + w++ + case 'b': + b[w] = '\b' + r++ + w++ + case 'f': + b[w] = '\f' + r++ + w++ + case 'n': + b[w] = '\n' + r++ + w++ + case 'r': + b[w] = '\r' + r++ + w++ + case 't': + b[w] = '\t' + r++ + w++ + case 'u': + r-- + rr := getu4(s[r:]) + if rr < 0 { + return + } + r += 6 + if utf16.IsSurrogate(rr) { + rr1 := getu4(s[r:]) + if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar { + // A valid pair; consume. + r += 6 + w += utf8.EncodeRune(b[w:], dec) + break + } + // Invalid surrogate; fall back to replacement rune. + rr = unicode.ReplacementChar + } + w += utf8.EncodeRune(b[w:], rr) + } + + // Quote, control characters are invalid. + case c == '"', c < ' ': + return + + // ASCII + case c < utf8.RuneSelf: + b[w] = c + r++ + w++ + + // Coerce to well-formed UTF-8. + default: + rr, size := utf8.DecodeRune(s[r:]) + r += size + w += utf8.EncodeRune(b[w:], rr) + } + } + return b[0:w], true +} diff --git a/vendor/github.com/evanphx/json-patch/v5/internal/json/encode.go b/vendor/github.com/evanphx/json-patch/v5/internal/json/encode.go new file mode 100644 index 000000000..2e6eca448 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/internal/json/encode.go @@ -0,0 +1,1486 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package json implements encoding and decoding of JSON as defined in +// RFC 7159. The mapping between JSON and Go values is described +// in the documentation for the Marshal and Unmarshal functions. +// +// See "JSON and Go" for an introduction to this package: +// https://golang.org/doc/articles/json_and_go.html +package json + +import ( + "bytes" + "encoding" + "encoding/base64" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "unicode" + "unicode/utf8" +) + +// Marshal returns the JSON encoding of v. +// +// Marshal traverses the value v recursively. +// If an encountered value implements the Marshaler interface +// and is not a nil pointer, Marshal calls its MarshalJSON method +// to produce JSON. If no MarshalJSON method is present but the +// value implements encoding.TextMarshaler instead, Marshal calls +// its MarshalText method and encodes the result as a JSON string. +// The nil pointer exception is not strictly necessary +// but mimics a similar, necessary exception in the behavior of +// UnmarshalJSON. +// +// Otherwise, Marshal uses the following type-dependent default encodings: +// +// Boolean values encode as JSON booleans. +// +// Floating point, integer, and Number values encode as JSON numbers. +// +// String values encode as JSON strings coerced to valid UTF-8, +// replacing invalid bytes with the Unicode replacement rune. +// So that the JSON will be safe to embed inside HTML