diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index de55a843..68e39bd3 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -135,7 +135,6 @@ jobs: cd plugin-template-go && make build && cp plugin-template-go ../ptg && cd .. export SHA256SUM=$(sha256sum ptg | awk '{print $1}') cat < gatewayd_plugins.yaml - compatibilityPolicy: "strict" metricsMergerPeriod: 1s healthCheckPeriod: 1s reloadOnCrash: true diff --git a/api/api_helpers_test.go b/api/api_helpers_test.go index 381cb55c..c84fb631 100644 --- a/api/api_helpers_test.go +++ b/api/api_helpers_test.go @@ -27,10 +27,9 @@ func getAPIConfig(httpAddr, grpcAddr string) *API { Actions: act.BuiltinActions(), DefaultPolicyName: config.DefaultPolicy, }), - DevMode: true, - Logger: logger, - Compatibility: config.DefaultCompatibilityPolicy, - StartTimeout: config.DefaultPluginStartTimeout, + DevMode: true, + Logger: logger, + StartTimeout: config.DefaultPluginStartTimeout, }, ) defaultProxy := network.NewProxy( diff --git a/api/api_test.go b/api/api_test.go index 378030da..5bee86d1 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -137,10 +137,9 @@ func TestGetPlugins(t *testing.T) { pluginRegistry := plugin.NewRegistry( context.Background(), plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: zerolog.Logger{}, - DevMode: true, + ActRegistry: actRegistry, + Logger: zerolog.Logger{}, + DevMode: true, }, ) pluginRegistry.Add(&plugin.Plugin{ @@ -192,10 +191,9 @@ func TestGetPluginsWithEmptyPluginRegistry(t *testing.T) { pluginRegistry := plugin.NewRegistry( context.Background(), plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: zerolog.Logger{}, - DevMode: true, + ActRegistry: actRegistry, + Logger: zerolog.Logger{}, + DevMode: true, }, ) @@ -332,10 +330,9 @@ func TestGetServers(t *testing.T) { pluginRegistry := plugin.NewRegistry( context.Background(), plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: zerolog.Logger{}, - DevMode: true, + ActRegistry: actRegistry, + Logger: zerolog.Logger{}, + DevMode: true, }, ) diff --git a/api/healthcheck_test.go b/api/healthcheck_test.go index d304b14f..024f657a 100644 --- a/api/healthcheck_test.go +++ b/api/healthcheck_test.go @@ -57,10 +57,9 @@ func Test_Healthchecker(t *testing.T) { pluginRegistry := plugin.NewRegistry( context.Background(), plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: zerolog.Logger{}, - DevMode: true, + ActRegistry: actRegistry, + Logger: zerolog.Logger{}, + DevMode: true, }, ) diff --git a/api/v1/api.pb.go b/api/v1/api.pb.go index b65bb55a..c2d80c91 100644 --- a/api/v1/api.pb.go +++ b/api/v1/api.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.2 +// protoc-gen-go v1.36.1 // protoc (unknown) // source: api/v1/api.proto @@ -26,14 +26,13 @@ const ( // VersionResponse is the response returned by the Version RPC. type VersionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Version is the version of the GatewayD. Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` // VersionInfo is the detailed version info of the GatewayD. - VersionInfo string `protobuf:"bytes,2,opt,name=version_info,json=versionInfo,proto3" json:"version_info,omitempty"` + VersionInfo string `protobuf:"bytes,2,opt,name=version_info,json=versionInfo,proto3" json:"version_info,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *VersionResponse) Reset() { @@ -82,10 +81,7 @@ func (x *VersionResponse) GetVersionInfo() string { // PluginID is the identifier that uniquely identifies the plugin. type PluginID struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Name is the name of the plugin. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Version is the version of the plugin. @@ -93,7 +89,9 @@ type PluginID struct { // RemoteURL is the remote URL of the plugin. RemoteUrl string `protobuf:"bytes,3,opt,name=remote_url,json=remoteUrl,proto3" json:"remote_url,omitempty"` // Checksum is the checksum of the plugin. - Checksum string `protobuf:"bytes,4,opt,name=checksum,proto3" json:"checksum,omitempty"` + Checksum string `protobuf:"bytes,4,opt,name=checksum,proto3" json:"checksum,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PluginID) Reset() { @@ -156,10 +154,7 @@ func (x *PluginID) GetChecksum() string { // PluginConfig is the configuration of the plugin. type PluginConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // ID is the identifier that uniquely identifies the plugin. Id *PluginID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Description is the description of the plugin. @@ -171,15 +166,17 @@ type PluginConfig struct { // ProjectURL is the project URL of the plugin. ProjectUrl string `protobuf:"bytes,5,opt,name=project_url,json=projectUrl,proto3" json:"project_url,omitempty"` // Config is the internal and external configuration of the plugin. - Config map[string]string `protobuf:"bytes,6,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Config map[string]string `protobuf:"bytes,6,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Hooks is the list of hooks the plugin attaches to. Hooks []int32 `protobuf:"varint,7,rep,packed,name=hooks,proto3" json:"hooks,omitempty"` // Requires is the list of plugins the plugin depends on. - Requires map[string]string `protobuf:"bytes,8,rep,name=requires,proto3" json:"requires,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Requires map[string]string `protobuf:"bytes,8,rep,name=requires,proto3" json:"requires,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Tags is the list of tags of the plugin. Tags []string `protobuf:"bytes,9,rep,name=tags,proto3" json:"tags,omitempty"` // Categories is the list of categories of the plugin. - Categories []string `protobuf:"bytes,10,rep,name=categories,proto3" json:"categories,omitempty"` + Categories []string `protobuf:"bytes,10,rep,name=categories,proto3" json:"categories,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PluginConfig) Reset() { @@ -284,12 +281,11 @@ func (x *PluginConfig) GetCategories() []string { // PluginConfigs is the list of plugin configurations. type PluginConfigs struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Configs is the list of plugin configurations. - Configs []*PluginConfig `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty"` + Configs []*PluginConfig `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PluginConfigs) Reset() { @@ -331,12 +327,11 @@ func (x *PluginConfigs) GetConfigs() []*PluginConfig { // Group is the object group to filter the global config by. type Group struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // GroupName is the name of the group. - GroupName *string `protobuf:"bytes,1,opt,name=group_name,json=groupName,proto3,oneof" json:"group_name,omitempty"` + GroupName *string `protobuf:"bytes,1,opt,name=group_name,json=groupName,proto3,oneof" json:"group_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Group) Reset() { @@ -574,7 +569,7 @@ var file_api_v1_api_proto_rawDesc = []byte{ 0x6e, 0x66, 0x69, 0x67, 0x20, 0x62, 0x79, 0x2e, 0x32, 0x17, 0x7b, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x7d, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x32, 0x90, 0x26, 0x0a, 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x41, 0x64, 0x6d, + 0x32, 0xf1, 0x25, 0x0a, 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x50, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xde, 0x02, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, @@ -680,223 +675,221 @@ var file_api_v1_api_proto_rawDesc = []byte{ 0x30, 0x30, 0x30, 0x30, 0x30, 0x7d, 0x7d, 0x7d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0xcc, 0x07, 0x0a, 0x0f, 0x47, 0x65, + 0x62, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0xad, 0x07, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x87, - 0x07, 0x92, 0x41, 0xd2, 0x06, 0x2a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0xbe, 0x06, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0xb6, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0xe8, + 0x06, 0x92, 0x41, 0xb3, 0x06, 0x2a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x9f, 0x06, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0x97, 0x06, 0x0a, 0x44, 0x41, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x12, 0x1b, 0x0a, 0x19, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x22, 0xd0, 0x05, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0xbb, 0x05, 0x7b, 0x22, 0x63, 0x6f, - 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x22, 0x3a, 0x22, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x2c, 0x22, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x72, - 0x22, 0x3a, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x22, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x3a, 0x22, 0x35, 0x73, 0x22, 0x2c, - 0x22, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x72, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x22, 0x3a, 0x22, 0x35, 0x73, 0x22, 0x2c, 0x22, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x61, 0x72, 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x22, - 0x2d, 0x2d, 0x6c, 0x6f, 0x67, 0x2d, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x64, 0x65, - 0x62, 0x75, 0x67, 0x22, 0x5d, 0x2c, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x22, - 0x3a, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, - 0x3a, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x22, 0x65, 0x6e, 0x76, 0x22, 0x3a, 0x5b, 0x22, 0x4d, 0x41, - 0x47, 0x49, 0x43, 0x5f, 0x43, 0x4f, 0x4f, 0x4b, 0x49, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x3d, 0x2e, - 0x2e, 0x2e, 0x22, 0x2c, 0x22, 0x4d, 0x41, 0x47, 0x49, 0x43, 0x5f, 0x43, 0x4f, 0x4f, 0x4b, 0x49, - 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x3d, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x22, 0x52, 0x45, - 0x44, 0x49, 0x53, 0x5f, 0x55, 0x52, 0x4c, 0x3d, 0x72, 0x65, 0x64, 0x69, 0x73, 0x3a, 0x2f, 0x2f, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x36, 0x33, 0x37, 0x39, 0x2f, 0x30, - 0x22, 0x2c, 0x22, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x3d, 0x31, 0x68, 0x22, 0x2c, 0x22, 0x4d, - 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x3d, 0x54, - 0x72, 0x75, 0x65, 0x22, 0x2c, 0x22, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x55, 0x4e, - 0x49, 0x58, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x43, 0x4b, 0x45, 0x54, - 0x3d, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6f, 0x63, 0x6b, - 0x22, 0x2c, 0x22, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x3d, - 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x2c, 0x22, 0x50, 0x45, 0x52, 0x49, 0x4f, - 0x44, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, - 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x3d, 0x54, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x22, 0x50, - 0x45, 0x52, 0x49, 0x4f, 0x44, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, - 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x3d, 0x31, 0x6d, 0x22, - 0x2c, 0x22, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x44, 0x45, 0x4c, - 0x41, 0x59, 0x3d, 0x31, 0x6d, 0x22, 0x2c, 0x22, 0x41, 0x50, 0x49, 0x5f, 0x41, 0x44, 0x44, 0x52, - 0x45, 0x53, 0x53, 0x3d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x31, 0x38, - 0x30, 0x38, 0x30, 0x22, 0x2c, 0x22, 0x45, 0x58, 0x49, 0x54, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, 0x54, - 0x41, 0x52, 0x54, 0x55, 0x50, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3d, 0x46, 0x61, 0x6c, 0x73, - 0x65, 0x22, 0x2c, 0x22, 0x53, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x44, 0x53, 0x4e, 0x3d, 0x2e, - 0x2e, 0x2e, 0x22, 0x5d, 0x2c, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x22, - 0x3a, 0x22, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x72, 0x75, 0x63, 0x74, 0x22, 0xb1, 0x05, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0x9c, 0x05, 0x7b, 0x22, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, + 0x72, 0x22, 0x3a, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x22, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x3a, 0x22, 0x35, 0x73, 0x22, + 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x72, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x3a, 0x22, 0x35, 0x73, 0x22, 0x2c, 0x22, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x61, 0x72, 0x67, 0x73, 0x22, 0x3a, 0x5b, + 0x22, 0x2d, 0x2d, 0x6c, 0x6f, 0x67, 0x2d, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x2c, 0x22, 0x64, + 0x65, 0x62, 0x75, 0x67, 0x22, 0x5d, 0x2c, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, + 0x22, 0x3a, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x22, 0x3a, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x22, 0x65, 0x6e, 0x76, 0x22, 0x3a, 0x5b, 0x22, 0x4d, + 0x41, 0x47, 0x49, 0x43, 0x5f, 0x43, 0x4f, 0x4f, 0x4b, 0x49, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x3d, + 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x22, 0x4d, 0x41, 0x47, 0x49, 0x43, 0x5f, 0x43, 0x4f, 0x4f, 0x4b, + 0x49, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x3d, 0x2e, 0x2e, 0x2e, 0x22, 0x2c, 0x22, 0x52, + 0x45, 0x44, 0x49, 0x53, 0x5f, 0x55, 0x52, 0x4c, 0x3d, 0x72, 0x65, 0x64, 0x69, 0x73, 0x3a, 0x2f, + 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x36, 0x33, 0x37, 0x39, 0x2f, + 0x30, 0x22, 0x2c, 0x22, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x3d, 0x31, 0x68, 0x22, 0x2c, 0x22, + 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x3d, + 0x54, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x22, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x55, + 0x4e, 0x49, 0x58, 0x5f, 0x44, 0x4f, 0x4d, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x43, 0x4b, 0x45, + 0x54, 0x3d, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x6f, 0x63, + 0x6b, 0x22, 0x2c, 0x22, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x50, 0x41, 0x54, 0x48, + 0x3d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x2c, 0x22, 0x50, 0x45, 0x52, 0x49, + 0x4f, 0x44, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, + 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x3d, 0x54, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x22, + 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x3d, 0x31, 0x6d, + 0x22, 0x2c, 0x22, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x44, 0x45, + 0x4c, 0x41, 0x59, 0x3d, 0x31, 0x6d, 0x22, 0x2c, 0x22, 0x41, 0x50, 0x49, 0x5f, 0x41, 0x44, 0x44, + 0x52, 0x45, 0x53, 0x53, 0x3d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x31, + 0x38, 0x30, 0x38, 0x30, 0x22, 0x2c, 0x22, 0x45, 0x58, 0x49, 0x54, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, + 0x54, 0x41, 0x52, 0x54, 0x55, 0x50, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3d, 0x46, 0x61, 0x6c, + 0x73, 0x65, 0x22, 0x2c, 0x22, 0x53, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x44, 0x53, 0x4e, 0x3d, + 0x2e, 0x2e, 0x2e, 0x22, 0x5d, 0x2c, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x22, 0x3a, 0x22, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x64, 0x2d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x22, 0x2c, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, - 0x2c, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x64, 0x2d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x7d, - 0x5d, 0x2c, 0x22, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x6e, 0x43, 0x72, 0x61, 0x73, 0x68, - 0x22, 0x3a, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, - 0x3a, 0x22, 0x33, 0x30, 0x73, 0x22, 0x7d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, - 0x76, 0x31, 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x50, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0xea, 0x07, 0x0a, 0x0a, 0x47, 0x65, 0x74, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0xac, 0x07, 0x92, 0x41, 0xfc, 0x06, 0x2a, 0x0a, 0x47, - 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x4a, 0xed, 0x06, 0x0a, 0x03, 0x32, 0x30, - 0x30, 0x12, 0xe5, 0x06, 0x0a, 0x3f, 0x41, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x12, 0x19, 0x0a, 0x17, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, - 0x22, 0x86, 0x06, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0xf1, 0x05, 0x7b, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x7b, 0x22, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x3a, 0x22, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2c, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x22, 0x2c, 0x22, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x22, 0x3a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x69, 0x6f, 0x2f, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2c, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, - 0x22, 0x3a, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, - 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x67, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x22, 0x2c, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x5b, 0x22, 0x2e, - 0x2e, 0x2e, 0x22, 0x5d, 0x2c, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x22, - 0x41, 0x47, 0x50, 0x4c, 0x2d, 0x33, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x55, 0x72, 0x6c, 0x22, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, - 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2c, 0x22, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x70, 0x69, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x22, 0x3a, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, - 0x31, 0x38, 0x30, 0x38, 0x30, 0x22, 0x2c, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x44, - 0x42, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x69, 0x74, 0x4f, - 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x3a, 0x22, - 0x46, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x22, 0x3a, - 0x22, 0x31, 0x68, 0x22, 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x22, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x3a, 0x22, - 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x55, 0x6e, 0x69, 0x78, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x22, 0x3a, 0x22, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x64, 0x2d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, - 0x73, 0x6f, 0x63, 0x6b, 0x22, 0x2c, 0x22, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x49, - 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x22, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x69, 0x63, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x3a, 0x22, 0x31, 0x6d, 0x22, 0x2c, 0x22, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x3a, 0x22, 0x31, 0x6d, - 0x22, 0x2c, 0x22, 0x72, 0x65, 0x64, 0x69, 0x73, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x22, 0x72, 0x65, - 0x64, 0x69, 0x73, 0x3a, 0x2f, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, - 0x36, 0x33, 0x37, 0x39, 0x2f, 0x30, 0x22, 0x2c, 0x22, 0x73, 0x63, 0x61, 0x6e, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0x3a, 0x22, 0x31, 0x30, 0x30, 0x30, 0x22, 0x7d, 0x2c, 0x22, 0x68, 0x6f, 0x6f, - 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x31, 0x34, 0x2c, 0x31, 0x36, 0x2c, 0x31, 0x38, 0x5d, 0x2c, 0x22, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x2c, 0x22, 0x74, 0x61, - 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, - 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x7d, 0x5d, 0x7d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, - 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x93, 0x02, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, - 0x6c, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x22, 0xd5, 0x01, 0x92, 0x41, 0xa7, 0x01, 0x2a, 0x08, 0x47, 0x65, 0x74, 0x50, - 0x6f, 0x6f, 0x6c, 0x73, 0x4a, 0x9a, 0x01, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0x92, 0x01, 0x0a, - 0x3d, 0x41, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, - 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x65, - 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x12, 0x1b, - 0x0a, 0x19, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x34, 0x0a, 0x10, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, - 0x20, 0x7b, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x63, 0x61, - 0x70, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x31, 0x30, 0x7d, - 0x7d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x44, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0xe1, 0x03, 0x0a, 0x0a, - 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0xa1, 0x03, 0x92, 0x41, - 0xf1, 0x02, 0x2a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x4a, 0xe2, - 0x02, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0xda, 0x02, 0x0a, 0x3f, 0x41, 0x20, 0x4a, 0x53, 0x4f, - 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x69, - 0x65, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x12, 0x1b, 0x0a, 0x19, 0x1a, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0xf9, 0x01, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0xe4, 0x01, 0x7b, - 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x3a, 0x5b, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, - 0x2e, 0x31, 0x3a, 0x35, 0x30, 0x39, 0x39, 0x32, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x30, 0x39, 0x35, 0x36, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, - 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x31, 0x30, 0x30, 0x36, 0x22, 0x2c, 0x22, 0x31, - 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x30, 0x39, 0x37, 0x32, 0x22, 0x2c, - 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x31, 0x30, 0x30, 0x32, - 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x30, 0x39, - 0x38, 0x30, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, - 0x30, 0x39, 0x33, 0x30, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, - 0x3a, 0x35, 0x30, 0x39, 0x34, 0x36, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, - 0x2e, 0x31, 0x3a, 0x35, 0x30, 0x39, 0x39, 0x36, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x31, 0x30, 0x32, 0x32, 0x22, 0x5d, 0x2c, 0x22, 0x62, 0x75, - 0x73, 0x79, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x31, - 0x30, 0x7d, 0x7d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x12, - 0xd7, 0x02, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, - 0x97, 0x02, 0x92, 0x41, 0xe7, 0x01, 0x2a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x73, 0x4a, 0xd8, 0x01, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0xd0, 0x01, 0x0a, 0x3f, 0x41, - 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x65, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x12, 0x1b, - 0x0a, 0x19, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x70, 0x0a, 0x10, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, - 0x5c, 0x7b, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x22, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, - 0x31, 0x35, 0x34, 0x33, 0x32, 0x22, 0x2c, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, - 0x3a, 0x22, 0x74, 0x63, 0x70, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3a, - 0x30, 0x2c, 0x22, 0x74, 0x69, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, - 0x3a, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x7d, 0x7d, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x44, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, - 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x1a, 0x58, 0x92, 0x41, 0x55, 0x12, 0x23, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, - 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x20, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x1a, 0x2e, 0x12, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x64, - 0x6f, 0x63, 0x73, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2e, 0x69, 0x6f, 0x2f, - 0x75, 0x73, 0x69, 0x6e, 0x67, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2f, 0x41, - 0x50, 0x49, 0x2f, 0x42, 0x8b, 0x02, 0x92, 0x41, 0xdf, 0x01, 0x12, 0xc7, 0x01, 0x0a, 0x12, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x41, 0x50, - 0x49, 0x22, 0x45, 0x0a, 0x08, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x12, 0x27, 0x68, - 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x1a, 0x10, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x64, 0x2e, 0x69, 0x6f, 0x2a, 0x63, 0x0a, 0x26, 0x47, 0x4e, 0x55, 0x20, - 0x41, 0x66, 0x66, 0x65, 0x72, 0x6f, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x76, 0x33, - 0x2e, 0x30, 0x12, 0x39, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x7d, 0x5d, 0x2c, 0x22, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x6e, 0x43, 0x72, 0x61, 0x73, + 0x68, 0x22, 0x3a, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x22, 0x3a, 0x22, 0x33, 0x30, 0x73, 0x22, 0x7d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, + 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0xea, 0x07, 0x0a, 0x0a, 0x47, 0x65, + 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0xac, 0x07, 0x92, 0x41, 0xfc, 0x06, 0x2a, 0x0a, + 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x4a, 0xed, 0x06, 0x0a, 0x03, 0x32, + 0x30, 0x30, 0x12, 0xe5, 0x06, 0x0a, 0x3f, 0x41, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x12, 0x19, 0x0a, 0x17, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x22, 0x86, 0x06, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0xf1, 0x05, 0x7b, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x7b, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x22, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2c, 0x22, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x22, 0x2c, 0x22, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x22, 0x3a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x69, 0x6f, + 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2c, 0x22, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, + 0x6d, 0x22, 0x3a, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x7d, 0x2c, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x44, 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x22, 0x2c, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x5b, 0x22, + 0x2e, 0x2e, 0x2e, 0x22, 0x5d, 0x2c, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x22, 0x3a, + 0x22, 0x41, 0x47, 0x50, 0x4c, 0x2d, 0x33, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x55, 0x72, 0x6c, 0x22, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, + 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, + 0x2d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x22, 0x2c, 0x22, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x70, 0x69, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, + 0x3a, 0x31, 0x38, 0x30, 0x38, 0x30, 0x22, 0x2c, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x44, 0x42, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x69, 0x74, + 0x4f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x3a, + 0x22, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x22, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x22, + 0x3a, 0x22, 0x31, 0x68, 0x22, 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x22, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x22, 0x3a, + 0x22, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x2c, 0x22, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x55, 0x6e, 0x69, 0x78, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x22, 0x3a, 0x22, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x64, 0x2d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x22, 0x2c, 0x22, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, + 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x22, 0x3a, 0x22, 0x54, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x22, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x69, 0x63, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x3a, 0x22, 0x31, 0x6d, 0x22, 0x2c, 0x22, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x69, 0x63, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x3a, 0x22, 0x31, + 0x6d, 0x22, 0x2c, 0x22, 0x72, 0x65, 0x64, 0x69, 0x73, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x22, 0x72, + 0x65, 0x64, 0x69, 0x73, 0x3a, 0x2f, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, + 0x3a, 0x36, 0x33, 0x37, 0x39, 0x2f, 0x30, 0x22, 0x2c, 0x22, 0x73, 0x63, 0x61, 0x6e, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x22, 0x31, 0x30, 0x30, 0x30, 0x22, 0x7d, 0x2c, 0x22, 0x68, 0x6f, + 0x6f, 0x6b, 0x73, 0x22, 0x3a, 0x5b, 0x31, 0x34, 0x2c, 0x31, 0x36, 0x2c, 0x31, 0x38, 0x5d, 0x2c, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x2c, 0x22, 0x74, + 0x61, 0x67, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x5d, 0x7d, 0x5d, 0x7d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, + 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x50, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x93, 0x02, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x6f, + 0x6f, 0x6c, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x22, 0xd5, 0x01, 0x92, 0x41, 0xa7, 0x01, 0x2a, 0x08, 0x47, 0x65, 0x74, + 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x4a, 0x9a, 0x01, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0x92, 0x01, + 0x0a, 0x3d, 0x41, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, + 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x12, + 0x1b, 0x0a, 0x19, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x34, 0x0a, 0x10, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x12, 0x20, 0x7b, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x63, + 0x61, 0x70, 0x22, 0x3a, 0x31, 0x30, 0x2c, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x31, 0x30, + 0x7d, 0x7d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0xe1, 0x03, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0xa1, 0x03, 0x92, + 0x41, 0xf1, 0x02, 0x2a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x4a, + 0xe2, 0x02, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0xda, 0x02, 0x0a, 0x3f, 0x41, 0x20, 0x4a, 0x53, + 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, + 0x69, 0x65, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x12, 0x1b, 0x0a, 0x19, 0x1a, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0xf9, 0x01, 0x0a, 0x10, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x12, 0xe4, 0x01, + 0x7b, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x3a, 0x5b, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, + 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x30, 0x39, 0x39, 0x32, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, + 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x30, 0x39, 0x35, 0x36, 0x22, 0x2c, 0x22, 0x31, 0x32, + 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x31, 0x30, 0x30, 0x36, 0x22, 0x2c, 0x22, + 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x30, 0x39, 0x37, 0x32, 0x22, + 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x31, 0x30, 0x30, + 0x32, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x30, + 0x39, 0x38, 0x30, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, + 0x35, 0x30, 0x39, 0x33, 0x30, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, + 0x31, 0x3a, 0x35, 0x30, 0x39, 0x34, 0x36, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, + 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x30, 0x39, 0x39, 0x36, 0x22, 0x2c, 0x22, 0x31, 0x32, 0x37, 0x2e, + 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x35, 0x31, 0x30, 0x32, 0x32, 0x22, 0x5d, 0x2c, 0x22, 0x62, + 0x75, 0x73, 0x79, 0x22, 0x3a, 0x5b, 0x5d, 0x2c, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, + 0x31, 0x30, 0x7d, 0x7d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, + 0x12, 0xd7, 0x02, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x22, 0x97, 0x02, 0x92, 0x41, 0xe7, 0x01, 0x2a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x73, 0x4a, 0xd8, 0x01, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0xd0, 0x01, 0x0a, 0x3f, + 0x41, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x12, + 0x1b, 0x0a, 0x19, 0x1a, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x70, 0x0a, 0x10, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x12, 0x5c, 0x7b, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3a, 0x22, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, + 0x3a, 0x31, 0x35, 0x34, 0x33, 0x32, 0x22, 0x2c, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x22, 0x3a, 0x22, 0x74, 0x63, 0x70, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x3a, 0x30, 0x2c, 0x22, 0x74, 0x69, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x22, 0x3a, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x7d, 0x7d, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x44, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, + 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x1a, 0x58, 0x92, 0x41, 0x55, 0x12, + 0x23, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x69, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x50, 0x49, 0x20, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x1a, 0x2e, 0x12, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, + 0x64, 0x6f, 0x63, 0x73, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2e, 0x69, 0x6f, + 0x2f, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2f, + 0x41, 0x50, 0x49, 0x2f, 0x42, 0x8b, 0x02, 0x92, 0x41, 0xdf, 0x01, 0x12, 0xc7, 0x01, 0x0a, 0x12, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x41, + 0x50, 0x49, 0x22, 0x45, 0x0a, 0x08, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x44, 0x12, 0x27, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x1a, 0x10, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2e, 0x69, 0x6f, 0x2a, 0x63, 0x0a, 0x26, 0x47, 0x4e, 0x55, + 0x20, 0x41, 0x66, 0x66, 0x65, 0x72, 0x6f, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x76, + 0x33, 0x2e, 0x30, 0x12, 0x39, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, + 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2f, 0x62, 0x6c, 0x6f, + 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x05, + 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x2a, 0x01, 0x01, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, - 0x69, 0x6f, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2f, 0x62, 0x6c, 0x6f, 0x62, - 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x05, 0x31, - 0x2e, 0x30, 0x2e, 0x30, 0x2a, 0x01, 0x01, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2d, 0x69, - 0x6f, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/v1/api.proto b/api/v1/api.proto index 2505dfcf..fde72c3e 100644 --- a/api/v1/api.proto +++ b/api/v1/api.proto @@ -87,7 +87,7 @@ service GatewayDAdminAPIService { }, examples: { key: "application/json" - value: '{"compatibilityPolicy":"strict","enableMetricsMerger":true,"healthCheckPeriod":"5s","metricsMergerPeriod":"5s","plugins":[{"args":["--log-level","debug"],"checksum":"...","enabled":true,"env":["MAGIC_COOKIE_KEY=...","MAGIC_COOKIE_VALUE=...","REDIS_URL=redis://localhost:6379/0","EXPIRY=1h","METRICS_ENABLED=True","METRICS_UNIX_DOMAIN_SOCKET=/tmp/gatewayd-plugin-cache.sock","METRICS_PATH=/metrics","PERIODIC_INVALIDATOR_ENABLED=True","PERIODIC_INVALIDATOR_INTERVAL=1m","PERIODIC_INVALIDATOR_START_DELAY=1m","API_ADDRESS=localhost:18080","EXIT_ON_STARTUP_ERROR=False","SENTRY_DSN=..."],"localPath":"plugins/gatewayd-plugin-cache","name":"gatewayd-plugin-cache"}],"reloadOnCrash":true,"timeout":"30s"}' + value: '{"enableMetricsMerger":true,"healthCheckPeriod":"5s","metricsMergerPeriod":"5s","plugins":[{"args":["--log-level","debug"],"checksum":"...","enabled":true,"env":["MAGIC_COOKIE_KEY=...","MAGIC_COOKIE_VALUE=...","REDIS_URL=redis://localhost:6379/0","EXPIRY=1h","METRICS_ENABLED=True","METRICS_UNIX_DOMAIN_SOCKET=/tmp/gatewayd-plugin-cache.sock","METRICS_PATH=/metrics","PERIODIC_INVALIDATOR_ENABLED=True","PERIODIC_INVALIDATOR_INTERVAL=1m","PERIODIC_INVALIDATOR_START_DELAY=1m","API_ADDRESS=localhost:18080","EXIT_ON_STARTUP_ERROR=False","SENTRY_DSN=..."],"localPath":"plugins/gatewayd-plugin-cache","name":"gatewayd-plugin-cache"}],"reloadOnCrash":true,"timeout":"30s"}' } }; }; diff --git a/api/v1/api.swagger.json b/api/v1/api.swagger.json index e7d6213b..c1e5868e 100644 --- a/api/v1/api.swagger.json +++ b/api/v1/api.swagger.json @@ -151,7 +151,6 @@ }, "examples": { "application/json": { - "compatibilityPolicy": "strict", "enableMetricsMerger": true, "healthCheckPeriod": "5s", "metricsMergerPeriod": "5s", @@ -417,7 +416,7 @@ "NULL_VALUE" ], "default": "NULL_VALUE", - "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\nThe JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." + "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." }, "protobufStruct": { "type": "object", diff --git a/cmd/gatewayd_app.go b/cmd/gatewayd_app.go index 2286a607..206e3b93 100644 --- a/cmd/gatewayd_app.go +++ b/cmd/gatewayd_app.go @@ -234,14 +234,8 @@ func (app *GatewayDApp) createPluginRegistry(runCtx context.Context, logger zero runCtx, plugin.Registry{ ActRegistry: app.actRegistry, - Compatibility: config.If( - config.Exists( - config.CompatibilityPolicies, app.conf.Plugin.CompatibilityPolicy, - ), - config.CompatibilityPolicies[app.conf.Plugin.CompatibilityPolicy], - config.DefaultCompatibilityPolicy), - Logger: logger, - DevMode: app.DevMode, + Logger: logger, + DevMode: app.DevMode, }, ) } diff --git a/config/config.go b/config/config.go index 6c57ae95..29f8c820 100644 --- a/config/config.go +++ b/config/config.go @@ -270,7 +270,6 @@ func (c *Config) LoadDefaults(ctx context.Context) *gerr.GatewayDError { } c.pluginDefaults = PluginConfig{ - CompatibilityPolicy: string(Strict), EnableMetricsMerger: true, MetricsMergerPeriod: DefaultMetricsMergerPeriod, HealthCheckPeriod: DefaultPluginHealthCheckPeriod, diff --git a/config/constants.go b/config/constants.go index 6107e16f..afa1096a 100644 --- a/config/constants.go +++ b/config/constants.go @@ -5,9 +5,8 @@ import ( ) type ( - Status uint - CompatibilityPolicy string - LogOutput uint + Status uint + LogOutput uint ) // Status is the status of the server. @@ -16,12 +15,6 @@ const ( Stopped ) -// CompatibilityPolicy is the compatibility policy for plugins. -const ( - Strict CompatibilityPolicy = "strict" // Expect all required plugins to be loaded and present - Loose CompatibilityPolicy = "loose" // Load the plugin, even if the requirements are not met -) - // LogOutput is the output type for the logger. const ( Console LogOutput = iota @@ -117,9 +110,6 @@ const ( DefaultGRPCAPIAddress = "localhost:19090" // Policies. - DefaultCompatibilityPolicy = Strict - - // Act. DefaultPolicy = "passthrough" DefaultPolicyTimeout = 30 * time.Second DefaultActionTimeout = 30 * time.Second diff --git a/config/getters.go b/config/getters.go index 02d1cb7f..b84c1555 100644 --- a/config/getters.go +++ b/config/getters.go @@ -9,10 +9,6 @@ import ( ) var ( - CompatibilityPolicies = map[string]CompatibilityPolicy{ - "strict": Strict, - "loose": Loose, - } logOutputs = map[string]LogOutput{ "console": Console, "stdout": Stdout, diff --git a/config/types.go b/config/types.go index 351a6e16..5c91adb4 100644 --- a/config/types.go +++ b/config/types.go @@ -22,7 +22,6 @@ type Policy struct { } type PluginConfig struct { - CompatibilityPolicy string `json:"compatibilityPolicy" jsonschema:"enum=strict,enum=loose"` EnableMetricsMerger bool `json:"enableMetricsMerger"` MetricsMergerPeriod time.Duration `json:"metricsMergerPeriod" jsonschema:"oneof_type=string;integer"` HealthCheckPeriod time.Duration `json:"healthCheckPeriod" jsonschema:"oneof_type=string;integer"` diff --git a/gatewayd_plugins.yaml b/gatewayd_plugins.yaml index 0ddccb02..34fa39e3 100644 --- a/gatewayd_plugins.yaml +++ b/gatewayd_plugins.yaml @@ -1,14 +1,5 @@ # GatewayD Plugin Configuration -# The compatibility policy controls how GatewayD treats plugins' requirements. If a plugin -# requires a specific version of another plugin, the compatibility policy controls whether to -# allow or reject the plugin. -# - "strict" (default): the plugin is rejected if it requires a specific version of another -# plugin and that version is not the one currently loaded. -# - "loose": the plugin is allowed to run even if it requires a specific version of another -# plugin and that version is not the one currently loaded. -compatibilityPolicy: "strict" - # The metrics policy controls whether to collect and merge metrics from plugins or not. # The Prometheus metrics are collected from the plugins via a Unix domain socket. The metrics # are merged and exposed via the GatewayD metrics endpoint via HTTP. diff --git a/network/proxy_test.go b/network/proxy_test.go index 4c205f80..fdb3e900 100644 --- a/network/proxy_test.go +++ b/network/proxy_test.go @@ -67,9 +67,8 @@ func TestNewProxy(t *testing.T) { PluginRegistry: plugin.NewRegistry( context.Background(), plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: logger, + ActRegistry: actRegistry, + Logger: logger, }, ), HealthCheckPeriod: config.DefaultHealthCheckPeriod, @@ -124,9 +123,8 @@ func BenchmarkNewProxy(b *testing.B) { PluginRegistry: plugin.NewRegistry( context.Background(), plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: logger, + ActRegistry: actRegistry, + Logger: logger, }, ), HealthCheckPeriod: config.DefaultHealthCheckPeriod, @@ -182,9 +180,8 @@ func BenchmarkProxyConnectDisconnect(b *testing.B) { PluginRegistry: plugin.NewRegistry( context.Background(), plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: logger, + ActRegistry: actRegistry, + Logger: logger, }, ), HealthCheckPeriod: config.DefaultHealthCheckPeriod, @@ -248,9 +245,8 @@ func BenchmarkProxyPassThrough(b *testing.B) { PluginRegistry: plugin.NewRegistry( context.Background(), plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: logger, + ActRegistry: actRegistry, + Logger: logger, }, ), HealthCheckPeriod: config.DefaultHealthCheckPeriod, @@ -319,9 +315,8 @@ func BenchmarkProxyIsHealthyAndIsExhausted(b *testing.B) { PluginRegistry: plugin.NewRegistry( context.Background(), plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: logger, + ActRegistry: actRegistry, + Logger: logger, }, ), HealthCheckPeriod: config.DefaultHealthCheckPeriod, @@ -388,9 +383,8 @@ func BenchmarkProxyAvailableAndBusyConnectionsString(b *testing.B) { PluginRegistry: plugin.NewRegistry( context.Background(), plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: logger, + ActRegistry: actRegistry, + Logger: logger, }, ), HealthCheckPeriod: config.DefaultHealthCheckPeriod, diff --git a/network/server_test.go b/network/server_test.go index fcb65de4..7ccf1c4d 100644 --- a/network/server_test.go +++ b/network/server_test.go @@ -54,9 +54,8 @@ func TestRunServer(t *testing.T) { pluginRegistry := plugin.NewRegistry( ctx, plugin.Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: logger, + ActRegistry: actRegistry, + Logger: logger, }) pluginRegistry.AddHook(v1.HookName_HOOK_NAME_ON_TRAFFIC_FROM_CLIENT, 1, onIncomingTraffic) diff --git a/plugin/.template/project/{{ plugin_name }}/gatewayd_plugin.yaml b/plugin/.template/project/{{ plugin_name }}/gatewayd_plugin.yaml index d95aee9b..2dc3518d 100644 --- a/plugin/.template/project/{{ plugin_name }}/gatewayd_plugin.yaml +++ b/plugin/.template/project/{{ plugin_name }}/gatewayd_plugin.yaml @@ -1,6 +1,5 @@ # Plugin configuration file for GatewayD -compatibilityPolicy: "strict" enableMetricsMerger: True metricsMergerPeriod: 5s healthCheckPeriod: 5s diff --git a/plugin/plugin_registry.go b/plugin/plugin_registry.go index 0586dc48..d8980e15 100644 --- a/plugin/plugin_registry.go +++ b/plugin/plugin_registry.go @@ -63,9 +63,8 @@ type Registry struct { ctx context.Context //nolint:containedctx DevMode bool - Logger zerolog.Logger - Compatibility config.CompatibilityPolicy - StartTimeout time.Duration + Logger zerolog.Logger + StartTimeout time.Duration } var _ IRegistry = (*Registry)(nil) @@ -79,13 +78,12 @@ func NewRegistry( defer span.End() return &Registry{ - plugins: pool.NewPool(regCtx, config.EmptyPoolCapacity), - hooks: map[v1.HookName]map[sdkPlugin.Priority]sdkPlugin.Method{}, - ActRegistry: registry.ActRegistry, - ctx: regCtx, - DevMode: registry.DevMode, - Logger: registry.Logger, - Compatibility: registry.Compatibility, + plugins: pool.NewPool(regCtx, config.EmptyPoolCapacity), + hooks: map[v1.HookName]map[sdkPlugin.Priority]sdkPlugin.Method{}, + ActRegistry: registry.ActRegistry, + ctx: regCtx, + DevMode: registry.DevMode, + Logger: registry.Logger, } } @@ -144,6 +142,11 @@ func (reg *Registry) Exists(name, version, remoteURL string) bool { for _, plugin := range reg.List() { if plugin.Name == name && plugin.RemoteURL == remoteURL { + // If the version is the same, the plugin exists. + if version == plugin.Version { + return true + } + // Parse the supplied version and the version in the registry. suppliedVer, err := semver.NewVersion(version) if err != nil { @@ -162,7 +165,7 @@ func (reg *Registry) Exists(name, version, remoteURL string) bool { // Check if the version of the plugin is less than or equal to // the version in the registry. // TODO: Should we check the major version only, or as well? - if suppliedVer.LessThan(registryVer) || suppliedVer.Equal(registryVer) { + if suppliedVer.LessThanEqual(registryVer) { return true } @@ -559,19 +562,7 @@ func (reg *Registry) LoadPlugins( "requirement": req.Name, }, ).Msg("The plugin requirement is not met, so it won't work properly") - if reg.Compatibility == config.Strict { - reg.Logger.Debug().Str("name", plugin.ID.Name).Msg( - "Registry is in strict compatibility mode, so the plugin won't be loaded") - plugin.Stop() // Stop the plugin. - continue - } - reg.Logger.Debug().Fields( - map[string]any{ - "name": plugin.ID.Name, - "requirement": req.Name, - }, - ).Msg("Registry is in loose compatibility mode, " + - "so the plugin will be loaded anyway") + plugin.Stop() // Stop the plugin. } } diff --git a/plugin/plugin_registry_test.go b/plugin/plugin_registry_test.go index 67996b60..d4e3fbd3 100644 --- a/plugin/plugin_registry_test.go +++ b/plugin/plugin_registry_test.go @@ -39,9 +39,8 @@ func NewPluginRegistry(t *testing.T) *Registry { reg := NewRegistry( context.Background(), Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: logger, + ActRegistry: actRegistry, + Logger: logger, }) return reg } @@ -157,9 +156,8 @@ func BenchmarkHookRun(b *testing.B) { reg := NewRegistry( context.Background(), Registry{ - ActRegistry: actRegistry, - Compatibility: config.Loose, - Logger: logger, + ActRegistry: actRegistry, + Logger: logger, }) hookFunction := func( _ context.Context, args *v1.Struct, _ ...grpc.CallOption, diff --git a/raft/proto/raft.pb.go b/raft/proto/raft.pb.go index 52561624..0674f060 100644 --- a/raft/proto/raft.pb.go +++ b/raft/proto/raft.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.2 +// protoc-gen-go v1.36.1 // protoc (unknown) // source: raft/proto/raft.proto @@ -22,12 +22,11 @@ const ( ) type ForwardApplyRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + TimeoutMs int64 `protobuf:"varint,2,opt,name=timeout_ms,json=timeoutMs,proto3" json:"timeout_ms,omitempty"` unknownFields protoimpl.UnknownFields - - Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` - TimeoutMs int64 `protobuf:"varint,2,opt,name=timeout_ms,json=timeoutMs,proto3" json:"timeout_ms,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ForwardApplyRequest) Reset() { @@ -75,12 +74,11 @@ func (x *ForwardApplyRequest) GetTimeoutMs() int64 { } type ForwardApplyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` unknownFields protoimpl.UnknownFields - - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ForwardApplyResponse) Reset() {