// Code generated by protoc-gen-go. DO NOT EDIT.
// source: gnb.proto

package entities

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type Nrscs int32

const (
	Nrscs_UNKNOWN_NRSCS Nrscs = 0
	Nrscs_SCS15         Nrscs = 1
	Nrscs_SCS30         Nrscs = 2
	Nrscs_SCS60         Nrscs = 3
	Nrscs_SCS120        Nrscs = 4
)

var Nrscs_name = map[int32]string{
	0: "UNKNOWN_NRSCS",
	1: "SCS15",
	2: "SCS30",
	3: "SCS60",
	4: "SCS120",
}

var Nrscs_value = map[string]int32{
	"UNKNOWN_NRSCS": 0,
	"SCS15":         1,
	"SCS30":         2,
	"SCS60":         3,
	"SCS120":        4,
}

func (x Nrscs) String() string {
	return proto.EnumName(Nrscs_name, int32(x))
}

func (Nrscs) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{0}
}

type Ncnrb int32

const (
	Ncnrb_UNKNOWN_NCNRB Ncnrb = 0
	Ncnrb_NRB11         Ncnrb = 1
	Ncnrb_NRB18         Ncnrb = 2
	Ncnrb_NRB24         Ncnrb = 3
	Ncnrb_NRB25         Ncnrb = 4
	Ncnrb_NRB31         Ncnrb = 5
	Ncnrb_NRB32         Ncnrb = 6
	Ncnrb_NRB38         Ncnrb = 7
	Ncnrb_NRB51         Ncnrb = 8
	Ncnrb_NRB52         Ncnrb = 9
	Ncnrb_NRB65         Ncnrb = 10
	Ncnrb_NRB66         Ncnrb = 11
	Ncnrb_NRB78         Ncnrb = 12
	Ncnrb_NRB79         Ncnrb = 13
	Ncnrb_NRB93         Ncnrb = 14
	Ncnrb_NRB106        Ncnrb = 15
	Ncnrb_NRB107        Ncnrb = 16
	Ncnrb_NRB121        Ncnrb = 17
	Ncnrb_NRB132        Ncnrb = 18
	Ncnrb_NRB133        Ncnrb = 19
	Ncnrb_NRB135        Ncnrb = 20
	Ncnrb_NRB160        Ncnrb = 21
	Ncnrb_NRB162        Ncnrb = 22
	Ncnrb_NRB189        Ncnrb = 23
	Ncnrb_NRB216        Ncnrb = 24
	Ncnrb_NRB217        Ncnrb = 25
	Ncnrb_NRB245        Ncnrb = 26
	Ncnrb_NRB264        Ncnrb = 27
	Ncnrb_NRB270        Ncnrb = 28
	Ncnrb_NRB273        Ncnrb = 29
)

var Ncnrb_name = map[int32]string{
	0:  "UNKNOWN_NCNRB",
	1:  "NRB11",
	2:  "NRB18",
	3:  "NRB24",
	4:  "NRB25",
	5:  "NRB31",
	6:  "NRB32",
	7:  "NRB38",
	8:  "NRB51",
	9:  "NRB52",
	10: "NRB65",
	11: "NRB66",
	12: "NRB78",
	13: "NRB79",
	14: "NRB93",
	15: "NRB106",
	16: "NRB107",
	17: "NRB121",
	18: "NRB132",
	19: "NRB133",
	20: "NRB135",
	21: "NRB160",
	22: "NRB162",
	23: "NRB189",
	24: "NRB216",
	25: "NRB217",
	26: "NRB245",
	27: "NRB264",
	28: "NRB270",
	29: "NRB273",
}

var Ncnrb_value = map[string]int32{
	"UNKNOWN_NCNRB": 0,
	"NRB11":         1,
	"NRB18":         2,
	"NRB24":         3,
	"NRB25":         4,
	"NRB31":         5,
	"NRB32":         6,
	"NRB38":         7,
	"NRB51":         8,
	"NRB52":         9,
	"NRB65":         10,
	"NRB66":         11,
	"NRB78":         12,
	"NRB79":         13,
	"NRB93":         14,
	"NRB106":        15,
	"NRB107":        16,
	"NRB121":        17,
	"NRB132":        18,
	"NRB133":        19,
	"NRB135":        20,
	"NRB160":        21,
	"NRB162":        22,
	"NRB189":        23,
	"NRB216":        24,
	"NRB217":        25,
	"NRB245":        26,
	"NRB264":        27,
	"NRB270":        28,
	"NRB273":        29,
}

func (x Ncnrb) String() string {
	return proto.EnumName(Ncnrb_name, int32(x))
}

func (Ncnrb) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{1}
}

type Nr_Mode int32

const (
	Nr_UNKNOWN Nr_Mode = 0
	Nr_FDD     Nr_Mode = 1
	Nr_TDD     Nr_Mode = 2
)

var Nr_Mode_name = map[int32]string{
	0: "UNKNOWN",
	1: "FDD",
	2: "TDD",
}

var Nr_Mode_value = map[string]int32{
	"UNKNOWN": 0,
	"FDD":     1,
	"TDD":     2,
}

func (x Nr_Mode) String() string {
	return proto.EnumName(Nr_Mode_name, int32(x))
}

func (Nr_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{3, 0}
}

type Gnb struct {
	ServedNrCells        []*ServedNRCell `protobuf:"bytes,1,rep,name=served_nr_cells,json=servedNrCells,proto3" json:"served_nr_cells,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *Gnb) Reset()         { *m = Gnb{} }
func (m *Gnb) String() string { return proto.CompactTextString(m) }
func (*Gnb) ProtoMessage()    {}
func (*Gnb) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{0}
}

func (m *Gnb) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Gnb.Unmarshal(m, b)
}
func (m *Gnb) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Gnb.Marshal(b, m, deterministic)
}
func (m *Gnb) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Gnb.Merge(m, src)
}
func (m *Gnb) XXX_Size() int {
	return xxx_messageInfo_Gnb.Size(m)
}
func (m *Gnb) XXX_DiscardUnknown() {
	xxx_messageInfo_Gnb.DiscardUnknown(m)
}

var xxx_messageInfo_Gnb proto.InternalMessageInfo

func (m *Gnb) GetServedNrCells() []*ServedNRCell {
	if m != nil {
		return m.ServedNrCells
	}
	return nil
}

type ServedNRCell struct {
	ServedNrCellInformation *ServedNRCellInformation  `protobuf:"bytes,1,opt,name=served_nr_cell_information,json=servedNrCellInformation,proto3" json:"served_nr_cell_information,omitempty"`
	NrNeighbourInfos        []*NrNeighbourInformation `protobuf:"bytes,2,rep,name=nr_neighbour_infos,json=nrNeighbourInfos,proto3" json:"nr_neighbour_infos,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                  `json:"-"`
	XXX_unrecognized        []byte                    `json:"-"`
	XXX_sizecache           int32                     `json:"-"`
}

func (m *ServedNRCell) Reset()         { *m = ServedNRCell{} }
func (m *ServedNRCell) String() string { return proto.CompactTextString(m) }
func (*ServedNRCell) ProtoMessage()    {}
func (*ServedNRCell) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{1}
}

func (m *ServedNRCell) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServedNRCell.Unmarshal(m, b)
}
func (m *ServedNRCell) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServedNRCell.Marshal(b, m, deterministic)
}
func (m *ServedNRCell) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServedNRCell.Merge(m, src)
}
func (m *ServedNRCell) XXX_Size() int {
	return xxx_messageInfo_ServedNRCell.Size(m)
}
func (m *ServedNRCell) XXX_DiscardUnknown() {
	xxx_messageInfo_ServedNRCell.DiscardUnknown(m)
}

var xxx_messageInfo_ServedNRCell proto.InternalMessageInfo

func (m *ServedNRCell) GetServedNrCellInformation() *ServedNRCellInformation {
	if m != nil {
		return m.ServedNrCellInformation
	}
	return nil
}

func (m *ServedNRCell) GetNrNeighbourInfos() []*NrNeighbourInformation {
	if m != nil {
		return m.NrNeighbourInfos
	}
	return nil
}

type ServedNRCellInformation struct {
	NrPci                uint32                                `protobuf:"varint,1,opt,name=nr_pci,json=nrPci,proto3" json:"nr_pci,omitempty"`
	CellId               string                                `protobuf:"bytes,2,opt,name=cell_id,json=cellId,proto3" json:"cell_id,omitempty"`
	Stac5G               string                                `protobuf:"bytes,3,opt,name=stac5g,proto3" json:"stac5g,omitempty"`
	ConfiguredStac       string                                `protobuf:"bytes,4,opt,name=configured_stac,json=configuredStac,proto3" json:"configured_stac,omitempty"`
	ServedPlmns          []string                              `protobuf:"bytes,5,rep,name=served_plmns,json=servedPlmns,proto3" json:"served_plmns,omitempty"`
	NrMode               Nr_Mode                               `protobuf:"varint,6,opt,name=nr_mode,json=nrMode,proto3,enum=entities.Nr_Mode" json:"nr_mode,omitempty"`
	ChoiceNrMode         *ServedNRCellInformation_ChoiceNRMode `protobuf:"bytes,7,opt,name=choice_nr_mode,json=choiceNrMode,proto3" json:"choice_nr_mode,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
	XXX_unrecognized     []byte                                `json:"-"`
	XXX_sizecache        int32                                 `json:"-"`
}

func (m *ServedNRCellInformation) Reset()         { *m = ServedNRCellInformation{} }
func (m *ServedNRCellInformation) String() string { return proto.CompactTextString(m) }
func (*ServedNRCellInformation) ProtoMessage()    {}
func (*ServedNRCellInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{2}
}

func (m *ServedNRCellInformation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServedNRCellInformation.Unmarshal(m, b)
}
func (m *ServedNRCellInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServedNRCellInformation.Marshal(b, m, deterministic)
}
func (m *ServedNRCellInformation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServedNRCellInformation.Merge(m, src)
}
func (m *ServedNRCellInformation) XXX_Size() int {
	return xxx_messageInfo_ServedNRCellInformation.Size(m)
}
func (m *ServedNRCellInformation) XXX_DiscardUnknown() {
	xxx_messageInfo_ServedNRCellInformation.DiscardUnknown(m)
}

var xxx_messageInfo_ServedNRCellInformation proto.InternalMessageInfo

func (m *ServedNRCellInformation) GetNrPci() uint32 {
	if m != nil {
		return m.NrPci
	}
	return 0
}

func (m *ServedNRCellInformation) GetCellId() string {
	if m != nil {
		return m.CellId
	}
	return ""
}

func (m *ServedNRCellInformation) GetStac5G() string {
	if m != nil {
		return m.Stac5G
	}
	return ""
}

func (m *ServedNRCellInformation) GetConfiguredStac() string {
	if m != nil {
		return m.ConfiguredStac
	}
	return ""
}

func (m *ServedNRCellInformation) GetServedPlmns() []string {
	if m != nil {
		return m.ServedPlmns
	}
	return nil
}

func (m *ServedNRCellInformation) GetNrMode() Nr_Mode {
	if m != nil {
		return m.NrMode
	}
	return Nr_UNKNOWN
}

func (m *ServedNRCellInformation) GetChoiceNrMode() *ServedNRCellInformation_ChoiceNRMode {
	if m != nil {
		return m.ChoiceNrMode
	}
	return nil
}

type ServedNRCellInformation_ChoiceNRMode struct {
	Fdd                  *ServedNRCellInformation_ChoiceNRMode_FddInfo `protobuf:"bytes,1,opt,name=fdd,proto3" json:"fdd,omitempty"`
	Tdd                  *ServedNRCellInformation_ChoiceNRMode_TddInfo `protobuf:"bytes,2,opt,name=tdd,proto3" json:"tdd,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
	XXX_unrecognized     []byte                                        `json:"-"`
	XXX_sizecache        int32                                         `json:"-"`
}

func (m *ServedNRCellInformation_ChoiceNRMode) Reset()         { *m = ServedNRCellInformation_ChoiceNRMode{} }
func (m *ServedNRCellInformation_ChoiceNRMode) String() string { return proto.CompactTextString(m) }
func (*ServedNRCellInformation_ChoiceNRMode) ProtoMessage()    {}
func (*ServedNRCellInformation_ChoiceNRMode) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{2, 0}
}

func (m *ServedNRCellInformation_ChoiceNRMode) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode.Unmarshal(m, b)
}
func (m *ServedNRCellInformation_ChoiceNRMode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode.Marshal(b, m, deterministic)
}
func (m *ServedNRCellInformation_ChoiceNRMode) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode.Merge(m, src)
}
func (m *ServedNRCellInformation_ChoiceNRMode) XXX_Size() int {
	return xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode.Size(m)
}
func (m *ServedNRCellInformation_ChoiceNRMode) XXX_DiscardUnknown() {
	xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode.DiscardUnknown(m)
}

var xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode proto.InternalMessageInfo

func (m *ServedNRCellInformation_ChoiceNRMode) GetFdd() *ServedNRCellInformation_ChoiceNRMode_FddInfo {
	if m != nil {
		return m.Fdd
	}
	return nil
}

func (m *ServedNRCellInformation_ChoiceNRMode) GetTdd() *ServedNRCellInformation_ChoiceNRMode_TddInfo {
	if m != nil {
		return m.Tdd
	}
	return nil
}

type ServedNRCellInformation_ChoiceNRMode_FddInfo struct {
	UlFreqInfo              *NrFrequencyInfo         `protobuf:"bytes,1,opt,name=ul_freq_info,json=ulFreqInfo,proto3" json:"ul_freq_info,omitempty"`
	DlFreqInfo              *NrFrequencyInfo         `protobuf:"bytes,2,opt,name=dl_freq_info,json=dlFreqInfo,proto3" json:"dl_freq_info,omitempty"`
	UlTransmissionBandwidth *NrTransmissionBandwidth `protobuf:"bytes,3,opt,name=ul_transmission_bandwidth,json=ulTransmissionBandwidth,proto3" json:"ul_transmission_bandwidth,omitempty"`
	DlTransmissionBandwidth *NrTransmissionBandwidth `protobuf:"bytes,4,opt,name=dl_transmission_bandwidth,json=dlTransmissionBandwidth,proto3" json:"dl_transmission_bandwidth,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                 `json:"-"`
	XXX_unrecognized        []byte                   `json:"-"`
	XXX_sizecache           int32                    `json:"-"`
}

func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) Reset() {
	*m = ServedNRCellInformation_ChoiceNRMode_FddInfo{}
}
func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) String() string {
	return proto.CompactTextString(m)
}
func (*ServedNRCellInformation_ChoiceNRMode_FddInfo) ProtoMessage() {}
func (*ServedNRCellInformation_ChoiceNRMode_FddInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{2, 0, 0}
}

func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_FddInfo.Unmarshal(m, b)
}
func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_FddInfo.Marshal(b, m, deterministic)
}
func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_FddInfo.Merge(m, src)
}
func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) XXX_Size() int {
	return xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_FddInfo.Size(m)
}
func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) XXX_DiscardUnknown() {
	xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_FddInfo.DiscardUnknown(m)
}

var xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_FddInfo proto.InternalMessageInfo

func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) GetUlFreqInfo() *NrFrequencyInfo {
	if m != nil {
		return m.UlFreqInfo
	}
	return nil
}

func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) GetDlFreqInfo() *NrFrequencyInfo {
	if m != nil {
		return m.DlFreqInfo
	}
	return nil
}

func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) GetUlTransmissionBandwidth() *NrTransmissionBandwidth {
	if m != nil {
		return m.UlTransmissionBandwidth
	}
	return nil
}

func (m *ServedNRCellInformation_ChoiceNRMode_FddInfo) GetDlTransmissionBandwidth() *NrTransmissionBandwidth {
	if m != nil {
		return m.DlTransmissionBandwidth
	}
	return nil
}

type ServedNRCellInformation_ChoiceNRMode_TddInfo struct {
	NrFreqInfo            *NrFrequencyInfo         `protobuf:"bytes,1,opt,name=nr_freq_info,json=nrFreqInfo,proto3" json:"nr_freq_info,omitempty"`
	TransmissionBandwidth *NrTransmissionBandwidth `protobuf:"bytes,2,opt,name=transmission_bandwidth,json=transmissionBandwidth,proto3" json:"transmission_bandwidth,omitempty"`
	XXX_NoUnkeyedLiteral  struct{}                 `json:"-"`
	XXX_unrecognized      []byte                   `json:"-"`
	XXX_sizecache         int32                    `json:"-"`
}

func (m *ServedNRCellInformation_ChoiceNRMode_TddInfo) Reset() {
	*m = ServedNRCellInformation_ChoiceNRMode_TddInfo{}
}
func (m *ServedNRCellInformation_ChoiceNRMode_TddInfo) String() string {
	return proto.CompactTextString(m)
}
func (*ServedNRCellInformation_ChoiceNRMode_TddInfo) ProtoMessage() {}
func (*ServedNRCellInformation_ChoiceNRMode_TddInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{2, 0, 1}
}

func (m *ServedNRCellInformation_ChoiceNRMode_TddInfo) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_TddInfo.Unmarshal(m, b)
}
func (m *ServedNRCellInformation_ChoiceNRMode_TddInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_TddInfo.Marshal(b, m, deterministic)
}
func (m *ServedNRCellInformation_ChoiceNRMode_TddInfo) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_TddInfo.Merge(m, src)
}
func (m *ServedNRCellInformation_ChoiceNRMode_TddInfo) XXX_Size() int {
	return xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_TddInfo.Size(m)
}
func (m *ServedNRCellInformation_ChoiceNRMode_TddInfo) XXX_DiscardUnknown() {
	xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_TddInfo.DiscardUnknown(m)
}

var xxx_messageInfo_ServedNRCellInformation_ChoiceNRMode_TddInfo proto.InternalMessageInfo

func (m *ServedNRCellInformation_ChoiceNRMode_TddInfo) GetNrFreqInfo() *NrFrequencyInfo {
	if m != nil {
		return m.NrFreqInfo
	}
	return nil
}

func (m *ServedNRCellInformation_ChoiceNRMode_TddInfo) GetTransmissionBandwidth() *NrTransmissionBandwidth {
	if m != nil {
		return m.TransmissionBandwidth
	}
	return nil
}

type Nr struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Nr) Reset()         { *m = Nr{} }
func (m *Nr) String() string { return proto.CompactTextString(m) }
func (*Nr) ProtoMessage()    {}
func (*Nr) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{3}
}

func (m *Nr) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Nr.Unmarshal(m, b)
}
func (m *Nr) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Nr.Marshal(b, m, deterministic)
}
func (m *Nr) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Nr.Merge(m, src)
}
func (m *Nr) XXX_Size() int {
	return xxx_messageInfo_Nr.Size(m)
}
func (m *Nr) XXX_DiscardUnknown() {
	xxx_messageInfo_Nr.DiscardUnknown(m)
}

var xxx_messageInfo_Nr proto.InternalMessageInfo

type NrFrequencyInfo struct {
	NrArFcn              uint64                          `protobuf:"varint,1,opt,name=nr_ar_fcn,json=nrArFcn,proto3" json:"nr_ar_fcn,omitempty"`
	SulInformation       *NrFrequencyInfo_SulInformation `protobuf:"bytes,3,opt,name=sulInformation,proto3" json:"sulInformation,omitempty"`
	FrequencyBands       []*FrequencyBandItem            `protobuf:"bytes,4,rep,name=frequency_bands,json=frequencyBands,proto3" json:"frequency_bands,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

func (m *NrFrequencyInfo) Reset()         { *m = NrFrequencyInfo{} }
func (m *NrFrequencyInfo) String() string { return proto.CompactTextString(m) }
func (*NrFrequencyInfo) ProtoMessage()    {}
func (*NrFrequencyInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{4}
}

func (m *NrFrequencyInfo) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NrFrequencyInfo.Unmarshal(m, b)
}
func (m *NrFrequencyInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NrFrequencyInfo.Marshal(b, m, deterministic)
}
func (m *NrFrequencyInfo) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NrFrequencyInfo.Merge(m, src)
}
func (m *NrFrequencyInfo) XXX_Size() int {
	return xxx_messageInfo_NrFrequencyInfo.Size(m)
}
func (m *NrFrequencyInfo) XXX_DiscardUnknown() {
	xxx_messageInfo_NrFrequencyInfo.DiscardUnknown(m)
}

var xxx_messageInfo_NrFrequencyInfo proto.InternalMessageInfo

func (m *NrFrequencyInfo) GetNrArFcn() uint64 {
	if m != nil {
		return m.NrArFcn
	}
	return 0
}

func (m *NrFrequencyInfo) GetSulInformation() *NrFrequencyInfo_SulInformation {
	if m != nil {
		return m.SulInformation
	}
	return nil
}

func (m *NrFrequencyInfo) GetFrequencyBands() []*FrequencyBandItem {
	if m != nil {
		return m.FrequencyBands
	}
	return nil
}

type NrFrequencyInfo_SulInformation struct {
	SulArFcn                 uint64                   `protobuf:"varint,1,opt,name=sul_ar_fcn,json=sulArFcn,proto3" json:"sul_ar_fcn,omitempty"`
	SulTransmissionBandwidth *NrTransmissionBandwidth `protobuf:"bytes,2,opt,name=sul_transmission_bandwidth,json=sulTransmissionBandwidth,proto3" json:"sul_transmission_bandwidth,omitempty"`
	XXX_NoUnkeyedLiteral     struct{}                 `json:"-"`
	XXX_unrecognized         []byte                   `json:"-"`
	XXX_sizecache            int32                    `json:"-"`
}

func (m *NrFrequencyInfo_SulInformation) Reset()         { *m = NrFrequencyInfo_SulInformation{} }
func (m *NrFrequencyInfo_SulInformation) String() string { return proto.CompactTextString(m) }
func (*NrFrequencyInfo_SulInformation) ProtoMessage()    {}
func (*NrFrequencyInfo_SulInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{4, 0}
}

func (m *NrFrequencyInfo_SulInformation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NrFrequencyInfo_SulInformation.Unmarshal(m, b)
}
func (m *NrFrequencyInfo_SulInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NrFrequencyInfo_SulInformation.Marshal(b, m, deterministic)
}
func (m *NrFrequencyInfo_SulInformation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NrFrequencyInfo_SulInformation.Merge(m, src)
}
func (m *NrFrequencyInfo_SulInformation) XXX_Size() int {
	return xxx_messageInfo_NrFrequencyInfo_SulInformation.Size(m)
}
func (m *NrFrequencyInfo_SulInformation) XXX_DiscardUnknown() {
	xxx_messageInfo_NrFrequencyInfo_SulInformation.DiscardUnknown(m)
}

var xxx_messageInfo_NrFrequencyInfo_SulInformation proto.InternalMessageInfo

func (m *NrFrequencyInfo_SulInformation) GetSulArFcn() uint64 {
	if m != nil {
		return m.SulArFcn
	}
	return 0
}

func (m *NrFrequencyInfo_SulInformation) GetSulTransmissionBandwidth() *NrTransmissionBandwidth {
	if m != nil {
		return m.SulTransmissionBandwidth
	}
	return nil
}

type FrequencyBandItem struct {
	NrFrequencyBand      uint32   `protobuf:"varint,1,opt,name=nr_frequency_band,json=nrFrequencyBand,proto3" json:"nr_frequency_band,omitempty"`
	SupportedSulBands    []uint32 `protobuf:"varint,2,rep,packed,name=supported_sul_bands,json=supportedSulBands,proto3" json:"supported_sul_bands,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FrequencyBandItem) Reset()         { *m = FrequencyBandItem{} }
func (m *FrequencyBandItem) String() string { return proto.CompactTextString(m) }
func (*FrequencyBandItem) ProtoMessage()    {}
func (*FrequencyBandItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{5}
}

func (m *FrequencyBandItem) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FrequencyBandItem.Unmarshal(m, b)
}
func (m *FrequencyBandItem) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FrequencyBandItem.Marshal(b, m, deterministic)
}
func (m *FrequencyBandItem) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FrequencyBandItem.Merge(m, src)
}
func (m *FrequencyBandItem) XXX_Size() int {
	return xxx_messageInfo_FrequencyBandItem.Size(m)
}
func (m *FrequencyBandItem) XXX_DiscardUnknown() {
	xxx_messageInfo_FrequencyBandItem.DiscardUnknown(m)
}

var xxx_messageInfo_FrequencyBandItem proto.InternalMessageInfo

func (m *FrequencyBandItem) GetNrFrequencyBand() uint32 {
	if m != nil {
		return m.NrFrequencyBand
	}
	return 0
}

func (m *FrequencyBandItem) GetSupportedSulBands() []uint32 {
	if m != nil {
		return m.SupportedSulBands
	}
	return nil
}

type NrTransmissionBandwidth struct {
	Nrscs                Nrscs    `protobuf:"varint,1,opt,name=nrscs,proto3,enum=entities.Nrscs" json:"nrscs,omitempty"`
	Ncnrb                Ncnrb    `protobuf:"varint,2,opt,name=ncnrb,proto3,enum=entities.Ncnrb" json:"ncnrb,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *NrTransmissionBandwidth) Reset()         { *m = NrTransmissionBandwidth{} }
func (m *NrTransmissionBandwidth) String() string { return proto.CompactTextString(m) }
func (*NrTransmissionBandwidth) ProtoMessage()    {}
func (*NrTransmissionBandwidth) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{6}
}

func (m *NrTransmissionBandwidth) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NrTransmissionBandwidth.Unmarshal(m, b)
}
func (m *NrTransmissionBandwidth) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NrTransmissionBandwidth.Marshal(b, m, deterministic)
}
func (m *NrTransmissionBandwidth) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NrTransmissionBandwidth.Merge(m, src)
}
func (m *NrTransmissionBandwidth) XXX_Size() int {
	return xxx_messageInfo_NrTransmissionBandwidth.Size(m)
}
func (m *NrTransmissionBandwidth) XXX_DiscardUnknown() {
	xxx_messageInfo_NrTransmissionBandwidth.DiscardUnknown(m)
}

var xxx_messageInfo_NrTransmissionBandwidth proto.InternalMessageInfo

func (m *NrTransmissionBandwidth) GetNrscs() Nrscs {
	if m != nil {
		return m.Nrscs
	}
	return Nrscs_UNKNOWN_NRSCS
}

func (m *NrTransmissionBandwidth) GetNcnrb() Ncnrb {
	if m != nil {
		return m.Ncnrb
	}
	return Ncnrb_UNKNOWN_NCNRB
}

type NrNeighbourInformation struct {
	NrPci                uint32                               `protobuf:"varint,1,opt,name=nr_pci,json=nrPci,proto3" json:"nr_pci,omitempty"`
	NrCgi                string                               `protobuf:"bytes,2,opt,name=nr_cgi,json=nrCgi,proto3" json:"nr_cgi,omitempty"`
	NrMode               Nr_Mode                              `protobuf:"varint,3,opt,name=nr_mode,json=nrMode,proto3,enum=entities.Nr_Mode" json:"nr_mode,omitempty"`
	ChoiceNrMode         *NrNeighbourInformation_ChoiceNRMode `protobuf:"bytes,4,opt,name=choice_nr_mode,json=choiceNrMode,proto3" json:"choice_nr_mode,omitempty"`
	Stac5G               string                               `protobuf:"bytes,5,opt,name=stac5g,proto3" json:"stac5g,omitempty"`
	ConfiguredStac       string                               `protobuf:"bytes,6,opt,name=configured_stac,json=configuredStac,proto3" json:"configured_stac,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

func (m *NrNeighbourInformation) Reset()         { *m = NrNeighbourInformation{} }
func (m *NrNeighbourInformation) String() string { return proto.CompactTextString(m) }
func (*NrNeighbourInformation) ProtoMessage()    {}
func (*NrNeighbourInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{7}
}

func (m *NrNeighbourInformation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NrNeighbourInformation.Unmarshal(m, b)
}
func (m *NrNeighbourInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NrNeighbourInformation.Marshal(b, m, deterministic)
}
func (m *NrNeighbourInformation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NrNeighbourInformation.Merge(m, src)
}
func (m *NrNeighbourInformation) XXX_Size() int {
	return xxx_messageInfo_NrNeighbourInformation.Size(m)
}
func (m *NrNeighbourInformation) XXX_DiscardUnknown() {
	xxx_messageInfo_NrNeighbourInformation.DiscardUnknown(m)
}

var xxx_messageInfo_NrNeighbourInformation proto.InternalMessageInfo

func (m *NrNeighbourInformation) GetNrPci() uint32 {
	if m != nil {
		return m.NrPci
	}
	return 0
}

func (m *NrNeighbourInformation) GetNrCgi() string {
	if m != nil {
		return m.NrCgi
	}
	return ""
}

func (m *NrNeighbourInformation) GetNrMode() Nr_Mode {
	if m != nil {
		return m.NrMode
	}
	return Nr_UNKNOWN
}

func (m *NrNeighbourInformation) GetChoiceNrMode() *NrNeighbourInformation_ChoiceNRMode {
	if m != nil {
		return m.ChoiceNrMode
	}
	return nil
}

func (m *NrNeighbourInformation) GetStac5G() string {
	if m != nil {
		return m.Stac5G
	}
	return ""
}

func (m *NrNeighbourInformation) GetConfiguredStac() string {
	if m != nil {
		return m.ConfiguredStac
	}
	return ""
}

type NrNeighbourInformation_ChoiceNRMode struct {
	Fdd                  *NrNeighbourInformation_ChoiceNRMode_FddInfo `protobuf:"bytes,1,opt,name=fdd,proto3" json:"fdd,omitempty"`
	Tdd                  *NrNeighbourInformation_ChoiceNRMode_TddInfo `protobuf:"bytes,2,opt,name=tdd,proto3" json:"tdd,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                     `json:"-"`
	XXX_unrecognized     []byte                                       `json:"-"`
	XXX_sizecache        int32                                        `json:"-"`
}

func (m *NrNeighbourInformation_ChoiceNRMode) Reset()         { *m = NrNeighbourInformation_ChoiceNRMode{} }
func (m *NrNeighbourInformation_ChoiceNRMode) String() string { return proto.CompactTextString(m) }
func (*NrNeighbourInformation_ChoiceNRMode) ProtoMessage()    {}
func (*NrNeighbourInformation_ChoiceNRMode) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{7, 0}
}

func (m *NrNeighbourInformation_ChoiceNRMode) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode.Unmarshal(m, b)
}
func (m *NrNeighbourInformation_ChoiceNRMode) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode.Marshal(b, m, deterministic)
}
func (m *NrNeighbourInformation_ChoiceNRMode) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode.Merge(m, src)
}
func (m *NrNeighbourInformation_ChoiceNRMode) XXX_Size() int {
	return xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode.Size(m)
}
func (m *NrNeighbourInformation_ChoiceNRMode) XXX_DiscardUnknown() {
	xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode.DiscardUnknown(m)
}

var xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode proto.InternalMessageInfo

func (m *NrNeighbourInformation_ChoiceNRMode) GetFdd() *NrNeighbourInformation_ChoiceNRMode_FddInfo {
	if m != nil {
		return m.Fdd
	}
	return nil
}

func (m *NrNeighbourInformation_ChoiceNRMode) GetTdd() *NrNeighbourInformation_ChoiceNRMode_TddInfo {
	if m != nil {
		return m.Tdd
	}
	return nil
}

type NrNeighbourInformation_ChoiceNRMode_FddInfo struct {
	UlarFcnFreqInfo      *NrFrequencyInfo `protobuf:"bytes,1,opt,name=ular_fcn_freq_info,json=ularFcnFreqInfo,proto3" json:"ular_fcn_freq_info,omitempty"`
	DlarFcnFreqInfo      *NrFrequencyInfo `protobuf:"bytes,2,opt,name=dlar_fcn_freq_info,json=dlarFcnFreqInfo,proto3" json:"dlar_fcn_freq_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *NrNeighbourInformation_ChoiceNRMode_FddInfo) Reset() {
	*m = NrNeighbourInformation_ChoiceNRMode_FddInfo{}
}
func (m *NrNeighbourInformation_ChoiceNRMode_FddInfo) String() string {
	return proto.CompactTextString(m)
}
func (*NrNeighbourInformation_ChoiceNRMode_FddInfo) ProtoMessage() {}
func (*NrNeighbourInformation_ChoiceNRMode_FddInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{7, 0, 0}
}

func (m *NrNeighbourInformation_ChoiceNRMode_FddInfo) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_FddInfo.Unmarshal(m, b)
}
func (m *NrNeighbourInformation_ChoiceNRMode_FddInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_FddInfo.Marshal(b, m, deterministic)
}
func (m *NrNeighbourInformation_ChoiceNRMode_FddInfo) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_FddInfo.Merge(m, src)
}
func (m *NrNeighbourInformation_ChoiceNRMode_FddInfo) XXX_Size() int {
	return xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_FddInfo.Size(m)
}
func (m *NrNeighbourInformation_ChoiceNRMode_FddInfo) XXX_DiscardUnknown() {
	xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_FddInfo.DiscardUnknown(m)
}

var xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_FddInfo proto.InternalMessageInfo

func (m *NrNeighbourInformation_ChoiceNRMode_FddInfo) GetUlarFcnFreqInfo() *NrFrequencyInfo {
	if m != nil {
		return m.UlarFcnFreqInfo
	}
	return nil
}

func (m *NrNeighbourInformation_ChoiceNRMode_FddInfo) GetDlarFcnFreqInfo() *NrFrequencyInfo {
	if m != nil {
		return m.DlarFcnFreqInfo
	}
	return nil
}

type NrNeighbourInformation_ChoiceNRMode_TddInfo struct {
	ArFcnNrFreqInfo      *NrFrequencyInfo `protobuf:"bytes,1,opt,name=ar_fcn_nr_freq_info,json=arFcnNrFreqInfo,proto3" json:"ar_fcn_nr_freq_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *NrNeighbourInformation_ChoiceNRMode_TddInfo) Reset() {
	*m = NrNeighbourInformation_ChoiceNRMode_TddInfo{}
}
func (m *NrNeighbourInformation_ChoiceNRMode_TddInfo) String() string {
	return proto.CompactTextString(m)
}
func (*NrNeighbourInformation_ChoiceNRMode_TddInfo) ProtoMessage() {}
func (*NrNeighbourInformation_ChoiceNRMode_TddInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_22d18f428b8f19f0, []int{7, 0, 1}
}

func (m *NrNeighbourInformation_ChoiceNRMode_TddInfo) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_TddInfo.Unmarshal(m, b)
}
func (m *NrNeighbourInformation_ChoiceNRMode_TddInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_TddInfo.Marshal(b, m, deterministic)
}
func (m *NrNeighbourInformation_ChoiceNRMode_TddInfo) XXX_Merge(src proto.Message) {
	xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_TddInfo.Merge(m, src)
}
func (m *NrNeighbourInformation_ChoiceNRMode_TddInfo) XXX_Size() int {
	return xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_TddInfo.Size(m)
}
func (m *NrNeighbourInformation_ChoiceNRMode_TddInfo) XXX_DiscardUnknown() {
	xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_TddInfo.DiscardUnknown(m)
}

var xxx_messageInfo_NrNeighbourInformation_ChoiceNRMode_TddInfo proto.InternalMessageInfo

func (m *NrNeighbourInformation_ChoiceNRMode_TddInfo) GetArFcnNrFreqInfo() *NrFrequencyInfo {
	if m != nil {
		return m.ArFcnNrFreqInfo
	}
	return nil
}

func init() {
	proto.RegisterEnum("entities.Nrscs", Nrscs_name, Nrscs_value)
	proto.RegisterEnum("entities.Ncnrb", Ncnrb_name, Ncnrb_value)
	proto.RegisterEnum("entities.Nr_Mode", Nr_Mode_name, Nr_Mode_value)
	proto.RegisterType((*Gnb)(nil), "entities.Gnb")
	proto.RegisterType((*ServedNRCell)(nil), "entities.ServedNRCell")
	proto.RegisterType((*ServedNRCellInformation)(nil), "entities.ServedNRCellInformation")
	proto.RegisterType((*ServedNRCellInformation_ChoiceNRMode)(nil), "entities.ServedNRCellInformation.ChoiceNRMode")
	proto.RegisterType((*ServedNRCellInformation_ChoiceNRMode_FddInfo)(nil), "entities.ServedNRCellInformation.ChoiceNRMode.FddInfo")
	proto.RegisterType((*ServedNRCellInformation_ChoiceNRMode_TddInfo)(nil), "entities.ServedNRCellInformation.ChoiceNRMode.TddInfo")
	proto.RegisterType((*Nr)(nil), "entities.Nr")
	proto.RegisterType((*NrFrequencyInfo)(nil), "entities.NrFrequencyInfo")
	proto.RegisterType((*NrFrequencyInfo_SulInformation)(nil), "entities.NrFrequencyInfo.SulInformation")
	proto.RegisterType((*FrequencyBandItem)(nil), "entities.FrequencyBandItem")
	proto.RegisterType((*NrTransmissionBandwidth)(nil), "entities.NrTransmissionBandwidth")
	proto.RegisterType((*NrNeighbourInformation)(nil), "entities.NrNeighbourInformation")
	proto.RegisterType((*NrNeighbourInformation_ChoiceNRMode)(nil), "entities.NrNeighbourInformation.ChoiceNRMode")
	proto.RegisterType((*NrNeighbourInformation_ChoiceNRMode_FddInfo)(nil), "entities.NrNeighbourInformation.ChoiceNRMode.FddInfo")
	proto.RegisterType((*NrNeighbourInformation_ChoiceNRMode_TddInfo)(nil), "entities.NrNeighbourInformation.ChoiceNRMode.TddInfo")
}

func init() { proto.RegisterFile("gnb.proto", fileDescriptor_22d18f428b8f19f0) }

var fileDescriptor_22d18f428b8f19f0 = []byte{
	// 1071 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xdd, 0x6e, 0xe3, 0x44,
	0x14, 0x5e, 0x27, 0x71, 0xb2, 0x39, 0x4d, 0x93, 0xc9, 0x2c, 0xdb, 0xb8, 0xd9, 0x45, 0xca, 0x46,
	0x5a, 0x11, 0x15, 0x11, 0x25, 0x4e, 0x93, 0xb6, 0x42, 0x42, 0xa2, 0x29, 0x29, 0x15, 0xc2, 0x54,
	0x4e, 0x11, 0xdc, 0x80, 0x95, 0x78, 0x9c, 0xd4, 0x92, 0x3b, 0xee, 0xce, 0xd8, 0x20, 0x1e, 0x81,
	0x2b, 0xb8, 0x45, 0xdc, 0xf0, 0x1e, 0x48, 0x48, 0x3c, 0x05, 0xaf, 0xc0, 0x63, 0x20, 0x8f, 0x7f,
	0x62, 0xb7, 0x09, 0x69, 0xae, 0xfa, 0xe5, 0xfc, 0x7c, 0x3e, 0xe7, 0xf8, 0xf8, 0x3b, 0x85, 0xf2,
	0x92, 0xce, 0xbb, 0xf7, 0xcc, 0xf5, 0x5c, 0xfc, 0xdc, 0xa2, 0x9e, 0xed, 0xd9, 0x16, 0x6f, 0x7f,
	0x06, 0xf9, 0x4b, 0x3a, 0xc7, 0x9f, 0x40, 0x8d, 0x5b, 0xec, 0x07, 0x8b, 0x18, 0x94, 0x19, 0xa6,
	0xe5, 0x38, 0x5c, 0x91, 0x5a, 0xf9, 0xce, 0x9e, 0x7a, 0xd0, 0x8d, 0x43, 0xbb, 0x53, 0x11, 0xa0,
	0xe9, 0x63, 0xcb, 0x71, 0xf4, 0xfd, 0x30, 0x5c, 0x63, 0xc1, 0x2f, 0xde, 0xfe, 0x4b, 0x82, 0x4a,
	0xda, 0x8f, 0xbf, 0x87, 0x66, 0x96, 0xd0, 0xb0, 0xe9, 0xc2, 0x65, 0x77, 0x33, 0xcf, 0x76, 0xa9,
	0x22, 0xb5, 0xa4, 0xce, 0x9e, 0xfa, 0x66, 0x3d, 0xf7, 0xd5, 0x2a, 0x50, 0x6f, 0xa4, 0x1f, 0x93,
	0x72, 0x60, 0x0d, 0x30, 0x65, 0x06, 0xb5, 0xec, 0xe5, 0xed, 0xdc, 0xf5, 0x99, 0x60, 0xe7, 0x4a,
	0x4e, 0xd4, 0xdc, 0x5a, 0xf1, 0x6a, 0x4c, 0x8b, 0x43, 0xd2, 0xb4, 0x88, 0x66, 0xed, 0xbc, 0xfd,
	0x67, 0x09, 0x1a, 0x1b, 0x8a, 0xc0, 0x2f, 0xa1, 0x48, 0x99, 0x71, 0x6f, 0xda, 0xa2, 0xee, 0x7d,
	0x5d, 0xa6, 0xec, 0xda, 0xb4, 0x71, 0x03, 0x4a, 0x61, 0x63, 0x44, 0xc9, 0xb5, 0xa4, 0x4e, 0x59,
	0x2f, 0x06, 0x3f, 0xaf, 0x08, 0x3e, 0x80, 0x22, 0xf7, 0x66, 0xe6, 0x70, 0xa9, 0xe4, 0x43, 0x7b,
	0xf8, 0x0b, 0x7f, 0x00, 0x35, 0xd3, 0xa5, 0x0b, 0x7b, 0xe9, 0x33, 0x8b, 0x18, 0x81, 0x51, 0x29,
	0x88, 0x80, 0xea, 0xca, 0x3c, 0xf5, 0x66, 0x26, 0x7e, 0x03, 0x95, 0x68, 0x78, 0xf7, 0xce, 0x1d,
	0xe5, 0x8a, 0xdc, 0xca, 0x77, 0xca, 0xfa, 0x5e, 0x68, 0xbb, 0x0e, 0x4c, 0xf8, 0x08, 0x4a, 0x94,
	0x19, 0x77, 0x2e, 0xb1, 0x94, 0x62, 0x4b, 0xea, 0x54, 0xd5, 0x7a, 0xba, 0xe9, 0xee, 0x97, 0x2e,
	0xb1, 0xf4, 0x22, 0x65, 0xc1, 0x5f, 0x7c, 0x03, 0x55, 0xf3, 0xd6, 0xb5, 0x4d, 0xcb, 0x88, 0x53,
	0x4a, 0x62, 0xfe, 0xdd, 0xad, 0xf3, 0xef, 0x8e, 0x45, 0x9e, 0xa6, 0x0b, 0xbe, 0x4a, 0xc8, 0xa2,
	0x09, 0xd6, 0xe6, 0xcf, 0x32, 0x54, 0xd2, 0x6e, 0xfc, 0x39, 0xe4, 0x17, 0x84, 0x44, 0xef, 0x76,
	0xb4, 0x1b, 0x77, 0x77, 0x42, 0x48, 0xe0, 0xd3, 0x03, 0x8a, 0x80, 0xc9, 0x23, 0xe1, 0x54, 0x77,
	0x67, 0xba, 0x89, 0x99, 0x3c, 0x42, 0x9a, 0x7f, 0xe7, 0xa0, 0x14, 0x51, 0xe3, 0x8f, 0xa1, 0xe2,
	0x3b, 0xc6, 0x82, 0x59, 0xef, 0xc4, 0xb6, 0x44, 0x85, 0x1e, 0xa6, 0xe7, 0x36, 0x61, 0xd6, 0x3b,
	0xdf, 0xa2, 0xe6, 0x4f, 0x82, 0x01, 0x7c, 0x27, 0x30, 0xc4, 0xc9, 0x24, 0x9d, 0x9c, 0xdb, 0x9a,
	0x4c, 0x56, 0xc9, 0xdf, 0xc1, 0xa1, 0xef, 0x18, 0x1e, 0x9b, 0x51, 0x7e, 0x67, 0x73, 0x6e, 0xbb,
	0xd4, 0x98, 0xcf, 0x28, 0xf9, 0xd1, 0x26, 0xde, 0xad, 0xd8, 0x91, 0xcc, 0xb7, 0xa0, 0xb1, 0x9b,
	0x54, 0xe4, 0x79, 0x1c, 0xa8, 0x37, 0x7c, 0x67, 0xad, 0x23, 0xa0, 0x27, 0x1b, 0xe9, 0x0b, 0x4f,
	0xa6, 0x27, 0xeb, 0xe9, 0x9b, 0x7f, 0x48, 0x50, 0xba, 0x59, 0xcd, 0x90, 0xb2, 0x9d, 0x66, 0x48,
	0x59, 0x32, 0x86, 0x6f, 0xe1, 0x60, 0x43, 0x91, 0xb9, 0xa7, 0x16, 0xf9, 0xd2, 0x5b, 0x67, 0x6e,
	0x7f, 0x08, 0x39, 0x8d, 0xb5, 0xdf, 0x42, 0x41, 0x2c, 0xe2, 0x1e, 0x94, 0xbe, 0xd6, 0xbe, 0xd0,
	0xbe, 0xfa, 0x46, 0x43, 0xcf, 0x70, 0x09, 0xf2, 0x93, 0x8b, 0x0b, 0x24, 0x05, 0xe0, 0xe6, 0xe2,
	0x02, 0xe5, 0xda, 0xff, 0xe4, 0xa0, 0xf6, 0xa0, 0x4c, 0xdc, 0x84, 0x32, 0x65, 0xc6, 0x8c, 0x19,
	0x0b, 0x33, 0x54, 0xa7, 0x82, 0x5e, 0xa2, 0xec, 0x53, 0x36, 0x31, 0x29, 0xbe, 0x86, 0x2a, 0xf7,
	0xd3, 0xfb, 0x16, 0xbd, 0xb2, 0xce, 0xc6, 0xae, 0xbb, 0xd3, 0x4c, 0xbc, 0xfe, 0x20, 0x1f, 0x5f,
	0x40, 0x6d, 0x11, 0xc7, 0x8b, 0x29, 0x70, 0xa5, 0x20, 0x94, 0xeb, 0xd5, 0x8a, 0x32, 0x21, 0x0c,
	0xba, 0xbc, 0xf2, 0xac, 0x3b, 0xbd, 0xba, 0x48, 0x9b, 0x78, 0xf3, 0x17, 0x09, 0xaa, 0xd9, 0x07,
	0xe1, 0xd7, 0x00, 0xdc, 0x77, 0xb2, 0x7d, 0x3c, 0xe7, 0xbe, 0x13, 0x36, 0x62, 0x40, 0x93, 0x6f,
	0xde, 0xc3, 0x27, 0xbf, 0x03, 0x85, 0x6f, 0x58, 0xc4, 0xb6, 0x0b, 0xf5, 0x47, 0x65, 0xe3, 0x23,
	0xa8, 0x47, 0x2b, 0xb3, 0xea, 0x37, 0x12, 0xd2, 0x1a, 0x65, 0x99, 0x78, 0xdc, 0x85, 0x17, 0xdc,
	0xbf, 0xbf, 0x77, 0x99, 0x17, 0x08, 0xa4, 0xef, 0x44, 0xc3, 0x09, 0x64, 0x7d, 0x5f, 0xaf, 0x27,
	0xae, 0xa9, 0xef, 0x88, 0x11, 0xb4, 0x97, 0xd0, 0xd8, 0x50, 0x25, 0x7e, 0x0b, 0x32, 0x65, 0xdc,
	0xe4, 0xe2, 0x51, 0x55, 0xb5, 0x96, 0xee, 0x8b, 0x9b, 0x5c, 0x0f, 0xbd, 0x22, 0xcc, 0xa4, 0x6c,
	0x2e, 0xda, 0xcf, 0x86, 0x05, 0x66, 0x3d, 0xf4, 0xb6, 0x7f, 0x97, 0xe1, 0x60, 0xfd, 0x2d, 0xd9,
	0x74, 0x1d, 0x42, 0xb3, 0xb9, 0xb4, 0xa3, 0xe3, 0x20, 0x53, 0x36, 0x5e, 0xda, 0x69, 0xdd, 0xce,
	0x6f, 0xd3, 0xed, 0xe9, 0x23, 0xdd, 0x0e, 0x3f, 0xe6, 0x8f, 0xb6, 0xdd, 0xb7, 0xff, 0x91, 0xed,
	0xd4, 0x71, 0x92, 0xb7, 0x1d, 0xa7, 0xe2, 0xba, 0xe3, 0xd4, 0xfc, 0x35, 0xff, 0x40, 0xf7, 0x2f,
	0xd3, 0xba, 0x3f, 0xdc, 0xa9, 0xb6, 0xac, 0xec, 0x5f, 0xa6, 0x65, 0x7f, 0x47, 0xa2, 0x8c, 0xea,
	0xff, 0x26, 0xad, 0x54, 0x7f, 0x02, 0xd8, 0x77, 0xc2, 0x0f, 0x62, 0x17, 0xdd, 0xaa, 0x05, 0x49,
	0x13, 0x93, 0x26, 0xe2, 0x35, 0x01, 0x4c, 0x1e, 0xf3, 0x6c, 0x3d, 0x03, 0x35, 0x92, 0xe5, 0x69,
	0xea, 0x2b, 0x31, 0xbd, 0x84, 0x17, 0x11, 0xe1, 0x6e, 0x9a, 0x5a, 0x13, 0x8c, 0x5a, 0x22, 0xac,
	0x47, 0x97, 0x20, 0x8b, 0xa5, 0xc6, 0x75, 0xd8, 0x8f, 0x94, 0xcf, 0xd0, 0xf4, 0xe9, 0x78, 0x8a,
	0x9e, 0xe1, 0x32, 0xc8, 0xd3, 0xf1, 0xb4, 0x3f, 0x44, 0x52, 0x04, 0x07, 0x3d, 0x94, 0x8b, 0xe0,
	0xa8, 0x87, 0xf2, 0x18, 0xa0, 0x18, 0x04, 0xa8, 0x3d, 0x54, 0x38, 0xfa, 0x37, 0x07, 0xb2, 0xd8,
	0xfb, 0x0c, 0xd3, 0x58, 0xd3, 0xcf, 0x43, 0x26, 0x4d, 0x3f, 0xef, 0xf7, 0x43, 0xa6, 0x00, 0x9e,
	0x86, 0x4c, 0x9a, 0x7e, 0xae, 0x1e, 0xa3, 0x7c, 0x0c, 0x87, 0xa8, 0x10, 0xc1, 0x41, 0x1f, 0xc9,
	0x31, 0x54, 0x51, 0x31, 0x86, 0xa7, 0xa8, 0x14, 0xc1, 0x61, 0x1f, 0x3d, 0x8f, 0xa1, 0x8a, 0xca,
	0x11, 0x1c, 0x0d, 0x11, 0xc4, 0x70, 0x84, 0xf6, 0x22, 0x78, 0x72, 0x8a, 0x2a, 0x31, 0x3c, 0x43,
	0xfb, 0x11, 0x3c, 0x1b, 0xa0, 0x6a, 0xd0, 0x42, 0x50, 0x4e, 0x6f, 0x84, 0x6a, 0x09, 0x3e, 0x41,
	0x28, 0xc6, 0x6a, 0x1f, 0xd5, 0x63, 0x3c, 0x50, 0x11, 0x4e, 0xf0, 0x00, 0xbd, 0x48, 0xf0, 0x10,
	0xbd, 0x17, 0xe3, 0x51, 0x0f, 0xbd, 0x4c, 0xb0, 0x8a, 0x0e, 0x62, 0x7c, 0x7a, 0x86, 0x1a, 0x11,
	0x56, 0xfb, 0x23, 0xa4, 0x24, 0xf8, 0x04, 0x1d, 0xc6, 0xf8, 0x78, 0x88, 0x9a, 0x31, 0x1e, 0x1d,
	0xa3, 0x57, 0x31, 0x3e, 0xe9, 0xa1, 0xd7, 0x09, 0x1e, 0xa0, 0xf7, 0xe7, 0x45, 0xf1, 0x9f, 0xf8,
	0xe0, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6a, 0xdb, 0x0f, 0xb8, 0x96, 0x0b, 0x00, 0x00,
}
