From 1e9de0df1f2a10e7fd7fb6d85f2f0ff6c404e60a Mon Sep 17 00:00:00 2001 From: Soumya Ghosh Dastidar Date: Tue, 22 Nov 2022 21:22:23 +0530 Subject: [PATCH 1/4] feat: added deep links backend changes Signed-off-by: Soumya Ghosh Dastidar --- assets/swagger.json | 161 ++ go.mod | 2 +- go.sum | 3 +- hack/generate-proto.sh | 2 +- pkg/apiclient/application/application.pb.go | 1308 ++++++++++++++--- .../application/application.pb.gw.go | 238 +++ pkg/apiclient/project/project.pb.go | 164 ++- pkg/apiclient/project/project.pb.gw.go | 120 ++ server/application/application.go | 46 + server/application/application.proto | 27 + server/deeplinks/deeplinks.go | 63 + server/deeplinks/deeplinks_test.go | 101 ++ server/project/project.go | 30 +- server/project/project.proto | 8 +- util/settings/settings.go | 35 + 15 files changed, 2021 insertions(+), 287 deletions(-) create mode 100644 server/deeplinks/deeplinks.go create mode 100644 server/deeplinks/deeplinks_test.go diff --git a/assets/swagger.json b/assets/swagger.json index 517b2a6f97164..0a481f15c2f52 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -735,6 +735,42 @@ } } }, + "/api/v1/applications/{name}/links": { + "get": { + "tags": [ + "ApplicationService" + ], + "summary": "ListLinks returns the list of all application deep links", + "operationId": "ApplicationService_ListLinks", + "parameters": [ + { + "type": "string", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "name": "namespace", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/applicationLinksResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + } + } + }, "/api/v1/applications/{name}/logs": { "get": { "tags": [ @@ -1385,6 +1421,67 @@ } } }, + "/api/v1/applications/{name}/resource/links": { + "get": { + "tags": [ + "ApplicationService" + ], + "summary": "ListResourceLinks returns the list of all resource deep links", + "operationId": "ApplicationService_ListResourceLinks", + "parameters": [ + { + "type": "string", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "name": "namespace", + "in": "query" + }, + { + "type": "string", + "name": "resourceName", + "in": "query" + }, + { + "type": "string", + "name": "version", + "in": "query" + }, + { + "type": "string", + "name": "group", + "in": "query" + }, + { + "type": "string", + "name": "kind", + "in": "query" + }, + { + "type": "string", + "name": "appNamespace", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/applicationLinksResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + } + } + }, "/api/v1/applications/{name}/revisions/{revision}/metadata": { "get": { "tags": [ @@ -2560,6 +2657,42 @@ } } }, + "/api/v1/projects/{name}/links": { + "get": { + "tags": [ + "ProjectService" + ], + "summary": "ListLinks returns all deep links for the particular project", + "operationId": "ProjectService_ListLinks", + "parameters": [ + { + "type": "string", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "string", + "name": "namespace", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/applicationLinksResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + } + } + }, "/api/v1/projects/{name}/syncwindows": { "get": { "tags": [ @@ -3900,6 +4033,34 @@ } } }, + "applicationLinkInfo": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "iconClass": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "applicationLinksResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/applicationLinkInfo" + } + } + } + }, "applicationLogEntry": { "type": "object", "properties": { diff --git a/go.mod b/go.mod index 887d8c9bfa97c..31a1f38025b37 100644 --- a/go.mod +++ b/go.mod @@ -137,7 +137,7 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20210112200207-10ab4d695d60 // indirect github.com/acomagu/bufpipe v1.0.3 // indirect github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a // indirect - github.com/antonmedv/expr v1.8.9 // indirect + github.com/antonmedv/expr v1.9.0 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.1.2 // indirect diff --git a/go.sum b/go.sum index 464126aaf29e5..58973775a4a67 100644 --- a/go.sum +++ b/go.sum @@ -137,8 +137,9 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/antonmedv/expr v1.8.9 h1:O9stiHmHHww9b4ozhPx7T6BK7fXfOCHJ8ybxf0833zw= github.com/antonmedv/expr v1.8.9/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.9.0 h1:j4HI3NHEdgDnN9p6oI6Ndr0G5QryMY0FNxT4ONrFDGU= +github.com/antonmedv/expr v1.9.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/appscode/go v0.0.0-20190808133642-1d4ef1f1c1e0/go.mod h1:iy07dV61Z7QQdCKJCIvUoDL21u6AIceRhZzyleh2ymc= diff --git a/hack/generate-proto.sh b/hack/generate-proto.sh index 3627a297fd879..cdd3cf2837214 100755 --- a/hack/generate-proto.sh +++ b/hack/generate-proto.sh @@ -125,7 +125,7 @@ clean_swagger() { } echo "If additional types are added, the number of expected collisions may need to be increased" -EXPECTED_COLLISION_COUNT=91 +EXPECTED_COLLISION_COUNT=93 collect_swagger server ${EXPECTED_COLLISION_COUNT} clean_swagger server clean_swagger reposerver diff --git a/pkg/apiclient/application/application.pb.go b/pkg/apiclient/application/application.pb.go index 60f4b7aa4de03..fe60992630c0a 100644 --- a/pkg/apiclient/application/application.pb.go +++ b/pkg/apiclient/application/application.pb.go @@ -2411,6 +2411,179 @@ func (m *ManagedResourcesResponse) GetItems() []*v1alpha1.ResourceDiff { return nil } +type LinkInfo struct { + Title *string `protobuf:"bytes,1,req,name=title" json:"title,omitempty"` + Url *string `protobuf:"bytes,2,req,name=url" json:"url,omitempty"` + Description *string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` + IconClass *string `protobuf:"bytes,4,opt,name=iconClass" json:"iconClass,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LinkInfo) Reset() { *m = LinkInfo{} } +func (m *LinkInfo) String() string { return proto.CompactTextString(m) } +func (*LinkInfo) ProtoMessage() {} +func (*LinkInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{32} +} +func (m *LinkInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LinkInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LinkInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *LinkInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_LinkInfo.Merge(m, src) +} +func (m *LinkInfo) XXX_Size() int { + return m.Size() +} +func (m *LinkInfo) XXX_DiscardUnknown() { + xxx_messageInfo_LinkInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_LinkInfo proto.InternalMessageInfo + +func (m *LinkInfo) GetTitle() string { + if m != nil && m.Title != nil { + return *m.Title + } + return "" +} + +func (m *LinkInfo) GetUrl() string { + if m != nil && m.Url != nil { + return *m.Url + } + return "" +} + +func (m *LinkInfo) GetDescription() string { + if m != nil && m.Description != nil { + return *m.Description + } + return "" +} + +func (m *LinkInfo) GetIconClass() string { + if m != nil && m.IconClass != nil { + return *m.IconClass + } + return "" +} + +type LinksResponse struct { + Items []*LinkInfo `protobuf:"bytes,1,rep,name=items" json:"items,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LinksResponse) Reset() { *m = LinksResponse{} } +func (m *LinksResponse) String() string { return proto.CompactTextString(m) } +func (*LinksResponse) ProtoMessage() {} +func (*LinksResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{33} +} +func (m *LinksResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LinksResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LinksResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *LinksResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_LinksResponse.Merge(m, src) +} +func (m *LinksResponse) XXX_Size() int { + return m.Size() +} +func (m *LinksResponse) XXX_DiscardUnknown() { + xxx_messageInfo_LinksResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_LinksResponse proto.InternalMessageInfo + +func (m *LinksResponse) GetItems() []*LinkInfo { + if m != nil { + return m.Items + } + return nil +} + +type ListLinksRequest struct { + Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` + Namespace *string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListLinksRequest) Reset() { *m = ListLinksRequest{} } +func (m *ListLinksRequest) String() string { return proto.CompactTextString(m) } +func (*ListLinksRequest) ProtoMessage() {} +func (*ListLinksRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{34} +} +func (m *ListLinksRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ListLinksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ListLinksRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ListLinksRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListLinksRequest.Merge(m, src) +} +func (m *ListLinksRequest) XXX_Size() int { + return m.Size() +} +func (m *ListLinksRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ListLinksRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ListLinksRequest proto.InternalMessageInfo + +func (m *ListLinksRequest) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ListLinksRequest) GetNamespace() string { + if m != nil && m.Namespace != nil { + return *m.Namespace + } + return "" +} + func init() { proto.RegisterType((*ApplicationQuery)(nil), "application.ApplicationQuery") proto.RegisterType((*NodeQuery)(nil), "application.NodeQuery") @@ -2444,6 +2617,9 @@ func init() { proto.RegisterType((*OperationTerminateResponse)(nil), "application.OperationTerminateResponse") proto.RegisterType((*ResourcesQuery)(nil), "application.ResourcesQuery") proto.RegisterType((*ManagedResourcesResponse)(nil), "application.ManagedResourcesResponse") + proto.RegisterType((*LinkInfo)(nil), "application.LinkInfo") + proto.RegisterType((*LinksResponse)(nil), "application.LinksResponse") + proto.RegisterType((*ListLinksRequest)(nil), "application.ListLinksRequest") } func init() { @@ -2451,160 +2627,168 @@ func init() { } var fileDescriptor_df6e82b174b5eaec = []byte{ - // 2444 bytes of a gzipped FileDescriptorProto + // 2573 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x8f, 0x1c, 0x47, - 0x15, 0xa7, 0x66, 0xbf, 0x66, 0xde, 0xac, 0xbf, 0x2a, 0xf1, 0xd2, 0x19, 0xaf, 0xcd, 0xa6, 0xfd, - 0xb5, 0x5e, 0x7b, 0x67, 0xec, 0xc1, 0x20, 0x67, 0x03, 0x02, 0xdb, 0xf1, 0x17, 0xac, 0x1d, 0xd3, - 0x6b, 0xb3, 0x28, 0x1c, 0xa0, 0xd2, 0x5d, 0x3b, 0xdb, 0xec, 0x4c, 0x57, 0xbb, 0xbb, 0x67, 0xac, - 0x91, 0xf1, 0x25, 0x08, 0x4e, 0x28, 0x48, 0x49, 0x0e, 0x28, 0x8a, 0x10, 0x4a, 0x94, 0x0b, 0x17, - 0x6e, 0x08, 0x89, 0x0b, 0x5c, 0x10, 0x48, 0x1c, 0x10, 0x1f, 0x97, 0x9c, 0x90, 0xc5, 0x8d, 0x0b, - 0x7f, 0x02, 0xaa, 0xea, 0xaa, 0xee, 0xea, 0x99, 0x9e, 0x9e, 0x59, 0x76, 0xa3, 0xf8, 0x56, 0xaf, - 0xba, 0xea, 0xbd, 0x5f, 0xbd, 0x7a, 0xef, 0x55, 0xd5, 0x6f, 0x06, 0x4e, 0x85, 0x34, 0xe8, 0xd1, - 0xa0, 0x41, 0x7c, 0xbf, 0xed, 0xda, 0x24, 0x72, 0x99, 0xa7, 0xb7, 0xeb, 0x7e, 0xc0, 0x22, 0x86, - 0xab, 0x5a, 0x57, 0x6d, 0xb1, 0xc5, 0x58, 0xab, 0x4d, 0x1b, 0xc4, 0x77, 0x1b, 0xc4, 0xf3, 0x58, - 0x24, 0xba, 0xc3, 0x78, 0x68, 0xcd, 0xdc, 0xb9, 0x12, 0xd6, 0x5d, 0x26, 0xbe, 0xda, 0x2c, 0xa0, - 0x8d, 0xde, 0xa5, 0x46, 0x8b, 0x7a, 0x34, 0x20, 0x11, 0x75, 0xe4, 0x98, 0xcb, 0xe9, 0x98, 0x0e, - 0xb1, 0xb7, 0x5d, 0x8f, 0x06, 0xfd, 0x86, 0xbf, 0xd3, 0xe2, 0x1d, 0x61, 0xa3, 0x43, 0x23, 0x92, - 0x37, 0x6b, 0xbd, 0xe5, 0x46, 0xdb, 0xdd, 0x37, 0xeb, 0x36, 0xeb, 0x34, 0x48, 0xd0, 0x62, 0x7e, - 0xc0, 0x7e, 0x20, 0x1a, 0xab, 0xb6, 0xd3, 0xe8, 0x35, 0x53, 0x05, 0xfa, 0x5a, 0x7a, 0x97, 0x48, - 0xdb, 0xdf, 0x26, 0xc3, 0xda, 0x6e, 0x8c, 0xd1, 0x16, 0x50, 0x9f, 0x49, 0xdf, 0x88, 0xa6, 0x1b, - 0xb1, 0xa0, 0xaf, 0x35, 0x63, 0x35, 0xe6, 0x27, 0x08, 0x0e, 0x5f, 0x4d, 0xed, 0x7d, 0xab, 0x4b, - 0x83, 0x3e, 0xc6, 0x30, 0xed, 0x91, 0x0e, 0x35, 0xd0, 0x12, 0x5a, 0xae, 0x58, 0xa2, 0x8d, 0x0d, - 0x98, 0x0b, 0xe8, 0x56, 0x40, 0xc3, 0x6d, 0xa3, 0x24, 0xba, 0x95, 0x88, 0x6b, 0x50, 0xe6, 0xc6, - 0xa9, 0x1d, 0x85, 0xc6, 0xd4, 0xd2, 0xd4, 0x72, 0xc5, 0x4a, 0x64, 0xbc, 0x0c, 0x87, 0x02, 0x1a, - 0xb2, 0x6e, 0x60, 0xd3, 0x6f, 0xd3, 0x20, 0x74, 0x99, 0x67, 0x4c, 0x8b, 0xd9, 0x83, 0xdd, 0x5c, - 0x4b, 0x48, 0xdb, 0xd4, 0x8e, 0x58, 0x60, 0xcc, 0x88, 0x21, 0x89, 0xcc, 0xf1, 0x70, 0xe0, 0xc6, - 0x6c, 0x8c, 0x87, 0xb7, 0xb1, 0x09, 0xf3, 0xc4, 0xf7, 0xef, 0x91, 0x0e, 0x0d, 0x7d, 0x62, 0x53, - 0x63, 0x4e, 0x7c, 0xcb, 0xf4, 0x99, 0xd7, 0xa1, 0x72, 0x8f, 0x39, 0x74, 0xf4, 0xa2, 0x06, 0x95, - 0x94, 0x72, 0x94, 0xec, 0xc0, 0x51, 0x8b, 0xf6, 0x5c, 0x0e, 0xf2, 0x2e, 0x8d, 0x88, 0x43, 0x22, - 0x32, 0xa8, 0xb0, 0x94, 0x28, 0xac, 0x41, 0x39, 0x90, 0x83, 0x8d, 0x92, 0xe8, 0x4f, 0xe4, 0x21, - 0x63, 0x53, 0x39, 0xc6, 0xfe, 0x82, 0xe0, 0x84, 0xb6, 0x1d, 0x96, 0x74, 0xd2, 0x8d, 0x1e, 0xf5, - 0xa2, 0x70, 0xb4, 0xd9, 0x0b, 0x70, 0x44, 0xf9, 0x73, 0x70, 0x31, 0xc3, 0x1f, 0x38, 0x10, 0xbd, - 0x53, 0x01, 0xd1, 0xfb, 0xf0, 0x12, 0x54, 0x95, 0xfc, 0xf0, 0xce, 0x6b, 0x72, 0xd3, 0xf4, 0xae, - 0xa1, 0xe5, 0xcc, 0xe4, 0x2c, 0xc7, 0x03, 0x43, 0x5b, 0xcd, 0x5d, 0xe2, 0xb9, 0x5b, 0x34, 0x8c, - 0x26, 0x75, 0x1f, 0xda, 0xb5, 0xfb, 0x5e, 0x86, 0xca, 0x4d, 0xb7, 0x4d, 0xaf, 0x6f, 0x77, 0xbd, - 0x1d, 0xfc, 0x22, 0xcc, 0xd8, 0xbc, 0x21, 0x2c, 0xcc, 0x5b, 0xb1, 0x60, 0x3e, 0x86, 0x97, 0x47, - 0x41, 0xda, 0x74, 0xa3, 0x6d, 0x3e, 0x3d, 0x1c, 0x85, 0xcd, 0xde, 0xa6, 0xf6, 0x4e, 0xd8, 0xed, - 0xa8, 0xad, 0x55, 0xf2, 0x44, 0xd8, 0x7e, 0x85, 0x60, 0x79, 0xac, 0xe5, 0xcd, 0x80, 0xf8, 0x3e, - 0x0d, 0xf0, 0x4d, 0x98, 0x79, 0xc4, 0x3f, 0x88, 0x68, 0xad, 0x36, 0xeb, 0x75, 0xbd, 0xa6, 0x8d, - 0xd5, 0x72, 0xfb, 0x73, 0x56, 0x3c, 0x1d, 0xd7, 0x95, 0x0f, 0x4a, 0x42, 0xcf, 0x42, 0x46, 0x4f, - 0xe2, 0x2a, 0x3e, 0x5e, 0x0c, 0xbb, 0x36, 0x0b, 0xd3, 0x3e, 0x09, 0x22, 0xf3, 0x28, 0xbc, 0x90, - 0x0d, 0x43, 0x9f, 0x79, 0x21, 0x35, 0x7f, 0x87, 0x32, 0x1b, 0x7a, 0x3d, 0xa0, 0x24, 0xa2, 0x16, - 0x7d, 0xd4, 0xa5, 0x61, 0x84, 0x77, 0x40, 0x2f, 0xb3, 0xc2, 0x77, 0xd5, 0xe6, 0x9d, 0x7a, 0x5a, - 0xa7, 0xea, 0xaa, 0x4e, 0x89, 0xc6, 0xf7, 0x6c, 0xa7, 0xde, 0x6b, 0xd6, 0xfd, 0x9d, 0x56, 0x9d, - 0x57, 0xbd, 0x0c, 0x32, 0x55, 0xf5, 0xf4, 0xa5, 0x5a, 0xba, 0x76, 0xbc, 0x00, 0xb3, 0x5d, 0x3f, - 0xa4, 0x41, 0x24, 0x56, 0x56, 0xb6, 0xa4, 0xc4, 0x77, 0xa9, 0x47, 0xda, 0xae, 0x43, 0xa2, 0x78, - 0x17, 0xca, 0x56, 0x22, 0x9b, 0x1f, 0x65, 0xd1, 0x3f, 0xf4, 0x9d, 0xcf, 0x0a, 0xbd, 0x8e, 0xb2, - 0x34, 0x80, 0xf2, 0xfd, 0x2c, 0xca, 0xd7, 0x68, 0x9b, 0xa6, 0x28, 0xf3, 0x02, 0xd3, 0x80, 0x39, - 0x9b, 0x84, 0x36, 0x71, 0x94, 0x2e, 0x25, 0xf2, 0xb2, 0xe0, 0x07, 0xcc, 0x27, 0x2d, 0xa1, 0xe9, - 0x3e, 0x6b, 0xbb, 0x76, 0x5f, 0xc6, 0xe6, 0xf0, 0x87, 0xa1, 0x20, 0x9e, 0xce, 0x09, 0xe2, 0x93, - 0x50, 0xdd, 0xe8, 0x7b, 0xf6, 0xeb, 0xbe, 0x38, 0x32, 0x79, 0x8a, 0xb9, 0x11, 0xed, 0x84, 0x06, - 0x12, 0x75, 0x3f, 0x16, 0xcc, 0x0f, 0x66, 0x60, 0x41, 0x5b, 0x01, 0x9f, 0x50, 0x84, 0xbf, 0x28, - 0xe9, 0x17, 0x60, 0xd6, 0x09, 0xfa, 0x56, 0xd7, 0x93, 0x9b, 0x29, 0x25, 0x6e, 0xd8, 0x0f, 0xba, - 0x5e, 0x0c, 0xb2, 0x6c, 0xc5, 0x02, 0xde, 0x82, 0x72, 0x18, 0xf1, 0x43, 0xb2, 0xd5, 0x17, 0xe5, - 0xa8, 0xda, 0xfc, 0xc6, 0xde, 0x36, 0x90, 0x43, 0xdf, 0x90, 0x1a, 0xad, 0x44, 0x37, 0x7e, 0x04, - 0x15, 0x55, 0x09, 0x43, 0x63, 0x6e, 0x69, 0x6a, 0xb9, 0xda, 0xdc, 0xd8, 0xbb, 0xa1, 0xd7, 0x7d, - 0x7e, 0xc0, 0x6b, 0x55, 0xdf, 0x4a, 0xad, 0xe0, 0x45, 0xa8, 0x74, 0x64, 0xae, 0x87, 0x46, 0x59, - 0x78, 0x3b, 0xed, 0xc0, 0xdf, 0x81, 0x19, 0xd7, 0xdb, 0x62, 0xa1, 0x51, 0x11, 0x60, 0xae, 0xed, - 0x0d, 0xcc, 0x1d, 0x6f, 0x8b, 0x59, 0xb1, 0x42, 0xfc, 0x08, 0x0e, 0x04, 0x34, 0x0a, 0xfa, 0xca, - 0x0b, 0x06, 0x08, 0xbf, 0x7e, 0x73, 0x6f, 0x16, 0x2c, 0x5d, 0xa5, 0x95, 0xb5, 0x80, 0xd7, 0xa0, - 0x1a, 0xa6, 0x31, 0x66, 0x54, 0x85, 0x41, 0x23, 0xa3, 0x48, 0x8b, 0x41, 0x4b, 0x1f, 0x3c, 0x14, - 0xc3, 0xf3, 0x39, 0x31, 0xfc, 0x4f, 0x04, 0x8b, 0x43, 0x65, 0x60, 0xc3, 0xa7, 0x85, 0x41, 0x4a, - 0x60, 0x3a, 0xf4, 0xa9, 0x2d, 0x2a, 0x7f, 0xb5, 0x79, 0x77, 0xdf, 0xea, 0x82, 0xb0, 0x2b, 0x54, - 0x17, 0x95, 0xae, 0x89, 0x72, 0xf3, 0xc7, 0x08, 0x3e, 0xaf, 0x69, 0xbe, 0x4f, 0x22, 0x7b, 0xbb, - 0x68, 0x49, 0x3c, 0x87, 0xf8, 0x18, 0x79, 0x9a, 0xc5, 0x02, 0x0f, 0x34, 0xd1, 0x78, 0xd0, 0xf7, - 0x39, 0x0c, 0xfe, 0x25, 0xed, 0x98, 0xe8, 0xd0, 0x7f, 0x07, 0x41, 0x4d, 0xaf, 0x7c, 0xac, 0xdd, - 0x7e, 0x93, 0xd8, 0x3b, 0x45, 0x50, 0x0e, 0x42, 0xc9, 0x75, 0x04, 0x8e, 0x29, 0xab, 0xe4, 0x3a, - 0xbb, 0x4c, 0xfb, 0x41, 0x50, 0xb3, 0x39, 0xa0, 0x3e, 0x19, 0x00, 0xa5, 0x52, 0xac, 0x00, 0xd4, - 0x22, 0x54, 0xbc, 0x81, 0xcb, 0x54, 0xda, 0x91, 0x73, 0x89, 0x2a, 0x0d, 0x5d, 0xa2, 0x0c, 0x98, - 0xeb, 0x25, 0xb7, 0x5e, 0xfe, 0x59, 0x89, 0x7c, 0x21, 0xad, 0x80, 0x75, 0x7d, 0xe9, 0xc0, 0x58, - 0xe0, 0x28, 0x76, 0x5c, 0xcf, 0x31, 0x66, 0x63, 0x14, 0xbc, 0x3d, 0xd1, 0x3d, 0xf7, 0xdd, 0x12, - 0x7c, 0x21, 0x67, 0x71, 0x63, 0x23, 0xe0, 0xf9, 0x58, 0x61, 0x12, 0x87, 0x73, 0x23, 0xe3, 0xb0, - 0x3c, 0x2e, 0x0e, 0x2b, 0x39, 0x5e, 0x79, 0xbb, 0x04, 0x4b, 0x39, 0x5e, 0x19, 0x7f, 0xa0, 0x3e, - 0x37, 0x6e, 0xd9, 0x62, 0x81, 0xdc, 0xf1, 0xb2, 0x15, 0x0b, 0x3c, 0x33, 0x58, 0xe0, 0x6f, 0x13, - 0xcf, 0x28, 0xc7, 0x99, 0x11, 0x4b, 0x13, 0x39, 0xe4, 0xbf, 0x08, 0x0c, 0xe5, 0x85, 0xab, 0xb6, - 0xf0, 0x49, 0xd7, 0x7b, 0xfe, 0x1d, 0xb1, 0x00, 0xb3, 0x44, 0xa0, 0x95, 0x01, 0x22, 0xa5, 0xa1, - 0x25, 0x97, 0xf3, 0x6b, 0xe2, 0xb1, 0xec, 0x92, 0xc3, 0x75, 0x37, 0x8c, 0xd4, 0x85, 0x16, 0x6f, - 0xc1, 0x5c, 0xac, 0x2d, 0xbe, 0xc2, 0x54, 0x9b, 0xeb, 0x7b, 0x3d, 0xd8, 0x32, 0xee, 0x55, 0xca, - 0xcd, 0x57, 0xe0, 0x58, 0x6e, 0xf5, 0x91, 0x30, 0x6a, 0x50, 0x56, 0x87, 0xb9, 0xdc, 0x80, 0x44, - 0x36, 0xff, 0x33, 0x95, 0x2d, 0xeb, 0xcc, 0x59, 0x67, 0xad, 0x82, 0xb7, 0x60, 0xf1, 0xa6, 0x19, - 0x30, 0xe7, 0x33, 0x47, 0x7b, 0xf6, 0x29, 0x91, 0xcf, 0xb3, 0x99, 0x17, 0x11, 0xd7, 0xa3, 0x81, - 0x3c, 0x5f, 0xd2, 0x0e, 0xee, 0xec, 0xd0, 0xf5, 0x6c, 0xba, 0x41, 0x6d, 0xe6, 0x39, 0xa1, 0xd8, - 0xb5, 0x29, 0x2b, 0xd3, 0x87, 0x6f, 0x43, 0x45, 0xc8, 0x0f, 0xdc, 0x4e, 0x5c, 0x84, 0xab, 0xcd, - 0x95, 0x7a, 0x4c, 0x95, 0xd4, 0x75, 0xaa, 0x24, 0xf5, 0x61, 0x87, 0x46, 0xa4, 0xde, 0xbb, 0x54, - 0xe7, 0x33, 0xac, 0x74, 0x32, 0xc7, 0x12, 0x11, 0xb7, 0xbd, 0xee, 0x7a, 0xe2, 0x82, 0xc5, 0x4d, - 0xa5, 0x1d, 0x3c, 0x20, 0xb6, 0x58, 0xbb, 0xcd, 0x1e, 0xab, 0x1c, 0x88, 0x25, 0x3e, 0xab, 0xeb, - 0x45, 0x6e, 0x5b, 0xd8, 0x8f, 0x13, 0x20, 0xed, 0x10, 0xb3, 0xdc, 0x76, 0x44, 0x03, 0x71, 0x85, - 0xa9, 0x58, 0x52, 0x4a, 0x42, 0xae, 0x1a, 0xf3, 0x02, 0x2a, 0xf7, 0xe2, 0xe0, 0x9c, 0xd7, 0x83, - 0x73, 0x30, 0xe0, 0x0f, 0xe4, 0xbc, 0x9b, 0x05, 0x19, 0x42, 0x7b, 0x2e, 0xeb, 0x86, 0xc6, 0xc1, - 0xf8, 0x10, 0x57, 0xf2, 0x50, 0xc0, 0x1e, 0xca, 0x09, 0xd8, 0xdf, 0x23, 0x28, 0xaf, 0xb3, 0xd6, - 0x0d, 0x2f, 0x0a, 0xfa, 0xe2, 0x66, 0xcf, 0xbc, 0x88, 0x7a, 0x2a, 0x2a, 0x94, 0xc8, 0x5d, 0x1d, - 0xb9, 0x1d, 0xba, 0x11, 0x91, 0x8e, 0x2f, 0xef, 0x24, 0xbb, 0x72, 0x75, 0x32, 0x99, 0x2f, 0xbf, - 0x4d, 0xc2, 0x48, 0x64, 0x6f, 0xd9, 0x12, 0x6d, 0x0e, 0x34, 0x19, 0xb0, 0x11, 0x05, 0x32, 0x75, - 0x33, 0x7d, 0x7a, 0x20, 0xcd, 0xc4, 0xd8, 0xa4, 0x68, 0x6e, 0xc0, 0x4b, 0xc9, 0x55, 0xf6, 0x01, - 0x0d, 0x3a, 0xae, 0x47, 0x8a, 0xeb, 0xed, 0x24, 0x2c, 0xcc, 0xc3, 0x4c, 0x02, 0xf1, 0xfb, 0xdf, - 0xa6, 0xeb, 0x39, 0xec, 0x71, 0x41, 0x22, 0x4c, 0xa2, 0xf6, 0x6f, 0x59, 0xbe, 0x45, 0xd3, 0x9b, - 0xe4, 0xe6, 0x6d, 0x38, 0xc0, 0xb3, 0xb8, 0x47, 0xe5, 0x07, 0x59, 0x28, 0xcc, 0x51, 0x4f, 0xf2, - 0x54, 0x87, 0x95, 0x9d, 0x88, 0xd7, 0xe1, 0x10, 0x09, 0x43, 0xb7, 0xe5, 0x51, 0x47, 0xe9, 0x2a, - 0x4d, 0xac, 0x6b, 0x70, 0x6a, 0xfc, 0xec, 0x13, 0x23, 0xe4, 0xde, 0x29, 0xd1, 0xfc, 0x11, 0x82, - 0xa3, 0xb9, 0x4a, 0x92, 0x58, 0x47, 0x5a, 0x79, 0xad, 0x41, 0x39, 0xb4, 0xb7, 0xa9, 0xd3, 0x6d, - 0x53, 0xc5, 0x6b, 0x28, 0x99, 0x7f, 0x73, 0xba, 0xf1, 0x4e, 0xca, 0xf2, 0x9e, 0xc8, 0xf8, 0x04, - 0x40, 0x87, 0x78, 0x5d, 0xd2, 0x16, 0x10, 0xa6, 0x05, 0x04, 0xad, 0xc7, 0x5c, 0x84, 0x5a, 0x5e, - 0x18, 0x48, 0x26, 0xe1, 0x1f, 0x08, 0x0e, 0xaa, 0x32, 0x28, 0xf7, 0x70, 0x19, 0x0e, 0x69, 0x6e, - 0xb8, 0x97, 0x6e, 0xe7, 0x60, 0xf7, 0x98, 0x12, 0xa7, 0x62, 0x61, 0x2a, 0xcb, 0x5e, 0xf6, 0x32, - 0xfc, 0xe3, 0xc4, 0xe7, 0x10, 0xda, 0xd5, 0x4d, 0xec, 0x87, 0x60, 0xdc, 0x25, 0x1e, 0x69, 0x51, - 0x27, 0x59, 0x5c, 0x12, 0x48, 0xdf, 0xd7, 0x1f, 0xcb, 0x7b, 0x7e, 0x9a, 0x26, 0xd7, 0x19, 0x77, - 0x6b, 0x4b, 0x3e, 0xbc, 0x9b, 0x3f, 0x59, 0x02, 0xac, 0x6f, 0x3c, 0x0d, 0x7a, 0xae, 0x4d, 0xf1, - 0x3b, 0x08, 0xa6, 0xf9, 0xa9, 0x87, 0x8f, 0x8f, 0x8a, 0x33, 0xb1, 0x01, 0xb5, 0xfd, 0x7b, 0xd5, - 0x70, 0x6b, 0xe6, 0xe2, 0x5b, 0x7f, 0xff, 0xf7, 0xbb, 0xa5, 0x05, 0xfc, 0xa2, 0xe0, 0xd2, 0x7b, - 0x97, 0x74, 0x5e, 0x3b, 0xc4, 0x3f, 0x45, 0x80, 0xe5, 0x51, 0xac, 0x51, 0x9c, 0xf8, 0xfc, 0x28, - 0x88, 0x39, 0x54, 0x68, 0xed, 0xb8, 0x56, 0xf2, 0xea, 0x36, 0x0b, 0x28, 0x2f, 0x70, 0x62, 0x80, - 0x00, 0xb0, 0x22, 0x00, 0x9c, 0xc2, 0x66, 0x1e, 0x80, 0xc6, 0x13, 0x1e, 0x18, 0x4f, 0x1b, 0x34, - 0xb6, 0xfb, 0x21, 0x82, 0x99, 0x4d, 0x71, 0xf1, 0x1c, 0xe3, 0xa4, 0x8d, 0x7d, 0x73, 0x92, 0x30, - 0x27, 0xd0, 0x9a, 0x27, 0x05, 0xd2, 0xe3, 0xf8, 0x98, 0x42, 0x1a, 0x46, 0x01, 0x25, 0x9d, 0x0c, - 0xe0, 0x8b, 0x08, 0x7f, 0x8c, 0x60, 0x36, 0xe6, 0xdc, 0xf0, 0xe9, 0x51, 0x28, 0x33, 0x9c, 0x5c, - 0x6d, 0xff, 0x08, 0x2c, 0xf3, 0x9c, 0xc0, 0x78, 0xd2, 0xcc, 0xdd, 0xce, 0xb5, 0x0c, 0xbd, 0xf5, - 0x1e, 0x82, 0xa9, 0x5b, 0x74, 0x6c, 0xbc, 0xed, 0x23, 0xb8, 0x21, 0x07, 0xe6, 0x6c, 0x35, 0xfe, - 0x08, 0xc1, 0x4b, 0xb7, 0x68, 0x94, 0x5f, 0xef, 0xf1, 0xf2, 0xf8, 0x22, 0x2c, 0xc3, 0xee, 0xfc, - 0x04, 0x23, 0x93, 0x42, 0xd7, 0x10, 0xc8, 0xce, 0xe1, 0xb3, 0x45, 0x41, 0x18, 0xf6, 0x3d, 0xfb, - 0xb1, 0xc4, 0xf1, 0x67, 0x04, 0x87, 0x07, 0x7f, 0x70, 0xc0, 0xd9, 0x13, 0x22, 0xf7, 0xf7, 0x88, - 0xda, 0xbd, 0xbd, 0x16, 0x94, 0xac, 0x52, 0xf3, 0xaa, 0x40, 0xfe, 0x2a, 0x7e, 0xa5, 0x08, 0xb9, - 0x62, 0xea, 0xc2, 0xc6, 0x13, 0xd5, 0x7c, 0x2a, 0x7e, 0x01, 0x13, 0xb0, 0xdf, 0x42, 0x30, 0x7f, - 0x8b, 0x46, 0x77, 0x13, 0xa2, 0xea, 0xf4, 0x44, 0x44, 0x76, 0x6d, 0xb1, 0xae, 0xfd, 0x50, 0xa5, - 0x3e, 0x25, 0x2e, 0x5d, 0x15, 0xc0, 0xce, 0xe2, 0xd3, 0x45, 0xc0, 0x52, 0x72, 0xec, 0x43, 0x04, - 0x47, 0x75, 0x10, 0x29, 0xcd, 0xff, 0xa5, 0xdd, 0xd1, 0xea, 0x92, 0x9c, 0x1f, 0x83, 0xae, 0x29, - 0xd0, 0x5d, 0x30, 0xf3, 0x37, 0xbc, 0x33, 0x84, 0x62, 0x0d, 0xad, 0x2c, 0x23, 0xfc, 0x07, 0x04, - 0xb3, 0x31, 0x13, 0x35, 0xda, 0x47, 0x19, 0xc2, 0x7a, 0x3f, 0xb3, 0xe7, 0x86, 0x80, 0xfc, 0xb5, - 0xda, 0xc5, 0x7c, 0x87, 0xea, 0xf3, 0xd5, 0xd6, 0xd6, 0x85, 0x97, 0xb3, 0x69, 0xff, 0x1b, 0x04, - 0x90, 0xb2, 0x69, 0xf8, 0x5c, 0xf1, 0x3a, 0x34, 0xc6, 0xad, 0xb6, 0xbf, 0x7c, 0x9a, 0x59, 0x17, - 0xeb, 0x59, 0xae, 0x2d, 0x15, 0xe6, 0x9c, 0x4f, 0xed, 0xb5, 0x98, 0x79, 0xfb, 0x25, 0x82, 0x19, - 0x41, 0x96, 0xe0, 0x53, 0xa3, 0x30, 0xeb, 0x5c, 0xca, 0x7e, 0xba, 0xfe, 0x8c, 0x80, 0xba, 0xd4, - 0x2c, 0x2a, 0x5c, 0x6b, 0x68, 0x05, 0xf7, 0x60, 0x36, 0x26, 0x2e, 0x46, 0x87, 0x47, 0x86, 0xd8, - 0xa8, 0x2d, 0x15, 0x1c, 0xa4, 0x71, 0xa0, 0xca, 0x9a, 0xb9, 0x32, 0xae, 0x66, 0x4e, 0xf3, 0xb2, - 0x86, 0x4f, 0x16, 0x15, 0xbd, 0x4f, 0xc1, 0x31, 0xe7, 0x05, 0xba, 0xd3, 0xe6, 0xd2, 0xb8, 0xba, - 0xc9, 0xbd, 0xf3, 0x73, 0x04, 0x87, 0x07, 0xef, 0x5d, 0xf8, 0xd8, 0x40, 0xcd, 0xd4, 0x2f, 0x9b, - 0xb5, 0xac, 0x17, 0x47, 0xdd, 0xd9, 0xcc, 0xaf, 0x0b, 0x14, 0x6b, 0xf8, 0xca, 0xd8, 0xcc, 0xb8, - 0xa7, 0xaa, 0x0e, 0x57, 0xb4, 0x9a, 0x12, 0xf7, 0xbf, 0x45, 0x30, 0xaf, 0xf4, 0x3e, 0x08, 0x28, - 0x2d, 0x86, 0xb5, 0x7f, 0x89, 0xc0, 0x6d, 0x99, 0x5f, 0x11, 0xf0, 0xbf, 0x8c, 0x2f, 0x4f, 0x08, - 0x5f, 0xc1, 0x5e, 0x8d, 0x38, 0xd2, 0x3f, 0x22, 0x38, 0xb2, 0x19, 0xc7, 0xfd, 0x67, 0x84, 0xff, - 0xba, 0xc0, 0xff, 0x55, 0xfc, 0x6a, 0xc1, 0xbd, 0x68, 0xdc, 0x32, 0x2e, 0x22, 0xfc, 0x6b, 0x04, - 0x65, 0x45, 0x43, 0xe3, 0xb3, 0x23, 0x13, 0x23, 0x4b, 0x54, 0xef, 0x67, 0x30, 0xcb, 0x4b, 0x80, - 0x79, 0xaa, 0xf0, 0x28, 0x95, 0xf6, 0x79, 0x40, 0xbf, 0x87, 0x00, 0x27, 0x8f, 0xa6, 0xe4, 0x19, - 0x85, 0xcf, 0x64, 0x4c, 0x8d, 0x7c, 0x65, 0xd7, 0xce, 0x8e, 0x1d, 0x97, 0x3d, 0x4a, 0x57, 0x0a, - 0x8f, 0x52, 0x96, 0xd8, 0x7f, 0x1b, 0x41, 0xf5, 0x16, 0x4d, 0xee, 0xec, 0x05, 0xbe, 0xcc, 0xf2, - 0xeb, 0xb5, 0xe5, 0xf1, 0x03, 0x25, 0xa2, 0x0b, 0x02, 0xd1, 0x19, 0x5c, 0xec, 0x2a, 0x05, 0xe0, - 0x03, 0x04, 0x07, 0xee, 0xeb, 0x21, 0x8a, 0x2f, 0x8c, 0xb3, 0x94, 0xa9, 0xe4, 0x93, 0xe3, 0xfa, - 0xa2, 0xc0, 0xb5, 0x6a, 0x4e, 0x84, 0x6b, 0x4d, 0x92, 0xd8, 0xbf, 0x40, 0xf0, 0x82, 0xfe, 0xc8, - 0x91, 0x14, 0xe4, 0xff, 0xeb, 0xb7, 0x02, 0x26, 0xd3, 0xbc, 0x2c, 0xf0, 0xd5, 0xf1, 0x85, 0x49, - 0xf0, 0x35, 0x24, 0x2f, 0x89, 0xdf, 0x47, 0x70, 0x44, 0x90, 0xc0, 0xba, 0xe2, 0x81, 0x23, 0x66, - 0x14, 0x65, 0x3c, 0xc1, 0x11, 0x23, 0xeb, 0x8f, 0xb9, 0x2b, 0x50, 0x6b, 0x8a, 0xe0, 0xfd, 0x19, - 0x82, 0x83, 0xea, 0x50, 0x93, 0xbb, 0xbb, 0x3a, 0xce, 0x71, 0xbb, 0x3d, 0x04, 0x65, 0xb8, 0xad, - 0x4c, 0x16, 0x6e, 0x1f, 0x23, 0x98, 0x93, 0x04, 0x6c, 0xc1, 0x55, 0x41, 0x63, 0x68, 0x6b, 0x47, - 0x33, 0xa3, 0x14, 0xb3, 0x67, 0x7e, 0x57, 0x98, 0x7d, 0x88, 0x1b, 0x45, 0x66, 0x7d, 0xe6, 0x84, - 0x8d, 0x27, 0x92, 0x56, 0x7b, 0xda, 0x68, 0xb3, 0x56, 0xf8, 0x86, 0x89, 0x0b, 0x0f, 0x44, 0x3e, - 0xe6, 0x22, 0xba, 0x76, 0xf3, 0x4f, 0xcf, 0x4e, 0xa0, 0xbf, 0x3e, 0x3b, 0x81, 0xfe, 0xf5, 0xec, - 0x04, 0x7a, 0xe3, 0xca, 0x64, 0x7f, 0x3c, 0xb3, 0xdb, 0x2e, 0xf5, 0x22, 0x5d, 0xed, 0xff, 0x02, - 0x00, 0x00, 0xff, 0xff, 0xa8, 0x3a, 0x7a, 0xdf, 0x5e, 0x27, 0x00, 0x00, + 0x15, 0xa7, 0x66, 0xbf, 0x66, 0xde, 0xac, 0xbf, 0x2a, 0xf1, 0xd2, 0x69, 0x6f, 0xcc, 0xba, 0xfd, + 0xb5, 0x5e, 0x7b, 0x67, 0xec, 0xc1, 0x20, 0x67, 0x13, 0x04, 0xfe, 0xb6, 0x61, 0xed, 0x98, 0x5e, + 0x1b, 0xa3, 0x70, 0x80, 0x4a, 0x77, 0xed, 0x6c, 0xb3, 0x3d, 0xdd, 0xed, 0xee, 0x9e, 0xb1, 0x46, + 0xc6, 0x97, 0x20, 0x24, 0x0e, 0x51, 0x90, 0x92, 0x1c, 0x50, 0x14, 0x21, 0x94, 0x28, 0x17, 0x2e, + 0xdc, 0x10, 0x12, 0x17, 0xb8, 0x20, 0x90, 0x38, 0x20, 0x3e, 0x2e, 0x39, 0x21, 0x8b, 0x1b, 0x17, + 0xfe, 0x04, 0x54, 0xd5, 0x55, 0xdd, 0xd5, 0x33, 0x3d, 0x3d, 0xb3, 0xd9, 0x45, 0xf1, 0xad, 0x5e, + 0x4d, 0xd5, 0x7b, 0xbf, 0x7a, 0xf5, 0xbe, 0xea, 0xf5, 0xc0, 0x89, 0x88, 0x86, 0x3d, 0x1a, 0x36, + 0x49, 0x10, 0xb8, 0x8e, 0x45, 0x62, 0xc7, 0xf7, 0xd4, 0x71, 0x23, 0x08, 0xfd, 0xd8, 0xc7, 0x75, + 0x65, 0x4a, 0x5f, 0x6c, 0xfb, 0x7e, 0xdb, 0xa5, 0x4d, 0x12, 0x38, 0x4d, 0xe2, 0x79, 0x7e, 0xcc, + 0xa7, 0xa3, 0x64, 0xa9, 0x6e, 0x6c, 0x5f, 0x8a, 0x1a, 0x8e, 0xcf, 0x7f, 0xb5, 0xfc, 0x90, 0x36, + 0x7b, 0x17, 0x9a, 0x6d, 0xea, 0xd1, 0x90, 0xc4, 0xd4, 0x16, 0x6b, 0x2e, 0x66, 0x6b, 0x3a, 0xc4, + 0xda, 0x72, 0x3c, 0x1a, 0xf6, 0x9b, 0xc1, 0x76, 0x9b, 0x4d, 0x44, 0xcd, 0x0e, 0x8d, 0x49, 0xd1, + 0xae, 0xf5, 0xb6, 0x13, 0x6f, 0x75, 0xdf, 0x6c, 0x58, 0x7e, 0xa7, 0x49, 0xc2, 0xb6, 0x1f, 0x84, + 0xfe, 0x0f, 0xf9, 0x60, 0xd5, 0xb2, 0x9b, 0xbd, 0x56, 0xc6, 0x40, 0x3d, 0x4b, 0xef, 0x02, 0x71, + 0x83, 0x2d, 0x32, 0xcc, 0xed, 0xfa, 0x18, 0x6e, 0x21, 0x0d, 0x7c, 0xa1, 0x1b, 0x3e, 0x74, 0x62, + 0x3f, 0xec, 0x2b, 0xc3, 0x84, 0x8d, 0xf1, 0x29, 0x82, 0x83, 0x97, 0x33, 0x79, 0xdf, 0xee, 0xd2, + 0xb0, 0x8f, 0x31, 0x4c, 0x7b, 0xa4, 0x43, 0x35, 0xb4, 0x84, 0x96, 0x6b, 0x26, 0x1f, 0x63, 0x0d, + 0xe6, 0x42, 0xba, 0x19, 0xd2, 0x68, 0x4b, 0xab, 0xf0, 0x69, 0x49, 0x62, 0x1d, 0xaa, 0x4c, 0x38, + 0xb5, 0xe2, 0x48, 0x9b, 0x5a, 0x9a, 0x5a, 0xae, 0x99, 0x29, 0x8d, 0x97, 0xe1, 0x40, 0x48, 0x23, + 0xbf, 0x1b, 0x5a, 0xf4, 0x3b, 0x34, 0x8c, 0x1c, 0xdf, 0xd3, 0xa6, 0xf9, 0xee, 0xc1, 0x69, 0xc6, + 0x25, 0xa2, 0x2e, 0xb5, 0x62, 0x3f, 0xd4, 0x66, 0xf8, 0x92, 0x94, 0x66, 0x78, 0x18, 0x70, 0x6d, + 0x36, 0xc1, 0xc3, 0xc6, 0xd8, 0x80, 0x79, 0x12, 0x04, 0x77, 0x49, 0x87, 0x46, 0x01, 0xb1, 0xa8, + 0x36, 0xc7, 0x7f, 0xcb, 0xcd, 0x19, 0x57, 0xa1, 0x76, 0xd7, 0xb7, 0xe9, 0xe8, 0x43, 0x0d, 0x32, + 0xa9, 0x14, 0x30, 0xd9, 0x86, 0xc3, 0x26, 0xed, 0x39, 0x0c, 0xe4, 0x1d, 0x1a, 0x13, 0x9b, 0xc4, + 0x64, 0x90, 0x61, 0x25, 0x65, 0xa8, 0x43, 0x35, 0x14, 0x8b, 0xb5, 0x0a, 0x9f, 0x4f, 0xe9, 0x21, + 0x61, 0x53, 0x05, 0xc2, 0xfe, 0x82, 0xe0, 0xa8, 0x72, 0x1d, 0xa6, 0x50, 0xd2, 0xf5, 0x1e, 0xf5, + 0xe2, 0x68, 0xb4, 0xd8, 0x73, 0x70, 0x48, 0xea, 0x73, 0xf0, 0x30, 0xc3, 0x3f, 0x30, 0x20, 0xea, + 0xa4, 0x04, 0xa2, 0xce, 0xe1, 0x25, 0xa8, 0x4b, 0xfa, 0xc1, 0xed, 0x6b, 0xe2, 0xd2, 0xd4, 0xa9, + 0xa1, 0xe3, 0xcc, 0x14, 0x1c, 0xc7, 0x03, 0x4d, 0x39, 0xcd, 0x1d, 0xe2, 0x39, 0x9b, 0x34, 0x8a, + 0x27, 0x55, 0x1f, 0xda, 0xb1, 0xfa, 0x8e, 0x41, 0xed, 0x86, 0xe3, 0xd2, 0xab, 0x5b, 0x5d, 0x6f, + 0x1b, 0xbf, 0x08, 0x33, 0x16, 0x1b, 0x70, 0x09, 0xf3, 0x66, 0x42, 0x18, 0x8f, 0xe1, 0xd8, 0x28, + 0x48, 0x0f, 0x9d, 0x78, 0x8b, 0x6d, 0x8f, 0x46, 0x61, 0xb3, 0xb6, 0xa8, 0xb5, 0x1d, 0x75, 0x3b, + 0xf2, 0x6a, 0x25, 0x3d, 0x11, 0xb6, 0x5f, 0x21, 0x58, 0x1e, 0x2b, 0xf9, 0x61, 0x48, 0x82, 0x80, + 0x86, 0xf8, 0x06, 0xcc, 0x3c, 0x62, 0x3f, 0x70, 0x6b, 0xad, 0xb7, 0x1a, 0x0d, 0x35, 0xa6, 0x8d, + 0xe5, 0x72, 0xeb, 0x0b, 0x66, 0xb2, 0x1d, 0x37, 0xa4, 0x0e, 0x2a, 0x9c, 0xcf, 0x42, 0x8e, 0x4f, + 0xaa, 0x2a, 0xb6, 0x9e, 0x2f, 0xbb, 0x32, 0x0b, 0xd3, 0x01, 0x09, 0x63, 0xe3, 0x30, 0xbc, 0x90, + 0x37, 0xc3, 0xc0, 0xf7, 0x22, 0x6a, 0xfc, 0x0e, 0xe5, 0x2e, 0xf4, 0x6a, 0x48, 0x49, 0x4c, 0x4d, + 0xfa, 0xa8, 0x4b, 0xa3, 0x18, 0x6f, 0x83, 0x1a, 0x66, 0xb9, 0xee, 0xea, 0xad, 0xdb, 0x8d, 0x2c, + 0x4e, 0x35, 0x64, 0x9c, 0xe2, 0x83, 0xef, 0x5b, 0x76, 0xa3, 0xd7, 0x6a, 0x04, 0xdb, 0xed, 0x06, + 0x8b, 0x7a, 0x39, 0x64, 0x32, 0xea, 0xa9, 0x47, 0x35, 0x55, 0xee, 0x78, 0x01, 0x66, 0xbb, 0x41, + 0x44, 0xc3, 0x98, 0x9f, 0xac, 0x6a, 0x0a, 0x8a, 0xdd, 0x52, 0x8f, 0xb8, 0x8e, 0x4d, 0xe2, 0xe4, + 0x16, 0xaa, 0x66, 0x4a, 0x1b, 0x1f, 0xe7, 0xd1, 0x3f, 0x08, 0xec, 0xcf, 0x0b, 0xbd, 0x8a, 0xb2, + 0x32, 0x80, 0xf2, 0x83, 0x3c, 0xca, 0x6b, 0xd4, 0xa5, 0x19, 0xca, 0x22, 0xc3, 0xd4, 0x60, 0xce, + 0x22, 0x91, 0x45, 0x6c, 0xc9, 0x4b, 0x92, 0x2c, 0x2c, 0x04, 0xa1, 0x1f, 0x90, 0x36, 0xe7, 0x74, + 0xcf, 0x77, 0x1d, 0xab, 0x2f, 0x6c, 0x73, 0xf8, 0x87, 0x21, 0x23, 0x9e, 0x2e, 0x30, 0xe2, 0xe3, + 0x50, 0xdf, 0xe8, 0x7b, 0xd6, 0xeb, 0x01, 0x4f, 0x99, 0xcc, 0xc5, 0x9c, 0x98, 0x76, 0x22, 0x0d, + 0xf1, 0xb8, 0x9f, 0x10, 0xc6, 0x87, 0x33, 0xb0, 0xa0, 0x9c, 0x80, 0x6d, 0x28, 0xc3, 0x5f, 0xe6, + 0xf4, 0x0b, 0x30, 0x6b, 0x87, 0x7d, 0xb3, 0xeb, 0x89, 0xcb, 0x14, 0x14, 0x13, 0x1c, 0x84, 0x5d, + 0x2f, 0x01, 0x59, 0x35, 0x13, 0x02, 0x6f, 0x42, 0x35, 0x8a, 0x59, 0x92, 0x6c, 0xf7, 0x79, 0x38, + 0xaa, 0xb7, 0xbe, 0xb9, 0xbb, 0x0b, 0x64, 0xd0, 0x37, 0x04, 0x47, 0x33, 0xe5, 0x8d, 0x1f, 0x41, + 0x4d, 0x46, 0xc2, 0x48, 0x9b, 0x5b, 0x9a, 0x5a, 0xae, 0xb7, 0x36, 0x76, 0x2f, 0xe8, 0xf5, 0x80, + 0x25, 0x78, 0x25, 0xea, 0x9b, 0x99, 0x14, 0xbc, 0x08, 0xb5, 0x8e, 0xf0, 0xf5, 0x48, 0xab, 0x72, + 0x6d, 0x67, 0x13, 0xf8, 0xbb, 0x30, 0xe3, 0x78, 0x9b, 0x7e, 0xa4, 0xd5, 0x38, 0x98, 0x2b, 0xbb, + 0x03, 0x73, 0xdb, 0xdb, 0xf4, 0xcd, 0x84, 0x21, 0x7e, 0x04, 0xfb, 0x42, 0x1a, 0x87, 0x7d, 0xa9, + 0x05, 0x0d, 0xb8, 0x5e, 0xbf, 0xb5, 0x3b, 0x09, 0xa6, 0xca, 0xd2, 0xcc, 0x4b, 0xc0, 0x6b, 0x50, + 0x8f, 0x32, 0x1b, 0xd3, 0xea, 0x5c, 0xa0, 0x96, 0x63, 0xa4, 0xd8, 0xa0, 0xa9, 0x2e, 0x1e, 0xb2, + 0xe1, 0xf9, 0x02, 0x1b, 0xfe, 0x27, 0x82, 0xc5, 0xa1, 0x30, 0xb0, 0x11, 0xd0, 0x52, 0x23, 0x25, + 0x30, 0x1d, 0x05, 0xd4, 0xe2, 0x91, 0xbf, 0xde, 0xba, 0xb3, 0x67, 0x71, 0x81, 0xcb, 0xe5, 0xac, + 0xcb, 0x42, 0xd7, 0x44, 0xbe, 0xf9, 0x13, 0x04, 0x5f, 0x54, 0x38, 0xdf, 0x23, 0xb1, 0xb5, 0x55, + 0x76, 0x24, 0xe6, 0x43, 0x6c, 0x8d, 0xc8, 0x66, 0x09, 0xc1, 0x0c, 0x8d, 0x0f, 0xee, 0xf7, 0x03, + 0x06, 0x83, 0xfd, 0x92, 0x4d, 0x4c, 0x94, 0xf4, 0xdf, 0x45, 0xa0, 0xab, 0x91, 0xcf, 0x77, 0xdd, + 0x37, 0x89, 0xb5, 0x5d, 0x06, 0x65, 0x3f, 0x54, 0x1c, 0x9b, 0xe3, 0x98, 0x32, 0x2b, 0x8e, 0xbd, + 0x43, 0xb7, 0x1f, 0x04, 0x35, 0x5b, 0x00, 0xea, 0xd3, 0x01, 0x50, 0xd2, 0xc5, 0x4a, 0x40, 0x2d, + 0x42, 0xcd, 0x1b, 0x28, 0xa6, 0xb2, 0x89, 0x82, 0x22, 0xaa, 0x32, 0x54, 0x44, 0x69, 0x30, 0xd7, + 0x4b, 0xab, 0x5e, 0xf6, 0xb3, 0x24, 0xd9, 0x41, 0xda, 0xa1, 0xdf, 0x0d, 0x84, 0x02, 0x13, 0x82, + 0xa1, 0xd8, 0x76, 0x3c, 0x5b, 0x9b, 0x4d, 0x50, 0xb0, 0xf1, 0x44, 0x75, 0xee, 0x7b, 0x15, 0xf8, + 0x52, 0xc1, 0xe1, 0xc6, 0x5a, 0xc0, 0xf3, 0x71, 0xc2, 0xd4, 0x0e, 0xe7, 0x46, 0xda, 0x61, 0x75, + 0x9c, 0x1d, 0xd6, 0x0a, 0xb4, 0xf2, 0x4e, 0x05, 0x96, 0x0a, 0xb4, 0x32, 0x3e, 0xa1, 0x3e, 0x37, + 0x6a, 0xd9, 0xf4, 0x43, 0x71, 0xe3, 0x55, 0x33, 0x21, 0x98, 0x67, 0xf8, 0x61, 0xb0, 0x45, 0x3c, + 0xad, 0x9a, 0x78, 0x46, 0x42, 0x4d, 0xa4, 0x90, 0xff, 0x22, 0xd0, 0xa4, 0x16, 0x2e, 0x5b, 0x5c, + 0x27, 0x5d, 0xef, 0xf9, 0x57, 0xc4, 0x02, 0xcc, 0x12, 0x8e, 0x56, 0x18, 0x88, 0xa0, 0x86, 0x8e, + 0x5c, 0x2d, 0x8e, 0x89, 0x47, 0xf2, 0x47, 0x8e, 0xd6, 0x9d, 0x28, 0x96, 0x05, 0x2d, 0xde, 0x84, + 0xb9, 0x84, 0x5b, 0x52, 0xc2, 0xd4, 0x5b, 0xeb, 0xbb, 0x4d, 0x6c, 0x39, 0xf5, 0x4a, 0xe6, 0xc6, + 0x2b, 0x70, 0xa4, 0x30, 0xfa, 0x08, 0x18, 0x3a, 0x54, 0x65, 0x32, 0x17, 0x17, 0x90, 0xd2, 0xc6, + 0x7f, 0xa6, 0xf2, 0x61, 0xdd, 0xb7, 0xd7, 0xfd, 0x76, 0xc9, 0x5b, 0xb0, 0xfc, 0xd2, 0x34, 0x98, + 0x0b, 0x7c, 0x5b, 0x79, 0xf6, 0x49, 0x92, 0xed, 0xb3, 0x7c, 0x2f, 0x26, 0x8e, 0x47, 0x43, 0x91, + 0x5f, 0xb2, 0x09, 0xa6, 0xec, 0xc8, 0xf1, 0x2c, 0xba, 0x41, 0x2d, 0xdf, 0xb3, 0x23, 0x7e, 0x6b, + 0x53, 0x66, 0x6e, 0x0e, 0xdf, 0x82, 0x1a, 0xa7, 0xef, 0x3b, 0x9d, 0x24, 0x08, 0xd7, 0x5b, 0x2b, + 0x8d, 0xa4, 0x55, 0xd2, 0x50, 0x5b, 0x25, 0x99, 0x0e, 0x3b, 0x34, 0x26, 0x8d, 0xde, 0x85, 0x06, + 0xdb, 0x61, 0x66, 0x9b, 0x19, 0x96, 0x98, 0x38, 0xee, 0xba, 0xe3, 0xf1, 0x02, 0x8b, 0x89, 0xca, + 0x26, 0x98, 0x41, 0x6c, 0xfa, 0xae, 0xeb, 0x3f, 0x96, 0x3e, 0x90, 0x50, 0x6c, 0x57, 0xd7, 0x8b, + 0x1d, 0x97, 0xcb, 0x4f, 0x1c, 0x20, 0x9b, 0xe0, 0xbb, 0x1c, 0x37, 0xa6, 0x21, 0x2f, 0x61, 0x6a, + 0xa6, 0xa0, 0x52, 0x93, 0xab, 0x27, 0x7d, 0x01, 0xe9, 0x7b, 0x89, 0x71, 0xce, 0xab, 0xc6, 0x39, + 0x68, 0xf0, 0xfb, 0x0a, 0xde, 0xcd, 0xbc, 0x19, 0x42, 0x7b, 0x8e, 0xdf, 0x8d, 0xb4, 0xfd, 0x49, + 0x12, 0x97, 0xf4, 0x90, 0xc1, 0x1e, 0x28, 0x30, 0xd8, 0xdf, 0x23, 0xa8, 0xae, 0xfb, 0xed, 0xeb, + 0x5e, 0x1c, 0xf6, 0x79, 0x65, 0xef, 0x7b, 0x31, 0xf5, 0xa4, 0x55, 0x48, 0x92, 0xa9, 0x3a, 0x76, + 0x3a, 0x74, 0x23, 0x26, 0x9d, 0x40, 0xd4, 0x24, 0x3b, 0x52, 0x75, 0xba, 0x99, 0x1d, 0xdf, 0x25, + 0x51, 0xcc, 0xbd, 0xb7, 0x6a, 0xf2, 0x31, 0x03, 0x9a, 0x2e, 0xd8, 0x88, 0x43, 0xe1, 0xba, 0xb9, + 0x39, 0xd5, 0x90, 0x66, 0x12, 0x6c, 0x82, 0x34, 0x36, 0xe0, 0xa5, 0xb4, 0x94, 0xbd, 0x4f, 0xc3, + 0x8e, 0xe3, 0x91, 0xf2, 0x78, 0x3b, 0x49, 0x17, 0xe6, 0x41, 0xce, 0x81, 0x58, 0xfd, 0xf7, 0xd0, + 0xf1, 0x6c, 0xff, 0x71, 0x89, 0x23, 0x4c, 0xc2, 0xf6, 0x6f, 0xf9, 0x7e, 0x8b, 0xc2, 0x37, 0xf5, + 0xcd, 0x5b, 0xb0, 0x8f, 0x79, 0x71, 0x8f, 0x8a, 0x1f, 0x44, 0xa0, 0x30, 0x46, 0x3d, 0xc9, 0x33, + 0x1e, 0x66, 0x7e, 0x23, 0x5e, 0x87, 0x03, 0x24, 0x8a, 0x9c, 0xb6, 0x47, 0x6d, 0xc9, 0xab, 0x32, + 0x31, 0xaf, 0xc1, 0xad, 0xc9, 0xb3, 0x8f, 0xaf, 0x10, 0x77, 0x27, 0x49, 0xe3, 0xc7, 0x08, 0x0e, + 0x17, 0x32, 0x49, 0x6d, 0x1d, 0x29, 0xe1, 0x55, 0x87, 0x6a, 0x64, 0x6d, 0x51, 0xbb, 0xeb, 0x52, + 0xd9, 0xd7, 0x90, 0x34, 0xfb, 0xcd, 0xee, 0x26, 0x37, 0x29, 0xc2, 0x7b, 0x4a, 0xe3, 0xa3, 0x00, + 0x1d, 0xe2, 0x75, 0x89, 0xcb, 0x21, 0x4c, 0x73, 0x08, 0xca, 0x8c, 0xb1, 0x08, 0x7a, 0x91, 0x19, + 0x88, 0x4e, 0xc2, 0x3f, 0x10, 0xec, 0x97, 0x61, 0x50, 0xdc, 0xe1, 0x32, 0x1c, 0x50, 0xd4, 0x70, + 0x37, 0xbb, 0xce, 0xc1, 0xe9, 0x31, 0x21, 0x4e, 0xda, 0xc2, 0x54, 0xbe, 0x7b, 0xd9, 0xcb, 0xf5, + 0x1f, 0x27, 0xce, 0x43, 0x68, 0x47, 0x95, 0xd8, 0x8f, 0x40, 0xbb, 0x43, 0x3c, 0xd2, 0xa6, 0x76, + 0x7a, 0xb8, 0xd4, 0x90, 0x7e, 0xa0, 0x3e, 0x96, 0x77, 0xfd, 0x34, 0x4d, 0xcb, 0x19, 0x67, 0x73, + 0x53, 0x3e, 0xbc, 0x43, 0xa8, 0xae, 0x3b, 0xde, 0x36, 0x7b, 0xbf, 0xb1, 0x73, 0xc5, 0x4e, 0xec, + 0x4a, 0x1d, 0x26, 0x04, 0x3e, 0x08, 0x53, 0xdd, 0xd0, 0x15, 0xf7, 0xcc, 0x86, 0x78, 0x09, 0xea, + 0x36, 0x8d, 0xac, 0xd0, 0x09, 0xc4, 0x2d, 0xf3, 0x46, 0x9f, 0x32, 0xc5, 0xb4, 0xed, 0x58, 0xbe, + 0x77, 0xd5, 0x25, 0x51, 0x24, 0x13, 0x43, 0x3a, 0x61, 0xbc, 0x06, 0xfb, 0x98, 0xcc, 0xec, 0x98, + 0x67, 0xf3, 0xc7, 0x3c, 0x9c, 0x83, 0x2f, 0xe1, 0x49, 0xc4, 0xd7, 0xe0, 0x20, 0xcb, 0xc7, 0x82, + 0xc3, 0x67, 0xac, 0x44, 0x5a, 0x3f, 0x35, 0x00, 0xab, 0x06, 0x4f, 0xc3, 0x9e, 0x63, 0x51, 0xfc, + 0x2e, 0x82, 0x69, 0xc6, 0x1d, 0xbf, 0x3c, 0xca, 0xbf, 0xb8, 0xe1, 0xe9, 0x7b, 0xf7, 0x9a, 0x63, + 0xd2, 0x8c, 0xc5, 0xb7, 0xfe, 0xfe, 0xef, 0xf7, 0x2a, 0x0b, 0xf8, 0x45, 0xfe, 0x0d, 0xa1, 0x77, + 0x41, 0xed, 0xe7, 0x47, 0xf8, 0x6d, 0x04, 0x58, 0x94, 0x20, 0x4a, 0x6b, 0x17, 0x9f, 0x1d, 0x05, + 0xb1, 0xa0, 0x05, 0xac, 0xbf, 0xac, 0x84, 0xfa, 0x86, 0xe5, 0x87, 0x94, 0x05, 0x76, 0xbe, 0x80, + 0x03, 0x58, 0xe1, 0x00, 0x4e, 0x60, 0xa3, 0x08, 0x40, 0xf3, 0x09, 0xd3, 0xdb, 0xd3, 0x26, 0x4d, + 0xe4, 0x7e, 0x84, 0x60, 0xe6, 0x21, 0x2f, 0xb8, 0xc7, 0x28, 0x69, 0x63, 0xcf, 0x94, 0xc4, 0xc5, + 0x71, 0xb4, 0xc6, 0x71, 0x8e, 0xf4, 0x65, 0x7c, 0x44, 0x22, 0x8d, 0xe2, 0x90, 0x92, 0x4e, 0x0e, + 0xf0, 0x79, 0x84, 0x3f, 0x41, 0x30, 0x9b, 0xf4, 0x1a, 0xf1, 0xc9, 0x51, 0x28, 0x73, 0xbd, 0x48, + 0x7d, 0xef, 0x1a, 0x77, 0xc6, 0x19, 0x8e, 0xf1, 0xb8, 0x51, 0x78, 0x9d, 0x6b, 0xb9, 0xb6, 0xde, + 0xfb, 0x08, 0xa6, 0x6e, 0xd2, 0xb1, 0xf6, 0xb6, 0x87, 0xe0, 0x86, 0x14, 0x58, 0x70, 0xd5, 0xf8, + 0x63, 0x04, 0x2f, 0xdd, 0xa4, 0x71, 0x71, 0x9e, 0xc3, 0xcb, 0xe3, 0x93, 0x8f, 0x30, 0xbb, 0xb3, + 0x13, 0xac, 0x4c, 0x03, 0x7c, 0x93, 0x23, 0x3b, 0x83, 0x4f, 0x97, 0x19, 0x61, 0xd4, 0xf7, 0xac, + 0xc7, 0x02, 0xc7, 0x9f, 0x11, 0x1c, 0x1c, 0xfc, 0xd0, 0x82, 0xf3, 0x99, 0xb1, 0xf0, 0x3b, 0x8c, + 0x7e, 0x77, 0xb7, 0x81, 0x34, 0xcf, 0xd4, 0xb8, 0xcc, 0x91, 0xbf, 0x8a, 0x5f, 0x29, 0x43, 0x2e, + 0x3b, 0x94, 0x51, 0xf3, 0x89, 0x1c, 0x3e, 0xe5, 0x5f, 0xfe, 0x38, 0xec, 0xb7, 0x10, 0xcc, 0xdf, + 0xa4, 0xf1, 0x9d, 0xb4, 0x41, 0x77, 0x72, 0xa2, 0x06, 0xbe, 0xbe, 0xd8, 0x50, 0x3e, 0xd0, 0xc9, + 0x9f, 0x52, 0x95, 0xae, 0x72, 0x60, 0xa7, 0xf1, 0xc9, 0x32, 0x60, 0x59, 0x53, 0xf0, 0x23, 0x04, + 0x87, 0x55, 0x10, 0xd9, 0xe7, 0x8d, 0xaf, 0xec, 0xec, 0x73, 0x82, 0xf8, 0x28, 0x31, 0x06, 0x5d, + 0x8b, 0xa3, 0x3b, 0x67, 0x14, 0x5f, 0x78, 0x67, 0x08, 0xc5, 0x1a, 0x5a, 0x59, 0x46, 0xf8, 0x0f, + 0x08, 0x66, 0x93, 0x0e, 0xdc, 0x68, 0x1d, 0xe5, 0x1a, 0xf5, 0x7b, 0xe9, 0x3d, 0xd7, 0x39, 0xe4, + 0xaf, 0xeb, 0xe7, 0x8b, 0x15, 0xaa, 0xee, 0x97, 0x57, 0xdb, 0xe0, 0x5a, 0xce, 0xbb, 0xfd, 0x6f, + 0x10, 0x40, 0xd6, 0x45, 0xc4, 0x67, 0xca, 0xcf, 0xa1, 0x74, 0x1a, 0xf5, 0xbd, 0xed, 0x23, 0x1a, + 0x0d, 0x7e, 0x9e, 0x65, 0x7d, 0xa9, 0xd4, 0xe7, 0x02, 0x6a, 0xad, 0x25, 0x1d, 0xc7, 0x5f, 0x22, + 0x98, 0xe1, 0x4d, 0x22, 0x7c, 0x62, 0x14, 0x66, 0xb5, 0x87, 0xb4, 0x97, 0xaa, 0x3f, 0xc5, 0xa1, + 0x2e, 0xb5, 0xca, 0x02, 0xd7, 0x1a, 0x5a, 0xc1, 0x3d, 0x98, 0x4d, 0x1a, 0x36, 0xa3, 0xcd, 0x23, + 0xd7, 0xd0, 0xd1, 0x97, 0x4a, 0x12, 0x69, 0x62, 0xa8, 0x22, 0x66, 0xae, 0x8c, 0x8b, 0x99, 0xd3, + 0x2c, 0xac, 0xe1, 0xe3, 0x65, 0x41, 0xef, 0xff, 0xa0, 0x98, 0xb3, 0x1c, 0xdd, 0x49, 0x63, 0x69, + 0x5c, 0xdc, 0x64, 0xda, 0xf9, 0x39, 0x82, 0x83, 0x83, 0xf5, 0x26, 0x3e, 0x32, 0x10, 0x33, 0xd5, + 0x22, 0x5b, 0xcf, 0x6b, 0x71, 0x54, 0xad, 0x6a, 0x7c, 0x83, 0xa3, 0x58, 0xc3, 0x97, 0xc6, 0x7a, + 0xc6, 0x5d, 0x19, 0x75, 0x18, 0xa3, 0xd5, 0xec, 0x83, 0xc5, 0x6f, 0x11, 0xcc, 0x4b, 0xbe, 0xf7, + 0x43, 0x4a, 0xcb, 0x61, 0xed, 0x9d, 0x23, 0x30, 0x59, 0xc6, 0x6b, 0x1c, 0xfe, 0x57, 0xf1, 0xc5, + 0x09, 0xe1, 0x4b, 0xd8, 0xab, 0x31, 0x43, 0xfa, 0x47, 0x04, 0x87, 0x1e, 0x26, 0x76, 0xff, 0x39, + 0xe1, 0xbf, 0xca, 0xf1, 0x7f, 0x0d, 0xbf, 0x5a, 0x52, 0x17, 0x8d, 0x3b, 0xc6, 0x79, 0x84, 0x7f, + 0x8d, 0xa0, 0x2a, 0xdb, 0xef, 0xf8, 0xf4, 0x48, 0xc7, 0xc8, 0x37, 0xe8, 0xf7, 0xd2, 0x98, 0x45, + 0x11, 0x60, 0x9c, 0x28, 0x4d, 0xa5, 0x42, 0x3e, 0x33, 0xe8, 0xf7, 0x11, 0xe0, 0xf4, 0xb1, 0x98, + 0x3e, 0x1f, 0xf1, 0xa9, 0x9c, 0xa8, 0x91, 0xdd, 0x05, 0xfd, 0xf4, 0xd8, 0x75, 0xf9, 0x54, 0xba, + 0x52, 0x9a, 0x4a, 0xfd, 0x54, 0xfe, 0x3b, 0x08, 0xea, 0x37, 0x69, 0x5a, 0xb3, 0x97, 0xe8, 0x32, + 0xff, 0x5d, 0x41, 0x5f, 0x1e, 0xbf, 0x50, 0x20, 0x3a, 0xc7, 0x11, 0x9d, 0xc2, 0xe5, 0xaa, 0x92, + 0x00, 0x3e, 0x44, 0xb0, 0xef, 0x9e, 0x6a, 0xa2, 0xf8, 0xdc, 0x38, 0x49, 0xb9, 0x48, 0x3e, 0x39, + 0xae, 0x2f, 0x73, 0x5c, 0xab, 0xc6, 0x44, 0xb8, 0xd6, 0x44, 0xf3, 0xfe, 0x17, 0x08, 0x5e, 0x50, + 0x1f, 0x39, 0xa2, 0xf5, 0xfa, 0x59, 0xf5, 0x56, 0xd2, 0xc1, 0x35, 0x2e, 0x72, 0x7c, 0x0d, 0x7c, + 0x6e, 0x12, 0x7c, 0x4d, 0xd1, 0x8f, 0xc5, 0x1f, 0x20, 0x38, 0xc4, 0x9b, 0xdf, 0x2a, 0xe3, 0x81, + 0x14, 0x33, 0xaa, 0x55, 0x3e, 0x41, 0x8a, 0x11, 0xf1, 0xc7, 0xd8, 0x11, 0xa8, 0x35, 0xd9, 0xd8, + 0xfe, 0x19, 0x82, 0xfd, 0x32, 0xa9, 0x89, 0xdb, 0x5d, 0x1d, 0xa7, 0xb8, 0x9d, 0x26, 0x41, 0x61, + 0x6e, 0x2b, 0x93, 0x99, 0xdb, 0x27, 0x08, 0xe6, 0x44, 0xe3, 0xb9, 0xa4, 0x54, 0x50, 0x3a, 0xd3, + 0xfa, 0xc0, 0xb3, 0x5f, 0x74, 0x34, 0x8d, 0xef, 0x71, 0xb1, 0x0f, 0x70, 0xb3, 0x4c, 0x6c, 0xe0, + 0xdb, 0x51, 0xf3, 0x89, 0x68, 0x27, 0x3e, 0x6d, 0xba, 0x7e, 0x3b, 0x7a, 0xc3, 0xc0, 0xa5, 0x09, + 0x91, 0xad, 0x39, 0x8f, 0xf0, 0x23, 0xa8, 0xa5, 0xed, 0x84, 0x81, 0x57, 0xd8, 0x60, 0x9b, 0x41, + 0xd7, 0x87, 0x1a, 0x13, 0x59, 0xfa, 0x13, 0x6f, 0x3e, 0x7c, 0xac, 0x54, 0x26, 0x97, 0xf2, 0x36, + 0x82, 0x43, 0xaa, 0xa9, 0x27, 0xb2, 0x27, 0x36, 0xf4, 0x32, 0x14, 0xa2, 0xa2, 0xc6, 0x2b, 0x13, + 0x59, 0x11, 0x87, 0x73, 0xe5, 0xc6, 0x9f, 0x9e, 0x1d, 0x45, 0x7f, 0x7d, 0x76, 0x14, 0xfd, 0xeb, + 0xd9, 0x51, 0xf4, 0xc6, 0xa5, 0xc9, 0xfe, 0x72, 0x68, 0xb9, 0x0e, 0xf5, 0x62, 0x95, 0xfd, 0xff, + 0x02, 0x00, 0x00, 0xff, 0xff, 0x51, 0x6e, 0x19, 0x88, 0x58, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2669,6 +2853,10 @@ type ApplicationServiceClient interface { DeleteResource(ctx context.Context, in *ApplicationResourceDeleteRequest, opts ...grpc.CallOption) (*ApplicationResponse, error) // PodLogs returns stream of log entries for the specified pod. Pod PodLogs(ctx context.Context, in *ApplicationPodLogsQuery, opts ...grpc.CallOption) (ApplicationService_PodLogsClient, error) + // ListLinks returns the list of all application deep links + ListLinks(ctx context.Context, in *ListLinksRequest, opts ...grpc.CallOption) (*LinksResponse, error) + // ListResourceLinks returns the list of all resource deep links + ListResourceLinks(ctx context.Context, in *ApplicationResourceRequest, opts ...grpc.CallOption) (*LinksResponse, error) } type applicationServiceClient struct { @@ -2998,6 +3186,24 @@ func (x *applicationServicePodLogsClient) Recv() (*LogEntry, error) { return m, nil } +func (c *applicationServiceClient) ListLinks(ctx context.Context, in *ListLinksRequest, opts ...grpc.CallOption) (*LinksResponse, error) { + out := new(LinksResponse) + err := c.cc.Invoke(ctx, "/application.ApplicationService/ListLinks", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *applicationServiceClient) ListResourceLinks(ctx context.Context, in *ApplicationResourceRequest, opts ...grpc.CallOption) (*LinksResponse, error) { + out := new(LinksResponse) + err := c.cc.Invoke(ctx, "/application.ApplicationService/ListResourceLinks", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ApplicationServiceServer is the server API for ApplicationService service. type ApplicationServiceServer interface { // List returns list of applications @@ -3050,6 +3256,10 @@ type ApplicationServiceServer interface { DeleteResource(context.Context, *ApplicationResourceDeleteRequest) (*ApplicationResponse, error) // PodLogs returns stream of log entries for the specified pod. Pod PodLogs(*ApplicationPodLogsQuery, ApplicationService_PodLogsServer) error + // ListLinks returns the list of all application deep links + ListLinks(context.Context, *ListLinksRequest) (*LinksResponse, error) + // ListResourceLinks returns the list of all resource deep links + ListResourceLinks(context.Context, *ApplicationResourceRequest) (*LinksResponse, error) } // UnimplementedApplicationServiceServer can be embedded to have forward compatible implementations. @@ -3131,6 +3341,12 @@ func (*UnimplementedApplicationServiceServer) DeleteResource(ctx context.Context func (*UnimplementedApplicationServiceServer) PodLogs(req *ApplicationPodLogsQuery, srv ApplicationService_PodLogsServer) error { return status.Errorf(codes.Unimplemented, "method PodLogs not implemented") } +func (*UnimplementedApplicationServiceServer) ListLinks(ctx context.Context, req *ListLinksRequest) (*LinksResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListLinks not implemented") +} +func (*UnimplementedApplicationServiceServer) ListResourceLinks(ctx context.Context, req *ApplicationResourceRequest) (*LinksResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListResourceLinks not implemented") +} func RegisterApplicationServiceServer(s *grpc.Server, srv ApplicationServiceServer) { s.RegisterService(&_ApplicationService_serviceDesc, srv) @@ -3603,6 +3819,42 @@ func (x *applicationServicePodLogsServer) Send(m *LogEntry) error { return x.ServerStream.SendMsg(m) } +func _ApplicationService_ListLinks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListLinksRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApplicationServiceServer).ListLinks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/application.ApplicationService/ListLinks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApplicationServiceServer).ListLinks(ctx, req.(*ListLinksRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ApplicationService_ListResourceLinks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ApplicationResourceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApplicationServiceServer).ListResourceLinks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/application.ApplicationService/ListResourceLinks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApplicationServiceServer).ListResourceLinks(ctx, req.(*ApplicationResourceRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _ApplicationService_serviceDesc = grpc.ServiceDesc{ ServiceName: "application.ApplicationService", HandlerType: (*ApplicationServiceServer)(nil), @@ -3691,6 +3943,14 @@ var _ApplicationService_serviceDesc = grpc.ServiceDesc{ MethodName: "DeleteResource", Handler: _ApplicationService_DeleteResource_Handler, }, + { + MethodName: "ListLinks", + Handler: _ApplicationService_ListLinks_Handler, + }, + { + MethodName: "ListResourceLinks", + Handler: _ApplicationService_ListResourceLinks_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -5790,89 +6050,232 @@ func (m *ManagedResourcesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func encodeVarintApplication(dAtA []byte, offset int, v uint64) int { - offset -= sovApplication(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ +func (m *LinkInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - dAtA[offset] = uint8(v) - return base + return dAtA[:n], nil } -func (m *ApplicationQuery) Size() (n int) { - if m == nil { - return 0 - } + +func (m *LinkInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *LinkInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Name != nil { - l = len(*m.Name) - n += 1 + l + sovApplication(uint64(l)) - } - if m.Refresh != nil { - l = len(*m.Refresh) - n += 1 + l + sovApplication(uint64(l)) - } - if len(m.Projects) > 0 { - for _, s := range m.Projects { - l = len(s) - n += 1 + l + sovApplication(uint64(l)) - } - } - if m.ResourceVersion != nil { - l = len(*m.ResourceVersion) - n += 1 + l + sovApplication(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Selector != nil { - l = len(*m.Selector) - n += 1 + l + sovApplication(uint64(l)) + if m.IconClass != nil { + i -= len(*m.IconClass) + copy(dAtA[i:], *m.IconClass) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.IconClass))) + i-- + dAtA[i] = 0x22 } - if m.Repo != nil { - l = len(*m.Repo) - n += 1 + l + sovApplication(uint64(l)) + if m.Description != nil { + i -= len(*m.Description) + copy(dAtA[i:], *m.Description) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Description))) + i-- + dAtA[i] = 0x1a } - if m.AppNamespace != nil { - l = len(*m.AppNamespace) - n += 1 + l + sovApplication(uint64(l)) + if m.Url == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("url") + } else { + i -= len(*m.Url) + copy(dAtA[i:], *m.Url) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Url))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if m.Title == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("title") + } else { + i -= len(*m.Title) + copy(dAtA[i:], *m.Title) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Title))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *NodeQuery) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Name != nil { - l = len(*m.Name) - n += 1 + l + sovApplication(uint64(l)) - } - if m.AppNamespace != nil { - l = len(*m.AppNamespace) - n += 1 + l + sovApplication(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *LinksResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *RevisionMetadataQuery) Size() (n int) { - if m == nil { - return 0 - } +func (m *LinksResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *LinksResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Name != nil { - l = len(*m.Name) - n += 1 + l + sovApplication(uint64(l)) - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApplication(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ListLinksRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListLinksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListLinksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Namespace != nil { + i -= len(*m.Namespace) + copy(dAtA[i:], *m.Namespace) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Namespace))) + i-- + dAtA[i] = 0x12 + } + if m.Name == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } else { + i -= len(*m.Name) + copy(dAtA[i:], *m.Name) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintApplication(dAtA []byte, offset int, v uint64) int { + offset -= sovApplication(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *ApplicationQuery) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Refresh != nil { + l = len(*m.Refresh) + n += 1 + l + sovApplication(uint64(l)) + } + if len(m.Projects) > 0 { + for _, s := range m.Projects { + l = len(s) + n += 1 + l + sovApplication(uint64(l)) + } + } + if m.ResourceVersion != nil { + l = len(*m.ResourceVersion) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Selector != nil { + l = len(*m.Selector) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Repo != nil { + l = len(*m.Repo) + n += 1 + l + sovApplication(uint64(l)) + } + if m.AppNamespace != nil { + l = len(*m.AppNamespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *NodeQuery) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovApplication(uint64(l)) + } + if m.AppNamespace != nil { + l = len(*m.AppNamespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RevisionMetadataQuery) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovApplication(uint64(l)) + } if m.Revision != nil { l = len(*m.Revision) n += 1 + l + sovApplication(uint64(l)) @@ -6739,6 +7142,72 @@ func (m *ManagedResourcesResponse) Size() (n int) { return n } +func (m *LinkInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Title != nil { + l = len(*m.Title) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Url != nil { + l = len(*m.Url) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Description != nil { + l = len(*m.Description) + n += 1 + l + sovApplication(uint64(l)) + } + if m.IconClass != nil { + l = len(*m.IconClass) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *LinksResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovApplication(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ListLinksRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Namespace != nil { + l = len(*m.Namespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovApplication(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -12832,6 +13301,405 @@ func (m *ManagedResourcesResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *LinkInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LinkInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LinkInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Title = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Url", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Url = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Description = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IconClass", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.IconClass = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("title") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("url") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LinksResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LinksResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LinksResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, &LinkInfo{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ListLinksRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListLinksRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListLinksRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Namespace = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipApplication(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apiclient/application/application.pb.gw.go b/pkg/apiclient/application/application.pb.gw.go index 56a1bbc27c1ba..7bd0b220d7500 100644 --- a/pkg/apiclient/application/application.pb.gw.go +++ b/pkg/apiclient/application/application.pb.gw.go @@ -1790,6 +1790,150 @@ func request_ApplicationService_PodLogs_1(ctx context.Context, marshaler runtime } +var ( + filter_ApplicationService_ListLinks_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_ApplicationService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListLinksRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.StringP(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_ListLinks_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListLinks(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ApplicationService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, server ApplicationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListLinksRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.StringP(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_ListLinks_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListLinks(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_ApplicationService_ListResourceLinks_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_ApplicationService_ListResourceLinks_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ApplicationResourceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.StringP(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_ListResourceLinks_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListResourceLinks(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ApplicationService_ListResourceLinks_0(ctx context.Context, marshaler runtime.Marshaler, server ApplicationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ApplicationResourceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.StringP(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_ListResourceLinks_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListResourceLinks(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterApplicationServiceHandlerServer registers the http handlers for service ApplicationService to "mux". // UnaryRPC :call ApplicationServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -2314,6 +2458,52 @@ func RegisterApplicationServiceHandlerServer(ctx context.Context, mux *runtime.S return }) + mux.Handle("GET", pattern_ApplicationService_ListLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ApplicationService_ListLinks_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_ListLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ApplicationService_ListResourceLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ApplicationService_ListResourceLinks_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_ListResourceLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -2875,6 +3065,46 @@ func RegisterApplicationServiceHandlerClient(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_ApplicationService_ListLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ApplicationService_ListLinks_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_ListLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ApplicationService_ListResourceLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ApplicationService_ListResourceLinks_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_ListResourceLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -2930,6 +3160,10 @@ var ( pattern_ApplicationService_PodLogs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"api", "v1", "applications", "name", "pods", "podName", "logs"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ApplicationService_PodLogs_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "applications", "name", "logs"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ApplicationService_ListLinks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "applications", "name", "links"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ApplicationService_ListResourceLinks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"api", "v1", "applications", "name", "resource", "links"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -2984,4 +3218,8 @@ var ( forward_ApplicationService_PodLogs_0 = runtime.ForwardResponseStream forward_ApplicationService_PodLogs_1 = runtime.ForwardResponseStream + + forward_ApplicationService_ListLinks_0 = runtime.ForwardResponseMessage + + forward_ApplicationService_ListResourceLinks_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/apiclient/project/project.pb.go b/pkg/apiclient/project/project.pb.go index 97199cdd0a84e..93d00a97a23ab 100644 --- a/pkg/apiclient/project/project.pb.go +++ b/pkg/apiclient/project/project.pb.go @@ -10,6 +10,7 @@ package project import ( context "context" fmt "fmt" + application "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" v1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" @@ -653,67 +654,70 @@ func init() { func init() { proto.RegisterFile("server/project/project.proto", fileDescriptor_5f0a51496972c9e2) } var fileDescriptor_5f0a51496972c9e2 = []byte{ - // 950 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x96, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0xc7, 0xe5, 0xa4, 0xcd, 0x6e, 0x27, 0x4b, 0x29, 0xb3, 0xbb, 0xc5, 0x0d, 0xdd, 0x6e, 0x18, - 0x44, 0x15, 0x15, 0x3a, 0x56, 0x53, 0x90, 0x56, 0x70, 0x62, 0x77, 0xab, 0x80, 0xd4, 0x03, 0xb8, - 0x20, 0x10, 0x07, 0xd0, 0xc4, 0x7e, 0xca, 0xce, 0xc6, 0xf1, 0x0c, 0x9e, 0x89, 0xb7, 0x21, 0xea, - 0x05, 0x09, 0x90, 0x38, 0x70, 0x80, 0x13, 0xff, 0x00, 0x27, 0xfe, 0x09, 0x6e, 0x1c, 0x91, 0xf8, - 0x07, 0x50, 0xc5, 0x1f, 0x82, 0x3c, 0xfe, 0x91, 0x38, 0xa9, 0x11, 0x68, 0xc3, 0x9e, 0x3c, 0x1e, - 0x3f, 0xbf, 0xef, 0xe7, 0xbd, 0x99, 0x79, 0x6f, 0xd0, 0xae, 0x82, 0x28, 0x86, 0xc8, 0x91, 0x91, - 0x78, 0x0c, 0x9e, 0xce, 0x9f, 0x54, 0x46, 0x42, 0x0b, 0x7c, 0x2d, 0x7b, 0x6d, 0xed, 0x0e, 0x84, - 0x18, 0x04, 0xe0, 0x30, 0xc9, 0x1d, 0x16, 0x86, 0x42, 0x33, 0xcd, 0x45, 0xa8, 0x52, 0xb3, 0x16, - 0x19, 0xde, 0x53, 0x94, 0x0b, 0xf3, 0xd5, 0x13, 0x11, 0x38, 0xf1, 0x91, 0x33, 0x80, 0x10, 0x22, - 0xa6, 0xc1, 0xcf, 0x6c, 0x4e, 0x07, 0x5c, 0x3f, 0x1a, 0xf7, 0xa9, 0x27, 0x46, 0x0e, 0x8b, 0x06, - 0x22, 0xf1, 0x6c, 0x06, 0x87, 0x9e, 0xef, 0xc4, 0x5d, 0x47, 0x0e, 0x07, 0xc9, 0xff, 0xca, 0x61, - 0x52, 0x06, 0xdc, 0x33, 0xfe, 0x9d, 0xf8, 0x88, 0x05, 0xf2, 0x11, 0x5b, 0xf2, 0x46, 0x7e, 0xb0, - 0xd0, 0xad, 0xf7, 0x53, 0xb6, 0x07, 0x11, 0x30, 0x0d, 0x2e, 0x7c, 0x31, 0x06, 0xa5, 0x71, 0x1f, - 0xe5, 0xcc, 0xb6, 0xd5, 0xb6, 0x3a, 0xcd, 0xee, 0xbb, 0x74, 0x26, 0x4c, 0x73, 0x61, 0x33, 0xf8, - 0xdc, 0xf3, 0x69, 0xdc, 0xa5, 0x72, 0x38, 0xa0, 0x89, 0x30, 0x9d, 0x13, 0xa6, 0xb9, 0x30, 0x7d, - 0x47, 0xca, 0x4c, 0xc7, 0xcd, 0x1d, 0xe3, 0x6d, 0xd4, 0x18, 0x4b, 0x05, 0x91, 0xb6, 0x6b, 0x6d, - 0xab, 0x73, 0xdd, 0xcd, 0xde, 0xc8, 0x10, 0xed, 0x64, 0xb6, 0x1f, 0x8a, 0x21, 0x84, 0x0f, 0x21, - 0x80, 0x19, 0x98, 0x5d, 0x06, 0xdb, 0x98, 0xb9, 0xc3, 0x68, 0x2d, 0x12, 0x01, 0x18, 0x67, 0x1b, - 0xae, 0x19, 0xe3, 0x2d, 0x54, 0xe7, 0x4c, 0xdb, 0xf5, 0xb6, 0xd5, 0xa9, 0xbb, 0xc9, 0x10, 0x6f, - 0xa2, 0x1a, 0xf7, 0xed, 0x35, 0x63, 0x53, 0xe3, 0x3e, 0xf9, 0xc9, 0x2a, 0xab, 0x95, 0xd3, 0x50, - 0xad, 0xd6, 0x46, 0x4d, 0x1f, 0x94, 0x17, 0x71, 0x99, 0x04, 0x9a, 0x89, 0xce, 0x4f, 0x15, 0x3c, - 0xf5, 0x39, 0x9e, 0x5d, 0xb4, 0x01, 0xe7, 0x92, 0x47, 0xa0, 0xde, 0x0b, 0x0d, 0x44, 0xdd, 0x9d, - 0x4d, 0x64, 0x6c, 0xeb, 0x05, 0xdb, 0xeb, 0xc5, 0xe2, 0x18, 0x34, 0x17, 0x94, 0x14, 0xa1, 0x02, - 0x7c, 0x0b, 0xad, 0xeb, 0x64, 0x22, 0x63, 0x4a, 0x5f, 0x08, 0x41, 0x37, 0x32, 0xeb, 0x0f, 0xc6, - 0x10, 0x4d, 0x12, 0xfd, 0x90, 0x8d, 0x20, 0x33, 0x32, 0x63, 0xf2, 0x65, 0xe1, 0xf1, 0x23, 0xe9, - 0x3f, 0xdb, 0xe5, 0x26, 0xcf, 0xa3, 0xe7, 0x4e, 0x46, 0x52, 0x4f, 0xf2, 0x30, 0xc8, 0x3e, 0xda, - 0x3a, 0x9b, 0x84, 0xde, 0xc7, 0x3c, 0xf4, 0xc5, 0x13, 0x55, 0x0d, 0x3d, 0x41, 0x37, 0xe7, 0xec, - 0x8a, 0x2c, 0xf4, 0xd1, 0xb5, 0x27, 0xe9, 0x94, 0x6d, 0xb5, 0xeb, 0x4f, 0xcf, 0x3c, 0xd3, 0x70, - 0x73, 0xc7, 0xe4, 0x1c, 0x6d, 0xf7, 0x02, 0xd1, 0x67, 0x41, 0x16, 0xcd, 0x4c, 0xfd, 0x33, 0xb4, - 0xce, 0x35, 0x8c, 0x56, 0xa4, 0x3d, 0x97, 0xaf, 0xd4, 0x2d, 0xf9, 0xb5, 0x8e, 0xec, 0x87, 0xa0, - 0x19, 0x0f, 0xc0, 0x5f, 0x12, 0x97, 0x68, 0x73, 0x50, 0xc2, 0x5a, 0x39, 0xc5, 0x82, 0xff, 0xf9, - 0x0d, 0x52, 0xfb, 0xbf, 0xea, 0x41, 0x80, 0x6e, 0x44, 0x20, 0x85, 0xe2, 0x5a, 0x44, 0x1c, 0x94, - 0x5d, 0x5f, 0x45, 0x4c, 0x6e, 0xee, 0x71, 0xe2, 0x96, 0xbc, 0x63, 0x86, 0xae, 0x7b, 0xc1, 0x58, - 0x69, 0x88, 0x94, 0xbd, 0x66, 0x94, 0x4e, 0x9e, 0x4e, 0xe9, 0x41, 0xea, 0xcd, 0x2d, 0xdc, 0x76, - 0x7f, 0x69, 0xa2, 0xcd, 0x2c, 0xca, 0x33, 0x88, 0x62, 0xee, 0x01, 0xfe, 0xce, 0x42, 0xcd, 0xb4, - 0xc4, 0x98, 0x23, 0x8d, 0x09, 0xcd, 0x3b, 0x45, 0x65, 0x11, 0x6a, 0xdd, 0xb9, 0xd2, 0xa6, 0x38, - 0x46, 0xf7, 0xbe, 0xfa, 0xe3, 0xaf, 0x1f, 0x6b, 0x5d, 0x72, 0x68, 0xfa, 0x46, 0x7c, 0x94, 0xf7, - 0x1e, 0xe5, 0x4c, 0xb3, 0xd1, 0x85, 0x93, 0x14, 0x1f, 0xe5, 0x4c, 0x93, 0xc7, 0x85, 0x63, 0xca, - 0xc5, 0x5b, 0xd6, 0x01, 0xfe, 0xc6, 0x42, 0xcd, 0xb4, 0xba, 0xfe, 0x13, 0x4c, 0xa9, 0xfe, 0xb6, - 0xb6, 0x0b, 0x9b, 0xf2, 0x61, 0x7e, 0xdb, 0x50, 0xbc, 0x79, 0x70, 0xfc, 0x9f, 0x28, 0x9c, 0x29, - 0x67, 0xfa, 0x02, 0x7f, 0x6f, 0xa1, 0x46, 0x1a, 0x33, 0x5e, 0x0a, 0xb6, 0x9c, 0x8b, 0x95, 0x6d, - 0x3b, 0xf2, 0x92, 0x01, 0xbe, 0x4d, 0xb6, 0x16, 0x81, 0x93, 0xcc, 0x7c, 0x6d, 0xa1, 0xb5, 0x53, - 0xae, 0x34, 0xbe, 0xbd, 0x88, 0x63, 0xca, 0x54, 0xeb, 0x74, 0x55, 0x18, 0x89, 0x08, 0xb1, 0x0d, - 0x0a, 0xc6, 0x4b, 0x28, 0xf8, 0x1c, 0xe1, 0x1e, 0xe8, 0x85, 0x3a, 0x50, 0x05, 0xf5, 0x72, 0x31, - 0x5d, 0x55, 0x38, 0x48, 0xc7, 0x28, 0x11, 0xdc, 0x5e, 0x5e, 0xa5, 0xa4, 0xd4, 0x5e, 0x38, 0x7e, - 0xf6, 0x27, 0xfe, 0xd6, 0x42, 0xf5, 0x1e, 0x54, 0x6a, 0xad, 0x6e, 0x1d, 0xee, 0x1a, 0xa4, 0x1d, - 0xfc, 0x62, 0x05, 0x12, 0x9e, 0xa2, 0x17, 0x7a, 0xa0, 0xcb, 0x65, 0xb8, 0x0a, 0xeb, 0x6e, 0x31, - 0x7d, 0x75, 0xd9, 0x26, 0xd4, 0xa8, 0x75, 0xf0, 0x7e, 0x55, 0x02, 0xd2, 0xba, 0x57, 0x2c, 0xc0, - 0xcf, 0x16, 0x6a, 0xa4, 0xad, 0x72, 0x79, 0x67, 0x96, 0x5a, 0xe8, 0x0a, 0x33, 0x72, 0x6c, 0x18, - 0x0f, 0x5b, 0x9d, 0xca, 0xa3, 0x44, 0x47, 0xa0, 0x99, 0xcf, 0x34, 0xa3, 0x06, 0x3a, 0xd9, 0xb1, - 0x9f, 0xa0, 0x46, 0x7a, 0x50, 0xab, 0x52, 0x53, 0x75, 0x70, 0xb3, 0xfc, 0x1f, 0x54, 0xe6, 0xff, - 0x31, 0x42, 0xc9, 0x2e, 0x3d, 0x89, 0x21, 0xac, 0x4e, 0xfc, 0x1d, 0x9a, 0xde, 0x5d, 0x93, 0x08, - 0x69, 0x72, 0x77, 0xa5, 0xf1, 0x11, 0x35, 0xbf, 0x98, 0x1d, 0xbe, 0x6f, 0x44, 0xda, 0x78, 0xaf, - 0x2a, 0xed, 0x90, 0x7a, 0x9f, 0xa2, 0x9b, 0x3d, 0xd0, 0x73, 0xdd, 0xfe, 0x4c, 0x27, 0xa9, 0xdf, - 0x29, 0x44, 0x17, 0x2f, 0x0c, 0xad, 0xdd, 0xab, 0x3e, 0x15, 0xc1, 0xbd, 0x66, 0x74, 0x5f, 0xc5, - 0xaf, 0x54, 0xe9, 0xaa, 0x49, 0xe8, 0x65, 0xcd, 0xfe, 0xfe, 0xfd, 0xdf, 0x2e, 0xf7, 0xac, 0xdf, - 0x2f, 0xf7, 0xac, 0x3f, 0x2f, 0xf7, 0xac, 0x4f, 0xdf, 0xf8, 0x77, 0x17, 0x6d, 0x2f, 0xe0, 0x10, - 0x16, 0xf7, 0xfd, 0x7e, 0xc3, 0xdc, 0xab, 0x8f, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x1d, - 0x2d, 0x85, 0x10, 0x0c, 0x00, 0x00, + // 993 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0xcf, 0x6f, 0xe3, 0x44, + 0x14, 0x96, 0x93, 0x36, 0xbb, 0x7d, 0x2d, 0xa5, 0xcc, 0xee, 0x16, 0x37, 0xf4, 0x47, 0x18, 0xb4, + 0x55, 0x54, 0xa8, 0xad, 0xa6, 0x20, 0xad, 0xe0, 0xc4, 0x76, 0xab, 0x80, 0xd4, 0x03, 0xb8, 0x20, + 0x10, 0x07, 0x90, 0x63, 0x3f, 0x65, 0x67, 0xe3, 0xd8, 0xc6, 0x33, 0xc9, 0x36, 0x44, 0xbd, 0x20, + 0x01, 0x12, 0x07, 0x0e, 0x70, 0x42, 0xdc, 0xf9, 0x3f, 0xb8, 0x71, 0x44, 0xe2, 0x1f, 0x40, 0x15, + 0x7f, 0x08, 0x9a, 0xf1, 0xd8, 0x89, 0x93, 0x9a, 0x1f, 0x6a, 0xd8, 0x93, 0xc7, 0x33, 0xcf, 0xdf, + 0xf7, 0xbd, 0x37, 0x33, 0xdf, 0x8c, 0x61, 0x9b, 0x63, 0x32, 0xc4, 0xc4, 0x8e, 0x93, 0xe8, 0x09, + 0x7a, 0x22, 0x7b, 0x5a, 0x71, 0x12, 0x89, 0x88, 0xdc, 0xd2, 0xaf, 0xf5, 0xed, 0x6e, 0x14, 0x75, + 0x03, 0xb4, 0xdd, 0x98, 0xd9, 0x6e, 0x18, 0x46, 0xc2, 0x15, 0x2c, 0x0a, 0x79, 0x1a, 0x56, 0xa7, + 0xbd, 0x07, 0xdc, 0x62, 0x91, 0x1a, 0xf5, 0xa2, 0x04, 0xed, 0xe1, 0x91, 0xdd, 0xc5, 0x10, 0x13, + 0x57, 0xa0, 0xaf, 0x63, 0xce, 0xba, 0x4c, 0x3c, 0x1e, 0x74, 0x2c, 0x2f, 0xea, 0xdb, 0x6e, 0xd2, + 0x8d, 0x24, 0xb2, 0x6a, 0x1c, 0x7a, 0xbe, 0x3d, 0x6c, 0xd9, 0x71, 0xaf, 0x2b, 0xbf, 0xe7, 0xb6, + 0x1b, 0xc7, 0x01, 0xf3, 0x14, 0xbe, 0x3d, 0x3c, 0x72, 0x83, 0xf8, 0xb1, 0x3b, 0x8f, 0x76, 0xf2, + 0x0f, 0x68, 0x3a, 0xab, 0x69, 0xac, 0xa9, 0x76, 0x0a, 0x42, 0xbf, 0x37, 0xe0, 0xee, 0x7b, 0x69, + 0x82, 0x27, 0x09, 0xba, 0x02, 0x1d, 0xfc, 0x7c, 0x80, 0x5c, 0x90, 0x0e, 0x64, 0x89, 0x9b, 0x46, + 0xc3, 0x68, 0xae, 0xb6, 0xde, 0xb1, 0x26, 0x7c, 0x56, 0xc6, 0xa7, 0x1a, 0x9f, 0x79, 0xbe, 0x35, + 0x6c, 0x59, 0x71, 0xaf, 0x6b, 0x49, 0xf5, 0xd6, 0x34, 0x4b, 0xa6, 0xde, 0x7a, 0x3b, 0x8e, 0x35, + 0x8f, 0x93, 0x01, 0x93, 0x4d, 0xa8, 0x0d, 0x62, 0x8e, 0x89, 0x30, 0x2b, 0x0d, 0xa3, 0x79, 0xdb, + 0xd1, 0x6f, 0xb4, 0x07, 0x5b, 0x3a, 0xf6, 0x83, 0xa8, 0x87, 0xe1, 0x23, 0x0c, 0x70, 0x22, 0xcc, + 0x2c, 0x0a, 0x5b, 0x99, 0xc0, 0x11, 0x58, 0x4a, 0xa2, 0x00, 0x15, 0xd8, 0x8a, 0xa3, 0xda, 0x64, + 0x03, 0xaa, 0xcc, 0x15, 0x66, 0xb5, 0x61, 0x34, 0xab, 0x8e, 0x6c, 0x92, 0x75, 0xa8, 0x30, 0xdf, + 0x5c, 0x52, 0x31, 0x15, 0xe6, 0xd3, 0x1f, 0x8d, 0x22, 0x5b, 0xb1, 0x0c, 0xe5, 0x6c, 0x0d, 0x58, + 0xf5, 0x91, 0x7b, 0x09, 0x8b, 0x65, 0xa2, 0x9a, 0x74, 0xba, 0x2b, 0xd7, 0x53, 0x9d, 0xd2, 0xb3, + 0x0d, 0x2b, 0x78, 0x11, 0xb3, 0x04, 0xf9, 0xbb, 0xa1, 0x12, 0x51, 0x75, 0x26, 0x1d, 0x5a, 0xdb, + 0x72, 0xae, 0xed, 0xb5, 0x7c, 0x72, 0x94, 0x34, 0x07, 0x79, 0x1c, 0x85, 0x1c, 0xc9, 0x5d, 0x58, + 0x16, 0xb2, 0x43, 0x6b, 0x4a, 0x5f, 0x28, 0x85, 0x35, 0x1d, 0xfd, 0xfe, 0x00, 0x93, 0x91, 0xe4, + 0x0f, 0xdd, 0x3e, 0xea, 0x20, 0xd5, 0xa6, 0x5f, 0xe4, 0x88, 0x1f, 0xc6, 0xfe, 0xb3, 0x9d, 0x6e, + 0xfa, 0x3c, 0x3c, 0x77, 0xda, 0x8f, 0xc5, 0x28, 0x4b, 0x83, 0xee, 0xc3, 0xc6, 0xf9, 0x28, 0xf4, + 0x3e, 0x62, 0xa1, 0x1f, 0x3d, 0xe5, 0xe5, 0xa2, 0x47, 0x70, 0x67, 0x2a, 0x2e, 0xaf, 0x42, 0x07, + 0x6e, 0x3d, 0x4d, 0xbb, 0x4c, 0xa3, 0x51, 0xbd, 0xb9, 0xe6, 0x09, 0x87, 0x93, 0x01, 0xd3, 0x0b, + 0xd8, 0x6c, 0x07, 0x51, 0xc7, 0x0d, 0x74, 0x36, 0x13, 0xf6, 0x4f, 0x61, 0x99, 0x09, 0xec, 0x2f, + 0x88, 0x7b, 0xaa, 0x5e, 0x29, 0x2c, 0xfd, 0xa5, 0x0a, 0xe6, 0x23, 0x14, 0x2e, 0x0b, 0xd0, 0x9f, + 0x23, 0x8f, 0x61, 0xbd, 0x5b, 0x90, 0xb5, 0x70, 0x15, 0x33, 0xf8, 0xd3, 0x0b, 0xa4, 0xf2, 0x7f, + 0xf9, 0x41, 0x00, 0x6b, 0x09, 0xc6, 0x11, 0x67, 0x22, 0x4a, 0x18, 0x72, 0xb3, 0xba, 0x88, 0x9c, + 0x9c, 0x0c, 0x71, 0xe4, 0x14, 0xd0, 0x89, 0x0b, 0xb7, 0xbd, 0x60, 0xc0, 0x05, 0x26, 0xdc, 0x5c, + 0x52, 0x4c, 0xa7, 0x37, 0x63, 0x3a, 0x49, 0xd1, 0x9c, 0x1c, 0xb6, 0xf5, 0xd3, 0x1a, 0xac, 0xeb, + 0x2c, 0xcf, 0x31, 0x19, 0x32, 0x0f, 0xc9, 0xb7, 0x06, 0xac, 0xa6, 0x16, 0xa3, 0xb6, 0x34, 0xa1, + 0x56, 0x76, 0xdc, 0x94, 0x9a, 0x50, 0x7d, 0xe7, 0xda, 0x98, 0x7c, 0x1b, 0x3d, 0xf8, 0xf2, 0xf7, + 0x3f, 0x7f, 0xa8, 0xb4, 0xe8, 0xa1, 0x3a, 0x7c, 0x86, 0x47, 0xd9, 0x01, 0xc6, 0xed, 0xb1, 0x6e, + 0x5d, 0xda, 0xd2, 0x7c, 0xb8, 0x3d, 0x96, 0x8f, 0x4b, 0x5b, 0xd9, 0xc5, 0x9b, 0xc6, 0x01, 0xf9, + 0xda, 0x80, 0xd5, 0xd4, 0x5d, 0xff, 0x4e, 0x4c, 0xc1, 0x7f, 0xeb, 0x9b, 0x79, 0x4c, 0x71, 0x33, + 0xbf, 0xa5, 0x54, 0xbc, 0x71, 0x70, 0xfc, 0x9f, 0x54, 0xd8, 0x63, 0xe6, 0x8a, 0x4b, 0xf2, 0x9d, + 0x01, 0xb5, 0x34, 0x67, 0x32, 0x97, 0x6c, 0xb1, 0x16, 0x0b, 0x5b, 0x76, 0xf4, 0x25, 0x25, 0xf8, + 0x1e, 0xdd, 0x98, 0x15, 0x2c, 0x2b, 0xf3, 0x95, 0x01, 0x4b, 0x67, 0x8c, 0x0b, 0x72, 0x6f, 0x56, + 0x8e, 0xb2, 0xa9, 0xfa, 0xd9, 0xa2, 0x64, 0x48, 0x12, 0x6a, 0x2a, 0x29, 0x84, 0xcc, 0x49, 0x21, + 0x17, 0x40, 0xda, 0x28, 0x66, 0x7c, 0xa0, 0x4c, 0xd4, 0xcb, 0x79, 0x77, 0x99, 0x71, 0xd0, 0xa6, + 0x62, 0xa2, 0xa4, 0x31, 0x3f, 0x4b, 0xd2, 0x6a, 0x2f, 0x6d, 0x5f, 0x7f, 0x49, 0xbe, 0x31, 0xa0, + 0xda, 0xc6, 0x52, 0xae, 0xc5, 0xcd, 0xc3, 0x9e, 0x92, 0xb4, 0x45, 0x5e, 0x2c, 0x91, 0x44, 0xc6, + 0xf0, 0x42, 0x1b, 0x45, 0xd1, 0x86, 0xcb, 0x64, 0xed, 0xe5, 0xdd, 0xd7, 0xdb, 0x36, 0xb5, 0x14, + 0x5b, 0x93, 0xec, 0x97, 0x15, 0x20, 0xf5, 0xbd, 0x7c, 0x02, 0x7e, 0x36, 0xa0, 0x96, 0x1e, 0x95, + 0xf3, 0x2b, 0xb3, 0x70, 0x84, 0x2e, 0xb0, 0x22, 0xc7, 0x4a, 0xe3, 0x61, 0xbd, 0x59, 0xba, 0x95, + 0xac, 0x3e, 0x0a, 0xd7, 0x77, 0x85, 0x6b, 0x29, 0xd1, 0x72, 0xc5, 0x7e, 0x0c, 0xb5, 0x74, 0xa3, + 0x96, 0x95, 0xa6, 0x6c, 0xe3, 0xea, 0xfa, 0x1f, 0x94, 0xd6, 0xff, 0x09, 0x80, 0x5c, 0xa5, 0xa7, + 0x43, 0x0c, 0xcb, 0x0b, 0xbf, 0x63, 0xa5, 0x17, 0x60, 0x99, 0xa1, 0x25, 0x2f, 0xc0, 0xd6, 0xf0, + 0xc8, 0x52, 0x9f, 0xa8, 0x15, 0xbe, 0xaf, 0x48, 0x1a, 0x64, 0xb7, 0xac, 0xec, 0x98, 0xa2, 0x8f, + 0xe1, 0x4e, 0x1b, 0xc5, 0xd4, 0x69, 0x7f, 0x2e, 0x64, 0xe9, 0xb7, 0x72, 0xd2, 0xd9, 0x0b, 0x43, + 0x7d, 0xfb, 0xba, 0xa1, 0x3c, 0xb9, 0x57, 0x15, 0xef, 0x7d, 0xf2, 0x4a, 0x19, 0x2f, 0x1f, 0x85, + 0x9e, 0x3e, 0xec, 0x49, 0x1f, 0x56, 0xa4, 0xd8, 0x33, 0x16, 0xf6, 0x38, 0xd9, 0x29, 0x4c, 0x53, + 0xde, 0x9f, 0xcd, 0x76, 0x7d, 0x66, 0x58, 0x0d, 0x69, 0xd2, 0xfb, 0x8a, 0x74, 0x8f, 0xec, 0x94, + 0x91, 0x06, 0x32, 0xfc, 0xe1, 0xc3, 0x5f, 0xaf, 0x76, 0x8d, 0xdf, 0xae, 0x76, 0x8d, 0x3f, 0xae, + 0x76, 0x8d, 0x4f, 0x5e, 0xff, 0x77, 0x3f, 0x07, 0x5e, 0xc0, 0x30, 0xcc, 0xff, 0x51, 0x3a, 0x35, + 0x75, 0x8d, 0x3f, 0xfe, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x73, 0xd5, 0x20, 0xa7, 0xc4, 0x0c, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -750,6 +754,8 @@ type ProjectServiceClient interface { ListEvents(ctx context.Context, in *ProjectQuery, opts ...grpc.CallOption) (*v1.EventList, error) // GetSchedulesState returns true if there are any active sync syncWindows GetSyncWindowsState(ctx context.Context, in *SyncWindowsQuery, opts ...grpc.CallOption) (*SyncWindowsResponse, error) + // ListLinks returns all deep links for the particular project + ListLinks(ctx context.Context, in *application.ListLinksRequest, opts ...grpc.CallOption) (*application.LinksResponse, error) } type projectServiceClient struct { @@ -859,6 +865,15 @@ func (c *projectServiceClient) GetSyncWindowsState(ctx context.Context, in *Sync return out, nil } +func (c *projectServiceClient) ListLinks(ctx context.Context, in *application.ListLinksRequest, opts ...grpc.CallOption) (*application.LinksResponse, error) { + out := new(application.LinksResponse) + err := c.cc.Invoke(ctx, "/project.ProjectService/ListLinks", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ProjectServiceServer is the server API for ProjectService service. type ProjectServiceServer interface { // Create a new project token @@ -883,6 +898,8 @@ type ProjectServiceServer interface { ListEvents(context.Context, *ProjectQuery) (*v1.EventList, error) // GetSchedulesState returns true if there are any active sync syncWindows GetSyncWindowsState(context.Context, *SyncWindowsQuery) (*SyncWindowsResponse, error) + // ListLinks returns all deep links for the particular project + ListLinks(context.Context, *application.ListLinksRequest) (*application.LinksResponse, error) } // UnimplementedProjectServiceServer can be embedded to have forward compatible implementations. @@ -922,6 +939,9 @@ func (*UnimplementedProjectServiceServer) ListEvents(ctx context.Context, req *P func (*UnimplementedProjectServiceServer) GetSyncWindowsState(ctx context.Context, req *SyncWindowsQuery) (*SyncWindowsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetSyncWindowsState not implemented") } +func (*UnimplementedProjectServiceServer) ListLinks(ctx context.Context, req *application.ListLinksRequest) (*application.LinksResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListLinks not implemented") +} func RegisterProjectServiceServer(s *grpc.Server, srv ProjectServiceServer) { s.RegisterService(&_ProjectService_serviceDesc, srv) @@ -1125,6 +1145,24 @@ func _ProjectService_GetSyncWindowsState_Handler(srv interface{}, ctx context.Co return interceptor(ctx, in, info, handler) } +func _ProjectService_ListLinks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(application.ListLinksRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProjectServiceServer).ListLinks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/project.ProjectService/ListLinks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProjectServiceServer).ListLinks(ctx, req.(*application.ListLinksRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _ProjectService_serviceDesc = grpc.ServiceDesc{ ServiceName: "project.ProjectService", HandlerType: (*ProjectServiceServer)(nil), @@ -1173,6 +1211,10 @@ var _ProjectService_serviceDesc = grpc.ServiceDesc{ MethodName: "GetSyncWindowsState", Handler: _ProjectService_GetSyncWindowsState_Handler, }, + { + MethodName: "ListLinks", + Handler: _ProjectService_ListLinks_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "server/project/project.proto", diff --git a/pkg/apiclient/project/project.pb.gw.go b/pkg/apiclient/project/project.pb.gw.go index 8ae2e95a62a69..39a53de2d6e50 100644 --- a/pkg/apiclient/project/project.pb.gw.go +++ b/pkg/apiclient/project/project.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -705,6 +706,78 @@ func local_request_ProjectService_GetSyncWindowsState_0(ctx context.Context, mar } +var ( + filter_ProjectService_ListLinks_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_ProjectService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, client ProjectServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq application.ListLinksRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.StringP(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProjectService_ListLinks_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListLinks(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ProjectService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, server ProjectServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq application.ListLinksRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.StringP(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProjectService_ListLinks_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListLinks(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterProjectServiceHandlerServer registers the http handlers for service ProjectService to "mux". // UnaryRPC :call ProjectServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -964,6 +1037,29 @@ func RegisterProjectServiceHandlerServer(ctx context.Context, mux *runtime.Serve }) + mux.Handle("GET", pattern_ProjectService_ListLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ProjectService_ListLinks_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ProjectService_ListLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1225,6 +1321,26 @@ func RegisterProjectServiceHandlerClient(ctx context.Context, mux *runtime.Serve }) + mux.Handle("GET", pattern_ProjectService_ListLinks_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ProjectService_ListLinks_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ProjectService_ListLinks_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1250,6 +1366,8 @@ var ( pattern_ProjectService_ListEvents_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "projects", "name", "events"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ProjectService_GetSyncWindowsState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "projects", "name", "syncwindows"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ProjectService_ListLinks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "projects", "name", "links"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -1274,4 +1392,6 @@ var ( forward_ProjectService_ListEvents_0 = runtime.ForwardResponseMessage forward_ProjectService_GetSyncWindowsState_0 = runtime.ForwardResponseMessage + + forward_ProjectService_ListLinks_0 = runtime.ForwardResponseMessage ) diff --git a/server/application/application.go b/server/application/application.go index 686b971d05017..a9e417b72b690 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -42,6 +42,7 @@ import ( applisters "github.com/argoproj/argo-cd/v2/pkg/client/listers/application/v1alpha1" "github.com/argoproj/argo-cd/v2/reposerver/apiclient" servercache "github.com/argoproj/argo-cd/v2/server/cache" + "github.com/argoproj/argo-cd/v2/server/deeplinks" "github.com/argoproj/argo-cd/v2/server/rbacpolicy" "github.com/argoproj/argo-cd/v2/util/argo" argoutil "github.com/argoproj/argo-cd/v2/util/argo" @@ -1892,6 +1893,51 @@ func (s *Server) Rollback(ctx context.Context, rollbackReq *application.Applicat return a, nil } +func (s *Server) ListLinks(ctx context.Context, req *application.ListLinksRequest) (*application.LinksResponse, error) { + appName := req.GetName() + appNs := s.appNamespaceOrDefault(req.GetNamespace()) + a, err := s.appclientset.ArgoprojV1alpha1().Applications(appNs).Get(ctx, appName, metav1.GetOptions{}) + if err != nil { + return nil, fmt.Errorf("error getting application: %w", err) + } + + obj, err := kube.ToUnstructured(a) + if err != nil { + return nil, fmt.Errorf("error getting application: %w", err) + } + + deepLinks, err := s.settingsMgr.GetDeepLinks(settings.ApplicationDeepLinks) + if err != nil { + return nil, fmt.Errorf("failed to read application deep links from configmap: %w", err) + } + + finalList, errorList := deeplinks.EvaluateDeepLinksResponse(*obj, deepLinks) + if len(errorList) > 0 { + log.Errorf("errorList while evaluating application deep links, %v", strings.Join(errorList, ", ")) + } + + return finalList, nil +} + +func (s *Server) ListResourceLinks(ctx context.Context, req *application.ApplicationResourceRequest) (*application.LinksResponse, error) { + obj, _, _, _, err := s.getUnstructuredLiveResourceOrApp(ctx, rbacpolicy.ActionGet, req) + if err != nil { + return nil, err + } + + deepLinks, err := s.settingsMgr.GetDeepLinks(settings.ResourceDeepLinks) + if err != nil { + return nil, fmt.Errorf("failed to read application deep links from configmap: %w", err) + } + + finalList, errorList := deeplinks.EvaluateDeepLinksResponse(*obj, deepLinks) + if len(errorList) > 0 { + log.Errorf("errors while evaluating resource deep links, %v", strings.Join(errorList, ", ")) + } + + return finalList, nil +} + // resolveRevision resolves the revision specified either in the sync request, or the // application source, into a concrete revision that will be used for a sync operation. func (s *Server) resolveRevision(ctx context.Context, app *appv1.Application, syncReq *application.ApplicationSyncRequest) (string, string, error) { diff --git a/server/application/application.proto b/server/application/application.proto index 50c22901503d5..a57dd55991600 100644 --- a/server/application/application.proto +++ b/server/application/application.proto @@ -264,6 +264,23 @@ message ManagedResourcesResponse { repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ResourceDiff items = 1; } +message LinkInfo { + required string title = 1; + required string url = 2; + optional string description = 3; + optional string iconClass = 4; +} + +message LinksResponse { + repeated LinkInfo items = 1; +} + +message ListLinksRequest { + required string name = 1; + optional string namespace = 2; +} + + // ApplicationService service ApplicationService { @@ -425,4 +442,14 @@ service ApplicationService { } }; } + + // ListLinks returns the list of all application deep links + rpc ListLinks(ListLinksRequest) returns (LinksResponse) { + option (google.api.http).get = "/api/v1/applications/{name}/links"; + } + + // ListResourceLinks returns the list of all resource deep links + rpc ListResourceLinks(ApplicationResourceRequest) returns (LinksResponse) { + option (google.api.http).get = "/api/v1/applications/{name}/resource/links"; + } } diff --git a/server/deeplinks/deeplinks.go b/server/deeplinks/deeplinks.go new file mode 100644 index 0000000000000..096521ab2bb0d --- /dev/null +++ b/server/deeplinks/deeplinks.go @@ -0,0 +1,63 @@ +package deeplinks + +import ( + "bytes" + "fmt" + "text/template" + + "github.com/antonmedv/expr" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/utils/pointer" + + "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" + "github.com/argoproj/argo-cd/v2/util/settings" +) + +func EvaluateDeepLinksResponse(obj unstructured.Unstructured, links []settings.DeepLink) (*application.LinksResponse, []string) { + finalLinks := []*application.LinkInfo{} + errors := []string{} + for _, link := range links { + t, err := template.New("deep-link").Parse(link.URL) + if err != nil { + errors = append(errors, fmt.Sprintf("failed to parse link template '%v', error=%v", link.URL, err.Error())) + continue + } + finalURL := bytes.Buffer{} + err = t.Execute(&finalURL, obj.Object) + if err != nil { + errors = append(errors, fmt.Sprintf("failed to evaluate link template '%v' with resource %v, error=%v", link.URL, obj.GetName(), err.Error())) + continue + } + if link.Condition != nil { + out, err := expr.Eval(*link.Condition, obj.Object) + if err != nil { + errors = append(errors, fmt.Sprintf("failed to evaluate link condition '%v' with resource %v, error=%v", *link.Condition, obj.GetName(), err.Error())) + continue + } + switch resOut := out.(type) { + case bool: + if resOut { + finalLinks = append(finalLinks, &application.LinkInfo{ + Title: pointer.String(link.Title), + Url: pointer.String(finalURL.String()), + Description: link.Description, + IconClass: link.IconClass, + }) + } + default: + errors = append(errors, fmt.Sprintf("link condition '%v' evaluated to non-boolean value for resource %v", *link.Condition, obj.GetName())) + continue + } + } else { + finalLinks = append(finalLinks, &application.LinkInfo{ + Title: pointer.String(link.Title), + Url: pointer.String(finalURL.String()), + Description: link.Description, + IconClass: link.IconClass, + }) + } + } + return &application.LinksResponse{ + Items: finalLinks, + }, errors +} diff --git a/server/deeplinks/deeplinks_test.go b/server/deeplinks/deeplinks_test.go new file mode 100644 index 0000000000000..9fc703a7e647c --- /dev/null +++ b/server/deeplinks/deeplinks_test.go @@ -0,0 +1,101 @@ +package deeplinks + +import ( + "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" + "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" + "github.com/argoproj/argo-cd/v2/util/settings" + "github.com/argoproj/gitops-engine/pkg/utils/kube" + "github.com/stretchr/testify/assert" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/utils/pointer" + "reflect" + "strings" + "testing" +) + +type deepLinkTC struct { + obj *unstructured.Unstructured + inputLinks []settings.DeepLink + outputLinks []*application.LinkInfo + error []string +} + +func TestDeepLinks(t *testing.T) { + appObj, err := kube.ToUnstructured(&v1alpha1.Application{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "test", + }, + Spec: v1alpha1.ApplicationSpec{ + Destination: v1alpha1.ApplicationDestination{ + Server: "test.com", + Namespace: "testns", + }, + }, + }) + assert.NoError(t, err) + testTable := []deepLinkTC{ + { + obj: appObj, + inputLinks: []settings.DeepLink{{ + Title: "link", + URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", + }}, + outputLinks: []*application.LinkInfo{{ + Title: pointer.String("link"), + Url: pointer.String("http://example.com/test&testns"), + }}, + error: []string{}, + }, + { + obj: appObj, + inputLinks: []settings.DeepLink{ + { + Title: "link", + URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", + Condition: pointer.String(`metadata.name matches "test"`), + }, + { + Title: "link1", + URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", + Condition: pointer.String(`metadata.name matches "test1"`), + }, + { + Title: "link2", + URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", + Condition: pointer.String(`metadata.test matches "test"`), + }}, + outputLinks: []*application.LinkInfo{{ + Title: pointer.String("link"), + Url: pointer.String("http://example.com/test&testns"), + }}, + error: []string{"failed to evaluate link condition 'metadata.test matches \"test\"' with resource test, error=interface conversion: interface {} is nil, not string (1:15)\n | metadata.test matches \"test\"\n | ..............^"}, + }, + { + obj: appObj, + inputLinks: []settings.DeepLink{ + { + Title: "link", + URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", + Condition: pointer.String(`metadata.name matches "test"`), + }, + { + Title: "link1", + URL: "http://example.com/{{ .metadata.name }}&{{ .spec.destination.namespace }}", + Condition: pointer.String(`1 + 1`), + }}, + outputLinks: []*application.LinkInfo{{ + Title: pointer.String("link"), + Url: pointer.String("http://example.com/test&testns"), + }}, + error: []string{"link condition '1 + 1' evaluated to non-boolean value for resource test"}, + }, + } + + for _, tc := range testTable { + output, err := EvaluateDeepLinksResponse(*tc.obj, tc.inputLinks) + assert.Equal(t, tc.error, err, strings.Join(err, ",")) + assert.Equal(t, reflect.DeepEqual(output.Items, tc.outputLinks), true) + } +} diff --git a/server/project/project.go b/server/project/project.go index d077b3bbc2b8e..286423412fd80 100644 --- a/server/project/project.go +++ b/server/project/project.go @@ -6,8 +6,7 @@ import ( "reflect" "strings" - "github.com/argoproj/argo-cd/v2/util/db" - + "github.com/argoproj/gitops-engine/pkg/utils/kube" "github.com/argoproj/pkg/sync" "github.com/golang-jwt/jwt/v4" "github.com/google/uuid" @@ -22,12 +21,15 @@ import ( "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/retry" + "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" "github.com/argoproj/argo-cd/v2/pkg/apiclient/project" "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" appclientset "github.com/argoproj/argo-cd/v2/pkg/client/clientset/versioned" listersv1alpha1 "github.com/argoproj/argo-cd/v2/pkg/client/listers/application/v1alpha1" + "github.com/argoproj/argo-cd/v2/server/deeplinks" "github.com/argoproj/argo-cd/v2/server/rbacpolicy" "github.com/argoproj/argo-cd/v2/util/argo" + "github.com/argoproj/argo-cd/v2/util/db" jwtutil "github.com/argoproj/argo-cd/v2/util/jwt" "github.com/argoproj/argo-cd/v2/util/rbac" "github.com/argoproj/argo-cd/v2/util/session" @@ -155,6 +157,30 @@ func (s *Server) createToken(ctx context.Context, q *project.ProjectTokenCreateR } +func (s *Server) ListLinks(ctx context.Context, q *application.ListLinksRequest) (*application.LinksResponse, error) { + proj, err := s.appclientset.ArgoprojV1alpha1().AppProjects(s.ns).Get(ctx, q.GetName(), metav1.GetOptions{}) + if err != nil { + return nil, err + } + + obj, err := kube.ToUnstructured(proj) + if err != nil { + return nil, fmt.Errorf("error getting application: %w", err) + } + + deepLinks, err := s.settingsMgr.GetDeepLinks(settings.ProjectDeepLinks) + if err != nil { + return nil, fmt.Errorf("failed to read application deep links from configmap: %w", err) + } + + finalList, errorList := deeplinks.EvaluateDeepLinksResponse(*obj, deepLinks) + if len(errorList) > 0 { + log.Errorf("errorList while evaluating project deep links, %v", strings.Join(errorList, ", ")) + } + + return finalList, nil +} + // DeleteToken deletes a token in a project func (s *Server) DeleteToken(ctx context.Context, q *project.ProjectTokenDeleteRequest) (*project.EmptyResponse, error) { var resp *project.EmptyResponse diff --git a/server/project/project.proto b/server/project/project.proto index 7d175000fbc21..496f4ae0c4d38 100644 --- a/server/project/project.proto +++ b/server/project/project.proto @@ -9,7 +9,7 @@ package project; import "google/api/annotations.proto"; import "k8s.io/api/core/v1/generated.proto"; import "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1/generated.proto"; - +import "github.com/argoproj/argo-cd/v2/server/application/application.proto"; // ProjectCreateRequest defines project creation parameters. message ProjectCreateRequest { @@ -136,4 +136,10 @@ service ProjectService { rpc GetSyncWindowsState(SyncWindowsQuery) returns (SyncWindowsResponse) { option (google.api.http).get = "/api/v1/projects/{name}/syncwindows"; } + + // ListLinks returns all deep links for the particular project + rpc ListLinks(application.ListLinksRequest) returns (application.LinksResponse) { + option (google.api.http).get = "/api/v1/projects/{name}/links"; + } + } \ No newline at end of file diff --git a/util/settings/settings.go b/util/settings/settings.go index 80a1c6da46fd4..ac668a99ba654 100644 --- a/util/settings/settings.go +++ b/util/settings/settings.go @@ -318,6 +318,20 @@ type RepositoryCredentials struct { Type string `json:"type,omitempty"` } +// DeepLink structure +type DeepLink struct { + // URL that the deep link will redirect to + URL string `json:"url"` + // Title that will be displayed in the UI corresponding to that link + Title string `json:"title"` + // Description (optional) a description for what the deep link is about + Description *string `json:"description,omitempty"` + // IconClass (optional) a font-awesome icon class to be used when displaying the links in dropdown menus. + IconClass *string `json:"icon.class,omitempty"` + // Condition (optional) a conditional statement depending on which the deep link shall be rendered + Condition *string `json:"if,omitempty"` +} + const ( // settingServerSignatureKey designates the key for a server secret key inside a Kubernetes secret. settingServerSignatureKey = "server.secretkey" @@ -423,6 +437,12 @@ const ( execShellsKey = "exec.shells" // oidcTLSInsecureSkipVerifyKey is the key to configure whether TLS cert verification is skipped for OIDC connections oidcTLSInsecureSkipVerifyKey = "oidc.tls.insecure.skip.verify" + // ApplicationDeepLinks is the application deep link key + ApplicationDeepLinks = "application.links" + // ProjectDeepLinks is the project deep link key + ProjectDeepLinks = "project.links" + // ResourceDeepLinks is the resource deep link key + ResourceDeepLinks = "resource.links" ) var ( @@ -701,6 +721,21 @@ func (mgr *SettingsManager) GetConfigManagementPlugins() ([]v1alpha1.ConfigManag return plugins, nil } +func (mgr *SettingsManager) GetDeepLinks(deeplinkType string) ([]DeepLink, error) { + argoCDCM, err := mgr.getConfigMap() + if err != nil { + return nil, err + } + deepLinks := make([]DeepLink, 0) + if value, ok := argoCDCM.Data[deeplinkType]; ok { + err := yaml.Unmarshal([]byte(value), &deepLinks) + if err != nil { + return nil, err + } + } + return deepLinks, nil +} + func (mgr *SettingsManager) GetEnabledSourceTypes() (map[string]bool, error) { argoCDCM, err := mgr.getConfigMap() if err != nil { From b05cbf3520117f4b027e7d1b3e1a8c678449eb40 Mon Sep 17 00:00:00 2001 From: Soumya Ghosh Dastidar Date: Thu, 24 Nov 2022 10:48:23 +0530 Subject: [PATCH 2/4] fix: add rbac check to list links services Signed-off-by: Soumya Ghosh Dastidar --- assets/swagger.json | 10 +- pkg/apiclient/application/application.pb.go | 441 ++++++++++-------- .../application/application.pb.gw.go | 4 +- pkg/apiclient/project/project.pb.go | 319 ++++++++++--- pkg/apiclient/project/project.pb.gw.go | 27 +- server/application/application.go | 37 +- server/application/application.proto | 7 +- server/project/project.go | 13 +- server/project/project.proto | 6 +- 9 files changed, 566 insertions(+), 298 deletions(-) diff --git a/assets/swagger.json b/assets/swagger.json index 0a481f15c2f52..f30633f22e414 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -749,6 +749,11 @@ "in": "path", "required": true }, + { + "type": "string", + "name": "project", + "in": "query" + }, { "type": "string", "name": "namespace", @@ -2670,11 +2675,6 @@ "name": "name", "in": "path", "required": true - }, - { - "type": "string", - "name": "namespace", - "in": "query" } ], "responses": { diff --git a/pkg/apiclient/application/application.pb.go b/pkg/apiclient/application/application.pb.go index fe60992630c0a..72a8c5ab556d8 100644 --- a/pkg/apiclient/application/application.pb.go +++ b/pkg/apiclient/application/application.pb.go @@ -2529,26 +2529,27 @@ func (m *LinksResponse) GetItems() []*LinkInfo { return nil } -type ListLinksRequest struct { +type ListAppLinksRequest struct { Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - Namespace *string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` + Project *string `protobuf:"bytes,2,req,name=project" json:"project,omitempty"` + Namespace *string `protobuf:"bytes,3,opt,name=namespace" json:"namespace,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *ListLinksRequest) Reset() { *m = ListLinksRequest{} } -func (m *ListLinksRequest) String() string { return proto.CompactTextString(m) } -func (*ListLinksRequest) ProtoMessage() {} -func (*ListLinksRequest) Descriptor() ([]byte, []int) { +func (m *ListAppLinksRequest) Reset() { *m = ListAppLinksRequest{} } +func (m *ListAppLinksRequest) String() string { return proto.CompactTextString(m) } +func (*ListAppLinksRequest) ProtoMessage() {} +func (*ListAppLinksRequest) Descriptor() ([]byte, []int) { return fileDescriptor_df6e82b174b5eaec, []int{34} } -func (m *ListLinksRequest) XXX_Unmarshal(b []byte) error { +func (m *ListAppLinksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ListLinksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ListAppLinksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ListLinksRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_ListAppLinksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2558,26 +2559,33 @@ func (m *ListLinksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *ListLinksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListLinksRequest.Merge(m, src) +func (m *ListAppLinksRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListAppLinksRequest.Merge(m, src) } -func (m *ListLinksRequest) XXX_Size() int { +func (m *ListAppLinksRequest) XXX_Size() int { return m.Size() } -func (m *ListLinksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListLinksRequest.DiscardUnknown(m) +func (m *ListAppLinksRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ListAppLinksRequest.DiscardUnknown(m) } -var xxx_messageInfo_ListLinksRequest proto.InternalMessageInfo +var xxx_messageInfo_ListAppLinksRequest proto.InternalMessageInfo -func (m *ListLinksRequest) GetName() string { +func (m *ListAppLinksRequest) GetName() string { if m != nil && m.Name != nil { return *m.Name } return "" } -func (m *ListLinksRequest) GetNamespace() string { +func (m *ListAppLinksRequest) GetProject() string { + if m != nil && m.Project != nil { + return *m.Project + } + return "" +} + +func (m *ListAppLinksRequest) GetNamespace() string { if m != nil && m.Namespace != nil { return *m.Namespace } @@ -2619,7 +2627,7 @@ func init() { proto.RegisterType((*ManagedResourcesResponse)(nil), "application.ManagedResourcesResponse") proto.RegisterType((*LinkInfo)(nil), "application.LinkInfo") proto.RegisterType((*LinksResponse)(nil), "application.LinksResponse") - proto.RegisterType((*ListLinksRequest)(nil), "application.ListLinksRequest") + proto.RegisterType((*ListAppLinksRequest)(nil), "application.ListAppLinksRequest") } func init() { @@ -2627,168 +2635,169 @@ func init() { } var fileDescriptor_df6e82b174b5eaec = []byte{ - // 2573 bytes of a gzipped FileDescriptorProto + // 2589 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x8f, 0x1c, 0x47, - 0x15, 0xa7, 0x66, 0xbf, 0x66, 0xde, 0xac, 0xbf, 0x2a, 0xf1, 0xd2, 0x69, 0x6f, 0xcc, 0xba, 0xfd, - 0xb5, 0x5e, 0x7b, 0x67, 0xec, 0xc1, 0x20, 0x67, 0x13, 0x04, 0xfe, 0xb6, 0x61, 0xed, 0x98, 0x5e, - 0x1b, 0xa3, 0x70, 0x80, 0x4a, 0x77, 0xed, 0x6c, 0xb3, 0x3d, 0xdd, 0xed, 0xee, 0x9e, 0xb1, 0x46, - 0xc6, 0x97, 0x20, 0x24, 0x0e, 0x51, 0x90, 0x92, 0x1c, 0x50, 0x14, 0x21, 0x94, 0x28, 0x17, 0x2e, + 0x15, 0xa7, 0x66, 0xbf, 0x66, 0xde, 0xac, 0xbf, 0x2a, 0xf1, 0xd2, 0x69, 0xaf, 0xcd, 0xba, 0xfd, + 0xb5, 0x5e, 0x7b, 0x67, 0xec, 0xc1, 0x20, 0x67, 0x13, 0x04, 0xb6, 0xe3, 0x2f, 0x58, 0x3b, 0xa6, + 0xd7, 0xc6, 0x28, 0x1c, 0xa0, 0xd2, 0x5d, 0x3b, 0xdb, 0x6c, 0x4f, 0x77, 0xbb, 0xbb, 0x67, 0xac, + 0x91, 0xf1, 0x25, 0x88, 0x13, 0x51, 0x90, 0x92, 0x1c, 0x50, 0x14, 0x21, 0x94, 0x28, 0x17, 0x2e, 0xdc, 0x10, 0x12, 0x17, 0xb8, 0x20, 0x90, 0x38, 0x20, 0x3e, 0x2e, 0x39, 0x21, 0x8b, 0x1b, 0x17, - 0xfe, 0x04, 0x54, 0xd5, 0x55, 0xdd, 0xd5, 0x33, 0x3d, 0x3d, 0xb3, 0xd9, 0x45, 0xf1, 0xad, 0x5e, - 0x4d, 0xd5, 0x7b, 0xbf, 0x7a, 0xf5, 0xbe, 0xea, 0xf5, 0xc0, 0x89, 0x88, 0x86, 0x3d, 0x1a, 0x36, - 0x49, 0x10, 0xb8, 0x8e, 0x45, 0x62, 0xc7, 0xf7, 0xd4, 0x71, 0x23, 0x08, 0xfd, 0xd8, 0xc7, 0x75, - 0x65, 0x4a, 0x5f, 0x6c, 0xfb, 0x7e, 0xdb, 0xa5, 0x4d, 0x12, 0x38, 0x4d, 0xe2, 0x79, 0x7e, 0xcc, - 0xa7, 0xa3, 0x64, 0xa9, 0x6e, 0x6c, 0x5f, 0x8a, 0x1a, 0x8e, 0xcf, 0x7f, 0xb5, 0xfc, 0x90, 0x36, - 0x7b, 0x17, 0x9a, 0x6d, 0xea, 0xd1, 0x90, 0xc4, 0xd4, 0x16, 0x6b, 0x2e, 0x66, 0x6b, 0x3a, 0xc4, - 0xda, 0x72, 0x3c, 0x1a, 0xf6, 0x9b, 0xc1, 0x76, 0x9b, 0x4d, 0x44, 0xcd, 0x0e, 0x8d, 0x49, 0xd1, - 0xae, 0xf5, 0xb6, 0x13, 0x6f, 0x75, 0xdf, 0x6c, 0x58, 0x7e, 0xa7, 0x49, 0xc2, 0xb6, 0x1f, 0x84, - 0xfe, 0x0f, 0xf9, 0x60, 0xd5, 0xb2, 0x9b, 0xbd, 0x56, 0xc6, 0x40, 0x3d, 0x4b, 0xef, 0x02, 0x71, - 0x83, 0x2d, 0x32, 0xcc, 0xed, 0xfa, 0x18, 0x6e, 0x21, 0x0d, 0x7c, 0xa1, 0x1b, 0x3e, 0x74, 0x62, - 0x3f, 0xec, 0x2b, 0xc3, 0x84, 0x8d, 0xf1, 0x29, 0x82, 0x83, 0x97, 0x33, 0x79, 0xdf, 0xee, 0xd2, - 0xb0, 0x8f, 0x31, 0x4c, 0x7b, 0xa4, 0x43, 0x35, 0xb4, 0x84, 0x96, 0x6b, 0x26, 0x1f, 0x63, 0x0d, - 0xe6, 0x42, 0xba, 0x19, 0xd2, 0x68, 0x4b, 0xab, 0xf0, 0x69, 0x49, 0x62, 0x1d, 0xaa, 0x4c, 0x38, - 0xb5, 0xe2, 0x48, 0x9b, 0x5a, 0x9a, 0x5a, 0xae, 0x99, 0x29, 0x8d, 0x97, 0xe1, 0x40, 0x48, 0x23, - 0xbf, 0x1b, 0x5a, 0xf4, 0x3b, 0x34, 0x8c, 0x1c, 0xdf, 0xd3, 0xa6, 0xf9, 0xee, 0xc1, 0x69, 0xc6, - 0x25, 0xa2, 0x2e, 0xb5, 0x62, 0x3f, 0xd4, 0x66, 0xf8, 0x92, 0x94, 0x66, 0x78, 0x18, 0x70, 0x6d, - 0x36, 0xc1, 0xc3, 0xc6, 0xd8, 0x80, 0x79, 0x12, 0x04, 0x77, 0x49, 0x87, 0x46, 0x01, 0xb1, 0xa8, - 0x36, 0xc7, 0x7f, 0xcb, 0xcd, 0x19, 0x57, 0xa1, 0x76, 0xd7, 0xb7, 0xe9, 0xe8, 0x43, 0x0d, 0x32, - 0xa9, 0x14, 0x30, 0xd9, 0x86, 0xc3, 0x26, 0xed, 0x39, 0x0c, 0xe4, 0x1d, 0x1a, 0x13, 0x9b, 0xc4, - 0x64, 0x90, 0x61, 0x25, 0x65, 0xa8, 0x43, 0x35, 0x14, 0x8b, 0xb5, 0x0a, 0x9f, 0x4f, 0xe9, 0x21, - 0x61, 0x53, 0x05, 0xc2, 0xfe, 0x82, 0xe0, 0xa8, 0x72, 0x1d, 0xa6, 0x50, 0xd2, 0xf5, 0x1e, 0xf5, - 0xe2, 0x68, 0xb4, 0xd8, 0x73, 0x70, 0x48, 0xea, 0x73, 0xf0, 0x30, 0xc3, 0x3f, 0x30, 0x20, 0xea, - 0xa4, 0x04, 0xa2, 0xce, 0xe1, 0x25, 0xa8, 0x4b, 0xfa, 0xc1, 0xed, 0x6b, 0xe2, 0xd2, 0xd4, 0xa9, - 0xa1, 0xe3, 0xcc, 0x14, 0x1c, 0xc7, 0x03, 0x4d, 0x39, 0xcd, 0x1d, 0xe2, 0x39, 0x9b, 0x34, 0x8a, - 0x27, 0x55, 0x1f, 0xda, 0xb1, 0xfa, 0x8e, 0x41, 0xed, 0x86, 0xe3, 0xd2, 0xab, 0x5b, 0x5d, 0x6f, - 0x1b, 0xbf, 0x08, 0x33, 0x16, 0x1b, 0x70, 0x09, 0xf3, 0x66, 0x42, 0x18, 0x8f, 0xe1, 0xd8, 0x28, - 0x48, 0x0f, 0x9d, 0x78, 0x8b, 0x6d, 0x8f, 0x46, 0x61, 0xb3, 0xb6, 0xa8, 0xb5, 0x1d, 0x75, 0x3b, - 0xf2, 0x6a, 0x25, 0x3d, 0x11, 0xb6, 0x5f, 0x21, 0x58, 0x1e, 0x2b, 0xf9, 0x61, 0x48, 0x82, 0x80, - 0x86, 0xf8, 0x06, 0xcc, 0x3c, 0x62, 0x3f, 0x70, 0x6b, 0xad, 0xb7, 0x1a, 0x0d, 0x35, 0xa6, 0x8d, - 0xe5, 0x72, 0xeb, 0x0b, 0x66, 0xb2, 0x1d, 0x37, 0xa4, 0x0e, 0x2a, 0x9c, 0xcf, 0x42, 0x8e, 0x4f, - 0xaa, 0x2a, 0xb6, 0x9e, 0x2f, 0xbb, 0x32, 0x0b, 0xd3, 0x01, 0x09, 0x63, 0xe3, 0x30, 0xbc, 0x90, - 0x37, 0xc3, 0xc0, 0xf7, 0x22, 0x6a, 0xfc, 0x0e, 0xe5, 0x2e, 0xf4, 0x6a, 0x48, 0x49, 0x4c, 0x4d, - 0xfa, 0xa8, 0x4b, 0xa3, 0x18, 0x6f, 0x83, 0x1a, 0x66, 0xb9, 0xee, 0xea, 0xad, 0xdb, 0x8d, 0x2c, - 0x4e, 0x35, 0x64, 0x9c, 0xe2, 0x83, 0xef, 0x5b, 0x76, 0xa3, 0xd7, 0x6a, 0x04, 0xdb, 0xed, 0x06, - 0x8b, 0x7a, 0x39, 0x64, 0x32, 0xea, 0xa9, 0x47, 0x35, 0x55, 0xee, 0x78, 0x01, 0x66, 0xbb, 0x41, - 0x44, 0xc3, 0x98, 0x9f, 0xac, 0x6a, 0x0a, 0x8a, 0xdd, 0x52, 0x8f, 0xb8, 0x8e, 0x4d, 0xe2, 0xe4, - 0x16, 0xaa, 0x66, 0x4a, 0x1b, 0x1f, 0xe7, 0xd1, 0x3f, 0x08, 0xec, 0xcf, 0x0b, 0xbd, 0x8a, 0xb2, - 0x32, 0x80, 0xf2, 0x83, 0x3c, 0xca, 0x6b, 0xd4, 0xa5, 0x19, 0xca, 0x22, 0xc3, 0xd4, 0x60, 0xce, - 0x22, 0x91, 0x45, 0x6c, 0xc9, 0x4b, 0x92, 0x2c, 0x2c, 0x04, 0xa1, 0x1f, 0x90, 0x36, 0xe7, 0x74, - 0xcf, 0x77, 0x1d, 0xab, 0x2f, 0x6c, 0x73, 0xf8, 0x87, 0x21, 0x23, 0x9e, 0x2e, 0x30, 0xe2, 0xe3, - 0x50, 0xdf, 0xe8, 0x7b, 0xd6, 0xeb, 0x01, 0x4f, 0x99, 0xcc, 0xc5, 0x9c, 0x98, 0x76, 0x22, 0x0d, - 0xf1, 0xb8, 0x9f, 0x10, 0xc6, 0x87, 0x33, 0xb0, 0xa0, 0x9c, 0x80, 0x6d, 0x28, 0xc3, 0x5f, 0xe6, - 0xf4, 0x0b, 0x30, 0x6b, 0x87, 0x7d, 0xb3, 0xeb, 0x89, 0xcb, 0x14, 0x14, 0x13, 0x1c, 0x84, 0x5d, - 0x2f, 0x01, 0x59, 0x35, 0x13, 0x02, 0x6f, 0x42, 0x35, 0x8a, 0x59, 0x92, 0x6c, 0xf7, 0x79, 0x38, - 0xaa, 0xb7, 0xbe, 0xb9, 0xbb, 0x0b, 0x64, 0xd0, 0x37, 0x04, 0x47, 0x33, 0xe5, 0x8d, 0x1f, 0x41, - 0x4d, 0x46, 0xc2, 0x48, 0x9b, 0x5b, 0x9a, 0x5a, 0xae, 0xb7, 0x36, 0x76, 0x2f, 0xe8, 0xf5, 0x80, - 0x25, 0x78, 0x25, 0xea, 0x9b, 0x99, 0x14, 0xbc, 0x08, 0xb5, 0x8e, 0xf0, 0xf5, 0x48, 0xab, 0x72, - 0x6d, 0x67, 0x13, 0xf8, 0xbb, 0x30, 0xe3, 0x78, 0x9b, 0x7e, 0xa4, 0xd5, 0x38, 0x98, 0x2b, 0xbb, - 0x03, 0x73, 0xdb, 0xdb, 0xf4, 0xcd, 0x84, 0x21, 0x7e, 0x04, 0xfb, 0x42, 0x1a, 0x87, 0x7d, 0xa9, - 0x05, 0x0d, 0xb8, 0x5e, 0xbf, 0xb5, 0x3b, 0x09, 0xa6, 0xca, 0xd2, 0xcc, 0x4b, 0xc0, 0x6b, 0x50, - 0x8f, 0x32, 0x1b, 0xd3, 0xea, 0x5c, 0xa0, 0x96, 0x63, 0xa4, 0xd8, 0xa0, 0xa9, 0x2e, 0x1e, 0xb2, - 0xe1, 0xf9, 0x02, 0x1b, 0xfe, 0x27, 0x82, 0xc5, 0xa1, 0x30, 0xb0, 0x11, 0xd0, 0x52, 0x23, 0x25, - 0x30, 0x1d, 0x05, 0xd4, 0xe2, 0x91, 0xbf, 0xde, 0xba, 0xb3, 0x67, 0x71, 0x81, 0xcb, 0xe5, 0xac, - 0xcb, 0x42, 0xd7, 0x44, 0xbe, 0xf9, 0x13, 0x04, 0x5f, 0x54, 0x38, 0xdf, 0x23, 0xb1, 0xb5, 0x55, - 0x76, 0x24, 0xe6, 0x43, 0x6c, 0x8d, 0xc8, 0x66, 0x09, 0xc1, 0x0c, 0x8d, 0x0f, 0xee, 0xf7, 0x03, - 0x06, 0x83, 0xfd, 0x92, 0x4d, 0x4c, 0x94, 0xf4, 0xdf, 0x45, 0xa0, 0xab, 0x91, 0xcf, 0x77, 0xdd, - 0x37, 0x89, 0xb5, 0x5d, 0x06, 0x65, 0x3f, 0x54, 0x1c, 0x9b, 0xe3, 0x98, 0x32, 0x2b, 0x8e, 0xbd, - 0x43, 0xb7, 0x1f, 0x04, 0x35, 0x5b, 0x00, 0xea, 0xd3, 0x01, 0x50, 0xd2, 0xc5, 0x4a, 0x40, 0x2d, - 0x42, 0xcd, 0x1b, 0x28, 0xa6, 0xb2, 0x89, 0x82, 0x22, 0xaa, 0x32, 0x54, 0x44, 0x69, 0x30, 0xd7, - 0x4b, 0xab, 0x5e, 0xf6, 0xb3, 0x24, 0xd9, 0x41, 0xda, 0xa1, 0xdf, 0x0d, 0x84, 0x02, 0x13, 0x82, - 0xa1, 0xd8, 0x76, 0x3c, 0x5b, 0x9b, 0x4d, 0x50, 0xb0, 0xf1, 0x44, 0x75, 0xee, 0x7b, 0x15, 0xf8, - 0x52, 0xc1, 0xe1, 0xc6, 0x5a, 0xc0, 0xf3, 0x71, 0xc2, 0xd4, 0x0e, 0xe7, 0x46, 0xda, 0x61, 0x75, - 0x9c, 0x1d, 0xd6, 0x0a, 0xb4, 0xf2, 0x4e, 0x05, 0x96, 0x0a, 0xb4, 0x32, 0x3e, 0xa1, 0x3e, 0x37, - 0x6a, 0xd9, 0xf4, 0x43, 0x71, 0xe3, 0x55, 0x33, 0x21, 0x98, 0x67, 0xf8, 0x61, 0xb0, 0x45, 0x3c, - 0xad, 0x9a, 0x78, 0x46, 0x42, 0x4d, 0xa4, 0x90, 0xff, 0x22, 0xd0, 0xa4, 0x16, 0x2e, 0x5b, 0x5c, - 0x27, 0x5d, 0xef, 0xf9, 0x57, 0xc4, 0x02, 0xcc, 0x12, 0x8e, 0x56, 0x18, 0x88, 0xa0, 0x86, 0x8e, - 0x5c, 0x2d, 0x8e, 0x89, 0x47, 0xf2, 0x47, 0x8e, 0xd6, 0x9d, 0x28, 0x96, 0x05, 0x2d, 0xde, 0x84, - 0xb9, 0x84, 0x5b, 0x52, 0xc2, 0xd4, 0x5b, 0xeb, 0xbb, 0x4d, 0x6c, 0x39, 0xf5, 0x4a, 0xe6, 0xc6, - 0x2b, 0x70, 0xa4, 0x30, 0xfa, 0x08, 0x18, 0x3a, 0x54, 0x65, 0x32, 0x17, 0x17, 0x90, 0xd2, 0xc6, - 0x7f, 0xa6, 0xf2, 0x61, 0xdd, 0xb7, 0xd7, 0xfd, 0x76, 0xc9, 0x5b, 0xb0, 0xfc, 0xd2, 0x34, 0x98, - 0x0b, 0x7c, 0x5b, 0x79, 0xf6, 0x49, 0x92, 0xed, 0xb3, 0x7c, 0x2f, 0x26, 0x8e, 0x47, 0x43, 0x91, - 0x5f, 0xb2, 0x09, 0xa6, 0xec, 0xc8, 0xf1, 0x2c, 0xba, 0x41, 0x2d, 0xdf, 0xb3, 0x23, 0x7e, 0x6b, - 0x53, 0x66, 0x6e, 0x0e, 0xdf, 0x82, 0x1a, 0xa7, 0xef, 0x3b, 0x9d, 0x24, 0x08, 0xd7, 0x5b, 0x2b, - 0x8d, 0xa4, 0x55, 0xd2, 0x50, 0x5b, 0x25, 0x99, 0x0e, 0x3b, 0x34, 0x26, 0x8d, 0xde, 0x85, 0x06, - 0xdb, 0x61, 0x66, 0x9b, 0x19, 0x96, 0x98, 0x38, 0xee, 0xba, 0xe3, 0xf1, 0x02, 0x8b, 0x89, 0xca, - 0x26, 0x98, 0x41, 0x6c, 0xfa, 0xae, 0xeb, 0x3f, 0x96, 0x3e, 0x90, 0x50, 0x6c, 0x57, 0xd7, 0x8b, - 0x1d, 0x97, 0xcb, 0x4f, 0x1c, 0x20, 0x9b, 0xe0, 0xbb, 0x1c, 0x37, 0xa6, 0x21, 0x2f, 0x61, 0x6a, - 0xa6, 0xa0, 0x52, 0x93, 0xab, 0x27, 0x7d, 0x01, 0xe9, 0x7b, 0x89, 0x71, 0xce, 0xab, 0xc6, 0x39, - 0x68, 0xf0, 0xfb, 0x0a, 0xde, 0xcd, 0xbc, 0x19, 0x42, 0x7b, 0x8e, 0xdf, 0x8d, 0xb4, 0xfd, 0x49, - 0x12, 0x97, 0xf4, 0x90, 0xc1, 0x1e, 0x28, 0x30, 0xd8, 0xdf, 0x23, 0xa8, 0xae, 0xfb, 0xed, 0xeb, - 0x5e, 0x1c, 0xf6, 0x79, 0x65, 0xef, 0x7b, 0x31, 0xf5, 0xa4, 0x55, 0x48, 0x92, 0xa9, 0x3a, 0x76, - 0x3a, 0x74, 0x23, 0x26, 0x9d, 0x40, 0xd4, 0x24, 0x3b, 0x52, 0x75, 0xba, 0x99, 0x1d, 0xdf, 0x25, - 0x51, 0xcc, 0xbd, 0xb7, 0x6a, 0xf2, 0x31, 0x03, 0x9a, 0x2e, 0xd8, 0x88, 0x43, 0xe1, 0xba, 0xb9, - 0x39, 0xd5, 0x90, 0x66, 0x12, 0x6c, 0x82, 0x34, 0x36, 0xe0, 0xa5, 0xb4, 0x94, 0xbd, 0x4f, 0xc3, - 0x8e, 0xe3, 0x91, 0xf2, 0x78, 0x3b, 0x49, 0x17, 0xe6, 0x41, 0xce, 0x81, 0x58, 0xfd, 0xf7, 0xd0, - 0xf1, 0x6c, 0xff, 0x71, 0x89, 0x23, 0x4c, 0xc2, 0xf6, 0x6f, 0xf9, 0x7e, 0x8b, 0xc2, 0x37, 0xf5, - 0xcd, 0x5b, 0xb0, 0x8f, 0x79, 0x71, 0x8f, 0x8a, 0x1f, 0x44, 0xa0, 0x30, 0x46, 0x3d, 0xc9, 0x33, - 0x1e, 0x66, 0x7e, 0x23, 0x5e, 0x87, 0x03, 0x24, 0x8a, 0x9c, 0xb6, 0x47, 0x6d, 0xc9, 0xab, 0x32, - 0x31, 0xaf, 0xc1, 0xad, 0xc9, 0xb3, 0x8f, 0xaf, 0x10, 0x77, 0x27, 0x49, 0xe3, 0xc7, 0x08, 0x0e, - 0x17, 0x32, 0x49, 0x6d, 0x1d, 0x29, 0xe1, 0x55, 0x87, 0x6a, 0x64, 0x6d, 0x51, 0xbb, 0xeb, 0x52, - 0xd9, 0xd7, 0x90, 0x34, 0xfb, 0xcd, 0xee, 0x26, 0x37, 0x29, 0xc2, 0x7b, 0x4a, 0xe3, 0xa3, 0x00, - 0x1d, 0xe2, 0x75, 0x89, 0xcb, 0x21, 0x4c, 0x73, 0x08, 0xca, 0x8c, 0xb1, 0x08, 0x7a, 0x91, 0x19, - 0x88, 0x4e, 0xc2, 0x3f, 0x10, 0xec, 0x97, 0x61, 0x50, 0xdc, 0xe1, 0x32, 0x1c, 0x50, 0xd4, 0x70, - 0x37, 0xbb, 0xce, 0xc1, 0xe9, 0x31, 0x21, 0x4e, 0xda, 0xc2, 0x54, 0xbe, 0x7b, 0xd9, 0xcb, 0xf5, - 0x1f, 0x27, 0xce, 0x43, 0x68, 0x47, 0x95, 0xd8, 0x8f, 0x40, 0xbb, 0x43, 0x3c, 0xd2, 0xa6, 0x76, - 0x7a, 0xb8, 0xd4, 0x90, 0x7e, 0xa0, 0x3e, 0x96, 0x77, 0xfd, 0x34, 0x4d, 0xcb, 0x19, 0x67, 0x73, - 0x53, 0x3e, 0xbc, 0x43, 0xa8, 0xae, 0x3b, 0xde, 0x36, 0x7b, 0xbf, 0xb1, 0x73, 0xc5, 0x4e, 0xec, - 0x4a, 0x1d, 0x26, 0x04, 0x3e, 0x08, 0x53, 0xdd, 0xd0, 0x15, 0xf7, 0xcc, 0x86, 0x78, 0x09, 0xea, - 0x36, 0x8d, 0xac, 0xd0, 0x09, 0xc4, 0x2d, 0xf3, 0x46, 0x9f, 0x32, 0xc5, 0xb4, 0xed, 0x58, 0xbe, - 0x77, 0xd5, 0x25, 0x51, 0x24, 0x13, 0x43, 0x3a, 0x61, 0xbc, 0x06, 0xfb, 0x98, 0xcc, 0xec, 0x98, - 0x67, 0xf3, 0xc7, 0x3c, 0x9c, 0x83, 0x2f, 0xe1, 0x49, 0xc4, 0xd7, 0xe0, 0x20, 0xcb, 0xc7, 0x82, - 0xc3, 0x67, 0xac, 0x44, 0x5a, 0x3f, 0x35, 0x00, 0xab, 0x06, 0x4f, 0xc3, 0x9e, 0x63, 0x51, 0xfc, - 0x2e, 0x82, 0x69, 0xc6, 0x1d, 0xbf, 0x3c, 0xca, 0xbf, 0xb8, 0xe1, 0xe9, 0x7b, 0xf7, 0x9a, 0x63, - 0xd2, 0x8c, 0xc5, 0xb7, 0xfe, 0xfe, 0xef, 0xf7, 0x2a, 0x0b, 0xf8, 0x45, 0xfe, 0x0d, 0xa1, 0x77, - 0x41, 0xed, 0xe7, 0x47, 0xf8, 0x6d, 0x04, 0x58, 0x94, 0x20, 0x4a, 0x6b, 0x17, 0x9f, 0x1d, 0x05, - 0xb1, 0xa0, 0x05, 0xac, 0xbf, 0xac, 0x84, 0xfa, 0x86, 0xe5, 0x87, 0x94, 0x05, 0x76, 0xbe, 0x80, - 0x03, 0x58, 0xe1, 0x00, 0x4e, 0x60, 0xa3, 0x08, 0x40, 0xf3, 0x09, 0xd3, 0xdb, 0xd3, 0x26, 0x4d, - 0xe4, 0x7e, 0x84, 0x60, 0xe6, 0x21, 0x2f, 0xb8, 0xc7, 0x28, 0x69, 0x63, 0xcf, 0x94, 0xc4, 0xc5, - 0x71, 0xb4, 0xc6, 0x71, 0x8e, 0xf4, 0x65, 0x7c, 0x44, 0x22, 0x8d, 0xe2, 0x90, 0x92, 0x4e, 0x0e, - 0xf0, 0x79, 0x84, 0x3f, 0x41, 0x30, 0x9b, 0xf4, 0x1a, 0xf1, 0xc9, 0x51, 0x28, 0x73, 0xbd, 0x48, - 0x7d, 0xef, 0x1a, 0x77, 0xc6, 0x19, 0x8e, 0xf1, 0xb8, 0x51, 0x78, 0x9d, 0x6b, 0xb9, 0xb6, 0xde, - 0xfb, 0x08, 0xa6, 0x6e, 0xd2, 0xb1, 0xf6, 0xb6, 0x87, 0xe0, 0x86, 0x14, 0x58, 0x70, 0xd5, 0xf8, - 0x63, 0x04, 0x2f, 0xdd, 0xa4, 0x71, 0x71, 0x9e, 0xc3, 0xcb, 0xe3, 0x93, 0x8f, 0x30, 0xbb, 0xb3, - 0x13, 0xac, 0x4c, 0x03, 0x7c, 0x93, 0x23, 0x3b, 0x83, 0x4f, 0x97, 0x19, 0x61, 0xd4, 0xf7, 0xac, - 0xc7, 0x02, 0xc7, 0x9f, 0x11, 0x1c, 0x1c, 0xfc, 0xd0, 0x82, 0xf3, 0x99, 0xb1, 0xf0, 0x3b, 0x8c, - 0x7e, 0x77, 0xb7, 0x81, 0x34, 0xcf, 0xd4, 0xb8, 0xcc, 0x91, 0xbf, 0x8a, 0x5f, 0x29, 0x43, 0x2e, - 0x3b, 0x94, 0x51, 0xf3, 0x89, 0x1c, 0x3e, 0xe5, 0x5f, 0xfe, 0x38, 0xec, 0xb7, 0x10, 0xcc, 0xdf, - 0xa4, 0xf1, 0x9d, 0xb4, 0x41, 0x77, 0x72, 0xa2, 0x06, 0xbe, 0xbe, 0xd8, 0x50, 0x3e, 0xd0, 0xc9, - 0x9f, 0x52, 0x95, 0xae, 0x72, 0x60, 0xa7, 0xf1, 0xc9, 0x32, 0x60, 0x59, 0x53, 0xf0, 0x23, 0x04, - 0x87, 0x55, 0x10, 0xd9, 0xe7, 0x8d, 0xaf, 0xec, 0xec, 0x73, 0x82, 0xf8, 0x28, 0x31, 0x06, 0x5d, - 0x8b, 0xa3, 0x3b, 0x67, 0x14, 0x5f, 0x78, 0x67, 0x08, 0xc5, 0x1a, 0x5a, 0x59, 0x46, 0xf8, 0x0f, - 0x08, 0x66, 0x93, 0x0e, 0xdc, 0x68, 0x1d, 0xe5, 0x1a, 0xf5, 0x7b, 0xe9, 0x3d, 0xd7, 0x39, 0xe4, - 0xaf, 0xeb, 0xe7, 0x8b, 0x15, 0xaa, 0xee, 0x97, 0x57, 0xdb, 0xe0, 0x5a, 0xce, 0xbb, 0xfd, 0x6f, - 0x10, 0x40, 0xd6, 0x45, 0xc4, 0x67, 0xca, 0xcf, 0xa1, 0x74, 0x1a, 0xf5, 0xbd, 0xed, 0x23, 0x1a, - 0x0d, 0x7e, 0x9e, 0x65, 0x7d, 0xa9, 0xd4, 0xe7, 0x02, 0x6a, 0xad, 0x25, 0x1d, 0xc7, 0x5f, 0x22, - 0x98, 0xe1, 0x4d, 0x22, 0x7c, 0x62, 0x14, 0x66, 0xb5, 0x87, 0xb4, 0x97, 0xaa, 0x3f, 0xc5, 0xa1, - 0x2e, 0xb5, 0xca, 0x02, 0xd7, 0x1a, 0x5a, 0xc1, 0x3d, 0x98, 0x4d, 0x1a, 0x36, 0xa3, 0xcd, 0x23, - 0xd7, 0xd0, 0xd1, 0x97, 0x4a, 0x12, 0x69, 0x62, 0xa8, 0x22, 0x66, 0xae, 0x8c, 0x8b, 0x99, 0xd3, - 0x2c, 0xac, 0xe1, 0xe3, 0x65, 0x41, 0xef, 0xff, 0xa0, 0x98, 0xb3, 0x1c, 0xdd, 0x49, 0x63, 0x69, - 0x5c, 0xdc, 0x64, 0xda, 0xf9, 0x39, 0x82, 0x83, 0x83, 0xf5, 0x26, 0x3e, 0x32, 0x10, 0x33, 0xd5, - 0x22, 0x5b, 0xcf, 0x6b, 0x71, 0x54, 0xad, 0x6a, 0x7c, 0x83, 0xa3, 0x58, 0xc3, 0x97, 0xc6, 0x7a, - 0xc6, 0x5d, 0x19, 0x75, 0x18, 0xa3, 0xd5, 0xec, 0x83, 0xc5, 0x6f, 0x11, 0xcc, 0x4b, 0xbe, 0xf7, - 0x43, 0x4a, 0xcb, 0x61, 0xed, 0x9d, 0x23, 0x30, 0x59, 0xc6, 0x6b, 0x1c, 0xfe, 0x57, 0xf1, 0xc5, - 0x09, 0xe1, 0x4b, 0xd8, 0xab, 0x31, 0x43, 0xfa, 0x47, 0x04, 0x87, 0x1e, 0x26, 0x76, 0xff, 0x39, - 0xe1, 0xbf, 0xca, 0xf1, 0x7f, 0x0d, 0xbf, 0x5a, 0x52, 0x17, 0x8d, 0x3b, 0xc6, 0x79, 0x84, 0x7f, - 0x8d, 0xa0, 0x2a, 0xdb, 0xef, 0xf8, 0xf4, 0x48, 0xc7, 0xc8, 0x37, 0xe8, 0xf7, 0xd2, 0x98, 0x45, - 0x11, 0x60, 0x9c, 0x28, 0x4d, 0xa5, 0x42, 0x3e, 0x33, 0xe8, 0xf7, 0x11, 0xe0, 0xf4, 0xb1, 0x98, - 0x3e, 0x1f, 0xf1, 0xa9, 0x9c, 0xa8, 0x91, 0xdd, 0x05, 0xfd, 0xf4, 0xd8, 0x75, 0xf9, 0x54, 0xba, - 0x52, 0x9a, 0x4a, 0xfd, 0x54, 0xfe, 0x3b, 0x08, 0xea, 0x37, 0x69, 0x5a, 0xb3, 0x97, 0xe8, 0x32, - 0xff, 0x5d, 0x41, 0x5f, 0x1e, 0xbf, 0x50, 0x20, 0x3a, 0xc7, 0x11, 0x9d, 0xc2, 0xe5, 0xaa, 0x92, - 0x00, 0x3e, 0x44, 0xb0, 0xef, 0x9e, 0x6a, 0xa2, 0xf8, 0xdc, 0x38, 0x49, 0xb9, 0x48, 0x3e, 0x39, - 0xae, 0x2f, 0x73, 0x5c, 0xab, 0xc6, 0x44, 0xb8, 0xd6, 0x44, 0xf3, 0xfe, 0x17, 0x08, 0x5e, 0x50, - 0x1f, 0x39, 0xa2, 0xf5, 0xfa, 0x59, 0xf5, 0x56, 0xd2, 0xc1, 0x35, 0x2e, 0x72, 0x7c, 0x0d, 0x7c, - 0x6e, 0x12, 0x7c, 0x4d, 0xd1, 0x8f, 0xc5, 0x1f, 0x20, 0x38, 0xc4, 0x9b, 0xdf, 0x2a, 0xe3, 0x81, - 0x14, 0x33, 0xaa, 0x55, 0x3e, 0x41, 0x8a, 0x11, 0xf1, 0xc7, 0xd8, 0x11, 0xa8, 0x35, 0xd9, 0xd8, - 0xfe, 0x19, 0x82, 0xfd, 0x32, 0xa9, 0x89, 0xdb, 0x5d, 0x1d, 0xa7, 0xb8, 0x9d, 0x26, 0x41, 0x61, - 0x6e, 0x2b, 0x93, 0x99, 0xdb, 0x27, 0x08, 0xe6, 0x44, 0xe3, 0xb9, 0xa4, 0x54, 0x50, 0x3a, 0xd3, - 0xfa, 0xc0, 0xb3, 0x5f, 0x74, 0x34, 0x8d, 0xef, 0x71, 0xb1, 0x0f, 0x70, 0xb3, 0x4c, 0x6c, 0xe0, - 0xdb, 0x51, 0xf3, 0x89, 0x68, 0x27, 0x3e, 0x6d, 0xba, 0x7e, 0x3b, 0x7a, 0xc3, 0xc0, 0xa5, 0x09, - 0x91, 0xad, 0x39, 0x8f, 0xf0, 0x23, 0xa8, 0xa5, 0xed, 0x84, 0x81, 0x57, 0xd8, 0x60, 0x9b, 0x41, - 0xd7, 0x87, 0x1a, 0x13, 0x59, 0xfa, 0x13, 0x6f, 0x3e, 0x7c, 0xac, 0x54, 0x26, 0x97, 0xf2, 0x36, - 0x82, 0x43, 0xaa, 0xa9, 0x27, 0xb2, 0x27, 0x36, 0xf4, 0x32, 0x14, 0xa2, 0xa2, 0xc6, 0x2b, 0x13, - 0x59, 0x11, 0x87, 0x73, 0xe5, 0xc6, 0x9f, 0x9e, 0x1d, 0x45, 0x7f, 0x7d, 0x76, 0x14, 0xfd, 0xeb, - 0xd9, 0x51, 0xf4, 0xc6, 0xa5, 0xc9, 0xfe, 0x72, 0x68, 0xb9, 0x0e, 0xf5, 0x62, 0x95, 0xfd, 0xff, - 0x02, 0x00, 0x00, 0xff, 0xff, 0x51, 0x6e, 0x19, 0x88, 0x58, 0x29, 0x00, 0x00, + 0xfe, 0x04, 0x54, 0xd5, 0x55, 0xdd, 0xd5, 0x33, 0x3d, 0x3d, 0xb3, 0xec, 0x46, 0xf1, 0xad, 0x5e, + 0x4d, 0xd5, 0x7b, 0xbf, 0x7a, 0xf5, 0xea, 0xbd, 0xaa, 0x5f, 0x0f, 0x9c, 0x8c, 0x68, 0xd8, 0xa3, + 0x61, 0x93, 0x04, 0x81, 0xeb, 0x58, 0x24, 0x76, 0x7c, 0x4f, 0x6d, 0x37, 0x82, 0xd0, 0x8f, 0x7d, + 0x5c, 0x57, 0xba, 0xf4, 0xc5, 0xb6, 0xef, 0xb7, 0x5d, 0xda, 0x24, 0x81, 0xd3, 0x24, 0x9e, 0xe7, + 0xc7, 0xbc, 0x3b, 0x4a, 0x86, 0xea, 0xc6, 0xf6, 0xe5, 0xa8, 0xe1, 0xf8, 0xfc, 0x57, 0xcb, 0x0f, + 0x69, 0xb3, 0x77, 0xb1, 0xd9, 0xa6, 0x1e, 0x0d, 0x49, 0x4c, 0x6d, 0x31, 0xe6, 0x52, 0x36, 0xa6, + 0x43, 0xac, 0x2d, 0xc7, 0xa3, 0x61, 0xbf, 0x19, 0x6c, 0xb7, 0x59, 0x47, 0xd4, 0xec, 0xd0, 0x98, + 0x14, 0xcd, 0x5a, 0x6f, 0x3b, 0xf1, 0x56, 0xf7, 0xcd, 0x86, 0xe5, 0x77, 0x9a, 0x24, 0x6c, 0xfb, + 0x41, 0xe8, 0xff, 0x90, 0x37, 0x56, 0x2d, 0xbb, 0xd9, 0x6b, 0x65, 0x0a, 0xd4, 0xb5, 0xf4, 0x2e, + 0x12, 0x37, 0xd8, 0x22, 0xc3, 0xda, 0xae, 0x8f, 0xd1, 0x16, 0xd2, 0xc0, 0x17, 0xbe, 0xe1, 0x4d, + 0x27, 0xf6, 0xc3, 0xbe, 0xd2, 0x4c, 0xd4, 0x18, 0x9f, 0x22, 0x38, 0x78, 0x25, 0xb3, 0xf7, 0xed, + 0x2e, 0x0d, 0xfb, 0x18, 0xc3, 0xb4, 0x47, 0x3a, 0x54, 0x43, 0x4b, 0x68, 0xb9, 0x66, 0xf2, 0x36, + 0xd6, 0x60, 0x2e, 0xa4, 0x9b, 0x21, 0x8d, 0xb6, 0xb4, 0x0a, 0xef, 0x96, 0x22, 0xd6, 0xa1, 0xca, + 0x8c, 0x53, 0x2b, 0x8e, 0xb4, 0xa9, 0xa5, 0xa9, 0xe5, 0x9a, 0x99, 0xca, 0x78, 0x19, 0x0e, 0x84, + 0x34, 0xf2, 0xbb, 0xa1, 0x45, 0xbf, 0x43, 0xc3, 0xc8, 0xf1, 0x3d, 0x6d, 0x9a, 0xcf, 0x1e, 0xec, + 0x66, 0x5a, 0x22, 0xea, 0x52, 0x2b, 0xf6, 0x43, 0x6d, 0x86, 0x0f, 0x49, 0x65, 0x86, 0x87, 0x01, + 0xd7, 0x66, 0x13, 0x3c, 0xac, 0x8d, 0x0d, 0x98, 0x27, 0x41, 0x70, 0x97, 0x74, 0x68, 0x14, 0x10, + 0x8b, 0x6a, 0x73, 0xfc, 0xb7, 0x5c, 0x9f, 0x71, 0x0d, 0x6a, 0x77, 0x7d, 0x9b, 0x8e, 0x5e, 0xd4, + 0xa0, 0x92, 0x4a, 0x81, 0x92, 0x6d, 0x38, 0x6c, 0xd2, 0x9e, 0xc3, 0x40, 0xde, 0xa1, 0x31, 0xb1, + 0x49, 0x4c, 0x06, 0x15, 0x56, 0x52, 0x85, 0x3a, 0x54, 0x43, 0x31, 0x58, 0xab, 0xf0, 0xfe, 0x54, + 0x1e, 0x32, 0x36, 0x55, 0x60, 0xec, 0x2f, 0x08, 0x8e, 0x29, 0xdb, 0x61, 0x0a, 0x27, 0x5d, 0xef, + 0x51, 0x2f, 0x8e, 0x46, 0x9b, 0x3d, 0x0f, 0x87, 0xa4, 0x3f, 0x07, 0x17, 0x33, 0xfc, 0x03, 0x03, + 0xa2, 0x76, 0x4a, 0x20, 0x6a, 0x1f, 0x5e, 0x82, 0xba, 0x94, 0x1f, 0xdc, 0x7e, 0x4d, 0x6c, 0x9a, + 0xda, 0x35, 0xb4, 0x9c, 0x99, 0x82, 0xe5, 0x78, 0xa0, 0x29, 0xab, 0xb9, 0x43, 0x3c, 0x67, 0x93, + 0x46, 0xf1, 0xa4, 0xee, 0x43, 0x3b, 0x76, 0xdf, 0x71, 0xa8, 0xdd, 0x70, 0x5c, 0x7a, 0x6d, 0xab, + 0xeb, 0x6d, 0xe3, 0x17, 0x61, 0xc6, 0x62, 0x0d, 0x6e, 0x61, 0xde, 0x4c, 0x04, 0xe3, 0x31, 0x1c, + 0x1f, 0x05, 0xe9, 0xa1, 0x13, 0x6f, 0xb1, 0xe9, 0xd1, 0x28, 0x6c, 0xd6, 0x16, 0xb5, 0xb6, 0xa3, + 0x6e, 0x47, 0x6e, 0xad, 0x94, 0x27, 0xc2, 0xf6, 0x2b, 0x04, 0xcb, 0x63, 0x2d, 0x3f, 0x0c, 0x49, + 0x10, 0xd0, 0x10, 0xdf, 0x80, 0x99, 0x47, 0xec, 0x07, 0x1e, 0xad, 0xf5, 0x56, 0xa3, 0xa1, 0xe6, + 0xb4, 0xb1, 0x5a, 0x6e, 0x7d, 0xc1, 0x4c, 0xa6, 0xe3, 0x86, 0xf4, 0x41, 0x85, 0xeb, 0x59, 0xc8, + 0xe9, 0x49, 0x5d, 0xc5, 0xc6, 0xf3, 0x61, 0x57, 0x67, 0x61, 0x3a, 0x20, 0x61, 0x6c, 0x1c, 0x86, + 0x17, 0xf2, 0x61, 0x18, 0xf8, 0x5e, 0x44, 0x8d, 0xdf, 0xa1, 0xdc, 0x86, 0x5e, 0x0b, 0x29, 0x89, + 0xa9, 0x49, 0x1f, 0x75, 0x69, 0x14, 0xe3, 0x6d, 0x50, 0xd3, 0x2c, 0xf7, 0x5d, 0xbd, 0x75, 0xbb, + 0x91, 0xe5, 0xa9, 0x86, 0xcc, 0x53, 0xbc, 0xf1, 0x7d, 0xcb, 0x6e, 0xf4, 0x5a, 0x8d, 0x60, 0xbb, + 0xdd, 0x60, 0x59, 0x2f, 0x87, 0x4c, 0x66, 0x3d, 0x75, 0xa9, 0xa6, 0xaa, 0x1d, 0x2f, 0xc0, 0x6c, + 0x37, 0x88, 0x68, 0x18, 0xf3, 0x95, 0x55, 0x4d, 0x21, 0xb1, 0x5d, 0xea, 0x11, 0xd7, 0xb1, 0x49, + 0x9c, 0xec, 0x42, 0xd5, 0x4c, 0x65, 0xe3, 0xe3, 0x3c, 0xfa, 0x07, 0x81, 0xfd, 0x79, 0xa1, 0x57, + 0x51, 0x56, 0x06, 0x50, 0x7e, 0x90, 0x47, 0xf9, 0x1a, 0x75, 0x69, 0x86, 0xb2, 0x28, 0x30, 0x35, + 0x98, 0xb3, 0x48, 0x64, 0x11, 0x5b, 0xea, 0x92, 0x22, 0x4b, 0x0b, 0x41, 0xe8, 0x07, 0xa4, 0xcd, + 0x35, 0xdd, 0xf3, 0x5d, 0xc7, 0xea, 0x8b, 0xd8, 0x1c, 0xfe, 0x61, 0x28, 0x88, 0xa7, 0x0b, 0x82, + 0xf8, 0x04, 0xd4, 0x37, 0xfa, 0x9e, 0xf5, 0x7a, 0xc0, 0x4b, 0x26, 0x3b, 0x62, 0x4e, 0x4c, 0x3b, + 0x91, 0x86, 0x78, 0xde, 0x4f, 0x04, 0xe3, 0xc3, 0x19, 0x58, 0x50, 0x56, 0xc0, 0x26, 0x94, 0xe1, + 0x2f, 0x3b, 0xf4, 0x0b, 0x30, 0x6b, 0x87, 0x7d, 0xb3, 0xeb, 0x89, 0xcd, 0x14, 0x12, 0x33, 0x1c, + 0x84, 0x5d, 0x2f, 0x01, 0x59, 0x35, 0x13, 0x01, 0x6f, 0x42, 0x35, 0x8a, 0x59, 0x91, 0x6c, 0xf7, + 0x79, 0x3a, 0xaa, 0xb7, 0xbe, 0xb9, 0xbb, 0x0d, 0x64, 0xd0, 0x37, 0x84, 0x46, 0x33, 0xd5, 0x8d, + 0x1f, 0x41, 0x4d, 0x66, 0xc2, 0x48, 0x9b, 0x5b, 0x9a, 0x5a, 0xae, 0xb7, 0x36, 0x76, 0x6f, 0xe8, + 0xf5, 0x80, 0x15, 0x78, 0x25, 0xeb, 0x9b, 0x99, 0x15, 0xbc, 0x08, 0xb5, 0x8e, 0x38, 0xeb, 0x91, + 0x56, 0xe5, 0xde, 0xce, 0x3a, 0xf0, 0x77, 0x61, 0xc6, 0xf1, 0x36, 0xfd, 0x48, 0xab, 0x71, 0x30, + 0x57, 0x77, 0x07, 0xe6, 0xb6, 0xb7, 0xe9, 0x9b, 0x89, 0x42, 0xfc, 0x08, 0xf6, 0x85, 0x34, 0x0e, + 0xfb, 0xd2, 0x0b, 0x1a, 0x70, 0xbf, 0x7e, 0x6b, 0x77, 0x16, 0x4c, 0x55, 0xa5, 0x99, 0xb7, 0x80, + 0xd7, 0xa0, 0x1e, 0x65, 0x31, 0xa6, 0xd5, 0xb9, 0x41, 0x2d, 0xa7, 0x48, 0x89, 0x41, 0x53, 0x1d, + 0x3c, 0x14, 0xc3, 0xf3, 0x05, 0x31, 0xfc, 0x4f, 0x04, 0x8b, 0x43, 0x69, 0x60, 0x23, 0xa0, 0xa5, + 0x41, 0x4a, 0x60, 0x3a, 0x0a, 0xa8, 0xc5, 0x33, 0x7f, 0xbd, 0x75, 0x67, 0xcf, 0xf2, 0x02, 0xb7, + 0xcb, 0x55, 0x97, 0xa5, 0xae, 0x89, 0xce, 0xe6, 0x4f, 0x10, 0x7c, 0x51, 0xd1, 0x7c, 0x8f, 0xc4, + 0xd6, 0x56, 0xd9, 0x92, 0xd8, 0x19, 0x62, 0x63, 0x44, 0x35, 0x4b, 0x04, 0x16, 0x68, 0xbc, 0x71, + 0xbf, 0x1f, 0x30, 0x18, 0xec, 0x97, 0xac, 0x63, 0xa2, 0xa2, 0xff, 0x2e, 0x02, 0x5d, 0xcd, 0x7c, + 0xbe, 0xeb, 0xbe, 0x49, 0xac, 0xed, 0x32, 0x28, 0xfb, 0xa1, 0xe2, 0xd8, 0x1c, 0xc7, 0x94, 0x59, + 0x71, 0xec, 0x1d, 0x1e, 0xfb, 0x41, 0x50, 0xb3, 0x05, 0xa0, 0x3e, 0x1d, 0x00, 0x25, 0x8f, 0x58, + 0x09, 0xa8, 0x45, 0xa8, 0x79, 0x03, 0x97, 0xa9, 0xac, 0xa3, 0xe0, 0x12, 0x55, 0x19, 0xba, 0x44, + 0x69, 0x30, 0xd7, 0x4b, 0x6f, 0xbd, 0xec, 0x67, 0x29, 0xb2, 0x85, 0xb4, 0x43, 0xbf, 0x1b, 0x08, + 0x07, 0x26, 0x02, 0x43, 0xb1, 0xed, 0x78, 0xb6, 0x36, 0x9b, 0xa0, 0x60, 0xed, 0x89, 0xee, 0xb9, + 0xef, 0x55, 0xe0, 0x4b, 0x05, 0x8b, 0x1b, 0x1b, 0x01, 0xcf, 0xc7, 0x0a, 0xd3, 0x38, 0x9c, 0x1b, + 0x19, 0x87, 0xd5, 0x71, 0x71, 0x58, 0x2b, 0xf0, 0xca, 0x3b, 0x15, 0x58, 0x2a, 0xf0, 0xca, 0xf8, + 0x82, 0xfa, 0xdc, 0xb8, 0x65, 0xd3, 0x0f, 0xc5, 0x8e, 0x57, 0xcd, 0x44, 0x60, 0x27, 0xc3, 0x0f, + 0x83, 0x2d, 0xe2, 0x69, 0xd5, 0xe4, 0x64, 0x24, 0xd2, 0x44, 0x0e, 0xf9, 0x2f, 0x02, 0x4d, 0x7a, + 0xe1, 0x8a, 0xc5, 0x7d, 0xd2, 0xf5, 0x9e, 0x7f, 0x47, 0x2c, 0xc0, 0x2c, 0xe1, 0x68, 0x45, 0x80, + 0x08, 0x69, 0x68, 0xc9, 0xd5, 0xe2, 0x9c, 0x78, 0x24, 0xbf, 0xe4, 0x68, 0xdd, 0x89, 0x62, 0x79, + 0xa1, 0xc5, 0x9b, 0x30, 0x97, 0x68, 0x4b, 0xae, 0x30, 0xf5, 0xd6, 0xfa, 0x6e, 0x0b, 0x5b, 0xce, + 0xbd, 0x52, 0xb9, 0xf1, 0x32, 0x1c, 0x29, 0xcc, 0x3e, 0x02, 0x86, 0x0e, 0x55, 0x59, 0xcc, 0xc5, + 0x06, 0xa4, 0xb2, 0xf1, 0x9f, 0xa9, 0x7c, 0x5a, 0xf7, 0xed, 0x75, 0xbf, 0x5d, 0xf2, 0x16, 0x2c, + 0xdf, 0x34, 0x0d, 0xe6, 0x02, 0xdf, 0x56, 0x9e, 0x7d, 0x52, 0x64, 0xf3, 0x2c, 0xdf, 0x8b, 0x89, + 0xe3, 0xd1, 0x50, 0xd4, 0x97, 0xac, 0x83, 0x39, 0x3b, 0x72, 0x3c, 0x8b, 0x6e, 0x50, 0xcb, 0xf7, + 0xec, 0x88, 0xef, 0xda, 0x94, 0x99, 0xeb, 0xc3, 0xb7, 0xa0, 0xc6, 0xe5, 0xfb, 0x4e, 0x27, 0x49, + 0xc2, 0xf5, 0xd6, 0x4a, 0x23, 0xa1, 0x4a, 0x1a, 0x2a, 0x55, 0x92, 0xf9, 0xb0, 0x43, 0x63, 0xd2, + 0xe8, 0x5d, 0x6c, 0xb0, 0x19, 0x66, 0x36, 0x99, 0x61, 0x89, 0x89, 0xe3, 0xae, 0x3b, 0x1e, 0xbf, + 0x60, 0x31, 0x53, 0x59, 0x07, 0x0b, 0x88, 0x4d, 0xdf, 0x75, 0xfd, 0xc7, 0xf2, 0x0c, 0x24, 0x12, + 0x9b, 0xd5, 0xf5, 0x62, 0xc7, 0xe5, 0xf6, 0x93, 0x03, 0x90, 0x75, 0xf0, 0x59, 0x8e, 0x1b, 0xd3, + 0x90, 0x5f, 0x61, 0x6a, 0xa6, 0x90, 0xd2, 0x90, 0xab, 0x27, 0xbc, 0x80, 0x3c, 0x7b, 0x49, 0x70, + 0xce, 0xab, 0xc1, 0x39, 0x18, 0xf0, 0xfb, 0x0a, 0xde, 0xcd, 0x9c, 0x0c, 0xa1, 0x3d, 0xc7, 0xef, + 0x46, 0xda, 0xfe, 0xa4, 0x88, 0x4b, 0x79, 0x28, 0x60, 0x0f, 0x14, 0x04, 0xec, 0xef, 0x11, 0x54, + 0xd7, 0xfd, 0xf6, 0x75, 0x2f, 0x0e, 0xfb, 0xfc, 0x66, 0xef, 0x7b, 0x31, 0xf5, 0x64, 0x54, 0x48, + 0x91, 0xb9, 0x3a, 0x76, 0x3a, 0x74, 0x23, 0x26, 0x9d, 0x40, 0xdc, 0x49, 0x76, 0xe4, 0xea, 0x74, + 0x32, 0x5b, 0xbe, 0x4b, 0xa2, 0x98, 0x9f, 0xde, 0xaa, 0xc9, 0xdb, 0x0c, 0x68, 0x3a, 0x60, 0x23, + 0x0e, 0xc5, 0xd1, 0xcd, 0xf5, 0xa9, 0x81, 0x34, 0x93, 0x60, 0x13, 0xa2, 0xb1, 0x01, 0x2f, 0xa5, + 0x57, 0xd9, 0xfb, 0x34, 0xec, 0x38, 0x1e, 0x29, 0xcf, 0xb7, 0x93, 0xb0, 0x30, 0x0f, 0x72, 0x07, + 0x88, 0xdd, 0xff, 0x1e, 0x3a, 0x9e, 0xed, 0x3f, 0x2e, 0x39, 0x08, 0x93, 0xa8, 0xfd, 0x5b, 0x9e, + 0x6f, 0x51, 0xf4, 0xa6, 0x67, 0xf3, 0x16, 0xec, 0x63, 0xa7, 0xb8, 0x47, 0xc5, 0x0f, 0x22, 0x51, + 0x18, 0xa3, 0x9e, 0xe4, 0x99, 0x0e, 0x33, 0x3f, 0x11, 0xaf, 0xc3, 0x01, 0x12, 0x45, 0x4e, 0xdb, + 0xa3, 0xb6, 0xd4, 0x55, 0x99, 0x58, 0xd7, 0xe0, 0xd4, 0xe4, 0xd9, 0xc7, 0x47, 0x88, 0xbd, 0x93, + 0xa2, 0xf1, 0x63, 0x04, 0x87, 0x0b, 0x95, 0xa4, 0xb1, 0x8e, 0x94, 0xf4, 0xaa, 0x43, 0x35, 0xb2, + 0xb6, 0xa8, 0xdd, 0x75, 0xa9, 0xe4, 0x35, 0xa4, 0xcc, 0x7e, 0xb3, 0xbb, 0xc9, 0x4e, 0x8a, 0xf4, + 0x9e, 0xca, 0xf8, 0x18, 0x40, 0x87, 0x78, 0x5d, 0xe2, 0x72, 0x08, 0xd3, 0x1c, 0x82, 0xd2, 0x63, + 0x2c, 0x82, 0x5e, 0x14, 0x06, 0x82, 0x49, 0xf8, 0x07, 0x82, 0xfd, 0x32, 0x0d, 0x8a, 0x3d, 0x5c, + 0x86, 0x03, 0x8a, 0x1b, 0xee, 0x66, 0xdb, 0x39, 0xd8, 0x3d, 0x26, 0xc5, 0xc9, 0x58, 0x98, 0xca, + 0xb3, 0x97, 0xbd, 0x1c, 0xff, 0x38, 0x71, 0x1d, 0x42, 0x3b, 0xba, 0x89, 0xfd, 0x08, 0xb4, 0x3b, + 0xc4, 0x23, 0x6d, 0x6a, 0xa7, 0x8b, 0x4b, 0x03, 0xe9, 0x07, 0xea, 0x63, 0x79, 0xd7, 0x4f, 0xd3, + 0xf4, 0x3a, 0xe3, 0x6c, 0x6e, 0xca, 0x87, 0x77, 0x08, 0xd5, 0x75, 0xc7, 0xdb, 0x66, 0xef, 0x37, + 0xb6, 0xae, 0xd8, 0x89, 0x5d, 0xe9, 0xc3, 0x44, 0xc0, 0x07, 0x61, 0xaa, 0x1b, 0xba, 0x62, 0x9f, + 0x59, 0x13, 0x2f, 0x41, 0xdd, 0xa6, 0x91, 0x15, 0x3a, 0x81, 0xd8, 0x65, 0x4e, 0xf4, 0x29, 0x5d, + 0xcc, 0xdb, 0x8e, 0xe5, 0x7b, 0xd7, 0x5c, 0x12, 0x45, 0xb2, 0x30, 0xa4, 0x1d, 0xc6, 0xab, 0xb0, + 0x8f, 0xd9, 0xcc, 0x96, 0x79, 0x2e, 0xbf, 0xcc, 0xc3, 0x39, 0xf8, 0x12, 0x9e, 0x44, 0x4c, 0xe0, + 0x05, 0x56, 0x8f, 0xaf, 0x04, 0x81, 0x50, 0x52, 0x4a, 0x73, 0x08, 0x5a, 0x59, 0xc0, 0x97, 0x62, + 0x3e, 0x1c, 0xa6, 0x06, 0xc2, 0xa1, 0xf5, 0x53, 0x03, 0xb0, 0x7a, 0x1a, 0x68, 0xd8, 0x73, 0x2c, + 0x8a, 0xdf, 0x45, 0x30, 0xcd, 0x4c, 0xe3, 0xa3, 0xa3, 0x0e, 0x1f, 0x8f, 0x4a, 0x7d, 0xef, 0x9e, + 0x7a, 0xcc, 0x9a, 0xb1, 0xf8, 0xd6, 0xdf, 0xff, 0xfd, 0x5e, 0x65, 0x01, 0xbf, 0xc8, 0x3f, 0x30, + 0xf4, 0x2e, 0xaa, 0x64, 0x7f, 0x84, 0xdf, 0x46, 0x80, 0xc5, 0xfd, 0x44, 0xe1, 0x7d, 0xf1, 0xb9, + 0x51, 0x10, 0x0b, 0xf8, 0x61, 0xfd, 0xa8, 0x52, 0x07, 0x1a, 0x96, 0x1f, 0x52, 0x96, 0xf5, 0xf9, + 0x00, 0x0e, 0x60, 0x85, 0x03, 0x38, 0x89, 0x8d, 0x22, 0x00, 0xcd, 0x27, 0xcc, 0x6f, 0x4f, 0x9b, + 0x34, 0xb1, 0xfb, 0x11, 0x82, 0x99, 0x87, 0xfc, 0x36, 0x3e, 0xc6, 0x49, 0x1b, 0x7b, 0xe6, 0x24, + 0x6e, 0x8e, 0xa3, 0x35, 0x4e, 0x70, 0xa4, 0x47, 0xf1, 0x11, 0x89, 0x34, 0x8a, 0x43, 0x4a, 0x3a, + 0x39, 0xc0, 0x17, 0x10, 0xfe, 0x04, 0xc1, 0x6c, 0x42, 0x44, 0xe2, 0x53, 0xa3, 0x50, 0xe6, 0x88, + 0x4a, 0x7d, 0xef, 0x58, 0x3d, 0xe3, 0x2c, 0xc7, 0x78, 0xc2, 0x28, 0xdc, 0xce, 0xb5, 0x1c, 0xe7, + 0xf7, 0x3e, 0x82, 0xa9, 0x9b, 0x74, 0x6c, 0xbc, 0xed, 0x21, 0xb8, 0x21, 0x07, 0x16, 0x6c, 0x35, + 0xfe, 0x18, 0xc1, 0x4b, 0x37, 0x69, 0x5c, 0x5c, 0x04, 0xf1, 0xf2, 0xf8, 0xca, 0x24, 0xc2, 0xee, + 0xdc, 0x04, 0x23, 0xd3, 0xec, 0xdf, 0xe4, 0xc8, 0xce, 0xe2, 0x33, 0x65, 0x41, 0x18, 0xf5, 0x3d, + 0xeb, 0xb1, 0xc0, 0xf1, 0x67, 0x04, 0x07, 0x07, 0xbf, 0xc2, 0xe0, 0x7c, 0xd9, 0x2c, 0xfc, 0x48, + 0xa3, 0xdf, 0xdd, 0x6d, 0x96, 0xcd, 0x2b, 0x35, 0xae, 0x70, 0xe4, 0xaf, 0xe0, 0x97, 0xcb, 0x90, + 0x4b, 0xfa, 0x32, 0x6a, 0x3e, 0x91, 0xcd, 0xa7, 0xfc, 0xb3, 0x20, 0x87, 0xfd, 0x16, 0x82, 0xf9, + 0x9b, 0x34, 0xbe, 0x93, 0xb2, 0x77, 0xa7, 0x26, 0x62, 0xf7, 0xf5, 0xc5, 0x86, 0xf2, 0xf5, 0x4e, + 0xfe, 0x94, 0xba, 0x74, 0x95, 0x03, 0x3b, 0x83, 0x4f, 0x95, 0x01, 0xcb, 0x18, 0xc3, 0x8f, 0x10, + 0x1c, 0x56, 0x41, 0x64, 0xdf, 0x3e, 0xbe, 0xb2, 0xb3, 0x6f, 0x0d, 0xe2, 0x8b, 0xc5, 0x18, 0x74, + 0x2d, 0x8e, 0xee, 0xbc, 0x51, 0xbc, 0xe1, 0x9d, 0x21, 0x14, 0x6b, 0x68, 0x65, 0x19, 0xe1, 0x3f, + 0x20, 0x98, 0x4d, 0xe8, 0xb9, 0xd1, 0x3e, 0xca, 0xb1, 0xf8, 0x7b, 0x79, 0x7a, 0xae, 0x73, 0xc8, + 0x5f, 0xd7, 0x2f, 0x14, 0x3b, 0x54, 0x9d, 0x2f, 0xb7, 0xb6, 0xc1, 0xbd, 0x9c, 0x3f, 0xf6, 0xbf, + 0x41, 0x00, 0x19, 0xc5, 0x88, 0xcf, 0x96, 0xaf, 0x43, 0xa1, 0x21, 0xf5, 0xbd, 0x25, 0x19, 0x8d, + 0x06, 0x5f, 0xcf, 0xb2, 0xbe, 0x54, 0x7a, 0xe6, 0x02, 0x6a, 0xad, 0x25, 0x74, 0xe4, 0x2f, 0x11, + 0xcc, 0x70, 0x06, 0x09, 0x9f, 0x1c, 0x85, 0x59, 0x25, 0x98, 0xf6, 0xd2, 0xf5, 0xa7, 0x39, 0xd4, + 0xa5, 0x56, 0x59, 0xe2, 0x5a, 0x43, 0x2b, 0xb8, 0x07, 0xb3, 0x09, 0x9b, 0x33, 0x3a, 0x3c, 0x72, + 0x6c, 0x8f, 0xbe, 0x54, 0x52, 0x48, 0x93, 0x40, 0x15, 0x39, 0x73, 0x65, 0x5c, 0xce, 0x9c, 0x66, + 0x69, 0x0d, 0x9f, 0x28, 0x4b, 0x7a, 0x9f, 0x81, 0x63, 0xce, 0x71, 0x74, 0xa7, 0x8c, 0xa5, 0x71, + 0x79, 0x93, 0x79, 0xe7, 0xe7, 0x08, 0x0e, 0x0e, 0x5e, 0x46, 0xf1, 0x91, 0x81, 0x9c, 0xa9, 0xde, + 0xc0, 0xf5, 0xbc, 0x17, 0x47, 0x5d, 0x64, 0x8d, 0x6f, 0x70, 0x14, 0x6b, 0xf8, 0xf2, 0xd8, 0x93, + 0x71, 0x57, 0x66, 0x1d, 0xa6, 0x68, 0x35, 0xfb, 0x9a, 0xf1, 0x5b, 0x04, 0xf3, 0x52, 0xef, 0xfd, + 0x90, 0xd2, 0x72, 0x58, 0x7b, 0x77, 0x10, 0x98, 0x2d, 0xe3, 0x55, 0x0e, 0xff, 0xab, 0xf8, 0xd2, + 0x84, 0xf0, 0x25, 0xec, 0xd5, 0x98, 0x21, 0xfd, 0x23, 0x82, 0x43, 0x0f, 0x93, 0xb8, 0xff, 0x9c, + 0xf0, 0x5f, 0xe3, 0xf8, 0xbf, 0x86, 0x5f, 0x29, 0xb9, 0x17, 0x8d, 0x5b, 0xc6, 0x05, 0x84, 0x7f, + 0x8d, 0xa0, 0x2a, 0xb9, 0x79, 0x7c, 0x66, 0xe4, 0xc1, 0xc8, 0xb3, 0xf7, 0x7b, 0x19, 0xcc, 0xe2, + 0x12, 0x60, 0x9c, 0x2c, 0x2d, 0xa5, 0xc2, 0x3e, 0x0b, 0xe8, 0xf7, 0x11, 0xe0, 0xf4, 0x25, 0x99, + 0xbe, 0x2d, 0xf1, 0xe9, 0x9c, 0xa9, 0x91, 0xd4, 0x83, 0x7e, 0x66, 0xec, 0xb8, 0x7c, 0x29, 0x5d, + 0x29, 0x2d, 0xa5, 0x7e, 0x6a, 0xff, 0x1d, 0x04, 0xf5, 0x9b, 0x34, 0xbd, 0xb3, 0x97, 0xf8, 0x32, + 0xff, 0xd1, 0x41, 0x5f, 0x1e, 0x3f, 0x50, 0x20, 0x3a, 0xcf, 0x11, 0x9d, 0xc6, 0xe5, 0xae, 0x92, + 0x00, 0x3e, 0x44, 0xb0, 0xef, 0x9e, 0x1a, 0xa2, 0xf8, 0xfc, 0x38, 0x4b, 0xb9, 0x4c, 0x3e, 0x39, + 0xae, 0x2f, 0x73, 0x5c, 0xab, 0xc6, 0x44, 0xb8, 0xd6, 0x04, 0xb3, 0xff, 0x0b, 0x94, 0x3c, 0xfa, + 0x06, 0x78, 0xd9, 0xff, 0xd7, 0x6f, 0x25, 0xf4, 0xae, 0x71, 0x89, 0xe3, 0x6b, 0xe0, 0xf3, 0x93, + 0xe0, 0x6b, 0x0a, 0xb2, 0x16, 0x7f, 0x80, 0xe0, 0x10, 0x67, 0xc6, 0x55, 0xc5, 0x03, 0x25, 0x66, + 0x14, 0x8f, 0x3e, 0x41, 0x89, 0x11, 0xf9, 0xc7, 0xd8, 0x11, 0xa8, 0x35, 0xc9, 0x7a, 0xff, 0x0c, + 0xc1, 0x7e, 0x59, 0xd4, 0xc4, 0xee, 0xae, 0x8e, 0x73, 0xdc, 0x4e, 0x8b, 0xa0, 0x08, 0xb7, 0x95, + 0xc9, 0xc2, 0xed, 0x13, 0x04, 0x73, 0x82, 0x95, 0x2e, 0xb9, 0x2a, 0x28, 0xb4, 0xb5, 0x3e, 0xc0, + 0x09, 0x08, 0xba, 0xd3, 0xf8, 0x1e, 0x37, 0xfb, 0x00, 0x37, 0xcb, 0xcc, 0x06, 0xbe, 0x1d, 0x35, + 0x9f, 0x08, 0xae, 0xf1, 0x69, 0xd3, 0xf5, 0xdb, 0xd1, 0x1b, 0x06, 0x2e, 0x2d, 0x88, 0x6c, 0xcc, + 0x05, 0x84, 0x63, 0xa8, 0xb1, 0xe0, 0xe0, 0x44, 0x03, 0x5e, 0x1a, 0xa0, 0x25, 0x86, 0x38, 0x08, + 0x5d, 0x1f, 0x22, 0x2e, 0xb2, 0x0a, 0x28, 0x9e, 0x7d, 0xf8, 0x78, 0xa9, 0x59, 0x6e, 0xe8, 0x6d, + 0x04, 0x87, 0xd4, 0x68, 0x4f, 0xcc, 0x4f, 0x1c, 0xeb, 0x65, 0x28, 0xc4, 0xa5, 0x1a, 0xaf, 0x4c, + 0x14, 0x48, 0x1c, 0xce, 0xd5, 0x1b, 0x7f, 0x7a, 0x76, 0x0c, 0xfd, 0xf5, 0xd9, 0x31, 0xf4, 0xaf, + 0x67, 0xc7, 0xd0, 0x1b, 0x97, 0x27, 0xfb, 0x4b, 0xa2, 0xe5, 0x3a, 0xd4, 0x8b, 0x55, 0xf5, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0xff, 0x82, 0x54, 0x27, 0xf7, 0x78, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2854,7 +2863,7 @@ type ApplicationServiceClient interface { // PodLogs returns stream of log entries for the specified pod. Pod PodLogs(ctx context.Context, in *ApplicationPodLogsQuery, opts ...grpc.CallOption) (ApplicationService_PodLogsClient, error) // ListLinks returns the list of all application deep links - ListLinks(ctx context.Context, in *ListLinksRequest, opts ...grpc.CallOption) (*LinksResponse, error) + ListLinks(ctx context.Context, in *ListAppLinksRequest, opts ...grpc.CallOption) (*LinksResponse, error) // ListResourceLinks returns the list of all resource deep links ListResourceLinks(ctx context.Context, in *ApplicationResourceRequest, opts ...grpc.CallOption) (*LinksResponse, error) } @@ -3186,7 +3195,7 @@ func (x *applicationServicePodLogsClient) Recv() (*LogEntry, error) { return m, nil } -func (c *applicationServiceClient) ListLinks(ctx context.Context, in *ListLinksRequest, opts ...grpc.CallOption) (*LinksResponse, error) { +func (c *applicationServiceClient) ListLinks(ctx context.Context, in *ListAppLinksRequest, opts ...grpc.CallOption) (*LinksResponse, error) { out := new(LinksResponse) err := c.cc.Invoke(ctx, "/application.ApplicationService/ListLinks", in, out, opts...) if err != nil { @@ -3257,7 +3266,7 @@ type ApplicationServiceServer interface { // PodLogs returns stream of log entries for the specified pod. Pod PodLogs(*ApplicationPodLogsQuery, ApplicationService_PodLogsServer) error // ListLinks returns the list of all application deep links - ListLinks(context.Context, *ListLinksRequest) (*LinksResponse, error) + ListLinks(context.Context, *ListAppLinksRequest) (*LinksResponse, error) // ListResourceLinks returns the list of all resource deep links ListResourceLinks(context.Context, *ApplicationResourceRequest) (*LinksResponse, error) } @@ -3341,7 +3350,7 @@ func (*UnimplementedApplicationServiceServer) DeleteResource(ctx context.Context func (*UnimplementedApplicationServiceServer) PodLogs(req *ApplicationPodLogsQuery, srv ApplicationService_PodLogsServer) error { return status.Errorf(codes.Unimplemented, "method PodLogs not implemented") } -func (*UnimplementedApplicationServiceServer) ListLinks(ctx context.Context, req *ListLinksRequest) (*LinksResponse, error) { +func (*UnimplementedApplicationServiceServer) ListLinks(ctx context.Context, req *ListAppLinksRequest) (*LinksResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListLinks not implemented") } func (*UnimplementedApplicationServiceServer) ListResourceLinks(ctx context.Context, req *ApplicationResourceRequest) (*LinksResponse, error) { @@ -3820,7 +3829,7 @@ func (x *applicationServicePodLogsServer) Send(m *LogEntry) error { } func _ApplicationService_ListLinks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListLinksRequest) + in := new(ListAppLinksRequest) if err := dec(in); err != nil { return nil, err } @@ -3832,7 +3841,7 @@ func _ApplicationService_ListLinks_Handler(srv interface{}, ctx context.Context, FullMethod: "/application.ApplicationService/ListLinks", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApplicationServiceServer).ListLinks(ctx, req.(*ListLinksRequest)) + return srv.(ApplicationServiceServer).ListLinks(ctx, req.(*ListAppLinksRequest)) } return interceptor(ctx, in, info, handler) } @@ -6150,7 +6159,7 @@ func (m *LinksResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ListLinksRequest) Marshal() (dAtA []byte, err error) { +func (m *ListAppLinksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6160,12 +6169,12 @@ func (m *ListLinksRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ListLinksRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *ListAppLinksRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ListLinksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ListAppLinksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6179,6 +6188,15 @@ func (m *ListLinksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], *m.Namespace) i = encodeVarintApplication(dAtA, i, uint64(len(*m.Namespace))) i-- + dAtA[i] = 0x1a + } + if m.Project == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("project") + } else { + i -= len(*m.Project) + copy(dAtA[i:], *m.Project) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Project))) + i-- dAtA[i] = 0x12 } if m.Name == nil { @@ -7188,7 +7206,7 @@ func (m *LinksResponse) Size() (n int) { return n } -func (m *ListLinksRequest) Size() (n int) { +func (m *ListAppLinksRequest) Size() (n int) { if m == nil { return 0 } @@ -7198,6 +7216,10 @@ func (m *ListLinksRequest) Size() (n int) { l = len(*m.Name) n += 1 + l + sovApplication(uint64(l)) } + if m.Project != nil { + l = len(*m.Project) + n += 1 + l + sovApplication(uint64(l)) + } if m.Namespace != nil { l = len(*m.Namespace) n += 1 + l + sovApplication(uint64(l)) @@ -13578,7 +13600,7 @@ func (m *LinksResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *ListLinksRequest) Unmarshal(dAtA []byte) error { +func (m *ListAppLinksRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -13602,10 +13624,10 @@ func (m *ListLinksRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ListLinksRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ListAppLinksRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ListLinksRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ListAppLinksRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -13643,6 +13665,40 @@ func (m *ListLinksRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex hasFields[0] |= uint64(0x00000001) case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Project = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) } @@ -13694,6 +13750,9 @@ func (m *ListLinksRequest) Unmarshal(dAtA []byte) error { if hasFields[0]&uint64(0x00000001) == 0 { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("project") + } if iNdEx > l { return io.ErrUnexpectedEOF diff --git a/pkg/apiclient/application/application.pb.gw.go b/pkg/apiclient/application/application.pb.gw.go index 7bd0b220d7500..80c86e4fc9a19 100644 --- a/pkg/apiclient/application/application.pb.gw.go +++ b/pkg/apiclient/application/application.pb.gw.go @@ -1795,7 +1795,7 @@ var ( ) func request_ApplicationService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListLinksRequest + var protoReq ListAppLinksRequest var metadata runtime.ServerMetadata var ( @@ -1829,7 +1829,7 @@ func request_ApplicationService_ListLinks_0(ctx context.Context, marshaler runti } func local_request_ApplicationService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, server ApplicationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListLinksRequest + var protoReq ListAppLinksRequest var metadata runtime.ServerMetadata var ( diff --git a/pkg/apiclient/project/project.pb.go b/pkg/apiclient/project/project.pb.go index 93d00a97a23ab..2a89c8c2a02d8 100644 --- a/pkg/apiclient/project/project.pb.go +++ b/pkg/apiclient/project/project.pb.go @@ -637,6 +637,53 @@ func (m *DetailedProjectsResponse) GetClusters() []*v1alpha1.Cluster { return nil } +type ListProjectLinksRequest struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListProjectLinksRequest) Reset() { *m = ListProjectLinksRequest{} } +func (m *ListProjectLinksRequest) String() string { return proto.CompactTextString(m) } +func (*ListProjectLinksRequest) ProtoMessage() {} +func (*ListProjectLinksRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_5f0a51496972c9e2, []int{11} +} +func (m *ListProjectLinksRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ListProjectLinksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ListProjectLinksRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ListProjectLinksRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListProjectLinksRequest.Merge(m, src) +} +func (m *ListProjectLinksRequest) XXX_Size() int { + return m.Size() +} +func (m *ListProjectLinksRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ListProjectLinksRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ListProjectLinksRequest proto.InternalMessageInfo + +func (m *ListProjectLinksRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + func init() { proto.RegisterType((*ProjectCreateRequest)(nil), "project.ProjectCreateRequest") proto.RegisterType((*ProjectTokenDeleteRequest)(nil), "project.ProjectTokenDeleteRequest") @@ -649,75 +696,76 @@ func init() { proto.RegisterType((*SyncWindowsResponse)(nil), "project.SyncWindowsResponse") proto.RegisterType((*GlobalProjectsResponse)(nil), "project.GlobalProjectsResponse") proto.RegisterType((*DetailedProjectsResponse)(nil), "project.DetailedProjectsResponse") + proto.RegisterType((*ListProjectLinksRequest)(nil), "project.ListProjectLinksRequest") } func init() { proto.RegisterFile("server/project/project.proto", fileDescriptor_5f0a51496972c9e2) } var fileDescriptor_5f0a51496972c9e2 = []byte{ - // 993 bytes of a gzipped FileDescriptorProto + // 1007 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0x96, 0x93, 0x36, 0xbb, 0x7d, 0x2d, 0xa5, 0xcc, 0xee, 0x16, 0x37, 0xf4, 0x47, 0x18, 0xb4, - 0x55, 0x54, 0xa8, 0xad, 0xa6, 0x20, 0xad, 0xe0, 0xc4, 0x76, 0xab, 0x80, 0xd4, 0x03, 0xb8, 0x20, - 0x10, 0x07, 0x90, 0x63, 0x3f, 0x65, 0x67, 0xe3, 0xd8, 0xc6, 0x33, 0xc9, 0x36, 0x44, 0xbd, 0x20, - 0x01, 0x12, 0x07, 0x0e, 0x70, 0x42, 0xdc, 0xf9, 0x3f, 0xb8, 0x71, 0x44, 0xe2, 0x1f, 0x40, 0x15, - 0x7f, 0x08, 0x9a, 0xf1, 0xd8, 0x89, 0x93, 0x9a, 0x1f, 0x6a, 0xd8, 0x93, 0xc7, 0x33, 0xcf, 0xdf, - 0xf7, 0xbd, 0x37, 0x33, 0xdf, 0x8c, 0x61, 0x9b, 0x63, 0x32, 0xc4, 0xc4, 0x8e, 0x93, 0xe8, 0x09, - 0x7a, 0x22, 0x7b, 0x5a, 0x71, 0x12, 0x89, 0x88, 0xdc, 0xd2, 0xaf, 0xf5, 0xed, 0x6e, 0x14, 0x75, - 0x03, 0xb4, 0xdd, 0x98, 0xd9, 0x6e, 0x18, 0x46, 0xc2, 0x15, 0x2c, 0x0a, 0x79, 0x1a, 0x56, 0xa7, - 0xbd, 0x07, 0xdc, 0x62, 0x91, 0x1a, 0xf5, 0xa2, 0x04, 0xed, 0xe1, 0x91, 0xdd, 0xc5, 0x10, 0x13, - 0x57, 0xa0, 0xaf, 0x63, 0xce, 0xba, 0x4c, 0x3c, 0x1e, 0x74, 0x2c, 0x2f, 0xea, 0xdb, 0x6e, 0xd2, - 0x8d, 0x24, 0xb2, 0x6a, 0x1c, 0x7a, 0xbe, 0x3d, 0x6c, 0xd9, 0x71, 0xaf, 0x2b, 0xbf, 0xe7, 0xb6, - 0x1b, 0xc7, 0x01, 0xf3, 0x14, 0xbe, 0x3d, 0x3c, 0x72, 0x83, 0xf8, 0xb1, 0x3b, 0x8f, 0x76, 0xf2, - 0x0f, 0x68, 0x3a, 0xab, 0x69, 0xac, 0xa9, 0x76, 0x0a, 0x42, 0xbf, 0x37, 0xe0, 0xee, 0x7b, 0x69, - 0x82, 0x27, 0x09, 0xba, 0x02, 0x1d, 0xfc, 0x7c, 0x80, 0x5c, 0x90, 0x0e, 0x64, 0x89, 0x9b, 0x46, - 0xc3, 0x68, 0xae, 0xb6, 0xde, 0xb1, 0x26, 0x7c, 0x56, 0xc6, 0xa7, 0x1a, 0x9f, 0x79, 0xbe, 0x35, - 0x6c, 0x59, 0x71, 0xaf, 0x6b, 0x49, 0xf5, 0xd6, 0x34, 0x4b, 0xa6, 0xde, 0x7a, 0x3b, 0x8e, 0x35, - 0x8f, 0x93, 0x01, 0x93, 0x4d, 0xa8, 0x0d, 0x62, 0x8e, 0x89, 0x30, 0x2b, 0x0d, 0xa3, 0x79, 0xdb, - 0xd1, 0x6f, 0xb4, 0x07, 0x5b, 0x3a, 0xf6, 0x83, 0xa8, 0x87, 0xe1, 0x23, 0x0c, 0x70, 0x22, 0xcc, - 0x2c, 0x0a, 0x5b, 0x99, 0xc0, 0x11, 0x58, 0x4a, 0xa2, 0x00, 0x15, 0xd8, 0x8a, 0xa3, 0xda, 0x64, - 0x03, 0xaa, 0xcc, 0x15, 0x66, 0xb5, 0x61, 0x34, 0xab, 0x8e, 0x6c, 0x92, 0x75, 0xa8, 0x30, 0xdf, - 0x5c, 0x52, 0x31, 0x15, 0xe6, 0xd3, 0x1f, 0x8d, 0x22, 0x5b, 0xb1, 0x0c, 0xe5, 0x6c, 0x0d, 0x58, - 0xf5, 0x91, 0x7b, 0x09, 0x8b, 0x65, 0xa2, 0x9a, 0x74, 0xba, 0x2b, 0xd7, 0x53, 0x9d, 0xd2, 0xb3, - 0x0d, 0x2b, 0x78, 0x11, 0xb3, 0x04, 0xf9, 0xbb, 0xa1, 0x12, 0x51, 0x75, 0x26, 0x1d, 0x5a, 0xdb, - 0x72, 0xae, 0xed, 0xb5, 0x7c, 0x72, 0x94, 0x34, 0x07, 0x79, 0x1c, 0x85, 0x1c, 0xc9, 0x5d, 0x58, - 0x16, 0xb2, 0x43, 0x6b, 0x4a, 0x5f, 0x28, 0x85, 0x35, 0x1d, 0xfd, 0xfe, 0x00, 0x93, 0x91, 0xe4, - 0x0f, 0xdd, 0x3e, 0xea, 0x20, 0xd5, 0xa6, 0x5f, 0xe4, 0x88, 0x1f, 0xc6, 0xfe, 0xb3, 0x9d, 0x6e, - 0xfa, 0x3c, 0x3c, 0x77, 0xda, 0x8f, 0xc5, 0x28, 0x4b, 0x83, 0xee, 0xc3, 0xc6, 0xf9, 0x28, 0xf4, - 0x3e, 0x62, 0xa1, 0x1f, 0x3d, 0xe5, 0xe5, 0xa2, 0x47, 0x70, 0x67, 0x2a, 0x2e, 0xaf, 0x42, 0x07, - 0x6e, 0x3d, 0x4d, 0xbb, 0x4c, 0xa3, 0x51, 0xbd, 0xb9, 0xe6, 0x09, 0x87, 0x93, 0x01, 0xd3, 0x0b, - 0xd8, 0x6c, 0x07, 0x51, 0xc7, 0x0d, 0x74, 0x36, 0x13, 0xf6, 0x4f, 0x61, 0x99, 0x09, 0xec, 0x2f, - 0x88, 0x7b, 0xaa, 0x5e, 0x29, 0x2c, 0xfd, 0xa5, 0x0a, 0xe6, 0x23, 0x14, 0x2e, 0x0b, 0xd0, 0x9f, - 0x23, 0x8f, 0x61, 0xbd, 0x5b, 0x90, 0xb5, 0x70, 0x15, 0x33, 0xf8, 0xd3, 0x0b, 0xa4, 0xf2, 0x7f, - 0xf9, 0x41, 0x00, 0x6b, 0x09, 0xc6, 0x11, 0x67, 0x22, 0x4a, 0x18, 0x72, 0xb3, 0xba, 0x88, 0x9c, - 0x9c, 0x0c, 0x71, 0xe4, 0x14, 0xd0, 0x89, 0x0b, 0xb7, 0xbd, 0x60, 0xc0, 0x05, 0x26, 0xdc, 0x5c, - 0x52, 0x4c, 0xa7, 0x37, 0x63, 0x3a, 0x49, 0xd1, 0x9c, 0x1c, 0xb6, 0xf5, 0xd3, 0x1a, 0xac, 0xeb, - 0x2c, 0xcf, 0x31, 0x19, 0x32, 0x0f, 0xc9, 0xb7, 0x06, 0xac, 0xa6, 0x16, 0xa3, 0xb6, 0x34, 0xa1, - 0x56, 0x76, 0xdc, 0x94, 0x9a, 0x50, 0x7d, 0xe7, 0xda, 0x98, 0x7c, 0x1b, 0x3d, 0xf8, 0xf2, 0xf7, - 0x3f, 0x7f, 0xa8, 0xb4, 0xe8, 0xa1, 0x3a, 0x7c, 0x86, 0x47, 0xd9, 0x01, 0xc6, 0xed, 0xb1, 0x6e, - 0x5d, 0xda, 0xd2, 0x7c, 0xb8, 0x3d, 0x96, 0x8f, 0x4b, 0x5b, 0xd9, 0xc5, 0x9b, 0xc6, 0x01, 0xf9, - 0xda, 0x80, 0xd5, 0xd4, 0x5d, 0xff, 0x4e, 0x4c, 0xc1, 0x7f, 0xeb, 0x9b, 0x79, 0x4c, 0x71, 0x33, - 0xbf, 0xa5, 0x54, 0xbc, 0x71, 0x70, 0xfc, 0x9f, 0x54, 0xd8, 0x63, 0xe6, 0x8a, 0x4b, 0xf2, 0x9d, - 0x01, 0xb5, 0x34, 0x67, 0x32, 0x97, 0x6c, 0xb1, 0x16, 0x0b, 0x5b, 0x76, 0xf4, 0x25, 0x25, 0xf8, - 0x1e, 0xdd, 0x98, 0x15, 0x2c, 0x2b, 0xf3, 0x95, 0x01, 0x4b, 0x67, 0x8c, 0x0b, 0x72, 0x6f, 0x56, - 0x8e, 0xb2, 0xa9, 0xfa, 0xd9, 0xa2, 0x64, 0x48, 0x12, 0x6a, 0x2a, 0x29, 0x84, 0xcc, 0x49, 0x21, - 0x17, 0x40, 0xda, 0x28, 0x66, 0x7c, 0xa0, 0x4c, 0xd4, 0xcb, 0x79, 0x77, 0x99, 0x71, 0xd0, 0xa6, - 0x62, 0xa2, 0xa4, 0x31, 0x3f, 0x4b, 0xd2, 0x6a, 0x2f, 0x6d, 0x5f, 0x7f, 0x49, 0xbe, 0x31, 0xa0, - 0xda, 0xc6, 0x52, 0xae, 0xc5, 0xcd, 0xc3, 0x9e, 0x92, 0xb4, 0x45, 0x5e, 0x2c, 0x91, 0x44, 0xc6, - 0xf0, 0x42, 0x1b, 0x45, 0xd1, 0x86, 0xcb, 0x64, 0xed, 0xe5, 0xdd, 0xd7, 0xdb, 0x36, 0xb5, 0x14, - 0x5b, 0x93, 0xec, 0x97, 0x15, 0x20, 0xf5, 0xbd, 0x7c, 0x02, 0x7e, 0x36, 0xa0, 0x96, 0x1e, 0x95, - 0xf3, 0x2b, 0xb3, 0x70, 0x84, 0x2e, 0xb0, 0x22, 0xc7, 0x4a, 0xe3, 0x61, 0xbd, 0x59, 0xba, 0x95, - 0xac, 0x3e, 0x0a, 0xd7, 0x77, 0x85, 0x6b, 0x29, 0xd1, 0x72, 0xc5, 0x7e, 0x0c, 0xb5, 0x74, 0xa3, - 0x96, 0x95, 0xa6, 0x6c, 0xe3, 0xea, 0xfa, 0x1f, 0x94, 0xd6, 0xff, 0x09, 0x80, 0x5c, 0xa5, 0xa7, - 0x43, 0x0c, 0xcb, 0x0b, 0xbf, 0x63, 0xa5, 0x17, 0x60, 0x99, 0xa1, 0x25, 0x2f, 0xc0, 0xd6, 0xf0, - 0xc8, 0x52, 0x9f, 0xa8, 0x15, 0xbe, 0xaf, 0x48, 0x1a, 0x64, 0xb7, 0xac, 0xec, 0x98, 0xa2, 0x8f, - 0xe1, 0x4e, 0x1b, 0xc5, 0xd4, 0x69, 0x7f, 0x2e, 0x64, 0xe9, 0xb7, 0x72, 0xd2, 0xd9, 0x0b, 0x43, - 0x7d, 0xfb, 0xba, 0xa1, 0x3c, 0xb9, 0x57, 0x15, 0xef, 0x7d, 0xf2, 0x4a, 0x19, 0x2f, 0x1f, 0x85, - 0x9e, 0x3e, 0xec, 0x49, 0x1f, 0x56, 0xa4, 0xd8, 0x33, 0x16, 0xf6, 0x38, 0xd9, 0x29, 0x4c, 0x53, - 0xde, 0x9f, 0xcd, 0x76, 0x7d, 0x66, 0x58, 0x0d, 0x69, 0xd2, 0xfb, 0x8a, 0x74, 0x8f, 0xec, 0x94, - 0x91, 0x06, 0x32, 0xfc, 0xe1, 0xc3, 0x5f, 0xaf, 0x76, 0x8d, 0xdf, 0xae, 0x76, 0x8d, 0x3f, 0xae, - 0x76, 0x8d, 0x4f, 0x5e, 0xff, 0x77, 0x3f, 0x07, 0x5e, 0xc0, 0x30, 0xcc, 0xff, 0x51, 0x3a, 0x35, - 0x75, 0x8d, 0x3f, 0xfe, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x73, 0xd5, 0x20, 0xa7, 0xc4, 0x0c, 0x00, - 0x00, + 0x14, 0x96, 0x93, 0x36, 0xbb, 0x7d, 0x2d, 0xa5, 0xcc, 0xee, 0x76, 0xdd, 0xd0, 0x1f, 0x61, 0xd0, + 0x56, 0x51, 0xa1, 0xb6, 0x9a, 0x82, 0xb4, 0x82, 0x13, 0xdb, 0xad, 0x02, 0x52, 0x0f, 0xe0, 0x82, + 0x40, 0x1c, 0x40, 0x8e, 0xfd, 0x94, 0x9d, 0x8d, 0x63, 0x1b, 0xcf, 0x24, 0xdb, 0x10, 0xf5, 0x82, + 0x04, 0x48, 0x1c, 0x38, 0xc0, 0x89, 0x0b, 0x47, 0xfe, 0x0f, 0x6e, 0x1c, 0x91, 0xf8, 0x07, 0x50, + 0xc5, 0x1f, 0x82, 0x66, 0x3c, 0x76, 0xe2, 0xa4, 0xe6, 0x87, 0x1a, 0x38, 0x65, 0x3c, 0x7e, 0xfe, + 0xbe, 0xef, 0xbd, 0x79, 0xf3, 0xcd, 0x04, 0xb6, 0x39, 0x26, 0x43, 0x4c, 0xec, 0x38, 0x89, 0x9e, + 0xa2, 0x27, 0xb2, 0x5f, 0x2b, 0x4e, 0x22, 0x11, 0x91, 0x5b, 0xfa, 0xb1, 0xbe, 0xdd, 0x8d, 0xa2, + 0x6e, 0x80, 0xb6, 0x1b, 0x33, 0xdb, 0x0d, 0xc3, 0x48, 0xb8, 0x82, 0x45, 0x21, 0x4f, 0xc3, 0xea, + 0xb4, 0xf7, 0x90, 0x5b, 0x2c, 0x52, 0x6f, 0xbd, 0x28, 0x41, 0x7b, 0x78, 0x64, 0x77, 0x31, 0xc4, + 0xc4, 0x15, 0xe8, 0xeb, 0x98, 0xb3, 0x2e, 0x13, 0x4f, 0x06, 0x1d, 0xcb, 0x8b, 0xfa, 0xb6, 0x9b, + 0x74, 0x23, 0x89, 0xac, 0x06, 0x87, 0x9e, 0x6f, 0x0f, 0x5b, 0x76, 0xdc, 0xeb, 0xca, 0xef, 0xb9, + 0xed, 0xc6, 0x71, 0xc0, 0x3c, 0x85, 0x6f, 0x0f, 0x8f, 0xdc, 0x20, 0x7e, 0xe2, 0xce, 0xa3, 0x9d, + 0xfc, 0x0d, 0x9a, 0xce, 0x6a, 0x1a, 0x6b, 0x6a, 0x9c, 0x82, 0xd0, 0xef, 0x0c, 0xb8, 0xfb, 0x6e, + 0x9a, 0xe0, 0x49, 0x82, 0xae, 0x40, 0x07, 0x3f, 0x1b, 0x20, 0x17, 0xa4, 0x03, 0x59, 0xe2, 0xa6, + 0xd1, 0x30, 0x9a, 0xab, 0xad, 0xb7, 0xad, 0x09, 0x9f, 0x95, 0xf1, 0xa9, 0xc1, 0xa7, 0x9e, 0x6f, + 0x0d, 0x5b, 0x56, 0xdc, 0xeb, 0x5a, 0x52, 0xbd, 0x35, 0xcd, 0x92, 0xa9, 0xb7, 0xde, 0x8a, 0x63, + 0xcd, 0xe3, 0x64, 0xc0, 0x64, 0x13, 0x6a, 0x83, 0x98, 0x63, 0x22, 0xcc, 0x4a, 0xc3, 0x68, 0xde, + 0x76, 0xf4, 0x13, 0xed, 0xc1, 0x96, 0x8e, 0x7d, 0x3f, 0xea, 0x61, 0xf8, 0x18, 0x03, 0x9c, 0x08, + 0x33, 0x8b, 0xc2, 0x56, 0x26, 0x70, 0x04, 0x96, 0x92, 0x28, 0x40, 0x05, 0xb6, 0xe2, 0xa8, 0x31, + 0xd9, 0x80, 0x2a, 0x73, 0x85, 0x59, 0x6d, 0x18, 0xcd, 0xaa, 0x23, 0x87, 0x64, 0x1d, 0x2a, 0xcc, + 0x37, 0x97, 0x54, 0x4c, 0x85, 0xf9, 0xf4, 0x07, 0xa3, 0xc8, 0x56, 0x2c, 0x43, 0x39, 0x5b, 0x03, + 0x56, 0x7d, 0xe4, 0x5e, 0xc2, 0x62, 0x99, 0xa8, 0x26, 0x9d, 0x9e, 0xca, 0xf5, 0x54, 0xa7, 0xf4, + 0x6c, 0xc3, 0x0a, 0x5e, 0xc4, 0x2c, 0x41, 0xfe, 0x4e, 0xa8, 0x44, 0x54, 0x9d, 0xc9, 0x84, 0xd6, + 0xb6, 0x9c, 0x6b, 0x7b, 0x35, 0x5f, 0x1c, 0x25, 0xcd, 0x41, 0x1e, 0x47, 0x21, 0x47, 0x72, 0x17, + 0x96, 0x85, 0x9c, 0xd0, 0x9a, 0xd2, 0x07, 0x4a, 0x61, 0x4d, 0x47, 0xbf, 0x37, 0xc0, 0x64, 0x24, + 0xf9, 0x43, 0xb7, 0x8f, 0x3a, 0x48, 0x8d, 0xe9, 0xe7, 0x39, 0xe2, 0x07, 0xb1, 0xff, 0xff, 0x2e, + 0x37, 0x7d, 0x1e, 0x9e, 0x3b, 0xed, 0xc7, 0x62, 0x94, 0xa5, 0x41, 0xf7, 0x61, 0xe3, 0x7c, 0x14, + 0x7a, 0x1f, 0xb2, 0xd0, 0x8f, 0x9e, 0xf1, 0x72, 0xd1, 0x23, 0xb8, 0x33, 0x15, 0x97, 0x57, 0xa1, + 0x03, 0xb7, 0x9e, 0xa5, 0x53, 0xa6, 0xd1, 0xa8, 0xde, 0x5c, 0xf3, 0x84, 0xc3, 0xc9, 0x80, 0xe9, + 0x05, 0x6c, 0xb6, 0x83, 0xa8, 0xe3, 0x06, 0x3a, 0x9b, 0x09, 0xfb, 0x27, 0xb0, 0xcc, 0x04, 0xf6, + 0x17, 0xc4, 0x3d, 0x55, 0xaf, 0x14, 0x96, 0xfe, 0x5c, 0x05, 0xf3, 0x31, 0x0a, 0x97, 0x05, 0xe8, + 0xcf, 0x91, 0xc7, 0xb0, 0xde, 0x2d, 0xc8, 0x5a, 0xb8, 0x8a, 0x19, 0xfc, 0xe9, 0x06, 0xa9, 0xfc, + 0x57, 0x7e, 0x10, 0xc0, 0x5a, 0x82, 0x71, 0xc4, 0x99, 0x88, 0x12, 0x86, 0xdc, 0xac, 0x2e, 0x22, + 0x27, 0x27, 0x43, 0x1c, 0x39, 0x05, 0x74, 0xe2, 0xc2, 0x6d, 0x2f, 0x18, 0x70, 0x81, 0x09, 0x37, + 0x97, 0x14, 0xd3, 0xe9, 0xcd, 0x98, 0x4e, 0x52, 0x34, 0x27, 0x87, 0xa5, 0x87, 0x70, 0xff, 0x8c, + 0x71, 0xa1, 0x13, 0x3d, 0x63, 0x61, 0x8f, 0x67, 0x1b, 0xee, 0x9a, 0x3e, 0x6f, 0xfd, 0xb8, 0x06, + 0xeb, 0x3a, 0xf6, 0x1c, 0x93, 0x21, 0xf3, 0x90, 0x7c, 0x63, 0xc0, 0x6a, 0xea, 0x48, 0xca, 0x01, + 0x08, 0xb5, 0xb2, 0xd3, 0xa9, 0xd4, 0xb3, 0xea, 0x3b, 0xd7, 0xc6, 0xe4, 0xbb, 0xee, 0xe1, 0x17, + 0xbf, 0xfd, 0xf1, 0x7d, 0xa5, 0x45, 0x0f, 0xd5, 0x59, 0x35, 0x3c, 0xca, 0xce, 0x3b, 0x6e, 0x8f, + 0xf5, 0xe8, 0xd2, 0x96, 0x5e, 0xc5, 0xed, 0xb1, 0xfc, 0xb9, 0xb4, 0x95, 0xbb, 0xbc, 0x61, 0x1c, + 0x90, 0xaf, 0x0c, 0x58, 0x4d, 0xcd, 0xf8, 0xaf, 0xc4, 0x14, 0xec, 0xba, 0xbe, 0x99, 0xc7, 0x14, + 0xf7, 0xfe, 0x9b, 0x4a, 0xc5, 0xeb, 0x07, 0xc7, 0xff, 0x4a, 0x85, 0x3d, 0x66, 0xae, 0xb8, 0x24, + 0xdf, 0x1a, 0x50, 0x4b, 0x73, 0x26, 0x73, 0xc9, 0x16, 0x6b, 0xb1, 0xb0, 0x2e, 0xa5, 0x2f, 0x2a, + 0xc1, 0xf7, 0xe8, 0xc6, 0xac, 0x60, 0x59, 0x99, 0x2f, 0x0d, 0x58, 0x92, 0x2b, 0x4d, 0xee, 0xcd, + 0xca, 0x51, 0xae, 0x56, 0x3f, 0x5b, 0x94, 0x0c, 0x49, 0x42, 0x4d, 0x25, 0x85, 0x90, 0x39, 0x29, + 0xe4, 0x02, 0x48, 0x1b, 0xc5, 0x8c, 0x6d, 0x94, 0x89, 0x7a, 0x29, 0x9f, 0x2e, 0xf3, 0x19, 0xda, + 0x54, 0x4c, 0x94, 0x34, 0xe6, 0x57, 0x49, 0x76, 0xec, 0xa5, 0xed, 0xeb, 0x2f, 0xc9, 0xd7, 0x06, + 0x54, 0xdb, 0x58, 0xca, 0xb5, 0xb8, 0x75, 0xd8, 0x53, 0x92, 0xb6, 0xc8, 0xfd, 0x12, 0x49, 0x64, + 0x0c, 0x2f, 0xb4, 0x51, 0x14, 0x5d, 0xbb, 0x4c, 0xd6, 0x5e, 0x3e, 0x7d, 0xbd, 0xcb, 0x53, 0x4b, + 0xb1, 0x35, 0xc9, 0x7e, 0x59, 0x01, 0x52, 0x9b, 0xcc, 0x17, 0xe0, 0x27, 0x03, 0x6a, 0xe9, 0xc9, + 0x3a, 0xdf, 0x99, 0x85, 0x13, 0x77, 0x81, 0x15, 0x39, 0x56, 0x1a, 0x0f, 0xeb, 0xcd, 0xd2, 0xad, + 0x64, 0xf5, 0x51, 0xb8, 0xbe, 0x2b, 0x5c, 0x4b, 0x89, 0x96, 0x1d, 0xfb, 0x11, 0xd4, 0xd2, 0x8d, + 0x5a, 0x56, 0x9a, 0xb2, 0x8d, 0xab, 0xeb, 0x7f, 0x50, 0x5a, 0xff, 0xa7, 0x00, 0xb2, 0x4b, 0x4f, + 0x87, 0x18, 0x96, 0x17, 0x7e, 0xc7, 0x4a, 0xef, 0xcb, 0x32, 0x43, 0x4b, 0xde, 0x97, 0xad, 0xe1, + 0x91, 0xa5, 0x3e, 0x51, 0x1d, 0xbe, 0xaf, 0x48, 0x1a, 0x64, 0xb7, 0xac, 0xec, 0x98, 0xa2, 0x8f, + 0xe1, 0x4e, 0x1b, 0xc5, 0xd4, 0xe5, 0xe0, 0x5c, 0xc8, 0xd2, 0x6f, 0xe5, 0xa4, 0xb3, 0xf7, 0x8b, + 0xfa, 0xf6, 0x75, 0xaf, 0xf2, 0xe4, 0x5e, 0x51, 0xbc, 0x0f, 0xc8, 0xcb, 0x65, 0xbc, 0x7c, 0x14, + 0x7a, 0xfa, 0x6e, 0x40, 0x62, 0x58, 0x91, 0x62, 0x95, 0xad, 0x93, 0x46, 0x8e, 0x5b, 0xe2, 0xf8, + 0xf5, 0x7a, 0x61, 0x21, 0xf5, 0x2b, 0xcd, 0xfb, 0x40, 0xf1, 0xee, 0x91, 0x9d, 0x32, 0xde, 0x40, + 0x86, 0x3f, 0x7a, 0xf4, 0xcb, 0xd5, 0xae, 0xf1, 0xeb, 0xd5, 0xae, 0xf1, 0xfb, 0xd5, 0xae, 0xf1, + 0xf1, 0x6b, 0xff, 0xec, 0xef, 0x84, 0x17, 0x30, 0x0c, 0xf3, 0x7f, 0x35, 0x9d, 0x9a, 0xba, 0xf8, + 0x1f, 0xff, 0x19, 0x00, 0x00, 0xff, 0xff, 0x28, 0x9d, 0xea, 0xa8, 0xf6, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -755,7 +803,7 @@ type ProjectServiceClient interface { // GetSchedulesState returns true if there are any active sync syncWindows GetSyncWindowsState(ctx context.Context, in *SyncWindowsQuery, opts ...grpc.CallOption) (*SyncWindowsResponse, error) // ListLinks returns all deep links for the particular project - ListLinks(ctx context.Context, in *application.ListLinksRequest, opts ...grpc.CallOption) (*application.LinksResponse, error) + ListLinks(ctx context.Context, in *ListProjectLinksRequest, opts ...grpc.CallOption) (*application.LinksResponse, error) } type projectServiceClient struct { @@ -865,7 +913,7 @@ func (c *projectServiceClient) GetSyncWindowsState(ctx context.Context, in *Sync return out, nil } -func (c *projectServiceClient) ListLinks(ctx context.Context, in *application.ListLinksRequest, opts ...grpc.CallOption) (*application.LinksResponse, error) { +func (c *projectServiceClient) ListLinks(ctx context.Context, in *ListProjectLinksRequest, opts ...grpc.CallOption) (*application.LinksResponse, error) { out := new(application.LinksResponse) err := c.cc.Invoke(ctx, "/project.ProjectService/ListLinks", in, out, opts...) if err != nil { @@ -899,7 +947,7 @@ type ProjectServiceServer interface { // GetSchedulesState returns true if there are any active sync syncWindows GetSyncWindowsState(context.Context, *SyncWindowsQuery) (*SyncWindowsResponse, error) // ListLinks returns all deep links for the particular project - ListLinks(context.Context, *application.ListLinksRequest) (*application.LinksResponse, error) + ListLinks(context.Context, *ListProjectLinksRequest) (*application.LinksResponse, error) } // UnimplementedProjectServiceServer can be embedded to have forward compatible implementations. @@ -939,7 +987,7 @@ func (*UnimplementedProjectServiceServer) ListEvents(ctx context.Context, req *P func (*UnimplementedProjectServiceServer) GetSyncWindowsState(ctx context.Context, req *SyncWindowsQuery) (*SyncWindowsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetSyncWindowsState not implemented") } -func (*UnimplementedProjectServiceServer) ListLinks(ctx context.Context, req *application.ListLinksRequest) (*application.LinksResponse, error) { +func (*UnimplementedProjectServiceServer) ListLinks(ctx context.Context, req *ListProjectLinksRequest) (*application.LinksResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListLinks not implemented") } @@ -1146,7 +1194,7 @@ func _ProjectService_GetSyncWindowsState_Handler(srv interface{}, ctx context.Co } func _ProjectService_ListLinks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(application.ListLinksRequest) + in := new(ListProjectLinksRequest) if err := dec(in); err != nil { return nil, err } @@ -1158,7 +1206,7 @@ func _ProjectService_ListLinks_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/project.ProjectService/ListLinks", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProjectServiceServer).ListLinks(ctx, req.(*application.ListLinksRequest)) + return srv.(ProjectServiceServer).ListLinks(ctx, req.(*ListProjectLinksRequest)) } return interceptor(ctx, in, info, handler) } @@ -1713,6 +1761,40 @@ func (m *DetailedProjectsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } +func (m *ListProjectLinksRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListProjectLinksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListProjectLinksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintProject(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintProject(dAtA []byte, offset int, v uint64) int { offset -= sovProject(v) base := offset @@ -1947,6 +2029,22 @@ func (m *DetailedProjectsResponse) Size() (n int) { return n } +func (m *ListProjectLinksRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovProject(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovProject(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -3170,6 +3268,89 @@ func (m *DetailedProjectsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *ListProjectLinksRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProject + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListProjectLinksRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListProjectLinksRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProject + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthProject + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProject + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProject(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProject + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipProject(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apiclient/project/project.pb.gw.go b/pkg/apiclient/project/project.pb.gw.go index 39a53de2d6e50..f672aa23cd83f 100644 --- a/pkg/apiclient/project/project.pb.gw.go +++ b/pkg/apiclient/project/project.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/argoproj/argo-cd/v2/pkg/apiclient/application" "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -706,12 +705,8 @@ func local_request_ProjectService_GetSyncWindowsState_0(ctx context.Context, mar } -var ( - filter_ProjectService_ListLinks_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - func request_ProjectService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, client ProjectServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq application.ListLinksRequest + var protoReq ListProjectLinksRequest var metadata runtime.ServerMetadata var ( @@ -726,26 +721,19 @@ func request_ProjectService_ListLinks_0(ctx context.Context, marshaler runtime.M return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.StringP(val) + protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProjectService_ListLinks_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := client.ListLinks(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } func local_request_ProjectService_ListLinks_0(ctx context.Context, marshaler runtime.Marshaler, server ProjectServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq application.ListLinksRequest + var protoReq ListProjectLinksRequest var metadata runtime.ServerMetadata var ( @@ -760,19 +748,12 @@ func local_request_ProjectService_ListLinks_0(ctx context.Context, marshaler run return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") } - protoReq.Name, err = runtime.StringP(val) + protoReq.Name, err = runtime.String(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) } - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ProjectService_ListLinks_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - msg, err := server.ListLinks(ctx, &protoReq) return msg, metadata, err diff --git a/server/application/application.go b/server/application/application.go index a9e417b72b690..6bf02f98b1e28 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -1893,12 +1893,37 @@ func (s *Server) Rollback(ctx context.Context, rollbackReq *application.Applicat return a, nil } -func (s *Server) ListLinks(ctx context.Context, req *application.ListLinksRequest) (*application.LinksResponse, error) { +func (s *Server) ListLinks(ctx context.Context, req *application.ListAppLinksRequest) (*application.LinksResponse, error) { appName := req.GetName() appNs := s.appNamespaceOrDefault(req.GetNamespace()) + appProject := req.GetProject() + + if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplications, rbacpolicy.ActionGet, getRBACName(s.ns, appNs, appName, appProject)); err != nil { + log.WithFields(map[string]interface{}{ + "application": appName, + "ns": appNs, + "project": appProject, + }).Warnf("unauthorized access to app, error=%v", err.Error()) + return nil, fmt.Errorf("error getting application") + } + a, err := s.appclientset.ArgoprojV1alpha1().Applications(appNs).Get(ctx, appName, metav1.GetOptions{}) if err != nil { - return nil, fmt.Errorf("error getting application: %w", err) + log.WithFields(map[string]interface{}{ + "application": appName, + "ns": appNs, + "project": appProject, + }).Errorf("failed to get application, error=%v", err.Error()) + return nil, fmt.Errorf("error getting application") + } + + if a.Spec.GetProject() != req.GetProject() { + log.WithFields(map[string]interface{}{ + "application": a.Name, + "ns": appNs, + "project": appProject, + }).Warnf("unauthorized access to app, app project %v does not match requested project %v", a.Spec.GetProject(), appProject) + return nil, fmt.Errorf("error getting application") } obj, err := kube.ToUnstructured(a) @@ -2340,3 +2365,11 @@ func (s *Server) isNamespaceEnabled(namespace string) bool { func namespaceNotPermittedError(namespace string) error { return fmt.Errorf("namespace '%s' is not permitted", namespace) } + +func getRBACName(defaultNS, appNamespace, appName, projectName string) string { + if defaultNS != "" && appNamespace != defaultNS && appNamespace != "" { + return fmt.Sprintf("%s/%s/%s", projectName, appNamespace, appName) + } else { + return fmt.Sprintf("%s/%s", projectName, appName) + } +} diff --git a/server/application/application.proto b/server/application/application.proto index a57dd55991600..7d3cc9c35b29f 100644 --- a/server/application/application.proto +++ b/server/application/application.proto @@ -275,9 +275,10 @@ message LinksResponse { repeated LinkInfo items = 1; } -message ListLinksRequest { +message ListAppLinksRequest { required string name = 1; - optional string namespace = 2; + required string project = 2; + optional string namespace = 3; } @@ -444,7 +445,7 @@ service ApplicationService { } // ListLinks returns the list of all application deep links - rpc ListLinks(ListLinksRequest) returns (LinksResponse) { + rpc ListLinks(ListAppLinksRequest) returns (LinksResponse) { option (google.api.http).get = "/api/v1/applications/{name}/links"; } diff --git a/server/project/project.go b/server/project/project.go index 286423412fd80..9c86cf1ead471 100644 --- a/server/project/project.go +++ b/server/project/project.go @@ -157,8 +157,17 @@ func (s *Server) createToken(ctx context.Context, q *project.ProjectTokenCreateR } -func (s *Server) ListLinks(ctx context.Context, q *application.ListLinksRequest) (*application.LinksResponse, error) { - proj, err := s.appclientset.ArgoprojV1alpha1().AppProjects(s.ns).Get(ctx, q.GetName(), metav1.GetOptions{}) +func (s *Server) ListLinks(ctx context.Context, q *project.ListProjectLinksRequest) (*application.LinksResponse, error) { + projName := q.GetName() + + if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceProjects, rbacpolicy.ActionGet, projName); err != nil { + log.WithFields(map[string]interface{}{ + "project": projName, + }).Warnf("unauthorized access to project, error=%v", err.Error()) + return nil, fmt.Errorf("unauthorized access to project %v", projName) + } + + proj, err := s.appclientset.ArgoprojV1alpha1().AppProjects(s.ns).Get(ctx, projName, metav1.GetOptions{}) if err != nil { return nil, err } diff --git a/server/project/project.proto b/server/project/project.proto index 496f4ae0c4d38..5cf4bc977a52b 100644 --- a/server/project/project.proto +++ b/server/project/project.proto @@ -70,6 +70,10 @@ message DetailedProjectsResponse { repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Cluster clusters = 4; } +message ListProjectLinksRequest { + string name = 1; +} + // ProjectService service ProjectService { @@ -138,7 +142,7 @@ service ProjectService { } // ListLinks returns all deep links for the particular project - rpc ListLinks(application.ListLinksRequest) returns (application.LinksResponse) { + rpc ListLinks(ListProjectLinksRequest) returns (application.LinksResponse) { option (google.api.http).get = "/api/v1/projects/{name}/links"; } From 6a6e684e8d27a83f120b0c3da6ac3d8b6093922f Mon Sep 17 00:00:00 2001 From: Soumya Ghosh Dastidar Date: Tue, 6 Dec 2022 12:27:24 +0530 Subject: [PATCH 3/4] feat: removed project param and updated sample config Signed-off-by: Soumya Ghosh Dastidar --- assets/swagger.json | 5 - docs/operator-manual/argocd-cm.yaml | 24 ++ hack/generate-proto.sh | 2 +- pkg/apiclient/application/application.pb.go | 374 +++++++++----------- server/application/application.go | 26 +- server/application/application.proto | 1 - 6 files changed, 186 insertions(+), 246 deletions(-) diff --git a/assets/swagger.json b/assets/swagger.json index 5801cf972f094..621b8d753c3b1 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -749,11 +749,6 @@ "in": "path", "required": true }, - { - "type": "string", - "name": "project", - "in": "query" - }, { "type": "string", "name": "namespace", diff --git a/docs/operator-manual/argocd-cm.yaml b/docs/operator-manual/argocd-cm.yaml index 5715f3a5dca45..cc7145231a98a 100644 --- a/docs/operator-manual/argocd-cm.yaml +++ b/docs/operator-manual/argocd-cm.yaml @@ -305,3 +305,27 @@ data: # token verification to pass despite the OIDC provider having an invalid certificate. Only set to "true" if you # understand the risks. oidc.tls.insecure.skip.verify: "false" + + # Add Deep Links to ArgoCD UI + # sample project level links + project.links: | + - url: https://myaudit-system.com?project={{.metadata.name}} + title: Audit + description: system audit logs + icon.class: "fa-book" + # sample application level links + application.links: | + - url: https://mycompany.splunk.com?search={{.spec.destination.namespace}} + title: Splunk + # conditionally show link e.g. for specific project + - url: https://mycompany.splunk.com?search={{.spec.destination.namespace}} + title: Splunk + if: spec.project == "default" + - url: https://{{.metadata.annotations.splunkhost}}?search={{.spec.destination.namespace}} + title: Splunk + if: metadata.annotations.splunkhost + # sample resource level links + resource.links: | + - url: https://mycompany.splunk.com?search={{.metadata.namespace}} + title: Splunk + if: kind == "Pod" || kind == "Deployment" \ No newline at end of file diff --git a/hack/generate-proto.sh b/hack/generate-proto.sh index cdd3cf2837214..d544bd045904f 100755 --- a/hack/generate-proto.sh +++ b/hack/generate-proto.sh @@ -125,7 +125,7 @@ clean_swagger() { } echo "If additional types are added, the number of expected collisions may need to be increased" -EXPECTED_COLLISION_COUNT=93 +EXPECTED_COLLISION_COUNT=95 collect_swagger server ${EXPECTED_COLLISION_COUNT} clean_swagger server clean_swagger reposerver diff --git a/pkg/apiclient/application/application.pb.go b/pkg/apiclient/application/application.pb.go index 72a8c5ab556d8..0de79ae034d70 100644 --- a/pkg/apiclient/application/application.pb.go +++ b/pkg/apiclient/application/application.pb.go @@ -2531,7 +2531,6 @@ func (m *LinksResponse) GetItems() []*LinkInfo { type ListAppLinksRequest struct { Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - Project *string `protobuf:"bytes,2,req,name=project" json:"project,omitempty"` Namespace *string `protobuf:"bytes,3,opt,name=namespace" json:"namespace,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -2578,13 +2577,6 @@ func (m *ListAppLinksRequest) GetName() string { return "" } -func (m *ListAppLinksRequest) GetProject() string { - if m != nil && m.Project != nil { - return *m.Project - } - return "" -} - func (m *ListAppLinksRequest) GetNamespace() string { if m != nil && m.Namespace != nil { return *m.Namespace @@ -2635,169 +2627,169 @@ func init() { } var fileDescriptor_df6e82b174b5eaec = []byte{ - // 2589 bytes of a gzipped FileDescriptorProto + // 2581 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x8f, 0x1c, 0x47, 0x15, 0xa7, 0x66, 0xbf, 0x66, 0xde, 0xac, 0xbf, 0x2a, 0xf1, 0xd2, 0x69, 0xaf, 0xcd, 0xba, 0xfd, 0xb5, 0x5e, 0x7b, 0x67, 0xec, 0xc1, 0x20, 0x67, 0x13, 0x04, 0xb6, 0xe3, 0x2f, 0x58, 0x3b, 0xa6, - 0xd7, 0xc6, 0x28, 0x1c, 0xa0, 0xd2, 0x5d, 0x3b, 0xdb, 0x6c, 0x4f, 0x77, 0xbb, 0xbb, 0x67, 0xac, + 0xd7, 0xc6, 0x28, 0x1c, 0xa0, 0xd2, 0x53, 0x3b, 0xdb, 0x6c, 0x4f, 0x77, 0xbb, 0xbb, 0x67, 0xac, 0x91, 0xf1, 0x25, 0x88, 0x13, 0x51, 0x90, 0x92, 0x1c, 0x50, 0x14, 0x21, 0x94, 0x28, 0x17, 0x2e, 0xdc, 0x10, 0x12, 0x17, 0xb8, 0x20, 0x90, 0x38, 0x20, 0x3e, 0x2e, 0x39, 0x21, 0x8b, 0x1b, 0x17, - 0xfe, 0x04, 0x54, 0xd5, 0x55, 0xdd, 0xd5, 0x33, 0x3d, 0x3d, 0xb3, 0xec, 0x46, 0xf1, 0xad, 0x5e, - 0x4d, 0xd5, 0x7b, 0xbf, 0x7a, 0xf5, 0xea, 0xbd, 0xaa, 0x5f, 0x0f, 0x9c, 0x8c, 0x68, 0xd8, 0xa3, - 0x61, 0x93, 0x04, 0x81, 0xeb, 0x58, 0x24, 0x76, 0x7c, 0x4f, 0x6d, 0x37, 0x82, 0xd0, 0x8f, 0x7d, - 0x5c, 0x57, 0xba, 0xf4, 0xc5, 0xb6, 0xef, 0xb7, 0x5d, 0xda, 0x24, 0x81, 0xd3, 0x24, 0x9e, 0xe7, - 0xc7, 0xbc, 0x3b, 0x4a, 0x86, 0xea, 0xc6, 0xf6, 0xe5, 0xa8, 0xe1, 0xf8, 0xfc, 0x57, 0xcb, 0x0f, - 0x69, 0xb3, 0x77, 0xb1, 0xd9, 0xa6, 0x1e, 0x0d, 0x49, 0x4c, 0x6d, 0x31, 0xe6, 0x52, 0x36, 0xa6, - 0x43, 0xac, 0x2d, 0xc7, 0xa3, 0x61, 0xbf, 0x19, 0x6c, 0xb7, 0x59, 0x47, 0xd4, 0xec, 0xd0, 0x98, - 0x14, 0xcd, 0x5a, 0x6f, 0x3b, 0xf1, 0x56, 0xf7, 0xcd, 0x86, 0xe5, 0x77, 0x9a, 0x24, 0x6c, 0xfb, - 0x41, 0xe8, 0xff, 0x90, 0x37, 0x56, 0x2d, 0xbb, 0xd9, 0x6b, 0x65, 0x0a, 0xd4, 0xb5, 0xf4, 0x2e, - 0x12, 0x37, 0xd8, 0x22, 0xc3, 0xda, 0xae, 0x8f, 0xd1, 0x16, 0xd2, 0xc0, 0x17, 0xbe, 0xe1, 0x4d, - 0x27, 0xf6, 0xc3, 0xbe, 0xd2, 0x4c, 0xd4, 0x18, 0x9f, 0x22, 0x38, 0x78, 0x25, 0xb3, 0xf7, 0xed, - 0x2e, 0x0d, 0xfb, 0x18, 0xc3, 0xb4, 0x47, 0x3a, 0x54, 0x43, 0x4b, 0x68, 0xb9, 0x66, 0xf2, 0x36, - 0xd6, 0x60, 0x2e, 0xa4, 0x9b, 0x21, 0x8d, 0xb6, 0xb4, 0x0a, 0xef, 0x96, 0x22, 0xd6, 0xa1, 0xca, - 0x8c, 0x53, 0x2b, 0x8e, 0xb4, 0xa9, 0xa5, 0xa9, 0xe5, 0x9a, 0x99, 0xca, 0x78, 0x19, 0x0e, 0x84, - 0x34, 0xf2, 0xbb, 0xa1, 0x45, 0xbf, 0x43, 0xc3, 0xc8, 0xf1, 0x3d, 0x6d, 0x9a, 0xcf, 0x1e, 0xec, - 0x66, 0x5a, 0x22, 0xea, 0x52, 0x2b, 0xf6, 0x43, 0x6d, 0x86, 0x0f, 0x49, 0x65, 0x86, 0x87, 0x01, - 0xd7, 0x66, 0x13, 0x3c, 0xac, 0x8d, 0x0d, 0x98, 0x27, 0x41, 0x70, 0x97, 0x74, 0x68, 0x14, 0x10, - 0x8b, 0x6a, 0x73, 0xfc, 0xb7, 0x5c, 0x9f, 0x71, 0x0d, 0x6a, 0x77, 0x7d, 0x9b, 0x8e, 0x5e, 0xd4, - 0xa0, 0x92, 0x4a, 0x81, 0x92, 0x6d, 0x38, 0x6c, 0xd2, 0x9e, 0xc3, 0x40, 0xde, 0xa1, 0x31, 0xb1, - 0x49, 0x4c, 0x06, 0x15, 0x56, 0x52, 0x85, 0x3a, 0x54, 0x43, 0x31, 0x58, 0xab, 0xf0, 0xfe, 0x54, - 0x1e, 0x32, 0x36, 0x55, 0x60, 0xec, 0x2f, 0x08, 0x8e, 0x29, 0xdb, 0x61, 0x0a, 0x27, 0x5d, 0xef, - 0x51, 0x2f, 0x8e, 0x46, 0x9b, 0x3d, 0x0f, 0x87, 0xa4, 0x3f, 0x07, 0x17, 0x33, 0xfc, 0x03, 0x03, - 0xa2, 0x76, 0x4a, 0x20, 0x6a, 0x1f, 0x5e, 0x82, 0xba, 0x94, 0x1f, 0xdc, 0x7e, 0x4d, 0x6c, 0x9a, - 0xda, 0x35, 0xb4, 0x9c, 0x99, 0x82, 0xe5, 0x78, 0xa0, 0x29, 0xab, 0xb9, 0x43, 0x3c, 0x67, 0x93, - 0x46, 0xf1, 0xa4, 0xee, 0x43, 0x3b, 0x76, 0xdf, 0x71, 0xa8, 0xdd, 0x70, 0x5c, 0x7a, 0x6d, 0xab, - 0xeb, 0x6d, 0xe3, 0x17, 0x61, 0xc6, 0x62, 0x0d, 0x6e, 0x61, 0xde, 0x4c, 0x04, 0xe3, 0x31, 0x1c, - 0x1f, 0x05, 0xe9, 0xa1, 0x13, 0x6f, 0xb1, 0xe9, 0xd1, 0x28, 0x6c, 0xd6, 0x16, 0xb5, 0xb6, 0xa3, - 0x6e, 0x47, 0x6e, 0xad, 0x94, 0x27, 0xc2, 0xf6, 0x2b, 0x04, 0xcb, 0x63, 0x2d, 0x3f, 0x0c, 0x49, - 0x10, 0xd0, 0x10, 0xdf, 0x80, 0x99, 0x47, 0xec, 0x07, 0x1e, 0xad, 0xf5, 0x56, 0xa3, 0xa1, 0xe6, - 0xb4, 0xb1, 0x5a, 0x6e, 0x7d, 0xc1, 0x4c, 0xa6, 0xe3, 0x86, 0xf4, 0x41, 0x85, 0xeb, 0x59, 0xc8, - 0xe9, 0x49, 0x5d, 0xc5, 0xc6, 0xf3, 0x61, 0x57, 0x67, 0x61, 0x3a, 0x20, 0x61, 0x6c, 0x1c, 0x86, - 0x17, 0xf2, 0x61, 0x18, 0xf8, 0x5e, 0x44, 0x8d, 0xdf, 0xa1, 0xdc, 0x86, 0x5e, 0x0b, 0x29, 0x89, - 0xa9, 0x49, 0x1f, 0x75, 0x69, 0x14, 0xe3, 0x6d, 0x50, 0xd3, 0x2c, 0xf7, 0x5d, 0xbd, 0x75, 0xbb, - 0x91, 0xe5, 0xa9, 0x86, 0xcc, 0x53, 0xbc, 0xf1, 0x7d, 0xcb, 0x6e, 0xf4, 0x5a, 0x8d, 0x60, 0xbb, - 0xdd, 0x60, 0x59, 0x2f, 0x87, 0x4c, 0x66, 0x3d, 0x75, 0xa9, 0xa6, 0xaa, 0x1d, 0x2f, 0xc0, 0x6c, - 0x37, 0x88, 0x68, 0x18, 0xf3, 0x95, 0x55, 0x4d, 0x21, 0xb1, 0x5d, 0xea, 0x11, 0xd7, 0xb1, 0x49, - 0x9c, 0xec, 0x42, 0xd5, 0x4c, 0x65, 0xe3, 0xe3, 0x3c, 0xfa, 0x07, 0x81, 0xfd, 0x79, 0xa1, 0x57, - 0x51, 0x56, 0x06, 0x50, 0x7e, 0x90, 0x47, 0xf9, 0x1a, 0x75, 0x69, 0x86, 0xb2, 0x28, 0x30, 0x35, - 0x98, 0xb3, 0x48, 0x64, 0x11, 0x5b, 0xea, 0x92, 0x22, 0x4b, 0x0b, 0x41, 0xe8, 0x07, 0xa4, 0xcd, - 0x35, 0xdd, 0xf3, 0x5d, 0xc7, 0xea, 0x8b, 0xd8, 0x1c, 0xfe, 0x61, 0x28, 0x88, 0xa7, 0x0b, 0x82, - 0xf8, 0x04, 0xd4, 0x37, 0xfa, 0x9e, 0xf5, 0x7a, 0xc0, 0x4b, 0x26, 0x3b, 0x62, 0x4e, 0x4c, 0x3b, - 0x91, 0x86, 0x78, 0xde, 0x4f, 0x04, 0xe3, 0xc3, 0x19, 0x58, 0x50, 0x56, 0xc0, 0x26, 0x94, 0xe1, - 0x2f, 0x3b, 0xf4, 0x0b, 0x30, 0x6b, 0x87, 0x7d, 0xb3, 0xeb, 0x89, 0xcd, 0x14, 0x12, 0x33, 0x1c, - 0x84, 0x5d, 0x2f, 0x01, 0x59, 0x35, 0x13, 0x01, 0x6f, 0x42, 0x35, 0x8a, 0x59, 0x91, 0x6c, 0xf7, - 0x79, 0x3a, 0xaa, 0xb7, 0xbe, 0xb9, 0xbb, 0x0d, 0x64, 0xd0, 0x37, 0x84, 0x46, 0x33, 0xd5, 0x8d, - 0x1f, 0x41, 0x4d, 0x66, 0xc2, 0x48, 0x9b, 0x5b, 0x9a, 0x5a, 0xae, 0xb7, 0x36, 0x76, 0x6f, 0xe8, - 0xf5, 0x80, 0x15, 0x78, 0x25, 0xeb, 0x9b, 0x99, 0x15, 0xbc, 0x08, 0xb5, 0x8e, 0x38, 0xeb, 0x91, - 0x56, 0xe5, 0xde, 0xce, 0x3a, 0xf0, 0x77, 0x61, 0xc6, 0xf1, 0x36, 0xfd, 0x48, 0xab, 0x71, 0x30, - 0x57, 0x77, 0x07, 0xe6, 0xb6, 0xb7, 0xe9, 0x9b, 0x89, 0x42, 0xfc, 0x08, 0xf6, 0x85, 0x34, 0x0e, - 0xfb, 0xd2, 0x0b, 0x1a, 0x70, 0xbf, 0x7e, 0x6b, 0x77, 0x16, 0x4c, 0x55, 0xa5, 0x99, 0xb7, 0x80, - 0xd7, 0xa0, 0x1e, 0x65, 0x31, 0xa6, 0xd5, 0xb9, 0x41, 0x2d, 0xa7, 0x48, 0x89, 0x41, 0x53, 0x1d, - 0x3c, 0x14, 0xc3, 0xf3, 0x05, 0x31, 0xfc, 0x4f, 0x04, 0x8b, 0x43, 0x69, 0x60, 0x23, 0xa0, 0xa5, - 0x41, 0x4a, 0x60, 0x3a, 0x0a, 0xa8, 0xc5, 0x33, 0x7f, 0xbd, 0x75, 0x67, 0xcf, 0xf2, 0x02, 0xb7, - 0xcb, 0x55, 0x97, 0xa5, 0xae, 0x89, 0xce, 0xe6, 0x4f, 0x10, 0x7c, 0x51, 0xd1, 0x7c, 0x8f, 0xc4, - 0xd6, 0x56, 0xd9, 0x92, 0xd8, 0x19, 0x62, 0x63, 0x44, 0x35, 0x4b, 0x04, 0x16, 0x68, 0xbc, 0x71, - 0xbf, 0x1f, 0x30, 0x18, 0xec, 0x97, 0xac, 0x63, 0xa2, 0xa2, 0xff, 0x2e, 0x02, 0x5d, 0xcd, 0x7c, - 0xbe, 0xeb, 0xbe, 0x49, 0xac, 0xed, 0x32, 0x28, 0xfb, 0xa1, 0xe2, 0xd8, 0x1c, 0xc7, 0x94, 0x59, - 0x71, 0xec, 0x1d, 0x1e, 0xfb, 0x41, 0x50, 0xb3, 0x05, 0xa0, 0x3e, 0x1d, 0x00, 0x25, 0x8f, 0x58, - 0x09, 0xa8, 0x45, 0xa8, 0x79, 0x03, 0x97, 0xa9, 0xac, 0xa3, 0xe0, 0x12, 0x55, 0x19, 0xba, 0x44, - 0x69, 0x30, 0xd7, 0x4b, 0x6f, 0xbd, 0xec, 0x67, 0x29, 0xb2, 0x85, 0xb4, 0x43, 0xbf, 0x1b, 0x08, - 0x07, 0x26, 0x02, 0x43, 0xb1, 0xed, 0x78, 0xb6, 0x36, 0x9b, 0xa0, 0x60, 0xed, 0x89, 0xee, 0xb9, - 0xef, 0x55, 0xe0, 0x4b, 0x05, 0x8b, 0x1b, 0x1b, 0x01, 0xcf, 0xc7, 0x0a, 0xd3, 0x38, 0x9c, 0x1b, - 0x19, 0x87, 0xd5, 0x71, 0x71, 0x58, 0x2b, 0xf0, 0xca, 0x3b, 0x15, 0x58, 0x2a, 0xf0, 0xca, 0xf8, - 0x82, 0xfa, 0xdc, 0xb8, 0x65, 0xd3, 0x0f, 0xc5, 0x8e, 0x57, 0xcd, 0x44, 0x60, 0x27, 0xc3, 0x0f, - 0x83, 0x2d, 0xe2, 0x69, 0xd5, 0xe4, 0x64, 0x24, 0xd2, 0x44, 0x0e, 0xf9, 0x2f, 0x02, 0x4d, 0x7a, - 0xe1, 0x8a, 0xc5, 0x7d, 0xd2, 0xf5, 0x9e, 0x7f, 0x47, 0x2c, 0xc0, 0x2c, 0xe1, 0x68, 0x45, 0x80, - 0x08, 0x69, 0x68, 0xc9, 0xd5, 0xe2, 0x9c, 0x78, 0x24, 0xbf, 0xe4, 0x68, 0xdd, 0x89, 0x62, 0x79, - 0xa1, 0xc5, 0x9b, 0x30, 0x97, 0x68, 0x4b, 0xae, 0x30, 0xf5, 0xd6, 0xfa, 0x6e, 0x0b, 0x5b, 0xce, - 0xbd, 0x52, 0xb9, 0xf1, 0x32, 0x1c, 0x29, 0xcc, 0x3e, 0x02, 0x86, 0x0e, 0x55, 0x59, 0xcc, 0xc5, - 0x06, 0xa4, 0xb2, 0xf1, 0x9f, 0xa9, 0x7c, 0x5a, 0xf7, 0xed, 0x75, 0xbf, 0x5d, 0xf2, 0x16, 0x2c, - 0xdf, 0x34, 0x0d, 0xe6, 0x02, 0xdf, 0x56, 0x9e, 0x7d, 0x52, 0x64, 0xf3, 0x2c, 0xdf, 0x8b, 0x89, - 0xe3, 0xd1, 0x50, 0xd4, 0x97, 0xac, 0x83, 0x39, 0x3b, 0x72, 0x3c, 0x8b, 0x6e, 0x50, 0xcb, 0xf7, - 0xec, 0x88, 0xef, 0xda, 0x94, 0x99, 0xeb, 0xc3, 0xb7, 0xa0, 0xc6, 0xe5, 0xfb, 0x4e, 0x27, 0x49, - 0xc2, 0xf5, 0xd6, 0x4a, 0x23, 0xa1, 0x4a, 0x1a, 0x2a, 0x55, 0x92, 0xf9, 0xb0, 0x43, 0x63, 0xd2, - 0xe8, 0x5d, 0x6c, 0xb0, 0x19, 0x66, 0x36, 0x99, 0x61, 0x89, 0x89, 0xe3, 0xae, 0x3b, 0x1e, 0xbf, - 0x60, 0x31, 0x53, 0x59, 0x07, 0x0b, 0x88, 0x4d, 0xdf, 0x75, 0xfd, 0xc7, 0xf2, 0x0c, 0x24, 0x12, - 0x9b, 0xd5, 0xf5, 0x62, 0xc7, 0xe5, 0xf6, 0x93, 0x03, 0x90, 0x75, 0xf0, 0x59, 0x8e, 0x1b, 0xd3, - 0x90, 0x5f, 0x61, 0x6a, 0xa6, 0x90, 0xd2, 0x90, 0xab, 0x27, 0xbc, 0x80, 0x3c, 0x7b, 0x49, 0x70, - 0xce, 0xab, 0xc1, 0x39, 0x18, 0xf0, 0xfb, 0x0a, 0xde, 0xcd, 0x9c, 0x0c, 0xa1, 0x3d, 0xc7, 0xef, - 0x46, 0xda, 0xfe, 0xa4, 0x88, 0x4b, 0x79, 0x28, 0x60, 0x0f, 0x14, 0x04, 0xec, 0xef, 0x11, 0x54, - 0xd7, 0xfd, 0xf6, 0x75, 0x2f, 0x0e, 0xfb, 0xfc, 0x66, 0xef, 0x7b, 0x31, 0xf5, 0x64, 0x54, 0x48, - 0x91, 0xb9, 0x3a, 0x76, 0x3a, 0x74, 0x23, 0x26, 0x9d, 0x40, 0xdc, 0x49, 0x76, 0xe4, 0xea, 0x74, - 0x32, 0x5b, 0xbe, 0x4b, 0xa2, 0x98, 0x9f, 0xde, 0xaa, 0xc9, 0xdb, 0x0c, 0x68, 0x3a, 0x60, 0x23, - 0x0e, 0xc5, 0xd1, 0xcd, 0xf5, 0xa9, 0x81, 0x34, 0x93, 0x60, 0x13, 0xa2, 0xb1, 0x01, 0x2f, 0xa5, - 0x57, 0xd9, 0xfb, 0x34, 0xec, 0x38, 0x1e, 0x29, 0xcf, 0xb7, 0x93, 0xb0, 0x30, 0x0f, 0x72, 0x07, - 0x88, 0xdd, 0xff, 0x1e, 0x3a, 0x9e, 0xed, 0x3f, 0x2e, 0x39, 0x08, 0x93, 0xa8, 0xfd, 0x5b, 0x9e, - 0x6f, 0x51, 0xf4, 0xa6, 0x67, 0xf3, 0x16, 0xec, 0x63, 0xa7, 0xb8, 0x47, 0xc5, 0x0f, 0x22, 0x51, - 0x18, 0xa3, 0x9e, 0xe4, 0x99, 0x0e, 0x33, 0x3f, 0x11, 0xaf, 0xc3, 0x01, 0x12, 0x45, 0x4e, 0xdb, - 0xa3, 0xb6, 0xd4, 0x55, 0x99, 0x58, 0xd7, 0xe0, 0xd4, 0xe4, 0xd9, 0xc7, 0x47, 0x88, 0xbd, 0x93, - 0xa2, 0xf1, 0x63, 0x04, 0x87, 0x0b, 0x95, 0xa4, 0xb1, 0x8e, 0x94, 0xf4, 0xaa, 0x43, 0x35, 0xb2, - 0xb6, 0xa8, 0xdd, 0x75, 0xa9, 0xe4, 0x35, 0xa4, 0xcc, 0x7e, 0xb3, 0xbb, 0xc9, 0x4e, 0x8a, 0xf4, - 0x9e, 0xca, 0xf8, 0x18, 0x40, 0x87, 0x78, 0x5d, 0xe2, 0x72, 0x08, 0xd3, 0x1c, 0x82, 0xd2, 0x63, - 0x2c, 0x82, 0x5e, 0x14, 0x06, 0x82, 0x49, 0xf8, 0x07, 0x82, 0xfd, 0x32, 0x0d, 0x8a, 0x3d, 0x5c, - 0x86, 0x03, 0x8a, 0x1b, 0xee, 0x66, 0xdb, 0x39, 0xd8, 0x3d, 0x26, 0xc5, 0xc9, 0x58, 0x98, 0xca, - 0xb3, 0x97, 0xbd, 0x1c, 0xff, 0x38, 0x71, 0x1d, 0x42, 0x3b, 0xba, 0x89, 0xfd, 0x08, 0xb4, 0x3b, - 0xc4, 0x23, 0x6d, 0x6a, 0xa7, 0x8b, 0x4b, 0x03, 0xe9, 0x07, 0xea, 0x63, 0x79, 0xd7, 0x4f, 0xd3, - 0xf4, 0x3a, 0xe3, 0x6c, 0x6e, 0xca, 0x87, 0x77, 0x08, 0xd5, 0x75, 0xc7, 0xdb, 0x66, 0xef, 0x37, - 0xb6, 0xae, 0xd8, 0x89, 0x5d, 0xe9, 0xc3, 0x44, 0xc0, 0x07, 0x61, 0xaa, 0x1b, 0xba, 0x62, 0x9f, - 0x59, 0x13, 0x2f, 0x41, 0xdd, 0xa6, 0x91, 0x15, 0x3a, 0x81, 0xd8, 0x65, 0x4e, 0xf4, 0x29, 0x5d, - 0xcc, 0xdb, 0x8e, 0xe5, 0x7b, 0xd7, 0x5c, 0x12, 0x45, 0xb2, 0x30, 0xa4, 0x1d, 0xc6, 0xab, 0xb0, - 0x8f, 0xd9, 0xcc, 0x96, 0x79, 0x2e, 0xbf, 0xcc, 0xc3, 0x39, 0xf8, 0x12, 0x9e, 0x44, 0x4c, 0xe0, - 0x05, 0x56, 0x8f, 0xaf, 0x04, 0x81, 0x50, 0x52, 0x4a, 0x73, 0x08, 0x5a, 0x59, 0xc0, 0x97, 0x62, - 0x3e, 0x1c, 0xa6, 0x06, 0xc2, 0xa1, 0xf5, 0x53, 0x03, 0xb0, 0x7a, 0x1a, 0x68, 0xd8, 0x73, 0x2c, - 0x8a, 0xdf, 0x45, 0x30, 0xcd, 0x4c, 0xe3, 0xa3, 0xa3, 0x0e, 0x1f, 0x8f, 0x4a, 0x7d, 0xef, 0x9e, - 0x7a, 0xcc, 0x9a, 0xb1, 0xf8, 0xd6, 0xdf, 0xff, 0xfd, 0x5e, 0x65, 0x01, 0xbf, 0xc8, 0x3f, 0x30, - 0xf4, 0x2e, 0xaa, 0x64, 0x7f, 0x84, 0xdf, 0x46, 0x80, 0xc5, 0xfd, 0x44, 0xe1, 0x7d, 0xf1, 0xb9, - 0x51, 0x10, 0x0b, 0xf8, 0x61, 0xfd, 0xa8, 0x52, 0x07, 0x1a, 0x96, 0x1f, 0x52, 0x96, 0xf5, 0xf9, - 0x00, 0x0e, 0x60, 0x85, 0x03, 0x38, 0x89, 0x8d, 0x22, 0x00, 0xcd, 0x27, 0xcc, 0x6f, 0x4f, 0x9b, - 0x34, 0xb1, 0xfb, 0x11, 0x82, 0x99, 0x87, 0xfc, 0x36, 0x3e, 0xc6, 0x49, 0x1b, 0x7b, 0xe6, 0x24, - 0x6e, 0x8e, 0xa3, 0x35, 0x4e, 0x70, 0xa4, 0x47, 0xf1, 0x11, 0x89, 0x34, 0x8a, 0x43, 0x4a, 0x3a, - 0x39, 0xc0, 0x17, 0x10, 0xfe, 0x04, 0xc1, 0x6c, 0x42, 0x44, 0xe2, 0x53, 0xa3, 0x50, 0xe6, 0x88, - 0x4a, 0x7d, 0xef, 0x58, 0x3d, 0xe3, 0x2c, 0xc7, 0x78, 0xc2, 0x28, 0xdc, 0xce, 0xb5, 0x1c, 0xe7, - 0xf7, 0x3e, 0x82, 0xa9, 0x9b, 0x74, 0x6c, 0xbc, 0xed, 0x21, 0xb8, 0x21, 0x07, 0x16, 0x6c, 0x35, - 0xfe, 0x18, 0xc1, 0x4b, 0x37, 0x69, 0x5c, 0x5c, 0x04, 0xf1, 0xf2, 0xf8, 0xca, 0x24, 0xc2, 0xee, - 0xdc, 0x04, 0x23, 0xd3, 0xec, 0xdf, 0xe4, 0xc8, 0xce, 0xe2, 0x33, 0x65, 0x41, 0x18, 0xf5, 0x3d, - 0xeb, 0xb1, 0xc0, 0xf1, 0x67, 0x04, 0x07, 0x07, 0xbf, 0xc2, 0xe0, 0x7c, 0xd9, 0x2c, 0xfc, 0x48, - 0xa3, 0xdf, 0xdd, 0x6d, 0x96, 0xcd, 0x2b, 0x35, 0xae, 0x70, 0xe4, 0xaf, 0xe0, 0x97, 0xcb, 0x90, - 0x4b, 0xfa, 0x32, 0x6a, 0x3e, 0x91, 0xcd, 0xa7, 0xfc, 0xb3, 0x20, 0x87, 0xfd, 0x16, 0x82, 0xf9, - 0x9b, 0x34, 0xbe, 0x93, 0xb2, 0x77, 0xa7, 0x26, 0x62, 0xf7, 0xf5, 0xc5, 0x86, 0xf2, 0xf5, 0x4e, - 0xfe, 0x94, 0xba, 0x74, 0x95, 0x03, 0x3b, 0x83, 0x4f, 0x95, 0x01, 0xcb, 0x18, 0xc3, 0x8f, 0x10, - 0x1c, 0x56, 0x41, 0x64, 0xdf, 0x3e, 0xbe, 0xb2, 0xb3, 0x6f, 0x0d, 0xe2, 0x8b, 0xc5, 0x18, 0x74, - 0x2d, 0x8e, 0xee, 0xbc, 0x51, 0xbc, 0xe1, 0x9d, 0x21, 0x14, 0x6b, 0x68, 0x65, 0x19, 0xe1, 0x3f, - 0x20, 0x98, 0x4d, 0xe8, 0xb9, 0xd1, 0x3e, 0xca, 0xb1, 0xf8, 0x7b, 0x79, 0x7a, 0xae, 0x73, 0xc8, - 0x5f, 0xd7, 0x2f, 0x14, 0x3b, 0x54, 0x9d, 0x2f, 0xb7, 0xb6, 0xc1, 0xbd, 0x9c, 0x3f, 0xf6, 0xbf, - 0x41, 0x00, 0x19, 0xc5, 0x88, 0xcf, 0x96, 0xaf, 0x43, 0xa1, 0x21, 0xf5, 0xbd, 0x25, 0x19, 0x8d, - 0x06, 0x5f, 0xcf, 0xb2, 0xbe, 0x54, 0x7a, 0xe6, 0x02, 0x6a, 0xad, 0x25, 0x74, 0xe4, 0x2f, 0x11, - 0xcc, 0x70, 0x06, 0x09, 0x9f, 0x1c, 0x85, 0x59, 0x25, 0x98, 0xf6, 0xd2, 0xf5, 0xa7, 0x39, 0xd4, - 0xa5, 0x56, 0x59, 0xe2, 0x5a, 0x43, 0x2b, 0xb8, 0x07, 0xb3, 0x09, 0x9b, 0x33, 0x3a, 0x3c, 0x72, - 0x6c, 0x8f, 0xbe, 0x54, 0x52, 0x48, 0x93, 0x40, 0x15, 0x39, 0x73, 0x65, 0x5c, 0xce, 0x9c, 0x66, - 0x69, 0x0d, 0x9f, 0x28, 0x4b, 0x7a, 0x9f, 0x81, 0x63, 0xce, 0x71, 0x74, 0xa7, 0x8c, 0xa5, 0x71, - 0x79, 0x93, 0x79, 0xe7, 0xe7, 0x08, 0x0e, 0x0e, 0x5e, 0x46, 0xf1, 0x91, 0x81, 0x9c, 0xa9, 0xde, - 0xc0, 0xf5, 0xbc, 0x17, 0x47, 0x5d, 0x64, 0x8d, 0x6f, 0x70, 0x14, 0x6b, 0xf8, 0xf2, 0xd8, 0x93, - 0x71, 0x57, 0x66, 0x1d, 0xa6, 0x68, 0x35, 0xfb, 0x9a, 0xf1, 0x5b, 0x04, 0xf3, 0x52, 0xef, 0xfd, - 0x90, 0xd2, 0x72, 0x58, 0x7b, 0x77, 0x10, 0x98, 0x2d, 0xe3, 0x55, 0x0e, 0xff, 0xab, 0xf8, 0xd2, - 0x84, 0xf0, 0x25, 0xec, 0xd5, 0x98, 0x21, 0xfd, 0x23, 0x82, 0x43, 0x0f, 0x93, 0xb8, 0xff, 0x9c, - 0xf0, 0x5f, 0xe3, 0xf8, 0xbf, 0x86, 0x5f, 0x29, 0xb9, 0x17, 0x8d, 0x5b, 0xc6, 0x05, 0x84, 0x7f, - 0x8d, 0xa0, 0x2a, 0xb9, 0x79, 0x7c, 0x66, 0xe4, 0xc1, 0xc8, 0xb3, 0xf7, 0x7b, 0x19, 0xcc, 0xe2, - 0x12, 0x60, 0x9c, 0x2c, 0x2d, 0xa5, 0xc2, 0x3e, 0x0b, 0xe8, 0xf7, 0x11, 0xe0, 0xf4, 0x25, 0x99, - 0xbe, 0x2d, 0xf1, 0xe9, 0x9c, 0xa9, 0x91, 0xd4, 0x83, 0x7e, 0x66, 0xec, 0xb8, 0x7c, 0x29, 0x5d, - 0x29, 0x2d, 0xa5, 0x7e, 0x6a, 0xff, 0x1d, 0x04, 0xf5, 0x9b, 0x34, 0xbd, 0xb3, 0x97, 0xf8, 0x32, - 0xff, 0xd1, 0x41, 0x5f, 0x1e, 0x3f, 0x50, 0x20, 0x3a, 0xcf, 0x11, 0x9d, 0xc6, 0xe5, 0xae, 0x92, - 0x00, 0x3e, 0x44, 0xb0, 0xef, 0x9e, 0x1a, 0xa2, 0xf8, 0xfc, 0x38, 0x4b, 0xb9, 0x4c, 0x3e, 0x39, - 0xae, 0x2f, 0x73, 0x5c, 0xab, 0xc6, 0x44, 0xb8, 0xd6, 0x04, 0xb3, 0xff, 0x0b, 0x94, 0x3c, 0xfa, - 0x06, 0x78, 0xd9, 0xff, 0xd7, 0x6f, 0x25, 0xf4, 0xae, 0x71, 0x89, 0xe3, 0x6b, 0xe0, 0xf3, 0x93, - 0xe0, 0x6b, 0x0a, 0xb2, 0x16, 0x7f, 0x80, 0xe0, 0x10, 0x67, 0xc6, 0x55, 0xc5, 0x03, 0x25, 0x66, - 0x14, 0x8f, 0x3e, 0x41, 0x89, 0x11, 0xf9, 0xc7, 0xd8, 0x11, 0xa8, 0x35, 0xc9, 0x7a, 0xff, 0x0c, - 0xc1, 0x7e, 0x59, 0xd4, 0xc4, 0xee, 0xae, 0x8e, 0x73, 0xdc, 0x4e, 0x8b, 0xa0, 0x08, 0xb7, 0x95, - 0xc9, 0xc2, 0xed, 0x13, 0x04, 0x73, 0x82, 0x95, 0x2e, 0xb9, 0x2a, 0x28, 0xb4, 0xb5, 0x3e, 0xc0, - 0x09, 0x08, 0xba, 0xd3, 0xf8, 0x1e, 0x37, 0xfb, 0x00, 0x37, 0xcb, 0xcc, 0x06, 0xbe, 0x1d, 0x35, - 0x9f, 0x08, 0xae, 0xf1, 0x69, 0xd3, 0xf5, 0xdb, 0xd1, 0x1b, 0x06, 0x2e, 0x2d, 0x88, 0x6c, 0xcc, - 0x05, 0x84, 0x63, 0xa8, 0xb1, 0xe0, 0xe0, 0x44, 0x03, 0x5e, 0x1a, 0xa0, 0x25, 0x86, 0x38, 0x08, - 0x5d, 0x1f, 0x22, 0x2e, 0xb2, 0x0a, 0x28, 0x9e, 0x7d, 0xf8, 0x78, 0xa9, 0x59, 0x6e, 0xe8, 0x6d, - 0x04, 0x87, 0xd4, 0x68, 0x4f, 0xcc, 0x4f, 0x1c, 0xeb, 0x65, 0x28, 0xc4, 0xa5, 0x1a, 0xaf, 0x4c, - 0x14, 0x48, 0x1c, 0xce, 0xd5, 0x1b, 0x7f, 0x7a, 0x76, 0x0c, 0xfd, 0xf5, 0xd9, 0x31, 0xf4, 0xaf, - 0x67, 0xc7, 0xd0, 0x1b, 0x97, 0x27, 0xfb, 0x4b, 0xa2, 0xe5, 0x3a, 0xd4, 0x8b, 0x55, 0xf5, 0xff, - 0x0b, 0x00, 0x00, 0xff, 0xff, 0x82, 0x54, 0x27, 0xf7, 0x78, 0x29, 0x00, 0x00, + 0xfe, 0x04, 0x54, 0xd5, 0x55, 0xdd, 0xd5, 0x33, 0x3d, 0x3d, 0xbd, 0xec, 0x46, 0xf1, 0xad, 0x5e, + 0x4d, 0xd5, 0x7b, 0xbf, 0x7a, 0xf5, 0xbe, 0xea, 0xf5, 0xc0, 0xc9, 0x90, 0x06, 0x7d, 0x1a, 0x34, + 0x89, 0xef, 0x3b, 0xb6, 0x45, 0x22, 0xdb, 0x73, 0xd5, 0x71, 0xc3, 0x0f, 0xbc, 0xc8, 0xc3, 0x75, + 0x65, 0x4a, 0x5f, 0xec, 0x78, 0x5e, 0xc7, 0xa1, 0x4d, 0xe2, 0xdb, 0x4d, 0xe2, 0xba, 0x5e, 0xc4, + 0xa7, 0xc3, 0x78, 0xa9, 0x6e, 0x6c, 0x5f, 0x0e, 0x1b, 0xb6, 0xc7, 0x7f, 0xb5, 0xbc, 0x80, 0x36, + 0xfb, 0x17, 0x9b, 0x1d, 0xea, 0xd2, 0x80, 0x44, 0xb4, 0x2d, 0xd6, 0x5c, 0x4a, 0xd7, 0x74, 0x89, + 0xb5, 0x65, 0xbb, 0x34, 0x18, 0x34, 0xfd, 0xed, 0x0e, 0x9b, 0x08, 0x9b, 0x5d, 0x1a, 0x91, 0xbc, + 0x5d, 0xeb, 0x1d, 0x3b, 0xda, 0xea, 0xbd, 0xd9, 0xb0, 0xbc, 0x6e, 0x93, 0x04, 0x1d, 0xcf, 0x0f, + 0xbc, 0x1f, 0xf2, 0xc1, 0xaa, 0xd5, 0x6e, 0xf6, 0x5b, 0x29, 0x03, 0xf5, 0x2c, 0xfd, 0x8b, 0xc4, + 0xf1, 0xb7, 0xc8, 0x28, 0xb7, 0xeb, 0x13, 0xb8, 0x05, 0xd4, 0xf7, 0x84, 0x6e, 0xf8, 0xd0, 0x8e, + 0xbc, 0x60, 0xa0, 0x0c, 0x63, 0x36, 0xc6, 0xa7, 0x08, 0x0e, 0x5e, 0x49, 0xe5, 0x7d, 0xbb, 0x47, + 0x83, 0x01, 0xc6, 0x30, 0xed, 0x92, 0x2e, 0xd5, 0xd0, 0x12, 0x5a, 0xae, 0x99, 0x7c, 0x8c, 0x35, + 0x98, 0x0b, 0xe8, 0x66, 0x40, 0xc3, 0x2d, 0xad, 0xc2, 0xa7, 0x25, 0x89, 0x75, 0xa8, 0x32, 0xe1, + 0xd4, 0x8a, 0x42, 0x6d, 0x6a, 0x69, 0x6a, 0xb9, 0x66, 0x26, 0x34, 0x5e, 0x86, 0x03, 0x01, 0x0d, + 0xbd, 0x5e, 0x60, 0xd1, 0xef, 0xd0, 0x20, 0xb4, 0x3d, 0x57, 0x9b, 0xe6, 0xbb, 0x87, 0xa7, 0x19, + 0x97, 0x90, 0x3a, 0xd4, 0x8a, 0xbc, 0x40, 0x9b, 0xe1, 0x4b, 0x12, 0x9a, 0xe1, 0x61, 0xc0, 0xb5, + 0xd9, 0x18, 0x0f, 0x1b, 0x63, 0x03, 0xe6, 0x89, 0xef, 0xdf, 0x25, 0x5d, 0x1a, 0xfa, 0xc4, 0xa2, + 0xda, 0x1c, 0xff, 0x2d, 0x33, 0x67, 0x5c, 0x83, 0xda, 0x5d, 0xaf, 0x4d, 0xc7, 0x1f, 0x6a, 0x98, + 0x49, 0x25, 0x87, 0xc9, 0x36, 0x1c, 0x36, 0x69, 0xdf, 0x66, 0x20, 0xef, 0xd0, 0x88, 0xb4, 0x49, + 0x44, 0x86, 0x19, 0x56, 0x12, 0x86, 0x3a, 0x54, 0x03, 0xb1, 0x58, 0xab, 0xf0, 0xf9, 0x84, 0x1e, + 0x11, 0x36, 0x95, 0x23, 0xec, 0x2f, 0x08, 0x8e, 0x29, 0xd7, 0x61, 0x0a, 0x25, 0x5d, 0xef, 0x53, + 0x37, 0x0a, 0xc7, 0x8b, 0x3d, 0x0f, 0x87, 0xa4, 0x3e, 0x87, 0x0f, 0x33, 0xfa, 0x03, 0x03, 0xa2, + 0x4e, 0x4a, 0x20, 0xea, 0x1c, 0x5e, 0x82, 0xba, 0xa4, 0x1f, 0xdc, 0x7e, 0x4d, 0x5c, 0x9a, 0x3a, + 0x35, 0x72, 0x9c, 0x99, 0x9c, 0xe3, 0xb8, 0xa0, 0x29, 0xa7, 0xb9, 0x43, 0x5c, 0x7b, 0x93, 0x86, + 0x51, 0x59, 0xf5, 0xa1, 0x1d, 0xab, 0xef, 0x38, 0xd4, 0x6e, 0xd8, 0x0e, 0xbd, 0xb6, 0xd5, 0x73, + 0xb7, 0xf1, 0x8b, 0x30, 0x63, 0xb1, 0x01, 0x97, 0x30, 0x6f, 0xc6, 0x84, 0xf1, 0x18, 0x8e, 0x8f, + 0x83, 0xf4, 0xd0, 0x8e, 0xb6, 0xd8, 0xf6, 0x70, 0x1c, 0x36, 0x6b, 0x8b, 0x5a, 0xdb, 0x61, 0xaf, + 0x2b, 0xaf, 0x56, 0xd2, 0xa5, 0xb0, 0xfd, 0x0a, 0xc1, 0xf2, 0x44, 0xc9, 0x0f, 0x03, 0xe2, 0xfb, + 0x34, 0xc0, 0x37, 0x60, 0xe6, 0x11, 0xfb, 0x81, 0x5b, 0x6b, 0xbd, 0xd5, 0x68, 0xa8, 0x31, 0x6d, + 0x22, 0x97, 0x5b, 0x5f, 0x30, 0xe3, 0xed, 0xb8, 0x21, 0x75, 0x50, 0xe1, 0x7c, 0x16, 0x32, 0x7c, + 0x12, 0x55, 0xb1, 0xf5, 0x7c, 0xd9, 0xd5, 0x59, 0x98, 0xf6, 0x49, 0x10, 0x19, 0x87, 0xe1, 0x85, + 0xac, 0x19, 0xfa, 0x9e, 0x1b, 0x52, 0xe3, 0x77, 0x28, 0x73, 0xa1, 0xd7, 0x02, 0x4a, 0x22, 0x6a, + 0xd2, 0x47, 0x3d, 0x1a, 0x46, 0x78, 0x1b, 0xd4, 0x30, 0xcb, 0x75, 0x57, 0x6f, 0xdd, 0x6e, 0xa4, + 0x71, 0xaa, 0x21, 0xe3, 0x14, 0x1f, 0x7c, 0xdf, 0x6a, 0x37, 0xfa, 0xad, 0x86, 0xbf, 0xdd, 0x69, + 0xb0, 0xa8, 0x97, 0x41, 0x26, 0xa3, 0x9e, 0x7a, 0x54, 0x53, 0xe5, 0x8e, 0x17, 0x60, 0xb6, 0xe7, + 0x87, 0x34, 0x88, 0xf8, 0xc9, 0xaa, 0xa6, 0xa0, 0xd8, 0x2d, 0xf5, 0x89, 0x63, 0xb7, 0x49, 0x14, + 0xdf, 0x42, 0xd5, 0x4c, 0x68, 0xe3, 0xe3, 0x2c, 0xfa, 0x07, 0x7e, 0xfb, 0xf3, 0x42, 0xaf, 0xa2, + 0xac, 0x0c, 0xa1, 0xfc, 0x20, 0x8b, 0xf2, 0x35, 0xea, 0xd0, 0x14, 0x65, 0x9e, 0x61, 0x6a, 0x30, + 0x67, 0x91, 0xd0, 0x22, 0x6d, 0xc9, 0x4b, 0x92, 0x2c, 0x2c, 0xf8, 0x81, 0xe7, 0x93, 0x0e, 0xe7, + 0x74, 0xcf, 0x73, 0x6c, 0x6b, 0x20, 0x6c, 0x73, 0xf4, 0x87, 0x11, 0x23, 0x9e, 0xce, 0x31, 0xe2, + 0x13, 0x50, 0xdf, 0x18, 0xb8, 0xd6, 0xeb, 0x3e, 0x4f, 0x99, 0xcc, 0xc5, 0xec, 0x88, 0x76, 0x43, + 0x0d, 0xf1, 0xb8, 0x1f, 0x13, 0xc6, 0x87, 0x33, 0xb0, 0xa0, 0x9c, 0x80, 0x6d, 0x28, 0xc2, 0x5f, + 0xe4, 0xf4, 0x0b, 0x30, 0xdb, 0x0e, 0x06, 0x66, 0xcf, 0x15, 0x97, 0x29, 0x28, 0x26, 0xd8, 0x0f, + 0x7a, 0x6e, 0x0c, 0xb2, 0x6a, 0xc6, 0x04, 0xde, 0x84, 0x6a, 0x18, 0xb1, 0x24, 0xd9, 0x19, 0xf0, + 0x70, 0x54, 0x6f, 0x7d, 0x73, 0x77, 0x17, 0xc8, 0xa0, 0x6f, 0x08, 0x8e, 0x66, 0xc2, 0x1b, 0x3f, + 0x82, 0x9a, 0x8c, 0x84, 0xa1, 0x36, 0xb7, 0x34, 0xb5, 0x5c, 0x6f, 0x6d, 0xec, 0x5e, 0xd0, 0xeb, + 0x3e, 0x4b, 0xf0, 0x4a, 0xd4, 0x37, 0x53, 0x29, 0x78, 0x11, 0x6a, 0x5d, 0xe1, 0xeb, 0xa1, 0x56, + 0xe5, 0xda, 0x4e, 0x27, 0xf0, 0x77, 0x61, 0xc6, 0x76, 0x37, 0xbd, 0x50, 0xab, 0x71, 0x30, 0x57, + 0x77, 0x07, 0xe6, 0xb6, 0xbb, 0xe9, 0x99, 0x31, 0x43, 0xfc, 0x08, 0xf6, 0x05, 0x34, 0x0a, 0x06, + 0x52, 0x0b, 0x1a, 0x70, 0xbd, 0x7e, 0x6b, 0x77, 0x12, 0x4c, 0x95, 0xa5, 0x99, 0x95, 0x80, 0xd7, + 0xa0, 0x1e, 0xa6, 0x36, 0xa6, 0xd5, 0xb9, 0x40, 0x2d, 0xc3, 0x48, 0xb1, 0x41, 0x53, 0x5d, 0x3c, + 0x62, 0xc3, 0xf3, 0x39, 0x36, 0xfc, 0x4f, 0x04, 0x8b, 0x23, 0x61, 0x60, 0xc3, 0xa7, 0x85, 0x46, + 0x4a, 0x60, 0x3a, 0xf4, 0xa9, 0xc5, 0x23, 0x7f, 0xbd, 0x75, 0x67, 0xcf, 0xe2, 0x02, 0x97, 0xcb, + 0x59, 0x17, 0x85, 0xae, 0x52, 0xbe, 0xf9, 0x13, 0x04, 0x5f, 0x54, 0x38, 0xdf, 0x23, 0x91, 0xb5, + 0x55, 0x74, 0x24, 0xe6, 0x43, 0x6c, 0x8d, 0xc8, 0x66, 0x31, 0xc1, 0x0c, 0x8d, 0x0f, 0xee, 0x0f, + 0x7c, 0x06, 0x83, 0xfd, 0x92, 0x4e, 0x94, 0x4a, 0xfa, 0xef, 0x22, 0xd0, 0xd5, 0xc8, 0xe7, 0x39, + 0xce, 0x9b, 0xc4, 0xda, 0x2e, 0x82, 0xb2, 0x1f, 0x2a, 0x76, 0x9b, 0xe3, 0x98, 0x32, 0x2b, 0x76, + 0x7b, 0x87, 0x6e, 0x3f, 0x0c, 0x6a, 0x36, 0x07, 0xd4, 0xa7, 0x43, 0xa0, 0xa4, 0x8b, 0x15, 0x80, + 0x5a, 0x84, 0x9a, 0x3b, 0x54, 0x4c, 0xa5, 0x13, 0x39, 0x45, 0x54, 0x65, 0xa4, 0x88, 0xd2, 0x60, + 0xae, 0x9f, 0x54, 0xbd, 0xec, 0x67, 0x49, 0xb2, 0x83, 0x74, 0x02, 0xaf, 0xe7, 0x0b, 0x05, 0xc6, + 0x04, 0x43, 0xb1, 0x6d, 0xbb, 0x6d, 0x6d, 0x36, 0x46, 0xc1, 0xc6, 0xa5, 0xea, 0xdc, 0xf7, 0x2a, + 0xf0, 0xa5, 0x9c, 0xc3, 0x4d, 0xb4, 0x80, 0xe7, 0xe3, 0x84, 0x89, 0x1d, 0xce, 0x8d, 0xb5, 0xc3, + 0xea, 0x24, 0x3b, 0xac, 0xe5, 0x68, 0xe5, 0x9d, 0x0a, 0x2c, 0xe5, 0x68, 0x65, 0x72, 0x42, 0x7d, + 0x6e, 0xd4, 0xb2, 0xe9, 0x05, 0xe2, 0xc6, 0xab, 0x66, 0x4c, 0x30, 0xcf, 0xf0, 0x02, 0x7f, 0x8b, + 0xb8, 0x5a, 0x35, 0xf6, 0x8c, 0x98, 0x2a, 0xa5, 0x90, 0xff, 0x22, 0xd0, 0xa4, 0x16, 0xae, 0x58, + 0x5c, 0x27, 0x3d, 0xf7, 0xf9, 0x57, 0xc4, 0x02, 0xcc, 0x12, 0x8e, 0x56, 0x18, 0x88, 0xa0, 0x46, + 0x8e, 0x5c, 0xcd, 0x8f, 0x89, 0x47, 0xb2, 0x47, 0x0e, 0xd7, 0xed, 0x30, 0x92, 0x05, 0x2d, 0xde, + 0x84, 0xb9, 0x98, 0x5b, 0x5c, 0xc2, 0xd4, 0x5b, 0xeb, 0xbb, 0x4d, 0x6c, 0x19, 0xf5, 0x4a, 0xe6, + 0xc6, 0xcb, 0x70, 0x24, 0x37, 0xfa, 0x08, 0x18, 0x3a, 0x54, 0x65, 0x32, 0x17, 0x17, 0x90, 0xd0, + 0xc6, 0x7f, 0xa6, 0xb2, 0x61, 0xdd, 0x6b, 0xaf, 0x7b, 0x9d, 0x82, 0xb7, 0x60, 0xf1, 0xa5, 0x69, + 0x30, 0xe7, 0x7b, 0x6d, 0xe5, 0xd9, 0x27, 0x49, 0xb6, 0xcf, 0xf2, 0xdc, 0x88, 0xd8, 0x2e, 0x0d, + 0x44, 0x7e, 0x49, 0x27, 0x98, 0xb2, 0x43, 0xdb, 0xb5, 0xe8, 0x06, 0xb5, 0x3c, 0xb7, 0x1d, 0xf2, + 0x5b, 0x9b, 0x32, 0x33, 0x73, 0xf8, 0x16, 0xd4, 0x38, 0x7d, 0xdf, 0xee, 0xc6, 0x41, 0xb8, 0xde, + 0x5a, 0x69, 0xc4, 0xad, 0x92, 0x86, 0xda, 0x2a, 0x49, 0x75, 0xd8, 0xa5, 0x11, 0x69, 0xf4, 0x2f, + 0x36, 0xd8, 0x0e, 0x33, 0xdd, 0xcc, 0xb0, 0x44, 0xc4, 0x76, 0xd6, 0x6d, 0x97, 0x17, 0x58, 0x4c, + 0x54, 0x3a, 0xc1, 0x0c, 0x62, 0xd3, 0x73, 0x1c, 0xef, 0xb1, 0xf4, 0x81, 0x98, 0x62, 0xbb, 0x7a, + 0x6e, 0x64, 0x3b, 0x5c, 0x7e, 0xec, 0x00, 0xe9, 0x04, 0xdf, 0x65, 0x3b, 0x11, 0x0d, 0x78, 0x09, + 0x53, 0x33, 0x05, 0x95, 0x98, 0x5c, 0x3d, 0xee, 0x0b, 0x48, 0xdf, 0x8b, 0x8d, 0x73, 0x5e, 0x35, + 0xce, 0x61, 0x83, 0xdf, 0x97, 0xf3, 0x6e, 0xe6, 0xcd, 0x10, 0xda, 0xb7, 0xbd, 0x5e, 0xa8, 0xed, + 0x8f, 0x93, 0xb8, 0xa4, 0x47, 0x0c, 0xf6, 0x40, 0x8e, 0xc1, 0xfe, 0x1e, 0x41, 0x75, 0xdd, 0xeb, + 0x5c, 0x77, 0xa3, 0x60, 0xc0, 0x2b, 0x7b, 0xcf, 0x8d, 0xa8, 0x2b, 0xad, 0x42, 0x92, 0x4c, 0xd5, + 0x91, 0xdd, 0xa5, 0x1b, 0x11, 0xe9, 0xfa, 0xa2, 0x26, 0xd9, 0x91, 0xaa, 0x93, 0xcd, 0xec, 0xf8, + 0x0e, 0x09, 0x23, 0xee, 0xbd, 0x55, 0x93, 0x8f, 0x19, 0xd0, 0x64, 0xc1, 0x46, 0x14, 0x08, 0xd7, + 0xcd, 0xcc, 0xa9, 0x86, 0x34, 0x13, 0x63, 0x13, 0xa4, 0xb1, 0x01, 0x2f, 0x25, 0xa5, 0xec, 0x7d, + 0x1a, 0x74, 0x6d, 0x97, 0x14, 0xc7, 0xdb, 0x32, 0x5d, 0x98, 0x07, 0x19, 0x07, 0x62, 0xf5, 0xdf, + 0x43, 0xdb, 0x6d, 0x7b, 0x8f, 0x0b, 0x1c, 0xa1, 0x0c, 0xdb, 0xbf, 0x65, 0xfb, 0x2d, 0x0a, 0xdf, + 0xc4, 0x37, 0x6f, 0xc1, 0x3e, 0xe6, 0xc5, 0x7d, 0x2a, 0x7e, 0x10, 0x81, 0xc2, 0x18, 0xf7, 0x24, + 0x4f, 0x79, 0x98, 0xd9, 0x8d, 0x78, 0x1d, 0x0e, 0x90, 0x30, 0xb4, 0x3b, 0x2e, 0x6d, 0x4b, 0x5e, + 0x95, 0xd2, 0xbc, 0x86, 0xb7, 0xc6, 0xcf, 0x3e, 0xbe, 0x42, 0xdc, 0x9d, 0x24, 0x8d, 0x1f, 0x23, + 0x38, 0x9c, 0xcb, 0x24, 0xb1, 0x75, 0xa4, 0x84, 0x57, 0x1d, 0xaa, 0xa1, 0xb5, 0x45, 0xdb, 0x3d, + 0x87, 0xca, 0xbe, 0x86, 0xa4, 0xd9, 0x6f, 0xed, 0x5e, 0x7c, 0x93, 0x22, 0xbc, 0x27, 0x34, 0x3e, + 0x06, 0xd0, 0x25, 0x6e, 0x8f, 0x38, 0x1c, 0xc2, 0x34, 0x87, 0xa0, 0xcc, 0x18, 0x8b, 0xa0, 0xe7, + 0x99, 0x81, 0xe8, 0x24, 0xfc, 0x03, 0xc1, 0x7e, 0x19, 0x06, 0xc5, 0x1d, 0x2e, 0xc3, 0x01, 0x45, + 0x0d, 0x77, 0xd3, 0xeb, 0x1c, 0x9e, 0x9e, 0x10, 0xe2, 0xa4, 0x2d, 0x4c, 0x65, 0xbb, 0x97, 0xfd, + 0x4c, 0xff, 0xb1, 0x74, 0x1e, 0x42, 0x3b, 0xaa, 0xc4, 0x7e, 0x04, 0xda, 0x1d, 0xe2, 0x92, 0x0e, + 0x6d, 0x27, 0x87, 0x4b, 0x0c, 0xe9, 0x07, 0xea, 0x63, 0x79, 0xd7, 0x4f, 0xd3, 0xa4, 0x9c, 0xb1, + 0x37, 0x37, 0xe5, 0xc3, 0x3b, 0x80, 0xea, 0xba, 0xed, 0x6e, 0xb3, 0xf7, 0x1b, 0x3b, 0x57, 0x64, + 0x47, 0x8e, 0xd4, 0x61, 0x4c, 0xe0, 0x83, 0x30, 0xd5, 0x0b, 0x1c, 0x71, 0xcf, 0x6c, 0x88, 0x97, + 0xa0, 0xde, 0xa6, 0xa1, 0x15, 0xd8, 0xbe, 0xb8, 0x65, 0xde, 0xe8, 0x53, 0xa6, 0x98, 0xb6, 0x6d, + 0xcb, 0x73, 0xaf, 0x39, 0x24, 0x0c, 0x65, 0x62, 0x48, 0x26, 0x8c, 0x57, 0x61, 0x1f, 0x93, 0x99, + 0x1e, 0xf3, 0x5c, 0xf6, 0x98, 0x87, 0x33, 0xf0, 0x25, 0x3c, 0x89, 0xf8, 0x26, 0xbc, 0xc0, 0xf2, + 0xf1, 0x15, 0xdf, 0x17, 0x4c, 0x4a, 0x16, 0x23, 0x53, 0x43, 0x97, 0xde, 0xfa, 0xa9, 0x01, 0x58, + 0xb5, 0x79, 0x1a, 0xf4, 0x6d, 0x8b, 0xe2, 0x77, 0x11, 0x4c, 0x33, 0x01, 0xf8, 0xe8, 0x38, 0x17, + 0xe3, 0xb6, 0xa7, 0xef, 0xdd, 0x83, 0x8e, 0x49, 0x33, 0x16, 0xdf, 0xfa, 0xfb, 0xbf, 0xdf, 0xab, + 0x2c, 0xe0, 0x17, 0xf9, 0x67, 0x84, 0xfe, 0x45, 0xb5, 0xa5, 0x1f, 0xe2, 0xb7, 0x11, 0x60, 0x51, + 0x85, 0x28, 0xdd, 0x5d, 0x7c, 0x6e, 0x1c, 0xc4, 0x9c, 0x2e, 0xb0, 0x7e, 0x54, 0x89, 0xf6, 0x0d, + 0xcb, 0x0b, 0x28, 0x8b, 0xed, 0x7c, 0x01, 0x07, 0xb0, 0xc2, 0x01, 0x9c, 0xc4, 0x46, 0x1e, 0x80, + 0xe6, 0x13, 0xa6, 0xb7, 0xa7, 0x4d, 0x1a, 0xcb, 0xfd, 0x08, 0xc1, 0xcc, 0x43, 0x5e, 0x73, 0x4f, + 0x50, 0xd2, 0xc6, 0x9e, 0x29, 0x89, 0x8b, 0xe3, 0x68, 0x8d, 0x13, 0x1c, 0xe9, 0x51, 0x7c, 0x44, + 0x22, 0x0d, 0xa3, 0x80, 0x92, 0x6e, 0x06, 0xf0, 0x05, 0x84, 0x3f, 0x41, 0x30, 0x1b, 0xb7, 0x1b, + 0xf1, 0xa9, 0x71, 0x28, 0x33, 0xed, 0x48, 0x7d, 0xef, 0x7a, 0x77, 0xc6, 0x59, 0x8e, 0xf1, 0x84, + 0x91, 0x7b, 0x9d, 0x6b, 0x99, 0xce, 0xde, 0xfb, 0x08, 0xa6, 0x6e, 0xd2, 0x89, 0xf6, 0xb6, 0x87, + 0xe0, 0x46, 0x14, 0x98, 0x73, 0xd5, 0xf8, 0x63, 0x04, 0x2f, 0xdd, 0xa4, 0x51, 0x7e, 0xaa, 0xc3, + 0xcb, 0x93, 0xf3, 0x8f, 0x30, 0xbb, 0x73, 0x25, 0x56, 0x26, 0x31, 0xbe, 0xc9, 0x91, 0x9d, 0xc5, + 0x67, 0x8a, 0x8c, 0x30, 0x1c, 0xb8, 0xd6, 0x63, 0x81, 0xe3, 0xcf, 0x08, 0x0e, 0x0e, 0x7f, 0x6b, + 0xc1, 0xd9, 0xe4, 0x98, 0xfb, 0x29, 0x46, 0xbf, 0xbb, 0xdb, 0x58, 0x9a, 0x65, 0x6a, 0x5c, 0xe1, + 0xc8, 0x5f, 0xc1, 0x2f, 0x17, 0x21, 0x97, 0x4d, 0xca, 0xb0, 0xf9, 0x44, 0x0e, 0x9f, 0xf2, 0x8f, + 0x7f, 0x1c, 0xf6, 0x5b, 0x08, 0xe6, 0x6f, 0xd2, 0xe8, 0x4e, 0xd2, 0xa3, 0x3b, 0x55, 0xaa, 0x87, + 0xaf, 0x2f, 0x36, 0x94, 0x6f, 0x74, 0xf2, 0xa7, 0x44, 0xa5, 0xab, 0x1c, 0xd8, 0x19, 0x7c, 0xaa, + 0x08, 0x58, 0xda, 0x17, 0xfc, 0x08, 0xc1, 0x61, 0x15, 0x44, 0xfa, 0x85, 0xe3, 0x2b, 0x3b, 0xfb, + 0xa2, 0x20, 0xbe, 0x4b, 0x4c, 0x40, 0xd7, 0xe2, 0xe8, 0xce, 0x1b, 0xf9, 0x17, 0xde, 0x1d, 0x41, + 0xb1, 0x86, 0x56, 0x96, 0x11, 0xfe, 0x03, 0x82, 0xd9, 0xb8, 0x09, 0x37, 0x5e, 0x47, 0x99, 0x5e, + 0xfd, 0x5e, 0x7a, 0xcf, 0x75, 0x0e, 0xf9, 0xeb, 0xfa, 0x85, 0x7c, 0x85, 0xaa, 0xfb, 0xe5, 0xd5, + 0x36, 0xb8, 0x96, 0xb3, 0x6e, 0xff, 0x1b, 0x04, 0x90, 0x36, 0x12, 0xf1, 0xd9, 0xe2, 0x73, 0x28, + 0xcd, 0x46, 0x7d, 0x6f, 0x5b, 0x89, 0x46, 0x83, 0x9f, 0x67, 0x59, 0x5f, 0x2a, 0xf4, 0x39, 0x9f, + 0x5a, 0x6b, 0x71, 0xd3, 0xf1, 0x97, 0x08, 0x66, 0x78, 0x9f, 0x08, 0x9f, 0x1c, 0x87, 0x59, 0x6d, + 0x23, 0xed, 0xa5, 0xea, 0x4f, 0x73, 0xa8, 0x4b, 0xad, 0xa2, 0xc0, 0xb5, 0x86, 0x56, 0x70, 0x1f, + 0x66, 0xe3, 0x9e, 0xcd, 0x78, 0xf3, 0xc8, 0xf4, 0x74, 0xf4, 0xa5, 0x82, 0x44, 0x1a, 0x1b, 0xaa, + 0x88, 0x99, 0x2b, 0x93, 0x62, 0xe6, 0x34, 0x0b, 0x6b, 0xf8, 0x44, 0x51, 0xd0, 0xfb, 0x0c, 0x14, + 0x73, 0x8e, 0xa3, 0x3b, 0x65, 0x2c, 0x4d, 0x8a, 0x9b, 0x4c, 0x3b, 0x3f, 0x47, 0x70, 0x70, 0xb8, + 0xe4, 0xc4, 0x47, 0x86, 0x62, 0xa6, 0x5a, 0x67, 0xeb, 0x59, 0x2d, 0x8e, 0x2b, 0x57, 0x8d, 0x6f, + 0x70, 0x14, 0x6b, 0xf8, 0xf2, 0x44, 0xcf, 0xb8, 0x2b, 0xa3, 0x0e, 0x63, 0xb4, 0x9a, 0x7e, 0xb3, + 0xf8, 0x2d, 0x82, 0x79, 0xc9, 0xf7, 0x7e, 0x40, 0x69, 0x31, 0xac, 0xbd, 0x73, 0x04, 0x26, 0xcb, + 0x78, 0x95, 0xc3, 0xff, 0x2a, 0xbe, 0x54, 0x12, 0xbe, 0x84, 0xbd, 0x1a, 0x31, 0xa4, 0x7f, 0x44, + 0x70, 0xe8, 0x61, 0x6c, 0xf7, 0x9f, 0x13, 0xfe, 0x6b, 0x1c, 0xff, 0xd7, 0xf0, 0x2b, 0x05, 0x75, + 0xd1, 0xa4, 0x63, 0x5c, 0x40, 0xf8, 0xd7, 0x08, 0xaa, 0xb2, 0x03, 0x8f, 0xcf, 0x8c, 0x75, 0x8c, + 0x6c, 0x8f, 0x7e, 0x2f, 0x8d, 0x59, 0x14, 0x01, 0xc6, 0xc9, 0xc2, 0x54, 0x2a, 0xe4, 0x33, 0x83, + 0x7e, 0x1f, 0x01, 0x4e, 0xde, 0x8b, 0xc9, 0x0b, 0x12, 0x9f, 0xce, 0x88, 0x1a, 0xdb, 0x60, 0xd0, + 0xcf, 0x4c, 0x5c, 0x97, 0x4d, 0xa5, 0x2b, 0x85, 0xa9, 0xd4, 0x4b, 0xe4, 0xbf, 0x83, 0xa0, 0x7e, + 0x93, 0x26, 0x35, 0x7b, 0x81, 0x2e, 0xb3, 0x9f, 0x16, 0xf4, 0xe5, 0xc9, 0x0b, 0x05, 0xa2, 0xf3, + 0x1c, 0xd1, 0x69, 0x5c, 0xac, 0x2a, 0x09, 0xe0, 0x43, 0x04, 0xfb, 0xee, 0xa9, 0x26, 0x8a, 0xcf, + 0x4f, 0x92, 0x94, 0x89, 0xe4, 0xe5, 0x71, 0x7d, 0x99, 0xe3, 0x5a, 0x35, 0x4a, 0xe1, 0x5a, 0x13, + 0xfd, 0xfb, 0x5f, 0xa0, 0xf8, 0x69, 0x37, 0xd4, 0x7d, 0xfd, 0x7f, 0xf5, 0x56, 0xd0, 0xc4, 0x35, + 0x2e, 0x71, 0x7c, 0x0d, 0x7c, 0xbe, 0x0c, 0xbe, 0xa6, 0x68, 0xc9, 0xe2, 0x0f, 0x10, 0x1c, 0xe2, + 0xfd, 0x6f, 0x95, 0xf1, 0x50, 0x8a, 0x19, 0xd7, 0x2d, 0x2f, 0x91, 0x62, 0x44, 0xfc, 0x31, 0x76, + 0x04, 0x6a, 0x4d, 0xf6, 0xb6, 0x7f, 0x86, 0x60, 0xbf, 0x4c, 0x6a, 0xe2, 0x76, 0x57, 0x27, 0x29, + 0x6e, 0xa7, 0x49, 0x50, 0x98, 0xdb, 0x4a, 0x39, 0x73, 0xfb, 0x04, 0xc1, 0x9c, 0xe8, 0x3d, 0x17, + 0x94, 0x0a, 0x4a, 0x73, 0x5a, 0x1f, 0x7a, 0xf9, 0x8b, 0xa6, 0xa6, 0xf1, 0x3d, 0x2e, 0xf6, 0x01, + 0x6e, 0x16, 0x89, 0xf5, 0xbd, 0x76, 0xd8, 0x7c, 0x22, 0x3a, 0x8a, 0x4f, 0x9b, 0x8e, 0xd7, 0x09, + 0xdf, 0x30, 0x70, 0x61, 0x42, 0x64, 0x6b, 0x2e, 0x20, 0x1c, 0x41, 0x8d, 0x19, 0x07, 0x6f, 0x27, + 0xe0, 0xa5, 0xa1, 0xe6, 0xc3, 0x48, 0xa7, 0x41, 0xd7, 0x47, 0xda, 0x13, 0x69, 0x06, 0x14, 0xcf, + 0x3e, 0x7c, 0xbc, 0x50, 0x2c, 0x17, 0xf4, 0x36, 0x82, 0x43, 0xaa, 0xb5, 0xc7, 0xe2, 0x4b, 0xdb, + 0x7a, 0x11, 0x0a, 0x51, 0x54, 0xe3, 0x95, 0x52, 0x86, 0xc4, 0xe1, 0x5c, 0xbd, 0xf1, 0xa7, 0x67, + 0xc7, 0xd0, 0x5f, 0x9f, 0x1d, 0x43, 0xff, 0x7a, 0x76, 0x0c, 0xbd, 0x71, 0xb9, 0xdc, 0x1f, 0x0f, + 0x2d, 0xc7, 0xa6, 0x6e, 0xa4, 0xb2, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x83, 0x0c, 0x3f, + 0x61, 0x5e, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6190,15 +6182,6 @@ func (m *ListAppLinksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - if m.Project == nil { - return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("project") - } else { - i -= len(*m.Project) - copy(dAtA[i:], *m.Project) - i = encodeVarintApplication(dAtA, i, uint64(len(*m.Project))) - i-- - dAtA[i] = 0x12 - } if m.Name == nil { return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") } else { @@ -7216,10 +7199,6 @@ func (m *ListAppLinksRequest) Size() (n int) { l = len(*m.Name) n += 1 + l + sovApplication(uint64(l)) } - if m.Project != nil { - l = len(*m.Project) - n += 1 + l + sovApplication(uint64(l)) - } if m.Namespace != nil { l = len(*m.Namespace) n += 1 + l + sovApplication(uint64(l)) @@ -13664,40 +13643,6 @@ func (m *ListAppLinksRequest) Unmarshal(dAtA []byte) error { m.Name = &s iNdEx = postIndex hasFields[0] |= uint64(0x00000001) - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Project = &s - iNdEx = postIndex - hasFields[0] |= uint64(0x00000002) case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) @@ -13750,9 +13695,6 @@ func (m *ListAppLinksRequest) Unmarshal(dAtA []byte) error { if hasFields[0]&uint64(0x00000001) == 0 { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") } - if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("project") - } if iNdEx > l { return io.ErrUnexpectedEOF diff --git a/server/application/application.go b/server/application/application.go index 6bf02f98b1e28..b56db0941733e 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -1896,33 +1896,21 @@ func (s *Server) Rollback(ctx context.Context, rollbackReq *application.Applicat func (s *Server) ListLinks(ctx context.Context, req *application.ListAppLinksRequest) (*application.LinksResponse, error) { appName := req.GetName() appNs := s.appNamespaceOrDefault(req.GetNamespace()) - appProject := req.GetProject() - - if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplications, rbacpolicy.ActionGet, getRBACName(s.ns, appNs, appName, appProject)); err != nil { - log.WithFields(map[string]interface{}{ - "application": appName, - "ns": appNs, - "project": appProject, - }).Warnf("unauthorized access to app, error=%v", err.Error()) - return nil, fmt.Errorf("error getting application") - } a, err := s.appclientset.ArgoprojV1alpha1().Applications(appNs).Get(ctx, appName, metav1.GetOptions{}) if err != nil { log.WithFields(map[string]interface{}{ "application": appName, "ns": appNs, - "project": appProject, }).Errorf("failed to get application, error=%v", err.Error()) return nil, fmt.Errorf("error getting application") } - if a.Spec.GetProject() != req.GetProject() { + if err := s.enf.EnforceErr(ctx.Value("claims"), rbacpolicy.ResourceApplications, rbacpolicy.ActionGet, a.RBACName(s.ns)); err != nil { log.WithFields(map[string]interface{}{ - "application": a.Name, + "application": appName, "ns": appNs, - "project": appProject, - }).Warnf("unauthorized access to app, app project %v does not match requested project %v", a.Spec.GetProject(), appProject) + }).Warnf("unauthorized access to app, error=%v", err.Error()) return nil, fmt.Errorf("error getting application") } @@ -2365,11 +2353,3 @@ func (s *Server) isNamespaceEnabled(namespace string) bool { func namespaceNotPermittedError(namespace string) error { return fmt.Errorf("namespace '%s' is not permitted", namespace) } - -func getRBACName(defaultNS, appNamespace, appName, projectName string) string { - if defaultNS != "" && appNamespace != defaultNS && appNamespace != "" { - return fmt.Sprintf("%s/%s/%s", projectName, appNamespace, appName) - } else { - return fmt.Sprintf("%s/%s", projectName, appName) - } -} diff --git a/server/application/application.proto b/server/application/application.proto index 7d3cc9c35b29f..4fb08a7082c0f 100644 --- a/server/application/application.proto +++ b/server/application/application.proto @@ -277,7 +277,6 @@ message LinksResponse { message ListAppLinksRequest { required string name = 1; - required string project = 2; optional string namespace = 3; } From bcd1c3570349d7122c5983386ac2524040728172 Mon Sep 17 00:00:00 2001 From: Soumya Ghosh Dastidar Date: Tue, 6 Dec 2022 22:08:29 +0530 Subject: [PATCH 4/4] feat: update sample config Signed-off-by: Soumya Ghosh Dastidar --- docs/operator-manual/argocd-cm.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/operator-manual/argocd-cm.yaml b/docs/operator-manual/argocd-cm.yaml index cc7145231a98a..851738380aec8 100644 --- a/docs/operator-manual/argocd-cm.yaml +++ b/docs/operator-manual/argocd-cm.yaml @@ -315,9 +315,11 @@ data: icon.class: "fa-book" # sample application level links application.links: | + # pkg.go.dev/text/template is used for evaluating url templates - url: https://mycompany.splunk.com?search={{.spec.destination.namespace}} title: Splunk # conditionally show link e.g. for specific project + # github.com/antonmedv/expr is used for evaluation of conditions - url: https://mycompany.splunk.com?search={{.spec.destination.namespace}} title: Splunk if: spec.project == "default"