mirror of
https://gitee.com/milvus-io/milvus.git
synced 2025-12-06 17:18:35 +08:00
enhance: support manifest-based index building with Loon FFI reader (#45726)
This PR adds support for reading data from StorageV2 using manifest files and the Loon FFI interface during index building, providing an alternative to the traditional segment insert files approach. Key changes: Core C++ changes: - Add SEGMENT_MANIFEST_KEY and LOON_FFI_PROPERTIES_KEY constants for manifest handling - Extend FileManagerContext to carry loon_ffi_properties for FFI operations - Update index_c.cpp to pass manifest and loon properties to file managers for all index types (vector, JSON key, text) - Implement GetFieldDatasFromManifest() in Util.cpp using Arrow C Stream interface: * Create Arrow schema from field metadata * Initialize FFI reader with manifest content and storage properties * Import record batches from C data interface * Convert to FieldData for index building - Update DiskFileManagerImpl and MemFileManagerImpl to support manifest-based data reading with fallback to traditional paths Loon FFI utilities (internal/core/src/storage/loon_ffi/): - Add ToCStorageConfig() to convert StorageConfig to C-compatible structure - Implement GetManifest() to parse manifest JSON and retrieve column groups via FFI - Enhance MakePropertiesFromStorageConfig() integration Storage V2 integration: - Update milvus-storage dependency from 0883026 to 302143c for latest FFI support Protobuf changes: - Add manifest field to BuildIndexInfo for passing manifest path to C++ layer Configuration: - Add common.storageV2.useLoonFFI config option (default: false) for feature toggle This change is part of issue #44956 to integrate the StorageV2 FFI interface as the unified storage layer. The implementation maintains backward compatibility by checking for manifest presence and falling back to existing segment insert files approach when manifest is not provided. Related issue: #44956 --------- Signed-off-by: Congqi Xia <congqi.xia@zilliz.com>
This commit is contained in:
parent
4b14ab14e3
commit
3f8c146831
@ -117,6 +117,8 @@ const std::string DIM_KEY = "dim";
|
||||
const std::string DATA_TYPE_KEY = "data_type";
|
||||
const std::string ELEMENT_TYPE_KEY = "element_type";
|
||||
const std::string INDEX_NUM_ROWS_KEY = "index_num_rows";
|
||||
const std::string SEGMENT_MANIFEST_KEY = "segment_manifest";
|
||||
const std::string LOON_FFI_PROPERTIES_KEY = "loon_ffi_properties";
|
||||
|
||||
// storage version
|
||||
const int64_t STORAGE_V1 = 1;
|
||||
|
||||
@ -17,6 +17,7 @@
|
||||
#include "indexbuilder/type_c.h"
|
||||
#include "log/Log.h"
|
||||
#include "storage/PluginLoader.h"
|
||||
#include "storage/loon_ffi/util.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#include <malloc.h>
|
||||
@ -177,6 +178,7 @@ get_config(std::unique_ptr<milvus::proto::indexcgo::BuildIndexInfo>& info) {
|
||||
if (info->storage_version() == STORAGE_V2) {
|
||||
config[SEGMENT_INSERT_FILES_KEY] =
|
||||
get_segment_insert_files(info->segment_insert_files());
|
||||
config[SEGMENT_MANIFEST_KEY] = info->manifest();
|
||||
}
|
||||
config[DIM_KEY] = info->dim();
|
||||
config[DATA_TYPE_KEY] = info->field_schema().data_type();
|
||||
@ -251,6 +253,11 @@ CreateIndex(CIndex* res_index,
|
||||
|
||||
milvus::storage::FileManagerContext fileManagerContext(
|
||||
field_meta, index_meta, chunk_manager, fs);
|
||||
if (build_index_info->manifest() != "") {
|
||||
auto loon_properties = MakeInternalPropertiesFromStorageConfig(
|
||||
ToCStorageConfig(storage_config));
|
||||
fileManagerContext.set_loon_ffi_properties(loon_properties);
|
||||
}
|
||||
|
||||
if (build_index_info->has_storage_plugin_context()) {
|
||||
auto cipherPlugin =
|
||||
@ -314,6 +321,9 @@ BuildJsonKeyIndex(ProtoLayoutInterface result,
|
||||
get_storage_config(build_index_info->storage_config());
|
||||
auto config = get_config(build_index_info);
|
||||
|
||||
auto loon_properties =
|
||||
MakePropertiesFromStorageConfig(ToCStorageConfig(storage_config));
|
||||
|
||||
// init file manager
|
||||
milvus::storage::FieldDataMeta field_meta{
|
||||
build_index_info->collectionid(),
|
||||
@ -350,6 +360,12 @@ BuildJsonKeyIndex(ProtoLayoutInterface result,
|
||||
milvus::storage::FileManagerContext fileManagerContext(
|
||||
field_meta, index_meta, chunk_manager, fs);
|
||||
|
||||
if (build_index_info->manifest() != "") {
|
||||
auto loon_properties = MakeInternalPropertiesFromStorageConfig(
|
||||
ToCStorageConfig(storage_config));
|
||||
fileManagerContext.set_loon_ffi_properties(loon_properties);
|
||||
}
|
||||
|
||||
if (build_index_info->has_storage_plugin_context()) {
|
||||
auto cipherPlugin =
|
||||
milvus::storage::PluginLoader::GetInstance().getCipherPlugin();
|
||||
@ -435,6 +451,12 @@ BuildTextIndex(ProtoLayoutInterface result,
|
||||
milvus::storage::FileManagerContext fileManagerContext(
|
||||
field_meta, index_meta, chunk_manager, fs);
|
||||
|
||||
if (build_index_info->manifest() != "") {
|
||||
auto loon_properties = MakeInternalPropertiesFromStorageConfig(
|
||||
ToCStorageConfig(storage_config));
|
||||
fileManagerContext.set_loon_ffi_properties(loon_properties);
|
||||
}
|
||||
|
||||
if (build_index_info->has_storage_plugin_context()) {
|
||||
auto cipherPlugin =
|
||||
milvus::storage::PluginLoader::GetInstance().getCipherPlugin();
|
||||
|
||||
@ -59,6 +59,7 @@ DiskFileManagerImpl::DiskFileManagerImpl(
|
||||
rcm_ = fileManagerContext.chunkManagerPtr;
|
||||
fs_ = fileManagerContext.fs;
|
||||
plugin_context_ = fileManagerContext.plugin_context;
|
||||
loon_ffi_properties_ = fileManagerContext.loon_ffi_properties;
|
||||
}
|
||||
|
||||
DiskFileManagerImpl::~DiskFileManagerImpl() {
|
||||
@ -652,12 +653,28 @@ DiskFileManagerImpl::cache_raw_data_to_disk_storage_v2(const Config& config) {
|
||||
uint32_t var_dim = 0;
|
||||
int64_t write_offset = sizeof(num_rows) + sizeof(var_dim);
|
||||
|
||||
auto field_datas = GetFieldDatasFromStorageV2(all_remote_files,
|
||||
std::vector<FieldDataPtr> field_datas;
|
||||
auto manifest =
|
||||
index::GetValueFromConfig<std::string>(config, SEGMENT_MANIFEST_KEY);
|
||||
auto manifest_path_str = manifest.value_or("");
|
||||
if (manifest_path_str != "") {
|
||||
AssertInfo(
|
||||
loon_ffi_properties_ != nullptr,
|
||||
"loon ffi properties is null when build index with manifest");
|
||||
field_datas = GetFieldDatasFromManifest(manifest_path_str,
|
||||
loon_ffi_properties_,
|
||||
field_meta_,
|
||||
data_type,
|
||||
dim,
|
||||
element_type);
|
||||
} else {
|
||||
field_datas = GetFieldDatasFromStorageV2(all_remote_files,
|
||||
GetFieldDataMeta().field_id,
|
||||
data_type.value(),
|
||||
element_type.value(),
|
||||
dim,
|
||||
fs_);
|
||||
}
|
||||
for (auto& field_data : field_datas) {
|
||||
num_rows += uint32_t(field_data->get_num_rows());
|
||||
cache_raw_data_to_disk_common<T>(field_data,
|
||||
|
||||
@ -72,7 +72,8 @@ struct FileManagerContext {
|
||||
* @param properties Shared pointer to Properties object
|
||||
*/
|
||||
void
|
||||
set_loon_ffi_properties(std::shared_ptr<Properties> properties) {
|
||||
set_loon_ffi_properties(
|
||||
std::shared_ptr<milvus_storage::api::Properties> properties) {
|
||||
loon_ffi_properties = std::move(properties);
|
||||
}
|
||||
|
||||
@ -82,7 +83,7 @@ struct FileManagerContext {
|
||||
milvus_storage::ArrowFileSystemPtr fs;
|
||||
bool for_loading_index{false};
|
||||
std::shared_ptr<CPluginContext> plugin_context;
|
||||
std::shared_ptr<Properties> loon_ffi_properties;
|
||||
std::shared_ptr<milvus_storage::api::Properties> loon_ffi_properties;
|
||||
};
|
||||
|
||||
#define FILEMANAGER_TRY try {
|
||||
@ -223,7 +224,7 @@ class FileManagerImpl : public milvus::FileManager {
|
||||
IndexMeta index_meta_;
|
||||
ChunkManagerPtr rcm_;
|
||||
milvus_storage::ArrowFileSystemPtr fs_;
|
||||
std::shared_ptr<Properties> loon_ffi_properties_;
|
||||
std::shared_ptr<milvus_storage::api::Properties> loon_ffi_properties_;
|
||||
std::shared_ptr<CPluginContext> plugin_context_;
|
||||
};
|
||||
|
||||
|
||||
@ -16,15 +16,21 @@
|
||||
|
||||
#include "storage/MemFileManagerImpl.h"
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
|
||||
#include <arrow/c/bridge.h>
|
||||
#include "common/Common.h"
|
||||
#include "common/Consts.h"
|
||||
#include "common/FieldData.h"
|
||||
#include "common/Types.h"
|
||||
#include "log/Log.h"
|
||||
#include "storage/Util.h"
|
||||
#include "storage/FileManager.h"
|
||||
#include "storage/loon_ffi/ffi_reader_c.h"
|
||||
#include "index/Utils.h"
|
||||
#include "milvus-storage/ffi_c.h"
|
||||
#include "util.h"
|
||||
|
||||
namespace milvus::storage {
|
||||
|
||||
@ -34,6 +40,7 @@ MemFileManagerImpl::MemFileManagerImpl(
|
||||
fileManagerContext.indexMeta) {
|
||||
rcm_ = fileManagerContext.chunkManagerPtr;
|
||||
fs_ = fileManagerContext.fs;
|
||||
loon_ffi_properties_ = fileManagerContext.loon_ffi_properties;
|
||||
plugin_context_ = fileManagerContext.plugin_context;
|
||||
}
|
||||
|
||||
@ -213,9 +220,25 @@ MemFileManagerImpl::cache_raw_data_to_memory_storage_v2(const Config& config) {
|
||||
auto segment_insert_files =
|
||||
index::GetValueFromConfig<std::vector<std::vector<std::string>>>(
|
||||
config, SEGMENT_INSERT_FILES_KEY);
|
||||
AssertInfo(segment_insert_files.has_value(),
|
||||
"[StorageV2] insert file paths for storage v2 is empty when "
|
||||
"build index");
|
||||
auto manifest =
|
||||
index::GetValueFromConfig<std::string>(config, SEGMENT_MANIFEST_KEY);
|
||||
AssertInfo(segment_insert_files.has_value() || manifest.has_value(),
|
||||
"[StorageV2] insert file paths and manifest for storage v2 is "
|
||||
"empty when build index");
|
||||
// use manifest file for storage v2
|
||||
auto manifest_path_str = manifest.value_or("");
|
||||
if (manifest_path_str != "") {
|
||||
AssertInfo(loon_ffi_properties_ != nullptr,
|
||||
"[StorageV2] loon ffi properties is null when build index "
|
||||
"with manifest");
|
||||
return GetFieldDatasFromManifest(manifest_path_str,
|
||||
loon_ffi_properties_,
|
||||
field_meta_,
|
||||
data_type,
|
||||
dim,
|
||||
element_type);
|
||||
}
|
||||
|
||||
auto remote_files = segment_insert_files.value();
|
||||
for (auto& files : remote_files) {
|
||||
SortByPath(files);
|
||||
|
||||
@ -19,6 +19,7 @@
|
||||
#include "arrow/array/builder_binary.h"
|
||||
#include "arrow/array/builder_nested.h"
|
||||
#include "arrow/array/builder_primitive.h"
|
||||
#include <arrow/c/bridge.h>
|
||||
#include "arrow/scalar.h"
|
||||
#include "arrow/type_fwd.h"
|
||||
#include "common/type_c.h"
|
||||
@ -58,8 +59,12 @@
|
||||
#include "storage/KeyRetriever.h"
|
||||
#include "segcore/memory_planner.h"
|
||||
#include "mmap/Types.h"
|
||||
#include "storage/loon_ffi/ffi_reader_c.h"
|
||||
#include "storage/loon_ffi/util.h"
|
||||
#include "milvus-storage/ffi_c.h"
|
||||
#include "milvus-storage/format/parquet/file_reader.h"
|
||||
#include "milvus-storage/filesystem/fs.h"
|
||||
#include "milvus-storage/reader.h"
|
||||
|
||||
namespace milvus::storage {
|
||||
|
||||
@ -1359,6 +1364,95 @@ GetFieldDatasFromStorageV2(std::vector<std::vector<std::string>>& remote_files,
|
||||
return field_data_list;
|
||||
}
|
||||
|
||||
std::vector<FieldDataPtr>
|
||||
GetFieldDatasFromManifest(
|
||||
const std::string& manifest_path,
|
||||
const std::shared_ptr<milvus_storage::api::Properties>& loon_ffi_properties,
|
||||
const FieldDataMeta& field_meta,
|
||||
std::optional<DataType> data_type,
|
||||
int64_t dim,
|
||||
std::optional<DataType> element_type) {
|
||||
auto column_groups = GetColumnGroups(manifest_path, loon_ffi_properties);
|
||||
|
||||
// ReaderHandle reader_handler = 0;
|
||||
|
||||
std::string field_id_str = std::to_string(field_meta.field_id);
|
||||
std::vector<std::string> needed_columns = {field_id_str};
|
||||
|
||||
// Create arrow schema from field meta
|
||||
std::shared_ptr<arrow::Schema> arrow_schema;
|
||||
bool nullable = field_meta.field_schema.nullable();
|
||||
|
||||
if (IsVectorDataType(data_type.value())) {
|
||||
if (data_type.value() == DataType::VECTOR_ARRAY) {
|
||||
arrow_schema = CreateArrowSchema(
|
||||
data_type.value(), static_cast<int>(dim), element_type.value());
|
||||
} else if (IsSparseFloatVectorDataType(data_type.value())) {
|
||||
arrow_schema = CreateArrowSchema(data_type.value(), nullable);
|
||||
} else {
|
||||
arrow_schema = CreateArrowSchema(
|
||||
data_type.value(), static_cast<int>(dim), nullable);
|
||||
}
|
||||
} else if (data_type.value() == DataType::ARRAY) {
|
||||
// For ARRAY types, we use binary representation
|
||||
// Element type information is encoded in the data itself
|
||||
arrow_schema = CreateArrowSchema(data_type.value(), nullable);
|
||||
} else {
|
||||
// For scalar types
|
||||
arrow_schema = CreateArrowSchema(data_type.value(), nullable);
|
||||
}
|
||||
|
||||
auto updated_schema = std::make_shared<arrow::Schema>(
|
||||
arrow::Schema({arrow_schema->field(0)->WithName(
|
||||
std::to_string((field_meta.field_id)))}));
|
||||
|
||||
auto reader = milvus_storage::api::Reader::create(
|
||||
column_groups,
|
||||
updated_schema,
|
||||
std::make_shared<std::vector<std::string>>(needed_columns),
|
||||
*loon_ffi_properties);
|
||||
|
||||
AssertInfo(reader != nullptr, "Failed to create reader");
|
||||
|
||||
// without predicate
|
||||
auto reader_result = reader->get_record_batch_reader("");
|
||||
AssertInfo(reader_result.ok(),
|
||||
"Failed to get record batch reader: " +
|
||||
reader_result.status().ToString());
|
||||
|
||||
auto record_batch_reader = reader_result.ValueOrDie();
|
||||
|
||||
// Read all record batches and convert to FieldDataPtr
|
||||
std::vector<FieldDataPtr> field_datas;
|
||||
while (true) {
|
||||
std::shared_ptr<arrow::RecordBatch> batch;
|
||||
auto status = record_batch_reader->ReadNext(&batch);
|
||||
AssertInfo(status.ok(),
|
||||
"Failed to read record batch: " + status.ToString());
|
||||
if (batch == nullptr) {
|
||||
break; // End of stream
|
||||
}
|
||||
|
||||
// Convert record batch to FieldData
|
||||
auto num_rows = batch->num_rows();
|
||||
if (num_rows == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto chunked_array =
|
||||
std::make_shared<arrow::ChunkedArray>(batch->column(0));
|
||||
auto field_data = CreateFieldData(data_type.value(),
|
||||
element_type.value(),
|
||||
batch->schema()->field(0)->nullable(),
|
||||
dim,
|
||||
num_rows);
|
||||
field_data->FillFieldData(chunked_array);
|
||||
field_datas.push_back(field_data);
|
||||
}
|
||||
|
||||
return field_datas;
|
||||
}
|
||||
|
||||
std::vector<FieldDataPtr>
|
||||
CacheRawDataAndFillMissing(const MemFileManagerImplPtr& file_manager,
|
||||
const Config& config) {
|
||||
|
||||
@ -189,6 +189,15 @@ GetFieldDatasFromStorageV2(std::vector<std::vector<std::string>>& remote_files,
|
||||
int64_t dim,
|
||||
milvus_storage::ArrowFileSystemPtr fs);
|
||||
|
||||
std::vector<FieldDataPtr>
|
||||
GetFieldDatasFromManifest(
|
||||
const std::string& manifest_path,
|
||||
const std::shared_ptr<milvus_storage::api::Properties>& loon_ffi_properties,
|
||||
const FieldDataMeta& field_meta,
|
||||
std::optional<DataType> data_type,
|
||||
int64_t dim,
|
||||
std::optional<DataType> element_type);
|
||||
|
||||
std::map<std::string, int64_t>
|
||||
PutIndexData(ChunkManager* remote_chunk_manager,
|
||||
const std::vector<const uint8_t*>& data_slices,
|
||||
|
||||
@ -101,6 +101,7 @@ message BuildIndexInfo {
|
||||
int64 json_stats_max_shredding_columns = 27;
|
||||
double json_stats_shredding_ratio_threshold = 28;
|
||||
int64 json_stats_write_batch_size = 29;
|
||||
string manifest = 30;
|
||||
}
|
||||
|
||||
message StoragePluginContext {
|
||||
|
||||
@ -691,6 +691,7 @@ type BuildIndexInfo struct {
|
||||
JsonStatsMaxShreddingColumns int64 `protobuf:"varint,27,opt,name=json_stats_max_shredding_columns,json=jsonStatsMaxShreddingColumns,proto3" json:"json_stats_max_shredding_columns,omitempty"`
|
||||
JsonStatsShreddingRatioThreshold float64 `protobuf:"fixed64,28,opt,name=json_stats_shredding_ratio_threshold,json=jsonStatsShreddingRatioThreshold,proto3" json:"json_stats_shredding_ratio_threshold,omitempty"`
|
||||
JsonStatsWriteBatchSize int64 `protobuf:"varint,29,opt,name=json_stats_write_batch_size,json=jsonStatsWriteBatchSize,proto3" json:"json_stats_write_batch_size,omitempty"`
|
||||
Manifest string `protobuf:"bytes,30,opt,name=manifest,proto3" json:"manifest,omitempty"`
|
||||
}
|
||||
|
||||
func (x *BuildIndexInfo) Reset() {
|
||||
@ -928,6 +929,13 @@ func (x *BuildIndexInfo) GetJsonStatsWriteBatchSize() int64 {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *BuildIndexInfo) GetManifest() string {
|
||||
if x != nil {
|
||||
return x.Manifest
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type StoragePluginContext struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
@ -1331,7 +1339,7 @@ var file_index_cgo_msg_proto_rawDesc = []byte{
|
||||
0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x50, 0x61, 0x74, 0x68,
|
||||
0x73, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70,
|
||||
0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
|
||||
0x54, 0x79, 0x70, 0x65, 0x22, 0xf8, 0x0b, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e,
|
||||
0x54, 0x79, 0x70, 0x65, 0x22, 0x94, 0x0c, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e,
|
||||
0x64, 0x65, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74,
|
||||
0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73,
|
||||
0x74, 0x65, 0x72, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44,
|
||||
@ -1426,71 +1434,73 @@ var file_index_cgo_msg_proto_rawDesc = []byte{
|
||||
0x64, 0x12, 0x3c, 0x0a, 0x1b, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f,
|
||||
0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65,
|
||||
0x18, 0x1d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x6a, 0x73, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74,
|
||||
0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x22,
|
||||
0x90, 0x01, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69,
|
||||
0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72,
|
||||
0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
|
||||
0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e,
|
||||
0x5a, 0x6f, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63,
|
||||
0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63,
|
||||
0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65,
|
||||
0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b,
|
||||
0x65, 0x79, 0x22, 0xff, 0x02, 0x0a, 0x11, 0x4c, 0x6f, 0x61, 0x64, 0x54, 0x65, 0x78, 0x74, 0x49,
|
||||
0x6e, 0x64, 0x65, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x69, 0x65, 0x6c,
|
||||
0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x46, 0x69, 0x65, 0x6c, 0x64,
|
||||
0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,
|
||||
0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07,
|
||||
0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x62,
|
||||
0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18,
|
||||
0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x06,
|
||||
0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d,
|
||||
0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68, 0x65,
|
||||
0x6d, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06,
|
||||
0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63,
|
||||
0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f,
|
||||
0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61,
|
||||
0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52,
|
||||
0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x46, 0x0a, 0x0d,
|
||||
0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20,
|
||||
0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f,
|
||||
0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x72,
|
||||
0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x69, 0x6f,
|
||||
0x72, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d,
|
||||
0x6d, 0x61, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c,
|
||||
0x65, 0x4d, 0x6d, 0x61, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x73,
|
||||
0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78,
|
||||
0x53, 0x69, 0x7a, 0x65, 0x22, 0xa6, 0x03, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x4a, 0x73, 0x6f,
|
||||
0x6e, 0x4b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a,
|
||||
0x07, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
|
||||
0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
|
||||
0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
|
||||
0x6e, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01,
|
||||
0x28, 0x03, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x66,
|
||||
0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65,
|
||||
0x73, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28,
|
||||
0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||
0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x63, 0x68,
|
||||
0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x63,
|
||||
0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28,
|
||||
0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12,
|
||||
0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x07,
|
||||
0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49,
|
||||
0x44, 0x12, 0x46, 0x0a, 0x0d, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69,
|
||||
0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75,
|
||||
0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c,
|
||||
0x6f, 0x61, 0x64, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x6c, 0x6f, 0x61,
|
||||
0x64, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x61,
|
||||
0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x6d, 0x61, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a,
|
||||
0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6d, 0x61, 0x70, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x6d,
|
||||
0x61, 0x70, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x0b, 0x6d, 0x6d, 0x61, 0x70, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d,
|
||||
0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, 0x01,
|
||||
0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x35, 0x5a,
|
||||
0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6c, 0x76,
|
||||
0x75, 0x73, 0x2d, 0x69, 0x6f, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2f, 0x70, 0x6b, 0x67,
|
||||
0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x63,
|
||||
0x67, 0x6f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x12,
|
||||
0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x90, 0x01, 0x0a, 0x14,
|
||||
0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e,
|
||||
0x74, 0x65, 0x78, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69,
|
||||
0x6f, 0x6e, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
|
||||
0x52, 0x10, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5a, 0x6f, 0x6e, 0x65,
|
||||
0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
|
||||
0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
|
||||
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x63, 0x72, 0x79,
|
||||
0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x22, 0xff,
|
||||
0x02, 0x0a, 0x11, 0x4c, 0x6f, 0x61, 0x64, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78,
|
||||
0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x18,
|
||||
0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x18,
|
||||
0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,
|
||||
0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c,
|
||||
0x64, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64,
|
||||
0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28,
|
||||
0x09, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65,
|
||||
0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75,
|
||||
0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x46,
|
||||
0x69, 0x65, 0x6c, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65,
|
||||
0x6d, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
|
||||
0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63,
|
||||
0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72,
|
||||
0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x46, 0x0a, 0x0d, 0x6c, 0x6f, 0x61, 0x64,
|
||||
0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32,
|
||||
0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63,
|
||||
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69,
|
||||
0x74, 0x79, 0x52, 0x0c, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79,
|
||||
0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x6d, 0x61, 0x70, 0x18,
|
||||
0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6d, 0x61,
|
||||
0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18,
|
||||
0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x69, 0x7a, 0x65,
|
||||
0x22, 0xa6, 0x03, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x4a, 0x73, 0x6f, 0x6e, 0x4b, 0x65, 0x79,
|
||||
0x49, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x69, 0x65,
|
||||
0x6c, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x46, 0x69, 0x65, 0x6c,
|
||||
0x64, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02,
|
||||
0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a,
|
||||
0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07,
|
||||
0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73,
|
||||
0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x38, 0x0a,
|
||||
0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e,
|
||||
0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x73, 0x63, 0x68,
|
||||
0x65, 0x6d, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52,
|
||||
0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
|
||||
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63,
|
||||
0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x70,
|
||||
0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03,
|
||||
0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x46, 0x0a,
|
||||
0x0d, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08,
|
||||
0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2e, 0x70, 0x72,
|
||||
0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x50,
|
||||
0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x69,
|
||||
0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f,
|
||||
0x6d, 0x6d, 0x61, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62,
|
||||
0x6c, 0x65, 0x4d, 0x6d, 0x61, 0x70, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x6d, 0x61, 0x70, 0x5f, 0x64,
|
||||
0x69, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d,
|
||||
0x6d, 0x61, 0x70, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74,
|
||||
0x61, 0x74, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
|
||||
0x73, 0x74, 0x61, 0x74, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74,
|
||||
0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2d, 0x69,
|
||||
0x6f, 0x2f, 0x6d, 0x69, 0x6c, 0x76, 0x75, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x76, 0x32, 0x2f,
|
||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x63, 0x67, 0x6f, 0x70, 0x62,
|
||||
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user