mirror of
				https://github.com/TeaOSLab/EdgeCommon.git
				synced 2025-11-04 13:10:24 +08:00 
			
		
		
		
	IP库加密/其他对IP库的改进
This commit is contained in:
		@@ -14418,7 +14418,7 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "name": "CreateIPLibraryFileRequest",
 | 
					      "name": "CreateIPLibraryFileRequest",
 | 
				
			||||||
      "code": "message CreateIPLibraryFileRequest {\n\tstring name = 1;\n\tstring template = 2;\n\trepeated string emptyValues = 3;\n\tint64 fileId = 4;\n\tbytes countriesJSON = 5;\n\tbytes provincesJSON = 6;\n\tbytes citiesJSON = 7;\n\tbytes townsJSON = 8;\n\tbytes providersJSON = 9;\n}",
 | 
					      "code": "message CreateIPLibraryFileRequest {\n\tstring name = 1;\n\tstring template = 2;\n\trepeated string emptyValues = 3;\n\tint64 fileId = 4;\n\tbytes countriesJSON = 5;\n\tbytes provincesJSON = 6;\n\tbytes citiesJSON = 7;\n\tbytes townsJSON = 8;\n\tbytes providersJSON = 9;\n\tstring password = 10; // 密码\n}",
 | 
				
			||||||
      "doc": "创建IP库文件"
 | 
					      "doc": "创建IP库文件"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -19158,7 +19158,7 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "name": "IPLibraryFile",
 | 
					      "name": "IPLibraryFile",
 | 
				
			||||||
      "code": "message IPLibraryFile {\n\tint64 id = 1;\n\tstring name = 2;\n\tint64 fileId = 3;\n\tstring template = 4;\n\trepeated string emptyValues = 5;\n\tint64 generatedFileId = 6;\n\tint64 generatedAt = 7;\n\tbool isFinished = 8;\n\tint64 createdAt = 9;\n\trepeated string countryNames = 10;\n\trepeated Province provinces = 11;\n\trepeated City cities = 12;\n\trepeated Town towns = 13;\n\trepeated string providerNames = 14;\n\n\n\tmessage Province {\n\t\tstring countryName = 1;\n\t\tstring provinceName = 2;\n\t}\n\n\n\tmessage City {\n\t\tstring countryName = 1;\n\t\tstring provinceName = 2;\n\t\tstring cityName = 3;\n\t}\n\n\n\tmessage Town {\n\t\tstring countryName = 1;\n\t\tstring provinceName = 2;\n\t\tstring cityName = 3;\n\t\tstring townName = 4;\n\t}\n}",
 | 
					      "code": "message IPLibraryFile {\n\tint64 id = 1;\n\tstring name = 2;\n\tint64 fileId = 3;\n\tstring template = 4;\n\trepeated string emptyValues = 5;\n\tint64 generatedFileId = 6;\n\tint64 generatedAt = 7;\n\tbool isFinished = 8;\n\tint64 createdAt = 9;\n\trepeated string countryNames = 10;\n\trepeated Province provinces = 11;\n\trepeated City cities = 12;\n\trepeated Town towns = 13;\n\trepeated string providerNames = 14;\n\tstring password = 15; // 密码\n\n\n\tmessage Province {\n\t\tstring countryName = 1;\n\t\tstring provinceName = 2;\n\t}\n\n\n\tmessage City {\n\t\tstring countryName = 1;\n\t\tstring provinceName = 2;\n\t\tstring cityName = 3;\n\t}\n\n\n\tmessage Town {\n\t\tstring countryName = 1;\n\t\tstring provinceName = 2;\n\t\tstring cityName = 3;\n\t\tstring townName = 4;\n\t}\n}",
 | 
				
			||||||
      "doc": ""
 | 
					      "doc": ""
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,26 +7,48 @@ import (
 | 
				
			|||||||
	"compress/gzip"
 | 
						"compress/gzip"
 | 
				
			||||||
	_ "embed"
 | 
						_ "embed"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:embed internal-ip-library.db
 | 
					//go:embed internal-ip-library.db
 | 
				
			||||||
var ipLibraryData []byte
 | 
					var ipLibraryData []byte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var defaultLibrary = NewIPLibrary()
 | 
					var defaultLibrary = NewIPLibrary()
 | 
				
			||||||
 | 
					var commonLibrary *IPLibrary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var libraryLocker = &sync.Mutex{} // 为了保持加载顺序性
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func DefaultIPLibraryData() []byte {
 | 
					func DefaultIPLibraryData() []byte {
 | 
				
			||||||
	return ipLibraryData
 | 
						return ipLibraryData
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// InitDefault 加载默认的IP库
 | 
				
			||||||
func InitDefault() error {
 | 
					func InitDefault() error {
 | 
				
			||||||
	defaultLibrary.reader = nil
 | 
						libraryLocker.Lock()
 | 
				
			||||||
	return defaultLibrary.InitFromData(ipLibraryData)
 | 
						defer libraryLocker.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if commonLibrary != nil {
 | 
				
			||||||
 | 
							defaultLibrary = commonLibrary
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var library = NewIPLibrary()
 | 
				
			||||||
 | 
						err := library.InitFromData(ipLibraryData, "")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						commonLibrary = library
 | 
				
			||||||
 | 
						defaultLibrary = commonLibrary
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Lookup 查询IP信息
 | 
				
			||||||
func Lookup(ip net.IP) *QueryResult {
 | 
					func Lookup(ip net.IP) *QueryResult {
 | 
				
			||||||
	return defaultLibrary.Lookup(ip)
 | 
						return defaultLibrary.Lookup(ip)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// LookupIP 查询IP信息
 | 
				
			||||||
func LookupIP(ip string) *QueryResult {
 | 
					func LookupIP(ip string) *QueryResult {
 | 
				
			||||||
	return defaultLibrary.LookupIP(ip)
 | 
						return defaultLibrary.LookupIP(ip)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -43,10 +65,19 @@ func NewIPLibraryWithReader(reader *Reader) *IPLibrary {
 | 
				
			|||||||
	return &IPLibrary{reader: reader}
 | 
						return &IPLibrary{reader: reader}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *IPLibrary) InitFromData(data []byte) error {
 | 
					func (this *IPLibrary) InitFromData(data []byte, password string) error {
 | 
				
			||||||
	if len(data) == 0 || this.reader != nil {
 | 
						if len(data) == 0 || this.reader != nil {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(password) > 0 {
 | 
				
			||||||
 | 
							srcData, err := NewEncrypt().Decode(data, password)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							data = srcData
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var reader = bytes.NewReader(data)
 | 
						var reader = bytes.NewReader(data)
 | 
				
			||||||
	gzipReader, err := gzip.NewReader(reader)
 | 
						gzipReader, err := gzip.NewReader(reader)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,12 +15,21 @@ import (
 | 
				
			|||||||
func TestIPLibrary_Init(t *testing.T) {
 | 
					func TestIPLibrary_Init(t *testing.T) {
 | 
				
			||||||
	var lib = iplibrary.NewIPLibrary()
 | 
						var lib = iplibrary.NewIPLibrary()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err := lib.InitFromData(iplibrary.DefaultIPLibraryData())
 | 
						err := lib.InitFromData(iplibrary.DefaultIPLibraryData(), "")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestIPLibrary_Load(t *testing.T) {
 | 
				
			||||||
 | 
						for i := 0; i < 10; i++ {
 | 
				
			||||||
 | 
							err := iplibrary.InitDefault()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								t.Fatal(err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestIPLibrary_Lookup(t *testing.T) {
 | 
					func TestIPLibrary_Lookup(t *testing.T) {
 | 
				
			||||||
	var stat1 = &runtime.MemStats{}
 | 
						var stat1 = &runtime.MemStats{}
 | 
				
			||||||
	runtime.ReadMemStats(stat1)
 | 
						runtime.ReadMemStats(stat1)
 | 
				
			||||||
@@ -29,7 +38,7 @@ func TestIPLibrary_Lookup(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	var before = time.Now()
 | 
						var before = time.Now()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err := lib.InitFromData(iplibrary.DefaultIPLibraryData())
 | 
						err := lib.InitFromData(iplibrary.DefaultIPLibraryData(), "")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -48,6 +57,7 @@ func TestIPLibrary_Lookup(t *testing.T) {
 | 
				
			|||||||
		"8.8.8.8",
 | 
							"8.8.8.8",
 | 
				
			||||||
		"4.4.4.4",
 | 
							"4.4.4.4",
 | 
				
			||||||
		"202.96.0.20",
 | 
							"202.96.0.20",
 | 
				
			||||||
 | 
							"111.197.165.199",
 | 
				
			||||||
		"66.249.66.69",
 | 
							"66.249.66.69",
 | 
				
			||||||
		"2222",                           // wrong ip
 | 
							"2222",                           // wrong ip
 | 
				
			||||||
		"2406:8c00:0:3401:133:18:168:70", // ipv6
 | 
							"2406:8c00:0:3401:133:18:168:70", // ipv6
 | 
				
			||||||
@@ -59,7 +69,7 @@ func TestIPLibrary_Lookup(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func TestIPLibrary_LookupIP(t *testing.T) {
 | 
					func TestIPLibrary_LookupIP(t *testing.T) {
 | 
				
			||||||
	var lib = iplibrary.NewIPLibrary()
 | 
						var lib = iplibrary.NewIPLibrary()
 | 
				
			||||||
	err := lib.InitFromData(iplibrary.DefaultIPLibraryData())
 | 
						err := lib.InitFromData(iplibrary.DefaultIPLibraryData(), "")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -78,7 +88,7 @@ func TestIPLibrary_LookupIP(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func BenchmarkIPLibrary_Lookup(b *testing.B) {
 | 
					func BenchmarkIPLibrary_Lookup(b *testing.B) {
 | 
				
			||||||
	var lib = iplibrary.NewIPLibrary()
 | 
						var lib = iplibrary.NewIPLibrary()
 | 
				
			||||||
	err := lib.InitFromData(iplibrary.DefaultIPLibraryData())
 | 
						err := lib.InitFromData(iplibrary.DefaultIPLibraryData(), "")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		b.Fatal(err)
 | 
							b.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										32
									
								
								pkg/iplibrary/encrypt.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								pkg/iplibrary/encrypt.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					// Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package iplibrary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "github.com/TeaOSLab/EdgeCommon/pkg/nodeutils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Encrypt struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewEncrypt() *Encrypt {
 | 
				
			||||||
 | 
						return &Encrypt{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *Encrypt) Encode(srcData []byte, password string) ([]byte, error) {
 | 
				
			||||||
 | 
						var method = nodeutils.AES256CFBMethod{}
 | 
				
			||||||
 | 
						err := method.Init([]byte(password), []byte(password))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return method.Encrypt(srcData)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *Encrypt) Decode(encodedData []byte, password string) ([]byte, error) {
 | 
				
			||||||
 | 
						var method = nodeutils.AES256CFBMethod{}
 | 
				
			||||||
 | 
						err := method.Init([]byte(password), []byte(password))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return method.Decrypt(encodedData)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							@@ -3,12 +3,17 @@
 | 
				
			|||||||
package iplibrary
 | 
					package iplibrary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
					 | 
				
			||||||
	"encoding/binary"
 | 
					 | 
				
			||||||
	"github.com/iwind/TeaGo/types"
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ipItem struct {
 | 
					type ipv4Item struct {
 | 
				
			||||||
 | 
						IPFrom uint32
 | 
				
			||||||
 | 
						IPTo   uint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Region *ipRegion
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ipv6Item struct {
 | 
				
			||||||
	IPFrom uint64
 | 
						IPFrom uint64
 | 
				
			||||||
	IPTo   uint64
 | 
						IPTo   uint64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -16,23 +21,14 @@ type ipItem struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ipRegion struct {
 | 
					type ipRegion struct {
 | 
				
			||||||
	CountryId  uint32
 | 
						CountryId  uint16
 | 
				
			||||||
	ProvinceId uint32
 | 
						ProvinceId uint16
 | 
				
			||||||
	CityId     uint32
 | 
						CityId     uint32
 | 
				
			||||||
	TownId     uint32
 | 
						TownId     uint32
 | 
				
			||||||
	ProviderId uint32
 | 
						ProviderId uint16
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *ipItem) AsBinary() ([]byte, error) {
 | 
					func HashRegion(countryId uint16, provinceId uint16, cityId uint32, townId uint32, providerId uint16) string {
 | 
				
			||||||
	var buf = &bytes.Buffer{}
 | 
					 | 
				
			||||||
	err := binary.Write(buf, binary.BigEndian, this)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return buf.Bytes(), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func HashRegion(countryId uint32, provinceId uint32, cityId uint32, townId uint32, providerId uint32) string {
 | 
					 | 
				
			||||||
	var providerHash = ""
 | 
						var providerHash = ""
 | 
				
			||||||
	if providerId > 0 {
 | 
						if providerId > 0 {
 | 
				
			||||||
		providerHash = "_" + types.String(providerId)
 | 
							providerHash = "_" + types.String(providerId)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,13 +3,13 @@
 | 
				
			|||||||
package iplibrary
 | 
					package iplibrary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Country struct {
 | 
					type Country struct {
 | 
				
			||||||
	Id    uint32   `json:"id"`
 | 
						Id    uint16   `json:"id"`
 | 
				
			||||||
	Name  string   `json:"name"`
 | 
						Name  string   `json:"name"`
 | 
				
			||||||
	Codes []string `json:"codes"`
 | 
						Codes []string `json:"codes"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Province struct {
 | 
					type Province struct {
 | 
				
			||||||
	Id    uint32   `json:"id"`
 | 
						Id    uint16   `json:"id"`
 | 
				
			||||||
	Name  string   `json:"name"`
 | 
						Name  string   `json:"name"`
 | 
				
			||||||
	Codes []string `json:"codes"`
 | 
						Codes []string `json:"codes"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -27,7 +27,7 @@ type Town struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Provider struct {
 | 
					type Provider struct {
 | 
				
			||||||
	Id    uint32   `json:"id"`
 | 
						Id    uint16   `json:"id"`
 | 
				
			||||||
	Name  string   `json:"name"`
 | 
						Name  string   `json:"name"`
 | 
				
			||||||
	Codes []string `json:"codes"`
 | 
						Codes []string `json:"codes"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -43,19 +43,19 @@ type Meta struct {
 | 
				
			|||||||
	Providers []*Provider `json:"providers"`
 | 
						Providers []*Provider `json:"providers"`
 | 
				
			||||||
	CreatedAt int64       `json:"createdAt"`
 | 
						CreatedAt int64       `json:"createdAt"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	countryMap  map[uint32]*Country  // id => *Country
 | 
						countryMap  map[uint16]*Country  // id => *Country
 | 
				
			||||||
	provinceMap map[uint32]*Province // id => *Province
 | 
						provinceMap map[uint16]*Province // id => *Province
 | 
				
			||||||
	cityMap     map[uint32]*City     // id => *City
 | 
						cityMap     map[uint32]*City     // id => *City
 | 
				
			||||||
	townMap     map[uint32]*Town     // id => *Town
 | 
						townMap     map[uint32]*Town     // id => *Town
 | 
				
			||||||
	providerMap map[uint32]*Provider // id => *Provider
 | 
						providerMap map[uint16]*Provider // id => *Provider
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *Meta) Init() {
 | 
					func (this *Meta) Init() {
 | 
				
			||||||
	this.countryMap = map[uint32]*Country{}
 | 
						this.countryMap = map[uint16]*Country{}
 | 
				
			||||||
	this.provinceMap = map[uint32]*Province{}
 | 
						this.provinceMap = map[uint16]*Province{}
 | 
				
			||||||
	this.cityMap = map[uint32]*City{}
 | 
						this.cityMap = map[uint32]*City{}
 | 
				
			||||||
	this.townMap = map[uint32]*Town{}
 | 
						this.townMap = map[uint32]*Town{}
 | 
				
			||||||
	this.providerMap = map[uint32]*Provider{}
 | 
						this.providerMap = map[uint16]*Provider{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, country := range this.Countries {
 | 
						for _, country := range this.Countries {
 | 
				
			||||||
		this.countryMap[country.Id] = country
 | 
							this.countryMap[country.Id] = country
 | 
				
			||||||
@@ -74,11 +74,11 @@ func (this *Meta) Init() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *Meta) CountryWithId(countryId uint32) *Country {
 | 
					func (this *Meta) CountryWithId(countryId uint16) *Country {
 | 
				
			||||||
	return this.countryMap[countryId]
 | 
						return this.countryMap[countryId]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *Meta) ProvinceWithId(provinceId uint32) *Province {
 | 
					func (this *Meta) ProvinceWithId(provinceId uint16) *Province {
 | 
				
			||||||
	return this.provinceMap[provinceId]
 | 
						return this.provinceMap[provinceId]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,6 +90,6 @@ func (this *Meta) TownWithId(townId uint32) *Town {
 | 
				
			|||||||
	return this.townMap[townId]
 | 
						return this.townMap[townId]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *Meta) ProviderWithId(providerId uint32) *Provider {
 | 
					func (this *Meta) ProviderWithId(providerId uint16) *Provider {
 | 
				
			||||||
	return this.providerMap[providerId]
 | 
						return this.providerMap[providerId]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,10 +7,10 @@ import (
 | 
				
			|||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
				
			||||||
	"github.com/iwind/TeaGo/types"
 | 
					 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"sort"
 | 
						"sort"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -18,17 +18,17 @@ import (
 | 
				
			|||||||
type Reader struct {
 | 
					type Reader struct {
 | 
				
			||||||
	meta *Meta
 | 
						meta *Meta
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	regionMap map[string]*ipRegion
 | 
						regionMap map[string]*ipRegion // 缓存重复的区域用来节约内存
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ipV4Items []*ipItem
 | 
						ipV4Items []*ipv4Item
 | 
				
			||||||
	ipV6Items []*ipItem
 | 
						ipV6Items []*ipv6Item
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	lastIPFrom     uint64
 | 
						lastIPFrom     uint64
 | 
				
			||||||
	lastCountryId  uint32
 | 
						lastCountryId  uint16
 | 
				
			||||||
	lastProvinceId uint32
 | 
						lastProvinceId uint16
 | 
				
			||||||
	lastCityId     uint32
 | 
						lastCityId     uint32
 | 
				
			||||||
	lastTownId     uint32
 | 
						lastTownId     uint32
 | 
				
			||||||
	lastProviderId uint32
 | 
						lastProviderId uint16
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewReader 创建新Reader对象
 | 
					// NewReader 创建新Reader对象
 | 
				
			||||||
@@ -112,6 +112,9 @@ func (this *Reader) load(reader io.Reader) error {
 | 
				
			|||||||
		return from0 < from1
 | 
							return from0 < from1
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 清理内存
 | 
				
			||||||
 | 
						this.regionMap = nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -122,12 +125,12 @@ func (this *Reader) Lookup(ip net.IP) *QueryResult {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	var ipLong = configutils.IP2Long(ip)
 | 
						var ipLong = configutils.IP2Long(ip)
 | 
				
			||||||
	var isV4 = configutils.IsIPv4(ip)
 | 
						var isV4 = configutils.IsIPv4(ip)
 | 
				
			||||||
	var resultItem *ipItem
 | 
						var resultItem any
 | 
				
			||||||
	if isV4 {
 | 
						if isV4 {
 | 
				
			||||||
		sort.Search(len(this.ipV4Items), func(i int) bool {
 | 
							sort.Search(len(this.ipV4Items), func(i int) bool {
 | 
				
			||||||
			var item = this.ipV4Items[i]
 | 
								var item = this.ipV4Items[i]
 | 
				
			||||||
			if item.IPFrom <= ipLong {
 | 
								if item.IPFrom <= uint32(ipLong) {
 | 
				
			||||||
				if item.IPTo >= ipLong {
 | 
									if item.IPTo >= uint32(ipLong) {
 | 
				
			||||||
					resultItem = item
 | 
										resultItem = item
 | 
				
			||||||
					return false
 | 
										return false
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -159,11 +162,11 @@ func (this *Reader) Meta() *Meta {
 | 
				
			|||||||
	return this.meta
 | 
						return this.meta
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *Reader) IPv4Items() []*ipItem {
 | 
					func (this *Reader) IPv4Items() []*ipv4Item {
 | 
				
			||||||
	return this.ipV4Items
 | 
						return this.ipV4Items
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *Reader) IPv6Items() []*ipItem {
 | 
					func (this *Reader) IPv6Items() []*ipv6Item {
 | 
				
			||||||
	return this.ipV6Items
 | 
						return this.ipV6Items
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -216,31 +219,31 @@ func (this *Reader) parseLine(line []byte) error {
 | 
				
			|||||||
	var ipFrom uint64
 | 
						var ipFrom uint64
 | 
				
			||||||
	var ipTo uint64
 | 
						var ipTo uint64
 | 
				
			||||||
	if strings.HasPrefix(pieces[1], "+") {
 | 
						if strings.HasPrefix(pieces[1], "+") {
 | 
				
			||||||
		ipFrom = this.lastIPFrom + types.Uint64(pieces[1][1:])
 | 
							ipFrom = this.lastIPFrom + this.decodeUint64(pieces[1][1:])
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		ipFrom = types.Uint64(pieces[1])
 | 
							ipFrom = this.decodeUint64(pieces[1])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(pieces[2]) == 0 {
 | 
						if len(pieces[2]) == 0 {
 | 
				
			||||||
		ipTo = ipFrom
 | 
							ipTo = ipFrom
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		ipTo = types.Uint64(pieces[2]) + ipFrom
 | 
							ipTo = this.decodeUint64(pieces[2]) + ipFrom
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	this.lastIPFrom = ipFrom
 | 
						this.lastIPFrom = ipFrom
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// country
 | 
						// country
 | 
				
			||||||
	var countryId uint32
 | 
						var countryId uint16
 | 
				
			||||||
	if pieces[3] == "+" {
 | 
						if pieces[3] == "+" {
 | 
				
			||||||
		countryId = this.lastCountryId
 | 
							countryId = this.lastCountryId
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		countryId = types.Uint32(pieces[3])
 | 
							countryId = uint16(this.decodeUint64(pieces[3]))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	this.lastCountryId = countryId
 | 
						this.lastCountryId = countryId
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var provinceId uint32
 | 
						var provinceId uint16
 | 
				
			||||||
	if pieces[4] == "+" {
 | 
						if pieces[4] == "+" {
 | 
				
			||||||
		provinceId = this.lastProvinceId
 | 
							provinceId = this.lastProvinceId
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		provinceId = types.Uint32(pieces[4])
 | 
							provinceId = uint16(this.decodeUint64(pieces[4]))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	this.lastProvinceId = provinceId
 | 
						this.lastProvinceId = provinceId
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -249,7 +252,7 @@ func (this *Reader) parseLine(line []byte) error {
 | 
				
			|||||||
	if pieces[5] == "+" {
 | 
						if pieces[5] == "+" {
 | 
				
			||||||
		cityId = this.lastCityId
 | 
							cityId = this.lastCityId
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		cityId = types.Uint32(pieces[5])
 | 
							cityId = uint32(this.decodeUint64(pieces[5]))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	this.lastCityId = cityId
 | 
						this.lastCityId = cityId
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -258,16 +261,16 @@ func (this *Reader) parseLine(line []byte) error {
 | 
				
			|||||||
	if pieces[6] == "+" {
 | 
						if pieces[6] == "+" {
 | 
				
			||||||
		townId = this.lastTownId
 | 
							townId = this.lastTownId
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		townId = types.Uint32(pieces[6])
 | 
							townId = uint32(this.decodeUint64(pieces[6]))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	this.lastTownId = townId
 | 
						this.lastTownId = townId
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// provider
 | 
						// provider
 | 
				
			||||||
	var providerId uint32
 | 
						var providerId uint16
 | 
				
			||||||
	if pieces[7] == "+" {
 | 
						if pieces[7] == "+" {
 | 
				
			||||||
		providerId = this.lastProviderId
 | 
							providerId = this.lastProviderId
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		providerId = types.Uint32(pieces[7])
 | 
							providerId = uint16(this.decodeUint64(pieces[7]))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	this.lastProviderId = providerId
 | 
						this.lastProviderId = providerId
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -286,13 +289,13 @@ func (this *Reader) parseLine(line []byte) error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if version == "4" {
 | 
						if version == "4" {
 | 
				
			||||||
		this.ipV4Items = append(this.ipV4Items, &ipItem{
 | 
							this.ipV4Items = append(this.ipV4Items, &ipv4Item{
 | 
				
			||||||
			IPFrom: ipFrom,
 | 
								IPFrom: uint32(ipFrom),
 | 
				
			||||||
			IPTo:   ipTo,
 | 
								IPTo:   uint32(ipTo),
 | 
				
			||||||
			Region: region,
 | 
								Region: region,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		this.ipV6Items = append(this.ipV6Items, &ipItem{
 | 
							this.ipV6Items = append(this.ipV6Items, &ipv6Item{
 | 
				
			||||||
			IPFrom: ipFrom,
 | 
								IPFrom: ipFrom,
 | 
				
			||||||
			IPTo:   ipTo,
 | 
								IPTo:   ipTo,
 | 
				
			||||||
			Region: region,
 | 
								Region: region,
 | 
				
			||||||
@@ -301,3 +304,12 @@ func (this *Reader) parseLine(line []byte) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *Reader) decodeUint64(s string) uint64 {
 | 
				
			||||||
 | 
						if this.meta != nil && this.meta.Version == Version2 {
 | 
				
			||||||
 | 
							i, _ := strconv.ParseUint(s, 32, 64)
 | 
				
			||||||
 | 
							return i
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						i, _ := strconv.ParseUint(s, 10, 64)
 | 
				
			||||||
 | 
						return i
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@
 | 
				
			|||||||
package iplibrary
 | 
					package iplibrary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
	"compress/gzip"
 | 
						"compress/gzip"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
@@ -12,9 +13,10 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type FileReader struct {
 | 
					type FileReader struct {
 | 
				
			||||||
	rawReader *Reader
 | 
						rawReader *Reader
 | 
				
			||||||
 | 
						password  string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewFileReader(path string) (*FileReader, error) {
 | 
					func NewFileReader(path string, password string) (*FileReader, error) {
 | 
				
			||||||
	fp, err := os.Open(path)
 | 
						fp, err := os.Open(path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -23,10 +25,24 @@ func NewFileReader(path string) (*FileReader, error) {
 | 
				
			|||||||
		_ = fp.Close()
 | 
							_ = fp.Close()
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return NewFileDataReader(fp)
 | 
						return NewFileDataReader(fp, password)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewFileDataReader(dataReader io.Reader) (*FileReader, error) {
 | 
					func NewFileDataReader(dataReader io.Reader, password string) (*FileReader, error) {
 | 
				
			||||||
 | 
						if len(password) > 0 {
 | 
				
			||||||
 | 
							data, err := io.ReadAll(dataReader)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sourceData, err := NewEncrypt().Decode(data, password)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							dataReader = bytes.NewReader(sourceData)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gzReader, err := gzip.NewReader(dataReader)
 | 
						gzReader, err := gzip.NewReader(dataReader)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errors.New("create gzip reader failed: " + err.Error())
 | 
							return nil, errors.New("create gzip reader failed: " + err.Error())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,7 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestNewFileReader(t *testing.T) {
 | 
					func TestNewFileReader(t *testing.T) {
 | 
				
			||||||
	reader, err := iplibrary.NewFileReader("./ip")
 | 
						reader, err := iplibrary.NewFileReader("./ip-20c1461c.db", "123456")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type QueryResult struct {
 | 
					type QueryResult struct {
 | 
				
			||||||
	item *ipItem
 | 
						item any
 | 
				
			||||||
	meta *Meta
 | 
						meta *Meta
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -17,18 +17,16 @@ func (this *QueryResult) IsOk() bool {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *QueryResult) CountryId() int64 {
 | 
					func (this *QueryResult) CountryId() int64 {
 | 
				
			||||||
	if this.item != nil {
 | 
						return int64(this.realCountryId())
 | 
				
			||||||
		return int64(this.item.Region.CountryId)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *QueryResult) CountryName() string {
 | 
					func (this *QueryResult) CountryName() string {
 | 
				
			||||||
	if this.item == nil {
 | 
						if this.item == nil {
 | 
				
			||||||
		return ""
 | 
							return ""
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if this.item.Region.CountryId > 0 {
 | 
						var countryId = this.realCountryId()
 | 
				
			||||||
		var country = this.meta.CountryWithId(this.item.Region.CountryId)
 | 
						if countryId > 0 {
 | 
				
			||||||
 | 
							var country = this.meta.CountryWithId(countryId)
 | 
				
			||||||
		if country != nil {
 | 
							if country != nil {
 | 
				
			||||||
			return country.Name
 | 
								return country.Name
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -40,8 +38,9 @@ func (this *QueryResult) CountryCodes() []string {
 | 
				
			|||||||
	if this.item == nil {
 | 
						if this.item == nil {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if this.item.Region.CountryId > 0 {
 | 
						var countryId = this.realCountryId()
 | 
				
			||||||
		var country = this.meta.CountryWithId(this.item.Region.CountryId)
 | 
						if countryId > 0 {
 | 
				
			||||||
 | 
							var country = this.meta.CountryWithId(countryId)
 | 
				
			||||||
		if country != nil {
 | 
							if country != nil {
 | 
				
			||||||
			return country.Codes
 | 
								return country.Codes
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -50,18 +49,16 @@ func (this *QueryResult) CountryCodes() []string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *QueryResult) ProvinceId() int64 {
 | 
					func (this *QueryResult) ProvinceId() int64 {
 | 
				
			||||||
	if this.item != nil {
 | 
						return int64(this.realProvinceId())
 | 
				
			||||||
		return int64(this.item.Region.ProvinceId)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *QueryResult) ProvinceName() string {
 | 
					func (this *QueryResult) ProvinceName() string {
 | 
				
			||||||
	if this.item == nil {
 | 
						if this.item == nil {
 | 
				
			||||||
		return ""
 | 
							return ""
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if this.item.Region.ProvinceId > 0 {
 | 
						var provinceId = this.realProvinceId()
 | 
				
			||||||
		var province = this.meta.ProvinceWithId(this.item.Region.ProvinceId)
 | 
						if provinceId > 0 {
 | 
				
			||||||
 | 
							var province = this.meta.ProvinceWithId(provinceId)
 | 
				
			||||||
		if province != nil {
 | 
							if province != nil {
 | 
				
			||||||
			return province.Name
 | 
								return province.Name
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -73,8 +70,9 @@ func (this *QueryResult) ProvinceCodes() []string {
 | 
				
			|||||||
	if this.item == nil {
 | 
						if this.item == nil {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if this.item.Region.ProvinceId > 0 {
 | 
						var provinceId = this.realProvinceId()
 | 
				
			||||||
		var province = this.meta.ProvinceWithId(this.item.Region.ProvinceId)
 | 
						if provinceId > 0 {
 | 
				
			||||||
 | 
							var province = this.meta.ProvinceWithId(provinceId)
 | 
				
			||||||
		if province != nil {
 | 
							if province != nil {
 | 
				
			||||||
			return province.Codes
 | 
								return province.Codes
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -83,18 +81,16 @@ func (this *QueryResult) ProvinceCodes() []string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *QueryResult) CityId() int64 {
 | 
					func (this *QueryResult) CityId() int64 {
 | 
				
			||||||
	if this.item != nil {
 | 
						return int64(this.realCityId())
 | 
				
			||||||
		return int64(this.item.Region.CityId)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *QueryResult) CityName() string {
 | 
					func (this *QueryResult) CityName() string {
 | 
				
			||||||
	if this.item == nil {
 | 
						if this.item == nil {
 | 
				
			||||||
		return ""
 | 
							return ""
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if this.item.Region.CityId > 0 {
 | 
						var cityId = this.realCityId()
 | 
				
			||||||
		var city = this.meta.CityWithId(this.item.Region.CityId)
 | 
						if cityId > 0 {
 | 
				
			||||||
 | 
							var city = this.meta.CityWithId(cityId)
 | 
				
			||||||
		if city != nil {
 | 
							if city != nil {
 | 
				
			||||||
			return city.Name
 | 
								return city.Name
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -103,18 +99,16 @@ func (this *QueryResult) CityName() string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *QueryResult) TownId() int64 {
 | 
					func (this *QueryResult) TownId() int64 {
 | 
				
			||||||
	if this.item != nil {
 | 
						return int64(this.realTownId())
 | 
				
			||||||
		return int64(this.item.Region.TownId)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *QueryResult) TownName() string {
 | 
					func (this *QueryResult) TownName() string {
 | 
				
			||||||
	if this.item == nil {
 | 
						if this.item == nil {
 | 
				
			||||||
		return ""
 | 
							return ""
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if this.item.Region.TownId > 0 {
 | 
						var townId = this.realTownId()
 | 
				
			||||||
		var town = this.meta.TownWithId(this.item.Region.TownId)
 | 
						if townId > 0 {
 | 
				
			||||||
 | 
							var town = this.meta.TownWithId(townId)
 | 
				
			||||||
		if town != nil {
 | 
							if town != nil {
 | 
				
			||||||
			return town.Name
 | 
								return town.Name
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -123,18 +117,16 @@ func (this *QueryResult) TownName() string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *QueryResult) ProviderId() int64 {
 | 
					func (this *QueryResult) ProviderId() int64 {
 | 
				
			||||||
	if this.item != nil {
 | 
						return int64(this.realProviderId())
 | 
				
			||||||
		return int64(this.item.Region.ProviderId)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (this *QueryResult) ProviderName() string {
 | 
					func (this *QueryResult) ProviderName() string {
 | 
				
			||||||
	if this.item == nil {
 | 
						if this.item == nil {
 | 
				
			||||||
		return ""
 | 
							return ""
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if this.item.Region.ProviderId > 0 {
 | 
						var providerId = this.realProviderId()
 | 
				
			||||||
		var provider = this.meta.ProviderWithId(this.item.Region.ProviderId)
 | 
						if providerId > 0 {
 | 
				
			||||||
 | 
							var provider = this.meta.ProviderWithId(providerId)
 | 
				
			||||||
		if provider != nil {
 | 
							if provider != nil {
 | 
				
			||||||
			return provider.Name
 | 
								return provider.Name
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -146,8 +138,9 @@ func (this *QueryResult) ProviderCodes() []string {
 | 
				
			|||||||
	if this.item == nil {
 | 
						if this.item == nil {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if this.item.Region.ProviderId > 0 {
 | 
						var providerId = this.realProviderId()
 | 
				
			||||||
		var provider = this.meta.ProviderWithId(this.item.Region.ProviderId)
 | 
						if providerId > 0 {
 | 
				
			||||||
 | 
							var provider = this.meta.ProviderWithId(providerId)
 | 
				
			||||||
		if provider != nil {
 | 
							if provider != nil {
 | 
				
			||||||
			return provider.Codes
 | 
								return provider.Codes
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -189,3 +182,68 @@ func (this *QueryResult) Summary() string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return strings.Join(pieces, " ")
 | 
						return strings.Join(pieces, " ")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *QueryResult) realCountryId() uint16 {
 | 
				
			||||||
 | 
						if this.item != nil {
 | 
				
			||||||
 | 
							switch item := this.item.(type) {
 | 
				
			||||||
 | 
							case *ipv4Item:
 | 
				
			||||||
 | 
								return item.Region.CountryId
 | 
				
			||||||
 | 
							case *ipv6Item:
 | 
				
			||||||
 | 
								return item.Region.CountryId
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *QueryResult) realProvinceId() uint16 {
 | 
				
			||||||
 | 
						if this.item != nil {
 | 
				
			||||||
 | 
							switch item := this.item.(type) {
 | 
				
			||||||
 | 
							case *ipv4Item:
 | 
				
			||||||
 | 
								return item.Region.ProvinceId
 | 
				
			||||||
 | 
							case *ipv6Item:
 | 
				
			||||||
 | 
								return item.Region.ProvinceId
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *QueryResult) realCityId() uint32 {
 | 
				
			||||||
 | 
						if this.item != nil {
 | 
				
			||||||
 | 
							switch item := this.item.(type) {
 | 
				
			||||||
 | 
							case *ipv4Item:
 | 
				
			||||||
 | 
								return item.Region.CityId
 | 
				
			||||||
 | 
							case *ipv6Item:
 | 
				
			||||||
 | 
								return item.Region.CityId
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *QueryResult) realTownId() uint32 {
 | 
				
			||||||
 | 
						if this.item != nil {
 | 
				
			||||||
 | 
							switch item := this.item.(type) {
 | 
				
			||||||
 | 
							case *ipv4Item:
 | 
				
			||||||
 | 
								return item.Region.TownId
 | 
				
			||||||
 | 
							case *ipv6Item:
 | 
				
			||||||
 | 
								return item.Region.TownId
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *QueryResult) realProviderId() uint16 {
 | 
				
			||||||
 | 
						if this.item != nil {
 | 
				
			||||||
 | 
							switch item := this.item.(type) {
 | 
				
			||||||
 | 
							case *ipv4Item:
 | 
				
			||||||
 | 
								return item.Region.ProviderId
 | 
				
			||||||
 | 
							case *ipv6Item:
 | 
				
			||||||
 | 
								return item.Region.ProviderId
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -213,7 +213,7 @@ func (this *Updater) Loop() error {
 | 
				
			|||||||
func (this *Updater) loadFile(fp *os.File) error {
 | 
					func (this *Updater) loadFile(fp *os.File) error {
 | 
				
			||||||
	this.source.LogInfo("load ip library from '" + fp.Name() + "' ...")
 | 
						this.source.LogInfo("load ip library from '" + fp.Name() + "' ...")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fileReader, err := NewFileDataReader(fp)
 | 
						fileReader, err := NewFileDataReader(fp, "")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errors.New("load ip library from reader failed: " + err.Error())
 | 
							return errors.New("load ip library from reader failed: " + err.Error())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,4 +6,5 @@ type Version = int
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	Version1 Version = 1
 | 
						Version1 Version = 1
 | 
				
			||||||
 | 
						Version2 Version = 2 // 主要变更为数字使用32进制
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,10 +8,10 @@ import (
 | 
				
			|||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
				
			||||||
	"github.com/iwind/TeaGo/types"
 | 
					 | 
				
			||||||
	"hash"
 | 
						"hash"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -54,7 +54,7 @@ func NewWriter(writer io.Writer, meta *Meta) *Writer {
 | 
				
			|||||||
	if meta == nil {
 | 
						if meta == nil {
 | 
				
			||||||
		meta = &Meta{}
 | 
							meta = &Meta{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	meta.Version = Version1
 | 
						meta.Version = Version2
 | 
				
			||||||
	meta.CreatedAt = time.Now().Unix()
 | 
						meta.CreatedAt = time.Now().Unix()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var libWriter = &Writer{
 | 
						var libWriter = &Writer{
 | 
				
			||||||
@@ -111,9 +111,9 @@ func (this *Writer) Write(ipFrom string, ipTo string, countryId int64, provinceI
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if this.lastIPFrom > 0 && fromIPLong > this.lastIPFrom {
 | 
						if this.lastIPFrom > 0 && fromIPLong > this.lastIPFrom {
 | 
				
			||||||
		pieces = append(pieces, "+"+types.String(fromIPLong-this.lastIPFrom))
 | 
							pieces = append(pieces, "+"+this.formatUint64(fromIPLong-this.lastIPFrom))
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		pieces = append(pieces, types.String(fromIPLong))
 | 
							pieces = append(pieces, this.formatUint64(fromIPLong))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	this.lastIPFrom = fromIPLong
 | 
						this.lastIPFrom = fromIPLong
 | 
				
			||||||
	if ipFrom == ipTo {
 | 
						if ipFrom == ipTo {
 | 
				
			||||||
@@ -121,7 +121,7 @@ func (this *Writer) Write(ipFrom string, ipTo string, countryId int64, provinceI
 | 
				
			|||||||
		pieces = append(pieces, "")
 | 
							pieces = append(pieces, "")
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		// 2
 | 
							// 2
 | 
				
			||||||
		pieces = append(pieces, types.String(toIPLong-fromIPLong))
 | 
							pieces = append(pieces, this.formatUint64(toIPLong-fromIPLong))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 3
 | 
						// 3
 | 
				
			||||||
@@ -129,7 +129,7 @@ func (this *Writer) Write(ipFrom string, ipTo string, countryId int64, provinceI
 | 
				
			|||||||
		if countryId == this.lastCountryId {
 | 
							if countryId == this.lastCountryId {
 | 
				
			||||||
			pieces = append(pieces, "+")
 | 
								pieces = append(pieces, "+")
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			pieces = append(pieces, types.String(countryId))
 | 
								pieces = append(pieces, this.formatUint64(uint64(countryId)))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		pieces = append(pieces, "")
 | 
							pieces = append(pieces, "")
 | 
				
			||||||
@@ -141,7 +141,7 @@ func (this *Writer) Write(ipFrom string, ipTo string, countryId int64, provinceI
 | 
				
			|||||||
		if provinceId == this.lastProvinceId {
 | 
							if provinceId == this.lastProvinceId {
 | 
				
			||||||
			pieces = append(pieces, "+")
 | 
								pieces = append(pieces, "+")
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			pieces = append(pieces, types.String(provinceId))
 | 
								pieces = append(pieces, this.formatUint64(uint64(provinceId)))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		pieces = append(pieces, "")
 | 
							pieces = append(pieces, "")
 | 
				
			||||||
@@ -153,7 +153,7 @@ func (this *Writer) Write(ipFrom string, ipTo string, countryId int64, provinceI
 | 
				
			|||||||
		if cityId == this.lastCityId {
 | 
							if cityId == this.lastCityId {
 | 
				
			||||||
			pieces = append(pieces, "+")
 | 
								pieces = append(pieces, "+")
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			pieces = append(pieces, types.String(cityId))
 | 
								pieces = append(pieces, this.formatUint64(uint64(cityId)))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		pieces = append(pieces, "")
 | 
							pieces = append(pieces, "")
 | 
				
			||||||
@@ -165,7 +165,7 @@ func (this *Writer) Write(ipFrom string, ipTo string, countryId int64, provinceI
 | 
				
			|||||||
		if townId == this.lastTownId {
 | 
							if townId == this.lastTownId {
 | 
				
			||||||
			pieces = append(pieces, "+")
 | 
								pieces = append(pieces, "+")
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			pieces = append(pieces, types.String(townId))
 | 
								pieces = append(pieces, this.formatUint64(uint64(townId)))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		pieces = append(pieces, "")
 | 
							pieces = append(pieces, "")
 | 
				
			||||||
@@ -177,7 +177,7 @@ func (this *Writer) Write(ipFrom string, ipTo string, countryId int64, provinceI
 | 
				
			|||||||
		if providerId == this.lastProviderId {
 | 
							if providerId == this.lastProviderId {
 | 
				
			||||||
			pieces = append(pieces, "+")
 | 
								pieces = append(pieces, "+")
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			pieces = append(pieces, types.String(providerId))
 | 
								pieces = append(pieces, this.formatUint64(uint64(providerId)))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		pieces = append(pieces, "")
 | 
							pieces = append(pieces, "")
 | 
				
			||||||
@@ -196,3 +196,7 @@ func (this *Writer) Write(ipFrom string, ipTo string, countryId int64, provinceI
 | 
				
			|||||||
func (this *Writer) Sum() string {
 | 
					func (this *Writer) Sum() string {
 | 
				
			||||||
	return this.writer.Sum()
 | 
						return this.writer.Sum()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *Writer) formatUint64(i uint64) string {
 | 
				
			||||||
 | 
						return strconv.FormatUint(i, 32)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,11 +10,12 @@ import (
 | 
				
			|||||||
type FileWriter struct {
 | 
					type FileWriter struct {
 | 
				
			||||||
	fp       *os.File
 | 
						fp       *os.File
 | 
				
			||||||
	gzWriter *gzip.Writer
 | 
						gzWriter *gzip.Writer
 | 
				
			||||||
 | 
						password string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rawWriter *Writer
 | 
						rawWriter *Writer
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewFileWriter(path string, meta *Meta) (*FileWriter, error) {
 | 
					func NewFileWriter(path string, meta *Meta, password string) (*FileWriter, error) {
 | 
				
			||||||
	fp, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
 | 
						fp, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -29,6 +30,7 @@ func NewFileWriter(path string, meta *Meta) (*FileWriter, error) {
 | 
				
			|||||||
		fp:        fp,
 | 
							fp:        fp,
 | 
				
			||||||
		gzWriter:  gzWriter,
 | 
							gzWriter:  gzWriter,
 | 
				
			||||||
		rawWriter: NewWriter(gzWriter, meta),
 | 
							rawWriter: NewWriter(gzWriter, meta),
 | 
				
			||||||
 | 
							password:  password,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return writer, nil
 | 
						return writer, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -54,5 +56,25 @@ func (this *FileWriter) Close() error {
 | 
				
			|||||||
	if err2 != nil {
 | 
						if err2 != nil {
 | 
				
			||||||
		return err2
 | 
							return err2
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 加密内容
 | 
				
			||||||
 | 
						if len(this.password) > 0 {
 | 
				
			||||||
 | 
							var filePath = this.fp.Name()
 | 
				
			||||||
 | 
							data, err := os.ReadFile(filePath)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if len(data) > 0 {
 | 
				
			||||||
 | 
								encodedData, err := NewEncrypt().Encode(data, this.password)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								err = os.WriteFile(filePath, encodedData, 0666)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,9 +10,9 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestNewFileWriter(t *testing.T) {
 | 
					func TestNewFileWriter(t *testing.T) {
 | 
				
			||||||
	writer, err := iplibrary.NewFileWriter("./internal-ip-library.db", &iplibrary.Meta{
 | 
						writer, err := iplibrary.NewFileWriter("./internal-ip-library-test.db", &iplibrary.Meta{
 | 
				
			||||||
		Author: "GoEdge",
 | 
							Author: "GoEdge",
 | 
				
			||||||
	})
 | 
						}, "")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -41,7 +41,7 @@ func TestNewFileWriter(t *testing.T) {
 | 
				
			|||||||
		return types.String(rands.Int(0, 255))
 | 
							return types.String(rands.Int(0, 255))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i := 0; i < 1_000_000; i++ {
 | 
						for i := 0; i < 1; i++ {
 | 
				
			||||||
		err = writer.Write(n()+"."+n()+"."+n()+"."+n(), n()+"."+n()+"."+n()+"."+n(), int64(i)+100, 201, 301, 401, 501)
 | 
							err = writer.Write(n()+"."+n()+"."+n()+"."+n(), n()+"."+n()+"."+n()+"."+n(), int64(i)+100, 201, 301, 401, 501)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			t.Fatal(err)
 | 
								t.Fatal(err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@ type AES256CFBMethod struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (this *AES256CFBMethod) Init(key, iv []byte) error {
 | 
					func (this *AES256CFBMethod) Init(key, iv []byte) error {
 | 
				
			||||||
	// 判断key是否为32长度
 | 
						// 判断key是否为32长度
 | 
				
			||||||
	l := len(key)
 | 
						var l = len(key)
 | 
				
			||||||
	if l > 32 {
 | 
						if l > 32 {
 | 
				
			||||||
		key = key[:32]
 | 
							key = key[:32]
 | 
				
			||||||
	} else if l < 32 {
 | 
						} else if l < 32 {
 | 
				
			||||||
@@ -27,7 +27,7 @@ func (this *AES256CFBMethod) Init(key, iv []byte) error {
 | 
				
			|||||||
	this.block = block
 | 
						this.block = block
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 判断iv长度
 | 
						// 判断iv长度
 | 
				
			||||||
	l2 := len(iv)
 | 
						var l2 = len(iv)
 | 
				
			||||||
	if l2 > aes.BlockSize {
 | 
						if l2 > aes.BlockSize {
 | 
				
			||||||
		iv = iv[:aes.BlockSize]
 | 
							iv = iv[:aes.BlockSize]
 | 
				
			||||||
	} else if l2 < aes.BlockSize {
 | 
						} else if l2 < aes.BlockSize {
 | 
				
			||||||
@@ -49,7 +49,7 @@ func (this *AES256CFBMethod) Encrypt(src []byte) (dst []byte, err error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	dst = make([]byte, len(src))
 | 
						dst = make([]byte, len(src))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	encrypter := cipher.NewCFBEncrypter(this.block, this.iv)
 | 
						var encrypter = cipher.NewCFBEncrypter(this.block, this.iv)
 | 
				
			||||||
	encrypter.XORKeyStream(dst, src)
 | 
						encrypter.XORKeyStream(dst, src)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
@@ -65,7 +65,7 @@ func (this *AES256CFBMethod) Decrypt(dst []byte) (src []byte, err error) {
 | 
				
			|||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	src = make([]byte, len(dst))
 | 
						src = make([]byte, len(dst))
 | 
				
			||||||
	decrypter := cipher.NewCFBDecrypter(this.block, this.iv)
 | 
						var decrypter = cipher.NewCFBDecrypter(this.block, this.iv)
 | 
				
			||||||
	decrypter.XORKeyStream(src, dst)
 | 
						decrypter.XORKeyStream(src, dst)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,6 +44,7 @@ type IPLibraryFile struct {
 | 
				
			|||||||
	Cities          []*IPLibraryFile_City     `protobuf:"bytes,12,rep,name=cities,proto3" json:"cities,omitempty"`
 | 
						Cities          []*IPLibraryFile_City     `protobuf:"bytes,12,rep,name=cities,proto3" json:"cities,omitempty"`
 | 
				
			||||||
	Towns           []*IPLibraryFile_Town     `protobuf:"bytes,13,rep,name=towns,proto3" json:"towns,omitempty"`
 | 
						Towns           []*IPLibraryFile_Town     `protobuf:"bytes,13,rep,name=towns,proto3" json:"towns,omitempty"`
 | 
				
			||||||
	ProviderNames   []string                  `protobuf:"bytes,14,rep,name=providerNames,proto3" json:"providerNames,omitempty"`
 | 
						ProviderNames   []string                  `protobuf:"bytes,14,rep,name=providerNames,proto3" json:"providerNames,omitempty"`
 | 
				
			||||||
 | 
						Password        string                    `protobuf:"bytes,15,opt,name=password,proto3" json:"password,omitempty"` // 密码
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *IPLibraryFile) Reset() {
 | 
					func (x *IPLibraryFile) Reset() {
 | 
				
			||||||
@@ -176,6 +177,13 @@ func (x *IPLibraryFile) GetProviderNames() []string {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *IPLibraryFile) GetPassword() string {
 | 
				
			||||||
 | 
						if x != nil {
 | 
				
			||||||
 | 
							return x.Password
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type IPLibraryFile_Province struct {
 | 
					type IPLibraryFile_Province struct {
 | 
				
			||||||
	state         protoimpl.MessageState
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
@@ -370,7 +378,7 @@ var File_models_model_ip_library_file_proto protoreflect.FileDescriptor
 | 
				
			|||||||
var file_models_model_ip_library_file_proto_rawDesc = []byte{
 | 
					var file_models_model_ip_library_file_proto_rawDesc = []byte{
 | 
				
			||||||
	0x0a, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69,
 | 
						0x0a, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69,
 | 
				
			||||||
	0x70, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x70,
 | 
						0x70, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x70,
 | 
				
			||||||
	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0xb8, 0x06, 0x0a, 0x0d, 0x49, 0x50, 0x4c,
 | 
						0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0xd4, 0x06, 0x0a, 0x0d, 0x49, 0x50, 0x4c,
 | 
				
			||||||
	0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
 | 
						0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
 | 
				
			||||||
	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
 | 
						0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
 | 
				
			||||||
	0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16,
 | 
						0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16,
 | 
				
			||||||
@@ -402,28 +410,29 @@ var file_models_model_ip_library_file_proto_rawDesc = []byte{
 | 
				
			|||||||
	0x6f, 0x77, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x77, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72,
 | 
						0x6f, 0x77, 0x6e, 0x52, 0x05, 0x74, 0x6f, 0x77, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72,
 | 
				
			||||||
	0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28,
 | 
						0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28,
 | 
				
			||||||
	0x09, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73,
 | 
						0x09, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73,
 | 
				
			||||||
	0x1a, 0x50, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b,
 | 
						0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01,
 | 
				
			||||||
	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
 | 
						0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x50, 0x0a, 0x08,
 | 
				
			||||||
	0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22,
 | 
						0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x6e,
 | 
				
			||||||
	0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02,
 | 
						0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63,
 | 
				
			||||||
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61,
 | 
						0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72,
 | 
				
			||||||
	0x6d, 0x65, 0x1a, 0x68, 0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f,
 | 
						0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
 | 
				
			||||||
	0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
						0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x68,
 | 
				
			||||||
	0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c,
 | 
						0x0a, 0x04, 0x43, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72,
 | 
				
			||||||
	0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
 | 
						0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75,
 | 
				
			||||||
	0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65,
 | 
						0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76,
 | 
				
			||||||
	0x12, 0x1a, 0x0a, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,
 | 
						0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
 | 
				
			||||||
	0x28, 0x09, 0x52, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x84, 0x01, 0x0a,
 | 
						0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08,
 | 
				
			||||||
	0x04, 0x54, 0x6f, 0x77, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79,
 | 
						0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
 | 
				
			||||||
	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e,
 | 
						0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x84, 0x01, 0x0a, 0x04, 0x54, 0x6f, 0x77,
 | 
				
			||||||
	0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69,
 | 
						0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65,
 | 
				
			||||||
	0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70,
 | 
						0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e,
 | 
				
			||||||
	0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63,
 | 
						0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e,
 | 
				
			||||||
	0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63,
 | 
						0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69,
 | 
				
			||||||
	0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x77, 0x6e, 0x4e,
 | 
						0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e,
 | 
				
			||||||
	0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x77, 0x6e, 0x4e,
 | 
						0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e,
 | 
				
			||||||
	0x61, 0x6d, 0x65, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f,
 | 
						0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18,
 | 
				
			||||||
	0x74, 0x6f, 0x33,
 | 
						0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x42,
 | 
				
			||||||
 | 
						0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -311,6 +311,7 @@ type CreateIPLibraryFileRequest struct {
 | 
				
			|||||||
	CitiesJSON    []byte   `protobuf:"bytes,7,opt,name=citiesJSON,proto3" json:"citiesJSON,omitempty"`
 | 
						CitiesJSON    []byte   `protobuf:"bytes,7,opt,name=citiesJSON,proto3" json:"citiesJSON,omitempty"`
 | 
				
			||||||
	TownsJSON     []byte   `protobuf:"bytes,8,opt,name=townsJSON,proto3" json:"townsJSON,omitempty"`
 | 
						TownsJSON     []byte   `protobuf:"bytes,8,opt,name=townsJSON,proto3" json:"townsJSON,omitempty"`
 | 
				
			||||||
	ProvidersJSON []byte   `protobuf:"bytes,9,opt,name=providersJSON,proto3" json:"providersJSON,omitempty"`
 | 
						ProvidersJSON []byte   `protobuf:"bytes,9,opt,name=providersJSON,proto3" json:"providersJSON,omitempty"`
 | 
				
			||||||
 | 
						Password      string   `protobuf:"bytes,10,opt,name=password,proto3" json:"password,omitempty"` // 密码
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (x *CreateIPLibraryFileRequest) Reset() {
 | 
					func (x *CreateIPLibraryFileRequest) Reset() {
 | 
				
			||||||
@@ -408,6 +409,13 @@ func (x *CreateIPLibraryFileRequest) GetProvidersJSON() []byte {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (x *CreateIPLibraryFileRequest) GetPassword() string {
 | 
				
			||||||
 | 
						if x != nil {
 | 
				
			||||||
 | 
							return x.Password
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type CreateIPLibraryFileResponse struct {
 | 
					type CreateIPLibraryFileResponse struct {
 | 
				
			||||||
	state         protoimpl.MessageState
 | 
						state         protoimpl.MessageState
 | 
				
			||||||
	sizeCache     protoimpl.SizeCache
 | 
						sizeCache     protoimpl.SizeCache
 | 
				
			||||||
@@ -1444,7 +1452,7 @@ var file_service_ip_library_file_proto_rawDesc = []byte{
 | 
				
			|||||||
	0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20,
 | 
						0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20,
 | 
				
			||||||
	0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61,
 | 
						0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61,
 | 
				
			||||||
	0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x0d, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
						0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x0d, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb6, 0x02, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
 | 
						0x79, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xd2, 0x02, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
 | 
				
			||||||
	0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71,
 | 
						0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71,
 | 
				
			||||||
	0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
 | 
						0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
 | 
				
			||||||
	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70,
 | 
						0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70,
 | 
				
			||||||
@@ -1463,227 +1471,229 @@ var file_service_ip_library_file_proto_rawDesc = []byte{
 | 
				
			|||||||
	0x77, 0x6e, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x74,
 | 
						0x77, 0x6e, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x74,
 | 
				
			||||||
	0x6f, 0x77, 0x6e, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76,
 | 
						0x6f, 0x77, 0x6e, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76,
 | 
				
			||||||
	0x69, 0x64, 0x65, 0x72, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52,
 | 
						0x69, 0x64, 0x65, 0x72, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52,
 | 
				
			||||||
	0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x22, 0x47,
 | 
						0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x1a,
 | 
				
			||||||
	0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
						0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09,
 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a,
 | 
						0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x47, 0x0a, 0x1b, 0x43, 0x72,
 | 
				
			||||||
	0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64,
 | 
						0x65, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
						0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c,
 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x54, 0x0a, 0x28, 0x43, 0x68, 0x65, 0x63, 0x6b,
 | 
						0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01,
 | 
				
			||||||
	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c,
 | 
						0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
	0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75,
 | 
						0x65, 0x49, 0x64, 0x22, 0x54, 0x0a, 0x28, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e,
 | 
				
			||||||
	0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
 | 
					 | 
				
			||||||
	0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x70,
 | 
					 | 
				
			||||||
	0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x88, 0x02,
 | 
					 | 
				
			||||||
	0x0a, 0x29, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73,
 | 
					 | 
				
			||||||
	0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
					 | 
				
			||||||
	0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x10, 0x6d,
 | 
					 | 
				
			||||||
	0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18,
 | 
					 | 
				
			||||||
	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b,
 | 
					 | 
				
			||||||
	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c,
 | 
					 | 
				
			||||||
	0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70,
 | 
					 | 
				
			||||||
	0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e,
 | 
					 | 
				
			||||||
	0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e,
 | 
					 | 
				
			||||||
	0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x71, 0x0a, 0x0e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67,
 | 
					 | 
				
			||||||
	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74,
 | 
					 | 
				
			||||||
	0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f,
 | 
					 | 
				
			||||||
	0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x10, 0x73, 0x69, 0x6d,
 | 
					 | 
				
			||||||
	0x69, 0x6c, 0x61, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20,
 | 
					 | 
				
			||||||
	0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x43,
 | 
					 | 
				
			||||||
	0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x43,
 | 
					 | 
				
			||||||
	0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x28, 0x43, 0x68, 0x65, 0x63,
 | 
					 | 
				
			||||||
	0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50,
 | 
					 | 
				
			||||||
	0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71,
 | 
					 | 
				
			||||||
	0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
					 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69,
 | 
					 | 
				
			||||||
	0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0xb0,
 | 
					 | 
				
			||||||
	0x02, 0x0a, 0x29, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65,
 | 
					 | 
				
			||||||
	0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69,
 | 
					 | 
				
			||||||
	0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x10,
 | 
					 | 
				
			||||||
	0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x73,
 | 
					 | 
				
			||||||
	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63,
 | 
					 | 
				
			||||||
	0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50,
 | 
					 | 
				
			||||||
	0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73,
 | 
					 | 
				
			||||||
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f,
 | 
					 | 
				
			||||||
	0x76, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x10, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72,
 | 
					 | 
				
			||||||
	0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x97, 0x01, 0x0a, 0x0f, 0x4d, 0x69, 0x73, 0x73,
 | 
					 | 
				
			||||||
	0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63,
 | 
					 | 
				
			||||||
	0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
 | 
					 | 
				
			||||||
	0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a,
 | 
					 | 
				
			||||||
	0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
 | 
					 | 
				
			||||||
	0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d,
 | 
					 | 
				
			||||||
	0x65, 0x12, 0x3e, 0x0a, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x76,
 | 
					 | 
				
			||||||
	0x69, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62,
 | 
					 | 
				
			||||||
	0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x52,
 | 
					 | 
				
			||||||
	0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65,
 | 
					 | 
				
			||||||
	0x73, 0x22, 0x51, 0x0a, 0x25, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73,
 | 
					 | 
				
			||||||
	0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
					 | 
				
			||||||
	0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70,
 | 
					 | 
				
			||||||
	0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20,
 | 
					 | 
				
			||||||
	0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69,
 | 
					 | 
				
			||||||
	0x6c, 0x65, 0x49, 0x64, 0x22, 0xae, 0x02, 0x0a, 0x26, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69,
 | 
					 | 
				
			||||||
	0x74, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
					 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
 | 
					 | 
				
			||||||
	0x5c, 0x0a, 0x0d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73,
 | 
					 | 
				
			||||||
	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63,
 | 
					 | 
				
			||||||
	0x6b, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62,
 | 
					 | 
				
			||||||
	0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
 | 
					 | 
				
			||||||
	0x73, 0x65, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x69, 0x74, 0x79, 0x52, 0x0d,
 | 
					 | 
				
			||||||
	0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xa5, 0x01,
 | 
					 | 
				
			||||||
	0x0a, 0x0b, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a,
 | 
					 | 
				
			||||||
	0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
 | 
					 | 
				
			||||||
	0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12,
 | 
					 | 
				
			||||||
	0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18,
 | 
					 | 
				
			||||||
	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e,
 | 
					 | 
				
			||||||
	0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18,
 | 
					 | 
				
			||||||
	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12,
 | 
					 | 
				
			||||||
	0x34, 0x0a, 0x0d, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73,
 | 
					 | 
				
			||||||
	0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69,
 | 
					 | 
				
			||||||
	0x6f, 0x6e, 0x43, 0x69, 0x74, 0x79, 0x52, 0x0d, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x43,
 | 
					 | 
				
			||||||
	0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x24, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f,
 | 
					 | 
				
			||||||
	0x77, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
 | 
					 | 
				
			||||||
	0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a,
 | 
					 | 
				
			||||||
	0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64,
 | 
					 | 
				
			||||||
	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
					 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0xc4, 0x02, 0x0a, 0x25, 0x43, 0x68, 0x65, 0x63,
 | 
					 | 
				
			||||||
	0x6b, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72,
 | 
					 | 
				
			||||||
	0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 | 
					 | 
				
			||||||
	0x65, 0x12, 0x59, 0x0a, 0x0c, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x77, 0x6e,
 | 
					 | 
				
			||||||
	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65,
 | 
					 | 
				
			||||||
	0x63, 0x6b, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62,
 | 
					 | 
				
			||||||
	0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
 | 
					 | 
				
			||||||
	0x73, 0x65, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x77, 0x6e, 0x52, 0x0c,
 | 
					 | 
				
			||||||
	0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x1a, 0xbf, 0x01, 0x0a,
 | 
					 | 
				
			||||||
	0x0b, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x77, 0x6e, 0x12, 0x20, 0x0a, 0x0b,
 | 
					 | 
				
			||||||
	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
 | 
					 | 
				
			||||||
	0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22,
 | 
					 | 
				
			||||||
	0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02,
 | 
					 | 
				
			||||||
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61,
 | 
					 | 
				
			||||||
	0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03,
 | 
					 | 
				
			||||||
	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a,
 | 
					 | 
				
			||||||
	0x0a, 0x08, 0x74, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
 | 
					 | 
				
			||||||
	0x52, 0x08, 0x74, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x0c, 0x73, 0x69,
 | 
					 | 
				
			||||||
	0x6d, 0x69, 0x6c, 0x61, 0x72, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b,
 | 
					 | 
				
			||||||
	0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x77, 0x6e,
 | 
					 | 
				
			||||||
	0x52, 0x0c, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x22, 0x54,
 | 
					 | 
				
			||||||
	0x0a, 0x28, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73,
 | 
					 | 
				
			||||||
	0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
					 | 
				
			||||||
	0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70,
 | 
					 | 
				
			||||||
	0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20,
 | 
					 | 
				
			||||||
	0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69,
 | 
					 | 
				
			||||||
	0x6c, 0x65, 0x49, 0x64, 0x22, 0x8d, 0x02, 0x0a, 0x29, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72,
 | 
					 | 
				
			||||||
	0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62,
 | 
					 | 
				
			||||||
	0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
 | 
					 | 
				
			||||||
	0x73, 0x65, 0x12, 0x69, 0x0a, 0x10, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f,
 | 
					 | 
				
			||||||
	0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70,
 | 
					 | 
				
			||||||
	0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73,
 | 
					 | 
				
			||||||
	0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
					 | 
				
			||||||
	0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x69, 0x73, 0x73,
 | 
					 | 
				
			||||||
	0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x10, 0x6d, 0x69, 0x73,
 | 
					 | 
				
			||||||
	0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x75, 0x0a,
 | 
					 | 
				
			||||||
	0x0f, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72,
 | 
					 | 
				
			||||||
	0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65,
 | 
					 | 
				
			||||||
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72,
 | 
					 | 
				
			||||||
	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x50,
 | 
					 | 
				
			||||||
	0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12,
 | 
					 | 
				
			||||||
	0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64,
 | 
					 | 
				
			||||||
	0x65, 0x72, 0x52, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69,
 | 
					 | 
				
			||||||
	0x64, 0x65, 0x72, 0x73, 0x22, 0x48, 0x0a, 0x1c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
 | 
					 | 
				
			||||||
	0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71,
 | 
					 | 
				
			||||||
	0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
					 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69,
 | 
					 | 
				
			||||||
	0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x4e,
 | 
					 | 
				
			||||||
	0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
					 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71,
 | 
					 | 
				
			||||||
	0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
					 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69,
 | 
					 | 
				
			||||||
	0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x46,
 | 
					 | 
				
			||||||
	0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
					 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f,
 | 
					 | 
				
			||||||
	0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18,
 | 
					 | 
				
			||||||
	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
 | 
					 | 
				
			||||||
	0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x32, 0x93, 0x0a, 0x0a, 0x14, 0x49, 0x50, 0x4c, 0x69, 0x62,
 | 
					 | 
				
			||||||
	0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
 | 
					 | 
				
			||||||
	0x74, 0x0a, 0x1d, 0x66, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68,
 | 
					 | 
				
			||||||
	0x65, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73,
 | 
					 | 
				
			||||||
	0x12, 0x28, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x6e,
 | 
					 | 
				
			||||||
	0x69, 0x73, 0x68, 0x65, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69,
 | 
					 | 
				
			||||||
	0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x70, 0x62, 0x2e,
 | 
					 | 
				
			||||||
	0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x49,
 | 
					 | 
				
			||||||
	0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73,
 | 
					 | 
				
			||||||
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x1f, 0x66, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c,
 | 
					 | 
				
			||||||
	0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72,
 | 
					 | 
				
			||||||
	0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69,
 | 
					 | 
				
			||||||
	0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x49,
 | 
					 | 
				
			||||||
	0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71,
 | 
					 | 
				
			||||||
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c,
 | 
					 | 
				
			||||||
	0x6c, 0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62,
 | 
					 | 
				
			||||||
	0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 | 
					 | 
				
			||||||
	0x65, 0x12, 0x50, 0x0a, 0x11, 0x66, 0x69, 0x6e, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61,
 | 
					 | 
				
			||||||
	0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64,
 | 
					 | 
				
			||||||
	0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71,
 | 
					 | 
				
			||||||
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x49, 0x50,
 | 
					 | 
				
			||||||
	0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
 | 
					 | 
				
			||||||
	0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c,
 | 
					 | 
				
			||||||
	0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x70, 0x62, 0x2e,
 | 
					 | 
				
			||||||
	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46,
 | 
					 | 
				
			||||||
	0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x2e,
 | 
					 | 
				
			||||||
	0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46,
 | 
					 | 
				
			||||||
	0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x21,
 | 
					 | 
				
			||||||
	0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x69,
 | 
					 | 
				
			||||||
	0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49,
 | 
					 | 
				
			||||||
	0x64, 0x12, 0x2c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e,
 | 
					 | 
				
			||||||
	0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61,
 | 
						0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61,
 | 
				
			||||||
	0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
 | 
						0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
 | 
				
			||||||
	0x2d, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72,
 | 
						0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65,
 | 
				
			||||||
	0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
 | 
						0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72,
 | 
				
			||||||
	0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80,
 | 
						0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x88, 0x02, 0x0a, 0x29, 0x43, 0x68,
 | 
				
			||||||
	0x01, 0x0a, 0x21, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65,
 | 
						0x65, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68,
 | 
				
			||||||
	0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69,
 | 
						0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52,
 | 
				
			||||||
	0x6c, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50,
 | 
						0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x10, 0x6d, 0x69, 0x73, 0x73, 0x69,
 | 
				
			||||||
	0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69,
 | 
						0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
 | 
				
			||||||
	0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
 | 
						0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e,
 | 
				
			||||||
	0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f,
 | 
						0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61,
 | 
				
			||||||
 | 
						0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
 | 
				
			||||||
 | 
						0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x52,
 | 
				
			||||||
 | 
						0x10, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65,
 | 
				
			||||||
 | 
						0x73, 0x1a, 0x71, 0x0a, 0x0e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e,
 | 
				
			||||||
 | 
						0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61,
 | 
				
			||||||
 | 
						0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72,
 | 
				
			||||||
 | 
						0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72,
 | 
				
			||||||
 | 
						0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
 | 
				
			||||||
 | 
						0x11, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74,
 | 
				
			||||||
 | 
						0x72, 0x79, 0x52, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74,
 | 
				
			||||||
 | 
						0x72, 0x69, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x28, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f,
 | 
				
			||||||
 | 
						0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72,
 | 
				
			||||||
 | 
						0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
				
			||||||
 | 
						0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
 | 
						0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62,
 | 
				
			||||||
 | 
						0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0xb0, 0x02, 0x0a, 0x29, 0x43,
 | 
				
			||||||
 | 
						0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x57, 0x69, 0x74,
 | 
				
			||||||
 | 
						0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64,
 | 
				
			||||||
 | 
						0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x10, 0x6d, 0x69, 0x73, 0x73,
 | 
				
			||||||
 | 
						0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
 | 
				
			||||||
 | 
						0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f,
 | 
				
			||||||
	0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72,
 | 
						0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72,
 | 
				
			||||||
	0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 | 
						0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 | 
				
			||||||
	0x65, 0x12, 0x77, 0x0a, 0x1e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73,
 | 
						0x65, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63,
 | 
				
			||||||
 | 
						0x65, 0x52, 0x10, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e,
 | 
				
			||||||
 | 
						0x63, 0x65, 0x73, 0x1a, 0x97, 0x01, 0x0a, 0x0f, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50,
 | 
				
			||||||
 | 
						0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74,
 | 
				
			||||||
 | 
						0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f,
 | 
				
			||||||
 | 
						0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f,
 | 
				
			||||||
 | 
						0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
 | 
				
			||||||
 | 
						0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a,
 | 
				
			||||||
 | 
						0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65,
 | 
				
			||||||
 | 
						0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67,
 | 
				
			||||||
 | 
						0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x10, 0x73, 0x69, 0x6d,
 | 
				
			||||||
 | 
						0x69, 0x6c, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x51, 0x0a,
 | 
				
			||||||
 | 
						0x25, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68,
 | 
				
			||||||
 | 
						0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52,
 | 
				
			||||||
 | 
						0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72,
 | 
				
			||||||
 | 
						0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
 | 
				
			||||||
 | 
						0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64,
 | 
				
			||||||
 | 
						0x22, 0xae, 0x02, 0x0a, 0x26, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73,
 | 
				
			||||||
	0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
						0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
	0x65, 0x49, 0x64, 0x12, 0x29, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69,
 | 
						0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0d, 0x6d,
 | 
				
			||||||
	0x74, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
						0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03,
 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a,
 | 
						0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69, 0x74,
 | 
				
			||||||
	0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73, 0x57,
 | 
						0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
 | 
				
			||||||
 | 
						0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d,
 | 
				
			||||||
 | 
						0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x69, 0x74, 0x79, 0x52, 0x0d, 0x6d, 0x69, 0x73, 0x73,
 | 
				
			||||||
 | 
						0x69, 0x6e, 0x67, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xa5, 0x01, 0x0a, 0x0b, 0x4d, 0x69,
 | 
				
			||||||
 | 
						0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x75,
 | 
				
			||||||
 | 
						0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
 | 
				
			||||||
 | 
						0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70,
 | 
				
			||||||
 | 
						0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
 | 
				
			||||||
 | 
						0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12,
 | 
				
			||||||
 | 
						0x1a, 0x0a, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
 | 
				
			||||||
 | 
						0x09, 0x52, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x0d, 0x73,
 | 
				
			||||||
 | 
						0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03,
 | 
				
			||||||
 | 
						0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x43, 0x69,
 | 
				
			||||||
 | 
						0x74, 0x79, 0x52, 0x0d, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x69, 0x65,
 | 
				
			||||||
 | 
						0x73, 0x22, 0x50, 0x0a, 0x24, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x57,
 | 
				
			||||||
	0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65,
 | 
						0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65,
 | 
				
			||||||
	0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x1d, 0x63, 0x68,
 | 
						0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c,
 | 
				
			||||||
	0x65, 0x63, 0x6b, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69,
 | 
						0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01,
 | 
				
			||||||
	0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x28, 0x2e, 0x70, 0x62,
 | 
						0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
	0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49,
 | 
						0x65, 0x49, 0x64, 0x22, 0xc4, 0x02, 0x0a, 0x25, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x77,
 | 
				
			||||||
	0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65,
 | 
						0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46,
 | 
				
			||||||
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b,
 | 
						0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a,
 | 
				
			||||||
	0x54, 0x6f, 0x77, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61,
 | 
						0x0c, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x18, 0x01, 0x20,
 | 
				
			||||||
	0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
 | 
						0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f,
 | 
				
			||||||
	0x12, 0x80, 0x01, 0x0a, 0x21, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64,
 | 
						0x77, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
 | 
				
			||||||
 | 
						0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d,
 | 
				
			||||||
 | 
						0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x77, 0x6e, 0x52, 0x0c, 0x6d, 0x69, 0x73, 0x73,
 | 
				
			||||||
 | 
						0x69, 0x6e, 0x67, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x1a, 0xbf, 0x01, 0x0a, 0x0b, 0x4d, 0x69, 0x73,
 | 
				
			||||||
 | 
						0x73, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x77, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x6e,
 | 
				
			||||||
 | 
						0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63,
 | 
				
			||||||
 | 
						0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x72,
 | 
				
			||||||
 | 
						0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
 | 
				
			||||||
 | 
						0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a,
 | 
				
			||||||
 | 
						0x0a, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
 | 
				
			||||||
 | 
						0x52, 0x08, 0x63, 0x69, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f,
 | 
				
			||||||
 | 
						0x77, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f,
 | 
				
			||||||
 | 
						0x77, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x0c, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61,
 | 
				
			||||||
 | 
						0x72, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70,
 | 
				
			||||||
 | 
						0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x77, 0x6e, 0x52, 0x0c, 0x73, 0x69,
 | 
				
			||||||
 | 
						0x6d, 0x69, 0x6c, 0x61, 0x72, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x22, 0x54, 0x0a, 0x28, 0x43, 0x68,
 | 
				
			||||||
 | 
						0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68,
 | 
				
			||||||
 | 
						0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52,
 | 
				
			||||||
 | 
						0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72,
 | 
				
			||||||
 | 
						0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
 | 
				
			||||||
 | 
						0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64,
 | 
				
			||||||
 | 
						0x22, 0x8d, 0x02, 0x0a, 0x29, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64,
 | 
				
			||||||
	0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
 | 
						0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
 | 
				
			||||||
	0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63,
 | 
						0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69,
 | 
				
			||||||
	0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50,
 | 
						0x0a, 0x10, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65,
 | 
				
			||||||
	0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71,
 | 
						0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68,
 | 
				
			||||||
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50,
 | 
						0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68,
 | 
				
			||||||
	0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69,
 | 
						0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52,
 | 
				
			||||||
	0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
 | 
						0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x50,
 | 
				
			||||||
	0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x15, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49,
 | 
						0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x10, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67,
 | 
				
			||||||
	0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x2e, 0x70,
 | 
						0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x75, 0x0a, 0x0f, 0x4d, 0x69, 0x73,
 | 
				
			||||||
	0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72,
 | 
						0x73, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c,
 | 
				
			||||||
	0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e,
 | 
						0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
 | 
				
			||||||
	0x2e, 0x70, 0x62, 0x2e, 0x52, 0x50, 0x43, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x55,
 | 
						0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65,
 | 
				
			||||||
	0x0a, 0x1b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
						0x12, 0x3e, 0x0a, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69,
 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x26, 0x2e,
 | 
						0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x2e,
 | 
				
			||||||
	0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61,
 | 
						0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x10,
 | 
				
			||||||
	0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65,
 | 
						0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73,
 | 
				
			||||||
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x50, 0x43, 0x53, 0x75,
 | 
						0x22, 0x48, 0x0a, 0x1c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69,
 | 
				
			||||||
	0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x45, 0x0a, 0x13, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49,
 | 
						0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
				
			||||||
	0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x70,
 | 
						0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
	0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
						0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62,
 | 
				
			||||||
	0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70,
 | 
						0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x22, 0x55, 0x70,
 | 
				
			||||||
	0x62, 0x2e, 0x52, 0x50, 0x43, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x06, 0x5a, 0x04,
 | 
						0x64, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
	0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
						0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
				
			||||||
 | 
						0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
 | 
						0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62,
 | 
				
			||||||
 | 
						0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x46, 0x0a, 0x1a, 0x44, 0x65,
 | 
				
			||||||
 | 
						0x6c, 0x65, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
 | 
						0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x70, 0x4c, 0x69,
 | 
				
			||||||
 | 
						0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
 | 
				
			||||||
 | 
						0x03, 0x52, 0x0f, 0x69, 0x70, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65,
 | 
				
			||||||
 | 
						0x49, 0x64, 0x32, 0x93, 0x0a, 0x0a, 0x14, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
 | 
				
			||||||
 | 
						0x46, 0x69, 0x6c, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x74, 0x0a, 0x1d, 0x66,
 | 
				
			||||||
 | 
						0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x49, 0x50,
 | 
				
			||||||
 | 
						0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x70,
 | 
				
			||||||
 | 
						0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65,
 | 
				
			||||||
 | 
						0x64, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52,
 | 
				
			||||||
 | 
						0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64,
 | 
				
			||||||
 | 
						0x41, 0x6c, 0x6c, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62,
 | 
				
			||||||
 | 
						0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
 | 
				
			||||||
 | 
						0x65, 0x12, 0x7a, 0x0a, 0x1f, 0x66, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x66, 0x69,
 | 
				
			||||||
 | 
						0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46,
 | 
				
			||||||
 | 
						0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c,
 | 
				
			||||||
 | 
						0x6c, 0x55, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62,
 | 
				
			||||||
 | 
						0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
				
			||||||
 | 
						0x1a, 0x2b, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x55, 0x6e, 0x66,
 | 
				
			||||||
 | 
						0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
 | 
				
			||||||
 | 
						0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a,
 | 
				
			||||||
 | 
						0x11, 0x66, 0x69, 0x6e, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69,
 | 
				
			||||||
 | 
						0x6c, 0x65, 0x12, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x49, 0x50, 0x4c, 0x69,
 | 
				
			||||||
 | 
						0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
				
			||||||
 | 
						0x1a, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72,
 | 
				
			||||||
 | 
						0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
 | 
				
			||||||
 | 
						0x56, 0x0a, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61,
 | 
				
			||||||
 | 
						0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61,
 | 
				
			||||||
 | 
						0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52,
 | 
				
			||||||
 | 
						0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61,
 | 
				
			||||||
 | 
						0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x52,
 | 
				
			||||||
 | 
						0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x21, 0x63, 0x68, 0x65, 0x63,
 | 
				
			||||||
 | 
						0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50,
 | 
				
			||||||
 | 
						0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x2e,
 | 
				
			||||||
 | 
						0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65,
 | 
				
			||||||
 | 
						0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69,
 | 
				
			||||||
 | 
						0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x70, 0x62,
 | 
				
			||||||
 | 
						0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x57,
 | 
				
			||||||
 | 
						0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65,
 | 
				
			||||||
 | 
						0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x21, 0x63,
 | 
				
			||||||
 | 
						0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x57, 0x69, 0x74,
 | 
				
			||||||
 | 
						0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64,
 | 
				
			||||||
 | 
						0x12, 0x2c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69,
 | 
				
			||||||
 | 
						0x6e, 0x63, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
				
			||||||
 | 
						0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d,
 | 
				
			||||||
 | 
						0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63,
 | 
				
			||||||
 | 
						0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46,
 | 
				
			||||||
 | 
						0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a,
 | 
				
			||||||
 | 
						0x1e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68,
 | 
				
			||||||
 | 
						0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12,
 | 
				
			||||||
 | 
						0x29, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73,
 | 
				
			||||||
 | 
						0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
 | 
						0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x70, 0x62, 0x2e,
 | 
				
			||||||
 | 
						0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x69, 0x74, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49,
 | 
				
			||||||
 | 
						0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65,
 | 
				
			||||||
 | 
						0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x1d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x54,
 | 
				
			||||||
 | 
						0x6f, 0x77, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
				
			||||||
 | 
						0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x28, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65,
 | 
				
			||||||
 | 
						0x63, 0x6b, 0x54, 0x6f, 0x77, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62,
 | 
				
			||||||
 | 
						0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 | 
				
			||||||
 | 
						0x74, 0x1a, 0x29, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x77, 0x6e,
 | 
				
			||||||
 | 
						0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69,
 | 
				
			||||||
 | 
						0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a,
 | 
				
			||||||
 | 
						0x21, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x57,
 | 
				
			||||||
 | 
						0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65,
 | 
				
			||||||
 | 
						0x49, 0x64, 0x12, 0x2c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f,
 | 
				
			||||||
 | 
						0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72,
 | 
				
			||||||
 | 
						0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 | 
				
			||||||
 | 
						0x1a, 0x2d, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x6f, 0x76, 0x69,
 | 
				
			||||||
 | 
						0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72,
 | 
				
			||||||
 | 
						0x79, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
 | 
				
			||||||
 | 
						0x49, 0x0a, 0x15, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62,
 | 
				
			||||||
 | 
						0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65,
 | 
				
			||||||
 | 
						0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46,
 | 
				
			||||||
 | 
						0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x62, 0x2e,
 | 
				
			||||||
 | 
						0x52, 0x50, 0x43, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x55, 0x0a, 0x1b, 0x75, 0x70,
 | 
				
			||||||
 | 
						0x64, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
 | 
						0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x26, 0x2e, 0x70, 0x62, 0x2e, 0x55,
 | 
				
			||||||
 | 
						0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69,
 | 
				
			||||||
 | 
						0x6c, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 | 
				
			||||||
 | 
						0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x50, 0x43, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73,
 | 
				
			||||||
 | 
						0x73, 0x12, 0x45, 0x0a, 0x13, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62,
 | 
				
			||||||
 | 
						0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65,
 | 
				
			||||||
 | 
						0x6c, 0x65, 0x74, 0x65, 0x49, 0x50, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c,
 | 
				
			||||||
 | 
						0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x50,
 | 
				
			||||||
 | 
						0x43, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62,
 | 
				
			||||||
 | 
						0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@ message IPLibraryFile {
 | 
				
			|||||||
	repeated City cities = 12;
 | 
						repeated City cities = 12;
 | 
				
			||||||
	repeated Town towns = 13;
 | 
						repeated Town towns = 13;
 | 
				
			||||||
	repeated string providerNames = 14;
 | 
						repeated string providerNames = 14;
 | 
				
			||||||
 | 
						string password = 15; // 密码
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	message Province {
 | 
						message Province {
 | 
				
			||||||
		string countryName = 1;
 | 
							string countryName = 1;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,6 +88,7 @@ message CreateIPLibraryFileRequest {
 | 
				
			|||||||
	bytes citiesJSON = 7;
 | 
						bytes citiesJSON = 7;
 | 
				
			||||||
	bytes townsJSON = 8;
 | 
						bytes townsJSON = 8;
 | 
				
			||||||
	bytes providersJSON = 9;
 | 
						bytes providersJSON = 9;
 | 
				
			||||||
 | 
						string password = 10; // 密码
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
message CreateIPLibraryFileResponse {
 | 
					message CreateIPLibraryFileResponse {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user