From 2c1d1b5ef0d66a1d83dad86a8d531b080bef4ee7 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Mon, 4 Nov 2024 09:23:28 +0100 Subject: [PATCH 1/6] Miragation to goflow2 v2.2.1 Goflow2 changed its protobuffer format These changes adapt the new format --- go.mod | 69 +- go.sum | 77 +- pb/enrichedflow.go | 139 +- pb/enrichedflow.pb.go | 1138 +++++++++-------- pb/enrichedflow.proto | 270 ++-- pb/flow.proto | 123 ++ pb/proton_producer.go | 17 + segments/export/clickhouse/clickhouse.go | 6 +- segments/filter/aggregate/flowcache.go | 32 +- segments/filter/flowfilter/flowfilter.go | 5 +- segments/filter/flowfilter/visitor.go | 502 ++++++++ segments/input/bpf/bpf.go | 11 +- segments/input/bpf/bpf_bpfeb.o | Bin 0 -> 18544 bytes segments/input/bpf/flow_exporter.go | 205 +++ segments/input/bpf/packet_dumper.go | 289 +++++ segments/input/goflow/goflow.go | 98 +- segments/input/kafkaconsumer/handler.go | 16 +- segments/modify/aslookup/aslookup.go | 113 +- segments/modify/aslookup/aslookup_test.go | 12 +- segments/modify/bgp/bgp.go | 6 +- .../output/kafkaproducer/kafkaproducer.go | 5 +- segments/print/printflowdump/printflowdump.go | 8 +- 22 files changed, 2196 insertions(+), 945 deletions(-) create mode 100644 pb/flow.proto create mode 100644 pb/proton_producer.go create mode 100644 segments/filter/flowfilter/visitor.go create mode 100644 segments/input/bpf/bpf_bpfeb.o create mode 100644 segments/input/bpf/flow_exporter.go create mode 100644 segments/input/bpf/packet_dumper.go diff --git a/go.mod b/go.mod index 1928f1a..4cb0a73 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/bwNetFlow/flowpipeline -go 1.20 +go 1.22.7 + +toolchain go1.23.2 require ( github.com/BelWue/bgp_routeinfo v0.0.0-20221004100427-d8095fc566dd @@ -10,7 +12,6 @@ require ( github.com/alouca/gosnmp v0.0.0-20170620005048-04d83944c9ab github.com/asecurityteam/rolling v2.0.4+incompatible github.com/banviktor/asnlookup v0.1.0 - github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05 github.com/bwNetFlow/flowfilter v0.0.0-20221025122858-60746fa15915 github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04 github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342 @@ -20,15 +21,24 @@ require ( github.com/hashicorp/logutils v1.0.0 github.com/influxdata/influxdb-client-go/v2 v2.12.2 github.com/mattn/go-sqlite3 v1.14.16 - github.com/netsampler/goflow2 v1.1.1 - github.com/oschwald/maxminddb-golang v1.10.0 + github.com/netsampler/goflow2/v2 v2.2.1 + github.com/oschwald/maxminddb-golang v1.13.0 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/prometheus/client_golang v1.14.0 + github.com/prometheus/client_golang v1.20.0 github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 - google.golang.org/protobuf v1.28.1 + google.golang.org/protobuf v1.35.1 gopkg.in/yaml.v2 v2.4.0 ) +require ( + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect +) + require ( github.com/ClickHouse/ch-go v0.53.0 // indirect github.com/alecthomas/participle/v2 v2.0.0-beta.1 // indirect @@ -36,8 +46,8 @@ require ( github.com/andybalholm/brotli v1.0.5 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cilium/ebpf v0.10.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cilium/ebpf v0.10.0 github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect @@ -48,9 +58,9 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.6.1 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect @@ -64,43 +74,44 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/k-sone/critbitgo v1.4.0 // indirect github.com/kaorimatz/go-mrt v0.0.0-20210326003454-aa11f3646f93 // indirect - github.com/klauspost/compress v1.15.15 // indirect - github.com/libp2p/go-reuseport v0.2.0 // indirect + github.com/klauspost/compress v1.17.9 + github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/osrg/gobgp/v3 v3.11.0 // indirect + github.com/netsampler/goflow2 v1.3.7 + github.com/osrg/gobgp/v3 v3.30.0 // indirect github.com/paulmach/orb v0.9.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.40.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/segmentio/asm v1.2.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - github.com/spf13/afero v1.9.4 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.15.0 // indirect + github.com/spf13/viper v1.16.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/vishvananda/netlink v1.2.1-beta.2 // indirect + github.com/vishvananda/netlink v1.2.1 // indirect github.com/vishvananda/netns v0.0.4 // indirect go.opentelemetry.io/otel v1.13.0 // indirect go.opentelemetry.io/otel/trace v1.13.0 // indirect - golang.org/x/crypto v0.6.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec // indirect - google.golang.org/grpc v1.53.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.17.0 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + google.golang.org/grpc v1.56.3 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 5d47c55..ea4bdb0 100644 --- a/go.sum +++ b/go.sum @@ -89,13 +89,10 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= -github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05 h1:/H/qIQ0bo3uVWV9ILwv7dIR6r4MsHmqk+Nc7zGT4/0s= -github.com/bwNetFlow/bpf_flowexport v0.0.0-20220515112212-cd8128615c05/go.mod h1:DuJLqsHWPJZpyo1yfuHEMjSlQlPjXWntTjGAHJCt4ns= github.com/bwNetFlow/flowfilter v0.0.0-20221025122858-60746fa15915 h1:RN9oNbfTMlAlVznyp0pI5LOZnB+rjnB/Lmzd23UVyQY= github.com/bwNetFlow/flowfilter v0.0.0-20221025122858-60746fa15915/go.mod h1:g+jR9KOBdcsGSdRLf8Q5ii7FgwumWPs83gU8pbBQ/4k= github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04 h1:mm0/N8cMAdc5TRsmAkrhnPIdOm0ZqbT7uUC9Wt/21mk= github.com/bwNetFlow/ip_prefix_trie v0.0.0-20210830112018-b360b7b65c04/go.mod h1:rtoxrzCig192Z9SYgF7J58r3qgnJ09yI3pnPVPf9+3U= -github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342 h1:CrEmmSVFs3Ssceezrj/KyLuTvelGH8CZkNLgVxYrQ4o= github.com/bwNetFlow/protobuf/go v0.0.0-20211004083441-61e193b4b342/go.mod h1:kBaPxJ+ZXKXx3DoYF8OQdxtkHtH2xhdUIL51a4OE3as= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -103,6 +100,8 @@ github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cb github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -217,6 +216,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -254,6 +255,8 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -318,6 +321,8 @@ github.com/klauspost/compress v1.15.14 h1:i7WCKDToww0wA+9qrUZ1xOjp218vfFo3nTU6UH github.com/klauspost/compress v1.15.14/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -344,6 +349,10 @@ github.com/lestrrat-go/jwx v1.2.24/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xw github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= +github.com/libp2p/go-reuseport v0.3.0 h1:iiZslO5byUYZEg9iCwJGf5h+sf1Agmqx2V2FDjPyvUw= +github.com/libp2p/go-reuseport v0.3.0/go.mod h1:laea40AimhtfEqysZ71UpYj4S+R9VpH8PgqLo7L+SwI= +github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= +github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -376,17 +385,29 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/netsampler/goflow2 v1.1.1 h1:GpVlvPq4yRbyzoiz0Vp3XilNr5js/0UhHcQI7Ol/MDk= -github.com/netsampler/goflow2 v1.1.1/go.mod h1:oNIeGj67SjwrRSTEukErjNT1zZ02W9+8M5mSgQCkZC8= +github.com/netsampler/goflow2 v1.3.7 h1:XZaTy8kkMnGXpJ9hS3KbO1McyrFTpVNhVFEx9rNhMmc= +github.com/netsampler/goflow2 v1.3.7/go.mod h1:4UZsVGVAs//iMCptUHn3WNScztJeUhZH7kDW2+/vDdQ= +github.com/netsampler/goflow2/v2 v2.2.1 h1:QzrtWS/meXsqCLv68hdouL+09NfuLKrCoVDJ1xfmuoE= +github.com/netsampler/goflow2/v2 v2.2.1/go.mod h1:057wOc/Xp7c+hUwRDB7wRqrx55m0r3vc7J0k4NrlFbM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oschwald/maxminddb-golang v1.10.0 h1:Xp1u0ZhqkSuopaKmk1WwHtjF0H9Hd9181uj2MQ5Vndg= github.com/oschwald/maxminddb-golang v1.10.0/go.mod h1:Y2ELenReaLAZ0b400URyGwvYxHV1dLIxBuyOsyYjHK0= +github.com/oschwald/maxminddb-golang v1.11.0 h1:aSXMqYR/EPNjGE8epgqwDay+P30hCBZIveY0WZbAWh0= +github.com/oschwald/maxminddb-golang v1.11.0/go.mod h1:YmVI+H0zh3ySFR3w+oz8PCfglAFj3PuCmui13+P9zDg= +github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU= +github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o= github.com/osrg/gobgp/v3 v3.7.0 h1:h+Liq90TsxNKTB/443V8b1o/pwOm94yIsm+gP0RHwOo= github.com/osrg/gobgp/v3 v3.7.0/go.mod h1:fKQPuk7+4qMiDT5viZTXT/aSEn8yYDkEs5p3NjmU2bw= github.com/osrg/gobgp/v3 v3.11.0 h1:HismNqoeZJ96WoDjxg5A4mAvFmOcuct5QYktFc8euSo= github.com/osrg/gobgp/v3 v3.11.0/go.mod h1:/q/mr+dOuPf5hDlLiatVll1P7BX4pmiXQxd4ZZpUbkg= +github.com/osrg/gobgp/v3 v3.30.0 h1:nGCr0G4ERPeKEHw9HpaUybeZdgIdrHHIIG2VSoZR2lQ= +github.com/osrg/gobgp/v3 v3.30.0/go.mod h1:8m+kgkdaWrByxg5EWpNUO2r/mopodrNBOUBhMnW/yGQ= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/paulmach/orb v0.8.0 h1:W5XAt5yNPNnhaMNEf0xNSkBMJ1LzOzdk2MRlB6EN0Vs= @@ -400,6 +421,8 @@ github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwb github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= @@ -420,12 +443,18 @@ github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPk github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= +github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= @@ -434,6 +463,10 @@ github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8 github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.40.0 h1:Afz7EVRqGg2Mqqf4JuF9vdvp1pi220m55Pi9T2JnO4Q= github.com/prometheus/common v0.40.0/go.mod h1:L65ZJPSmfn/UBWLQIHV7dBrKFidB/wPlF1y5TlSt9OE= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -443,6 +476,10 @@ github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -462,12 +499,18 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.9.4 h1:Sd43wM1IWz/s1aVXdOBkjJvuP8UdyqioeE4AmM0QsBs= github.com/spf13/afero v1.9.4/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -476,6 +519,8 @@ github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -491,6 +536,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= @@ -505,6 +552,8 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netlink v1.2.1 h1:pfLv/qlJUwOTPvtWREA7c3PI4u81YkqZw1DYhI2HmLA= +github.com/vishvananda/netlink v1.2.1/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207 h1:nn7SOQy8xCu3iXNv7oiBhhEQtbWdnEOMnuKBlHvrqIM= github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= @@ -631,6 +680,12 @@ golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -716,8 +771,14 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -858,6 +919,8 @@ google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e h1:S9GbmC1iCgvbLyA google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec h1:6rwgChOSUfpzJF2/KnLgo+gMaxGpujStSkPWrbhXArU= google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -878,6 +941,8 @@ google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -894,6 +959,8 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pb/enrichedflow.go b/pb/enrichedflow.go index 23292ac..b434399 100644 --- a/pb/enrichedflow.go +++ b/pb/enrichedflow.go @@ -3,141 +3,8 @@ package pb import ( "fmt" "net" - - oldpb "github.com/bwNetFlow/protobuf/go" - goflowpb "github.com/netsampler/goflow2/pb" ) -func NewFromOld(msg *oldpb.FlowMessage) *EnrichedFlow { - return &EnrichedFlow{ - Type: EnrichedFlow_FlowType(msg.Type), - TimeReceived: msg.TimeReceived, - SequenceNum: msg.SequenceNum, - SamplingRate: msg.SamplingRate, - FlowDirection: msg.FlowDirection, - SamplerAddress: msg.SamplerAddress, - TimeFlowStart: msg.TimeFlowStart, - TimeFlowEnd: msg.TimeFlowEnd, - Bytes: msg.Bytes, - Packets: msg.Packets, - SrcAddr: msg.SrcAddr, - DstAddr: msg.DstAddr, - Etype: msg.Etype, - Proto: msg.Proto, - SrcPort: msg.SrcPort, - DstPort: msg.DstPort, - InIf: msg.InIf, - OutIf: msg.OutIf, - SrcMac: msg.SrcMac, - DstMac: msg.DstMac, - SrcVlan: msg.SrcVlan, - DstVlan: msg.DstVlan, - VlanId: msg.VlanId, - IngressVrfID: msg.IngressVrfID, - EgressVrfID: msg.EgressVrfID, - IPTos: msg.IPTos, - ForwardingStatus: msg.ForwardingStatus, - IPTTL: msg.IPTTL, - TCPFlags: msg.TCPFlags, - IcmpType: msg.IcmpType, - IcmpCode: msg.IcmpCode, - IPv6FlowLabel: msg.IPv6FlowLabel, - FragmentId: msg.FragmentId, - FragmentOffset: msg.FragmentOffset, - BiFlowDirection: msg.BiFlowDirection, - SrcAS: msg.SrcAS, - DstAS: msg.DstAS, - NextHop: msg.NextHop, - NextHopAS: msg.NextHopAS, - SrcNet: msg.SrcNet, - DstNet: msg.DstNet, - HasMPLS: msg.HasMPLS, - MPLSCount: msg.MPLSCount, - MPLS1TTL: msg.MPLS1TTL, - MPLS1Label: msg.MPLS1Label, - MPLS2TTL: msg.MPLS2TTL, - MPLS2Label: msg.MPLS2Label, - MPLS3TTL: msg.MPLS3TTL, - MPLS3Label: msg.MPLS3Label, - MPLSLastTTL: msg.MPLSLastTTL, - MPLSLastLabel: msg.MPLSLastLabel, - Cid: msg.Cid, - CidString: msg.CidString, - SrcCid: msg.SrcCid, - DstCid: msg.DstCid, - Normalized: EnrichedFlow_NormalizedType(msg.Normalized), - SrcIfName: msg.SrcIfName, - SrcIfDesc: msg.SrcIfDesc, - SrcIfSpeed: msg.SrcIfSpeed, - DstIfName: msg.DstIfName, - DstIfDesc: msg.DstIfDesc, - DstIfSpeed: msg.DstIfSpeed, - ProtoName: msg.ProtoName, - RemoteCountry: msg.RemoteCountry, - SrcCountry: msg.SrcCountry, - DstCountry: msg.DstCountry, - RemoteAddr: EnrichedFlow_RemoteAddrType(msg.RemoteAddr), - Note: msg.Note, - } -} - -func NewFromGoflow(msg *goflowpb.FlowMessage) *EnrichedFlow { - return &EnrichedFlow{ - Type: EnrichedFlow_FlowType(msg.Type), - TimeReceived: msg.TimeReceived, - SequenceNum: msg.SequenceNum, - SamplingRate: msg.SamplingRate, - FlowDirection: msg.FlowDirection, - SamplerAddress: msg.SamplerAddress, - TimeFlowStart: msg.TimeFlowStart, - TimeFlowEnd: msg.TimeFlowEnd, - Bytes: msg.Bytes, - Packets: msg.Packets, - SrcAddr: msg.SrcAddr, - DstAddr: msg.DstAddr, - Etype: msg.Etype, - Proto: msg.Proto, - SrcPort: msg.SrcPort, - DstPort: msg.DstPort, - InIf: msg.InIf, - OutIf: msg.OutIf, - SrcMac: msg.SrcMac, - DstMac: msg.DstMac, - SrcVlan: msg.SrcVlan, - DstVlan: msg.DstVlan, - VlanId: msg.VlanId, - IngressVrfID: msg.IngressVrfID, - EgressVrfID: msg.EgressVrfID, - IPTos: msg.IPTos, - ForwardingStatus: msg.ForwardingStatus, - IPTTL: msg.IPTTL, - TCPFlags: msg.TCPFlags, - IcmpType: msg.IcmpType, - IcmpCode: msg.IcmpCode, - IPv6FlowLabel: msg.IPv6FlowLabel, - FragmentId: msg.FragmentId, - FragmentOffset: msg.FragmentOffset, - BiFlowDirection: msg.BiFlowDirection, - SrcAS: msg.SrcAS, - DstAS: msg.DstAS, - NextHop: msg.NextHop, - NextHopAS: msg.NextHopAS, - SrcNet: msg.SrcNet, - DstNet: msg.DstNet, - HasMPLS: msg.HasMPLS, - MPLSCount: msg.MPLSCount, - MPLS1TTL: msg.MPLS1TTL, - MPLS1Label: msg.MPLS1Label, - MPLS2TTL: msg.MPLS2TTL, - MPLS2Label: msg.MPLS2Label, - MPLS3TTL: msg.MPLS3TTL, - MPLS3Label: msg.MPLS3Label, - MPLSLastTTL: msg.MPLSLastTTL, - MPLSLastLabel: msg.MPLSLastLabel, - // leave the 'Custom*' fields out of this conversion - } -} - var ( FlowDirectionMap = map[uint32]string{ 0: "Incoming", @@ -301,7 +168,8 @@ func (flow *EnrichedFlow) GetBps() uint64 { if duration == 0 { duration = 1 } - return flow.Bytes / duration + bpns := flow.Bytes / duration + return bpns } func (flow *EnrichedFlow) GetPps() uint64 { @@ -309,5 +177,6 @@ func (flow *EnrichedFlow) GetPps() uint64 { if duration == 0 { duration = 1 } - return flow.Packets / duration + ppns := flow.Packets / duration + return ppns } diff --git a/pb/enrichedflow.pb.go b/pb/enrichedflow.pb.go index a64ec93..cd38533 100644 --- a/pb/enrichedflow.pb.go +++ b/pb/enrichedflow.pb.go @@ -1,8 +1,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v4.23.2 -// source: pb/enrichedflow.proto +// protoc-gen-go v1.35.1 +// protoc v3.21.12 +// source: enrichedflow.proto package pb @@ -62,11 +62,11 @@ func (x EnrichedFlow_FlowType) String() string { } func (EnrichedFlow_FlowType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[0].Descriptor() + return file_enrichedflow_proto_enumTypes[0].Descriptor() } func (EnrichedFlow_FlowType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[0] + return &file_enrichedflow_proto_enumTypes[0] } func (x EnrichedFlow_FlowType) Number() protoreflect.EnumNumber { @@ -75,7 +75,7 @@ func (x EnrichedFlow_FlowType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_FlowType.Descriptor instead. func (EnrichedFlow_FlowType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 0} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 0} } // modify/anonymize @@ -109,11 +109,11 @@ func (x EnrichedFlow_AnonymizedType) String() string { } func (EnrichedFlow_AnonymizedType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[1].Descriptor() + return file_enrichedflow_proto_enumTypes[1].Descriptor() } func (EnrichedFlow_AnonymizedType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[1] + return &file_enrichedflow_proto_enumTypes[1] } func (x EnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { @@ -122,7 +122,7 @@ func (x EnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_AnonymizedType.Descriptor instead. func (EnrichedFlow_AnonymizedType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 1} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 1} } type EnrichedFlow_ValidationStatusType int32 @@ -161,11 +161,11 @@ func (x EnrichedFlow_ValidationStatusType) String() string { } func (EnrichedFlow_ValidationStatusType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[2].Descriptor() + return file_enrichedflow_proto_enumTypes[2].Descriptor() } func (EnrichedFlow_ValidationStatusType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[2] + return &file_enrichedflow_proto_enumTypes[2] } func (x EnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { @@ -174,7 +174,7 @@ func (x EnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_ValidationStatusType.Descriptor instead. func (EnrichedFlow_ValidationStatusType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 2} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 2} } // modify/normalize @@ -208,11 +208,11 @@ func (x EnrichedFlow_NormalizedType) String() string { } func (EnrichedFlow_NormalizedType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[3].Descriptor() + return file_enrichedflow_proto_enumTypes[3].Descriptor() } func (EnrichedFlow_NormalizedType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[3] + return &file_enrichedflow_proto_enumTypes[3] } func (x EnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { @@ -221,7 +221,7 @@ func (x EnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_NormalizedType.Descriptor instead. func (EnrichedFlow_NormalizedType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 3} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 3} } // modify/remoteaddress @@ -258,11 +258,11 @@ func (x EnrichedFlow_RemoteAddrType) String() string { } func (EnrichedFlow_RemoteAddrType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[4].Descriptor() + return file_enrichedflow_proto_enumTypes[4].Descriptor() } func (EnrichedFlow_RemoteAddrType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[4] + return &file_enrichedflow_proto_enumTypes[4] } func (x EnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { @@ -271,7 +271,7 @@ func (x EnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_RemoteAddrType.Descriptor instead. func (EnrichedFlow_RemoteAddrType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 4} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 4} } type EnrichedFlow struct { @@ -279,158 +279,169 @@ type EnrichedFlow struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type EnrichedFlow_FlowType `protobuf:"varint,1,opt,name=Type,proto3,enum=flowpb.EnrichedFlow_FlowType" json:"Type,omitempty"` - TimeReceived uint64 `protobuf:"varint,2,opt,name=TimeReceived,proto3" json:"TimeReceived,omitempty"` - SequenceNum uint32 `protobuf:"varint,4,opt,name=SequenceNum,proto3" json:"SequenceNum,omitempty"` - SamplingRate uint64 `protobuf:"varint,3,opt,name=SamplingRate,proto3" json:"SamplingRate,omitempty"` - FlowDirection uint32 `protobuf:"varint,42,opt,name=FlowDirection,proto3" json:"FlowDirection,omitempty"` + Type EnrichedFlow_FlowType `protobuf:"varint,1,opt,name=type,proto3,enum=flowpb.EnrichedFlow_FlowType" json:"type,omitempty"` + TimeReceived uint64 `protobuf:"varint,2,opt,name=time_received,json=timeReceived,proto3" json:"time_received,omitempty"` + SequenceNum uint32 `protobuf:"varint,4,opt,name=sequence_num,json=sequenceNum,proto3" json:"sequence_num,omitempty"` + SamplingRate uint64 `protobuf:"varint,3,opt,name=sampling_rate,json=samplingRate,proto3" json:"sampling_rate,omitempty"` + FlowDirection uint32 `protobuf:"varint,42,opt,name=flow_direction,json=flowDirection,proto3" json:"flow_direction,omitempty"` // Sampler information - SamplerAddress []byte `protobuf:"bytes,11,opt,name=SamplerAddress,proto3" json:"SamplerAddress,omitempty"` + SamplerAddress []byte `protobuf:"bytes,11,opt,name=sampler_address,json=samplerAddress,proto3" json:"sampler_address,omitempty"` // Found inside packet - TimeFlowStart uint64 `protobuf:"varint,38,opt,name=TimeFlowStart,proto3" json:"TimeFlowStart,omitempty"` - TimeFlowEnd uint64 `protobuf:"varint,5,opt,name=TimeFlowEnd,proto3" json:"TimeFlowEnd,omitempty"` + TimeFlowStart uint64 `protobuf:"varint,38,opt,name=time_flow_start,json=timeFlowStart,proto3" json:"time_flow_start,omitempty"` + TimeFlowEnd uint64 `protobuf:"varint,5,opt,name=time_flow_end,json=timeFlowEnd,proto3" json:"time_flow_end,omitempty"` + TimeFlowStartMs uint64 `protobuf:"varint,63,opt,name=time_flow_start_ms,json=timeFlowStartMs,proto3" json:"time_flow_start_ms,omitempty"` + TimeFlowEndMs uint64 `protobuf:"varint,64,opt,name=time_flow_end_ms,json=timeFlowEndMs,proto3" json:"time_flow_end_ms,omitempty"` // Size of the sampled packet - Bytes uint64 `protobuf:"varint,9,opt,name=Bytes,proto3" json:"Bytes,omitempty"` - Packets uint64 `protobuf:"varint,10,opt,name=Packets,proto3" json:"Packets,omitempty"` + Bytes uint64 `protobuf:"varint,9,opt,name=bytes,proto3" json:"bytes,omitempty"` + Packets uint64 `protobuf:"varint,10,opt,name=packets,proto3" json:"packets,omitempty"` // Source/destination addresses - SrcAddr []byte `protobuf:"bytes,6,opt,name=SrcAddr,proto3" json:"SrcAddr,omitempty"` - DstAddr []byte `protobuf:"bytes,7,opt,name=DstAddr,proto3" json:"DstAddr,omitempty"` + SrcAddr []byte `protobuf:"bytes,6,opt,name=src_addr,json=srcAddr,proto3" json:"src_addr,omitempty"` + DstAddr []byte `protobuf:"bytes,7,opt,name=dst_addr,json=dstAddr,proto3" json:"dst_addr,omitempty"` // Layer 3 protocol (IPv4/IPv6/ARP/MPLS...) - Etype uint32 `protobuf:"varint,30,opt,name=Etype,proto3" json:"Etype,omitempty"` + Etype uint32 `protobuf:"varint,30,opt,name=etype,proto3" json:"etype,omitempty"` // Layer 4 protocol - Proto uint32 `protobuf:"varint,20,opt,name=Proto,proto3" json:"Proto,omitempty"` + Proto uint32 `protobuf:"varint,20,opt,name=proto,proto3" json:"proto,omitempty"` // Ports for UDP and TCP - SrcPort uint32 `protobuf:"varint,21,opt,name=SrcPort,proto3" json:"SrcPort,omitempty"` - DstPort uint32 `protobuf:"varint,22,opt,name=DstPort,proto3" json:"DstPort,omitempty"` + SrcPort uint32 `protobuf:"varint,21,opt,name=src_port,json=srcPort,proto3" json:"src_port,omitempty"` + DstPort uint32 `protobuf:"varint,22,opt,name=dst_port,json=dstPort,proto3" json:"dst_port,omitempty"` // Interfaces - InIf uint32 `protobuf:"varint,18,opt,name=InIf,proto3" json:"InIf,omitempty"` - OutIf uint32 `protobuf:"varint,19,opt,name=OutIf,proto3" json:"OutIf,omitempty"` + InIf uint32 `protobuf:"varint,18,opt,name=in_if,json=inIf,proto3" json:"in_if,omitempty"` + OutIf uint32 `protobuf:"varint,19,opt,name=out_if,json=outIf,proto3" json:"out_if,omitempty"` // Ethernet information - SrcMac uint64 `protobuf:"varint,27,opt,name=SrcMac,proto3" json:"SrcMac,omitempty"` - DstMac uint64 `protobuf:"varint,28,opt,name=DstMac,proto3" json:"DstMac,omitempty"` + SrcMac uint64 `protobuf:"varint,27,opt,name=src_mac,json=srcMac,proto3" json:"src_mac,omitempty"` + DstMac uint64 `protobuf:"varint,28,opt,name=dst_mac,json=dstMac,proto3" json:"dst_mac,omitempty"` // Vlan - SrcVlan uint32 `protobuf:"varint,33,opt,name=SrcVlan,proto3" json:"SrcVlan,omitempty"` - DstVlan uint32 `protobuf:"varint,34,opt,name=DstVlan,proto3" json:"DstVlan,omitempty"` + SrcVlan uint32 `protobuf:"varint,33,opt,name=src_vlan,json=srcVlan,proto3" json:"src_vlan,omitempty"` + DstVlan uint32 `protobuf:"varint,34,opt,name=dst_vlan,json=dstVlan,proto3" json:"dst_vlan,omitempty"` // 802.1q VLAN in sampled packet - VlanId uint32 `protobuf:"varint,29,opt,name=VlanId,proto3" json:"VlanId,omitempty"` + VlanId uint32 `protobuf:"varint,29,opt,name=vlan_id,json=vlanId,proto3" json:"vlan_id,omitempty"` // VRF - IngressVrfID uint32 `protobuf:"varint,39,opt,name=IngressVrfID,proto3" json:"IngressVrfID,omitempty"` - EgressVrfID uint32 `protobuf:"varint,40,opt,name=EgressVrfID,proto3" json:"EgressVrfID,omitempty"` + IngressVrfId uint32 `protobuf:"varint,39,opt,name=ingress_vrf_id,json=ingressVrfId,proto3" json:"ingress_vrf_id,omitempty"` + EgressVrfId uint32 `protobuf:"varint,40,opt,name=egress_vrf_id,json=egressVrfId,proto3" json:"egress_vrf_id,omitempty"` // IP and TCP special flags - IPTos uint32 `protobuf:"varint,23,opt,name=IPTos,proto3" json:"IPTos,omitempty"` - ForwardingStatus uint32 `protobuf:"varint,24,opt,name=ForwardingStatus,proto3" json:"ForwardingStatus,omitempty"` - IPTTL uint32 `protobuf:"varint,25,opt,name=IPTTL,proto3" json:"IPTTL,omitempty"` - TCPFlags uint32 `protobuf:"varint,26,opt,name=TCPFlags,proto3" json:"TCPFlags,omitempty"` - IcmpType uint32 `protobuf:"varint,31,opt,name=IcmpType,proto3" json:"IcmpType,omitempty"` - IcmpCode uint32 `protobuf:"varint,32,opt,name=IcmpCode,proto3" json:"IcmpCode,omitempty"` - IPv6FlowLabel uint32 `protobuf:"varint,37,opt,name=IPv6FlowLabel,proto3" json:"IPv6FlowLabel,omitempty"` + IpTos uint32 `protobuf:"varint,23,opt,name=ip_tos,json=ipTos,proto3" json:"ip_tos,omitempty"` + ForwardingStatus uint32 `protobuf:"varint,24,opt,name=forwarding_status,json=forwardingStatus,proto3" json:"forwarding_status,omitempty"` + IpTtl uint32 `protobuf:"varint,25,opt,name=ip_ttl,json=ipTtl,proto3" json:"ip_ttl,omitempty"` + TcpFlags uint32 `protobuf:"varint,26,opt,name=tcp_flags,json=tcpFlags,proto3" json:"tcp_flags,omitempty"` + IcmpType uint32 `protobuf:"varint,31,opt,name=icmp_type,json=icmpType,proto3" json:"icmp_type,omitempty"` + IcmpCode uint32 `protobuf:"varint,32,opt,name=icmp_code,json=icmpCode,proto3" json:"icmp_code,omitempty"` + Ipv6FlowLabel uint32 `protobuf:"varint,37,opt,name=ipv6_flow_label,json=ipv6FlowLabel,proto3" json:"ipv6_flow_label,omitempty"` // Fragments (IPv4/IPv6) - FragmentId uint32 `protobuf:"varint,35,opt,name=FragmentId,proto3" json:"FragmentId,omitempty"` - FragmentOffset uint32 `protobuf:"varint,36,opt,name=FragmentOffset,proto3" json:"FragmentOffset,omitempty"` - BiFlowDirection uint32 `protobuf:"varint,41,opt,name=BiFlowDirection,proto3" json:"BiFlowDirection,omitempty"` + FragmentId uint32 `protobuf:"varint,35,opt,name=fragment_id,json=fragmentId,proto3" json:"fragment_id,omitempty"` + FragmentOffset uint32 `protobuf:"varint,36,opt,name=fragment_offset,json=fragmentOffset,proto3" json:"fragment_offset,omitempty"` + BiFlowDirection uint32 `protobuf:"varint,41,opt,name=bi_flow_direction,json=biFlowDirection,proto3" json:"bi_flow_direction,omitempty"` // Autonomous system information - SrcAS uint32 `protobuf:"varint,14,opt,name=SrcAS,proto3" json:"SrcAS,omitempty"` - DstAS uint32 `protobuf:"varint,15,opt,name=DstAS,proto3" json:"DstAS,omitempty"` - NextHop []byte `protobuf:"bytes,12,opt,name=NextHop,proto3" json:"NextHop,omitempty"` - NextHopAS uint32 `protobuf:"varint,13,opt,name=NextHopAS,proto3" json:"NextHopAS,omitempty"` + SrcAs uint32 `protobuf:"varint,14,opt,name=src_as,json=srcAs,proto3" json:"src_as,omitempty"` + DstAs uint32 `protobuf:"varint,15,opt,name=dst_as,json=dstAs,proto3" json:"dst_as,omitempty"` + NextHop []byte `protobuf:"bytes,12,opt,name=next_hop,json=nextHop,proto3" json:"next_hop,omitempty"` + NextHopAs uint32 `protobuf:"varint,13,opt,name=next_hop_as,json=nextHopAs,proto3" json:"next_hop_as,omitempty"` // Prefix size - SrcNet uint32 `protobuf:"varint,16,opt,name=SrcNet,proto3" json:"SrcNet,omitempty"` - DstNet uint32 `protobuf:"varint,17,opt,name=DstNet,proto3" json:"DstNet,omitempty"` + SrcNet uint32 `protobuf:"varint,16,opt,name=src_net,json=srcNet,proto3" json:"src_net,omitempty"` + DstNet uint32 `protobuf:"varint,17,opt,name=dst_net,json=dstNet,proto3" json:"dst_net,omitempty"` + // BGP information + BgpNextHop []byte `protobuf:"bytes,100,opt,name=bgp_next_hop,json=bgpNextHop,proto3" json:"bgp_next_hop,omitempty"` + BgpCommunities []uint32 `protobuf:"varint,101,rep,packed,name=bgp_communities,json=bgpCommunities,proto3" json:"bgp_communities,omitempty"` + AsPath []uint32 `protobuf:"varint,102,rep,packed,name=as_path,json=asPath,proto3" json:"as_path,omitempty"` // MPLS information - HasMPLS bool `protobuf:"varint,53,opt,name=HasMPLS,proto3" json:"HasMPLS,omitempty"` - MPLSCount uint32 `protobuf:"varint,54,opt,name=MPLSCount,proto3" json:"MPLSCount,omitempty"` - MPLS1TTL uint32 `protobuf:"varint,55,opt,name=MPLS1TTL,proto3" json:"MPLS1TTL,omitempty"` // First TTL - MPLS1Label uint32 `protobuf:"varint,56,opt,name=MPLS1Label,proto3" json:"MPLS1Label,omitempty"` // First Label - MPLS2TTL uint32 `protobuf:"varint,57,opt,name=MPLS2TTL,proto3" json:"MPLS2TTL,omitempty"` // Second TTL - MPLS2Label uint32 `protobuf:"varint,58,opt,name=MPLS2Label,proto3" json:"MPLS2Label,omitempty"` // Second Label - MPLS3TTL uint32 `protobuf:"varint,59,opt,name=MPLS3TTL,proto3" json:"MPLS3TTL,omitempty"` // Third TTL - MPLS3Label uint32 `protobuf:"varint,60,opt,name=MPLS3Label,proto3" json:"MPLS3Label,omitempty"` // Third Label - MPLSLastTTL uint32 `protobuf:"varint,61,opt,name=MPLSLastTTL,proto3" json:"MPLSLastTTL,omitempty"` // Last TTL - MPLSLastLabel uint32 `protobuf:"varint,62,opt,name=MPLSLastLabel,proto3" json:"MPLSLastLabel,omitempty"` // Last Label - PacketBytesMin uint32 `protobuf:"varint,1100,opt,name=PacketBytesMin,proto3" json:"PacketBytesMin,omitempty"` // new, single packet means uint32 < MTU - PacketBytesMax uint32 `protobuf:"varint,1101,opt,name=PacketBytesMax,proto3" json:"PacketBytesMax,omitempty"` // new - PacketBytesMean uint32 `protobuf:"varint,1102,opt,name=PacketBytesMean,proto3" json:"PacketBytesMean,omitempty"` // new - PacketBytesStdDev uint32 `protobuf:"varint,1103,opt,name=PacketBytesStdDev,proto3" json:"PacketBytesStdDev,omitempty"` // new - PacketIATMin uint64 `protobuf:"varint,1110,opt,name=PacketIATMin,proto3" json:"PacketIATMin,omitempty"` // new - PacketIATMax uint64 `protobuf:"varint,1111,opt,name=PacketIATMax,proto3" json:"PacketIATMax,omitempty"` // new - PacketIATMean uint64 `protobuf:"varint,1112,opt,name=PacketIATMean,proto3" json:"PacketIATMean,omitempty"` // new - PacketIATStdDev uint64 `protobuf:"varint,1113,opt,name=PacketIATStdDev,proto3" json:"PacketIATStdDev,omitempty"` // new - HeaderBytes uint32 `protobuf:"varint,1120,opt,name=HeaderBytes,proto3" json:"HeaderBytes,omitempty"` // new - FINFlagCount uint64 `protobuf:"varint,1130,opt,name=FINFlagCount,proto3" json:"FINFlagCount,omitempty"` // new - SYNFlagCount uint64 `protobuf:"varint,1131,opt,name=SYNFlagCount,proto3" json:"SYNFlagCount,omitempty"` // new - RSTFlagCount uint64 `protobuf:"varint,1132,opt,name=RSTFlagCount,proto3" json:"RSTFlagCount,omitempty"` // new - PSHFlagCount uint64 `protobuf:"varint,1133,opt,name=PSHFlagCount,proto3" json:"PSHFlagCount,omitempty"` // new - ACKFlagCount uint64 `protobuf:"varint,1134,opt,name=ACKFlagCount,proto3" json:"ACKFlagCount,omitempty"` // new - URGFlagCount uint64 `protobuf:"varint,1135,opt,name=URGFlagCount,proto3" json:"URGFlagCount,omitempty"` // new - CWRFlagCount uint64 `protobuf:"varint,1136,opt,name=CWRFlagCount,proto3" json:"CWRFlagCount,omitempty"` // new - ECEFlagCount uint64 `protobuf:"varint,1137,opt,name=ECEFlagCount,proto3" json:"ECEFlagCount,omitempty"` // new - PayloadPackets uint64 `protobuf:"varint,1140,opt,name=PayloadPackets,proto3" json:"PayloadPackets,omitempty"` // new - TimeActiveMin uint64 `protobuf:"varint,1150,opt,name=TimeActiveMin,proto3" json:"TimeActiveMin,omitempty"` // new - TimeActiveMax uint64 `protobuf:"varint,1151,opt,name=TimeActiveMax,proto3" json:"TimeActiveMax,omitempty"` // new - TimeActiveMean uint64 `protobuf:"varint,1152,opt,name=TimeActiveMean,proto3" json:"TimeActiveMean,omitempty"` // new - TimeActiveStdDev uint64 `protobuf:"varint,1153,opt,name=TimeActiveStdDev,proto3" json:"TimeActiveStdDev,omitempty"` // new - TimeIdleMin uint64 `protobuf:"varint,1154,opt,name=TimeIdleMin,proto3" json:"TimeIdleMin,omitempty"` // new - TimeIdleMax uint64 `protobuf:"varint,1155,opt,name=TimeIdleMax,proto3" json:"TimeIdleMax,omitempty"` // new - TimeIdleMean uint64 `protobuf:"varint,1156,opt,name=TimeIdleMean,proto3" json:"TimeIdleMean,omitempty"` // new - TimeIdleStdDev uint64 `protobuf:"varint,1157,opt,name=TimeIdleStdDev,proto3" json:"TimeIdleStdDev,omitempty"` // new + HasMpls bool `protobuf:"varint,53,opt,name=has_mpls,json=hasMpls,proto3" json:"has_mpls,omitempty"` + MplsCount uint32 `protobuf:"varint,54,opt,name=mpls_count,json=mplsCount,proto3" json:"mpls_count,omitempty"` + Mpls_1Ttl uint32 `protobuf:"varint,55,opt,name=mpls_1_ttl,json=mpls1Ttl,proto3" json:"mpls_1_ttl,omitempty"` // First TTL + Mpls_1Label uint32 `protobuf:"varint,56,opt,name=mpls_1_label,json=mpls1Label,proto3" json:"mpls_1_label,omitempty"` // First Label + Mpls_2Ttl uint32 `protobuf:"varint,57,opt,name=mpls_2_ttl,json=mpls2Ttl,proto3" json:"mpls_2_ttl,omitempty"` // Second TTL + Mpls_2Label uint32 `protobuf:"varint,58,opt,name=mpls_2_label,json=mpls2Label,proto3" json:"mpls_2_label,omitempty"` // Second Label + Mpls_3Ttl uint32 `protobuf:"varint,59,opt,name=mpls_3_ttl,json=mpls3Ttl,proto3" json:"mpls_3_ttl,omitempty"` // Third TTL + Mpls_3Label uint32 `protobuf:"varint,60,opt,name=mpls_3_label,json=mpls3Label,proto3" json:"mpls_3_label,omitempty"` // Third Label + MplsLastTtl uint32 `protobuf:"varint,61,opt,name=mpls_last_ttl,json=mplsLastTtl,proto3" json:"mpls_last_ttl,omitempty"` // Last TTL + MplsLastLabel uint32 `protobuf:"varint,62,opt,name=mpls_last_label,json=mplsLastLabel,proto3" json:"mpls_last_label,omitempty"` // Last Label + MplsLabelIp []byte `protobuf:"bytes,65,opt,name=mpls_label_ip,json=mplsLabelIp,proto3" json:"mpls_label_ip,omitempty"` // MPLS TOP Label IP + ObservationDomainId uint32 `protobuf:"varint,70,opt,name=observation_domain_id,json=observationDomainId,proto3" json:"observation_domain_id,omitempty"` + ObservationPointId uint32 `protobuf:"varint,71,opt,name=observation_point_id,json=observationPointId,proto3" json:"observation_point_id,omitempty"` + SrcCountry string `protobuf:"bytes,1000,opt,name=src_country,json=srcCountry,proto3" json:"src_country,omitempty"` + DstCountry string `protobuf:"bytes,1001,opt,name=dst_country,json=dstCountry,proto3" json:"dst_country,omitempty"` + PacketBytesMin uint32 `protobuf:"varint,2100,opt,name=PacketBytesMin,proto3" json:"PacketBytesMin,omitempty"` // new, single packet means uint32 < MTU + PacketBytesMax uint32 `protobuf:"varint,2101,opt,name=PacketBytesMax,proto3" json:"PacketBytesMax,omitempty"` // new + PacketBytesMean uint32 `protobuf:"varint,2102,opt,name=PacketBytesMean,proto3" json:"PacketBytesMean,omitempty"` // new + PacketBytesStdDev uint32 `protobuf:"varint,2103,opt,name=PacketBytesStdDev,proto3" json:"PacketBytesStdDev,omitempty"` // new + PacketIATMin uint64 `protobuf:"varint,2110,opt,name=PacketIATMin,proto3" json:"PacketIATMin,omitempty"` // new + PacketIATMax uint64 `protobuf:"varint,2111,opt,name=PacketIATMax,proto3" json:"PacketIATMax,omitempty"` // new + PacketIATMean uint64 `protobuf:"varint,2112,opt,name=PacketIATMean,proto3" json:"PacketIATMean,omitempty"` // new + PacketIATStdDev uint64 `protobuf:"varint,2113,opt,name=PacketIATStdDev,proto3" json:"PacketIATStdDev,omitempty"` // new + HeaderBytes uint32 `protobuf:"varint,2120,opt,name=HeaderBytes,proto3" json:"HeaderBytes,omitempty"` // new + FINFlagCount uint64 `protobuf:"varint,2130,opt,name=FINFlagCount,proto3" json:"FINFlagCount,omitempty"` // new + SYNFlagCount uint64 `protobuf:"varint,2131,opt,name=SYNFlagCount,proto3" json:"SYNFlagCount,omitempty"` // new + RSTFlagCount uint64 `protobuf:"varint,2132,opt,name=RSTFlagCount,proto3" json:"RSTFlagCount,omitempty"` // new + PSHFlagCount uint64 `protobuf:"varint,2133,opt,name=PSHFlagCount,proto3" json:"PSHFlagCount,omitempty"` // new + ACKFlagCount uint64 `protobuf:"varint,2134,opt,name=ACKFlagCount,proto3" json:"ACKFlagCount,omitempty"` // new + URGFlagCount uint64 `protobuf:"varint,2135,opt,name=URGFlagCount,proto3" json:"URGFlagCount,omitempty"` // new + CWRFlagCount uint64 `protobuf:"varint,2136,opt,name=CWRFlagCount,proto3" json:"CWRFlagCount,omitempty"` // new + ECEFlagCount uint64 `protobuf:"varint,2137,opt,name=ECEFlagCount,proto3" json:"ECEFlagCount,omitempty"` // new + PayloadPackets uint64 `protobuf:"varint,2140,opt,name=PayloadPackets,proto3" json:"PayloadPackets,omitempty"` // new + TimeActiveMin uint64 `protobuf:"varint,2150,opt,name=TimeActiveMin,proto3" json:"TimeActiveMin,omitempty"` // new + TimeActiveMax uint64 `protobuf:"varint,2151,opt,name=TimeActiveMax,proto3" json:"TimeActiveMax,omitempty"` // new + TimeActiveMean uint64 `protobuf:"varint,2152,opt,name=TimeActiveMean,proto3" json:"TimeActiveMean,omitempty"` // new + TimeActiveStdDev uint64 `protobuf:"varint,2153,opt,name=TimeActiveStdDev,proto3" json:"TimeActiveStdDev,omitempty"` // new + TimeIdleMin uint64 `protobuf:"varint,2154,opt,name=TimeIdleMin,proto3" json:"TimeIdleMin,omitempty"` // new + TimeIdleMax uint64 `protobuf:"varint,2155,opt,name=TimeIdleMax,proto3" json:"TimeIdleMax,omitempty"` // new + TimeIdleMean uint64 `protobuf:"varint,2156,opt,name=TimeIdleMean,proto3" json:"TimeIdleMean,omitempty"` // new + TimeIdleStdDev uint64 `protobuf:"varint,2157,opt,name=TimeIdleStdDev,proto3" json:"TimeIdleStdDev,omitempty"` // new // modify/addcid - Cid uint32 `protobuf:"varint,1000,opt,name=Cid,proto3" json:"Cid,omitempty"` // TODO: deprecate and provide as helper? - CidString string `protobuf:"bytes,1001,opt,name=CidString,proto3" json:"CidString,omitempty"` // deprecated, delete for v1.0.0 - SrcCid uint32 `protobuf:"varint,1012,opt,name=SrcCid,proto3" json:"SrcCid,omitempty"` - DstCid uint32 `protobuf:"varint,1013,opt,name=DstCid,proto3" json:"DstCid,omitempty"` - SrcAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,1160,opt,name=SrcAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"SrcAddrAnon,omitempty"` - DstAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,1161,opt,name=DstAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"DstAddrAnon,omitempty"` - SrcAddrPreservedLen uint32 `protobuf:"varint,1162,opt,name=SrcAddrPreservedLen,proto3" json:"SrcAddrPreservedLen,omitempty"` - DstAddrPreservedLen uint32 `protobuf:"varint,1163,opt,name=DstAddrPreservedLen,proto3" json:"DstAddrPreservedLen,omitempty"` - SamplerAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,1164,opt,name=SamplerAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"SamplerAddrAnon,omitempty"` - SamplerAddrAnonPreservedPrefixLen uint32 `protobuf:"varint,1165,opt,name=SamplerAddrAnonPreservedPrefixLen,proto3" json:"SamplerAddrAnonPreservedPrefixLen,omitempty"` + Cid uint32 `protobuf:"varint,2000,opt,name=Cid,proto3" json:"Cid,omitempty"` // TODO: deprecate and provide as helper? + CidString string `protobuf:"bytes,2001,opt,name=CidString,proto3" json:"CidString,omitempty"` // deprecated, delete for v1.0.0 + SrcCid uint32 `protobuf:"varint,2012,opt,name=SrcCid,proto3" json:"SrcCid,omitempty"` + DstCid uint32 `protobuf:"varint,2013,opt,name=DstCid,proto3" json:"DstCid,omitempty"` + SrcAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,2160,opt,name=SrcAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"SrcAddrAnon,omitempty"` + DstAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,2161,opt,name=DstAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"DstAddrAnon,omitempty"` + SrcAddrPreservedLen uint32 `protobuf:"varint,2162,opt,name=SrcAddrPreservedLen,proto3" json:"SrcAddrPreservedLen,omitempty"` + DstAddrPreservedLen uint32 `protobuf:"varint,2163,opt,name=DstAddrPreservedLen,proto3" json:"DstAddrPreservedLen,omitempty"` + SamplerAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,2164,opt,name=SamplerAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"SamplerAddrAnon,omitempty"` + SamplerAddrAnonPreservedPrefixLen uint32 `protobuf:"varint,2165,opt,name=SamplerAddrAnonPreservedPrefixLen,proto3" json:"SamplerAddrAnonPreservedPrefixLen,omitempty"` // modify/bgp // as done by a number of Netflow implementations, these refer to the destination - ASPath []uint32 `protobuf:"varint,1171,rep,packed,name=ASPath,proto3" json:"ASPath,omitempty"` - Med uint32 `protobuf:"varint,1172,opt,name=Med,proto3" json:"Med,omitempty"` - LocalPref uint32 `protobuf:"varint,1173,opt,name=LocalPref,proto3" json:"LocalPref,omitempty"` - ValidationStatus EnrichedFlow_ValidationStatusType `protobuf:"varint,1174,opt,name=ValidationStatus,proto3,enum=flowpb.EnrichedFlow_ValidationStatusType" json:"ValidationStatus,omitempty"` + Med uint32 `protobuf:"varint,2172,opt,name=Med,proto3" json:"Med,omitempty"` + LocalPref uint32 `protobuf:"varint,2173,opt,name=LocalPref,proto3" json:"LocalPref,omitempty"` + ValidationStatus EnrichedFlow_ValidationStatusType `protobuf:"varint,2174,opt,name=ValidationStatus,proto3,enum=flowpb.EnrichedFlow_ValidationStatusType" json:"ValidationStatus,omitempty"` // modify/geolocation - RemoteCountry string `protobuf:"bytes,1010,opt,name=RemoteCountry,proto3" json:"RemoteCountry,omitempty"` // TODO: deprecate and provide as helper - SrcCountry string `protobuf:"bytes,1014,opt,name=SrcCountry,proto3" json:"SrcCountry,omitempty"` - DstCountry string `protobuf:"bytes,1015,opt,name=DstCountry,proto3" json:"DstCountry,omitempty"` - Normalized EnrichedFlow_NormalizedType `protobuf:"varint,1002,opt,name=Normalized,proto3,enum=flowpb.EnrichedFlow_NormalizedType" json:"Normalized,omitempty"` // TODO: deprecate and replace with helper? + RemoteCountry string `protobuf:"bytes,2010,opt,name=RemoteCountry,proto3" json:"RemoteCountry,omitempty"` // TODO: deprecate and provide as helper + SrcCountryBW string `protobuf:"bytes,2014,opt,name=SrcCountryBW,proto3" json:"SrcCountryBW,omitempty"` + DstCountryBW string `protobuf:"bytes,2015,opt,name=DstCountryBW,proto3" json:"DstCountryBW,omitempty"` + Normalized EnrichedFlow_NormalizedType `protobuf:"varint,2002,opt,name=Normalized,proto3,enum=flowpb.EnrichedFlow_NormalizedType" json:"Normalized,omitempty"` // TODO: deprecate and replace with helper? // modify/protomap - ProtoName string `protobuf:"bytes,1009,opt,name=ProtoName,proto3" json:"ProtoName,omitempty"` // TODO: deprecate and replace with helper, why lug a string along... - RemoteAddr EnrichedFlow_RemoteAddrType `protobuf:"varint,1011,opt,name=RemoteAddr,proto3,enum=flowpb.EnrichedFlow_RemoteAddrType" json:"RemoteAddr,omitempty"` // TODO: figure out a better system? applicable only to service providers right now... + ProtoName string `protobuf:"bytes,2009,opt,name=ProtoName,proto3" json:"ProtoName,omitempty"` // TODO: deprecate and replace with helper, why lug a string along... + RemoteAddr EnrichedFlow_RemoteAddrType `protobuf:"varint,2011,opt,name=RemoteAddr,proto3,enum=flowpb.EnrichedFlow_RemoteAddrType" json:"RemoteAddr,omitempty"` // TODO: figure out a better system? applicable only to service providers right now... // modify/reversedns - SrcHostName string `protobuf:"bytes,1180,opt,name=SrcHostName,proto3" json:"SrcHostName,omitempty"` - DstHostName string `protobuf:"bytes,1181,opt,name=DstHostName,proto3" json:"DstHostName,omitempty"` - NextHopHostName string `protobuf:"bytes,1182,opt,name=NextHopHostName,proto3" json:"NextHopHostName,omitempty"` - SrcASName string `protobuf:"bytes,1183,opt,name=SrcASName,proto3" json:"SrcASName,omitempty"` - DstASName string `protobuf:"bytes,1184,opt,name=DstASName,proto3" json:"DstASName,omitempty"` - NextHopASName string `protobuf:"bytes,1185,opt,name=NextHopASName,proto3" json:"NextHopASName,omitempty"` - SamplerHostName string `protobuf:"bytes,1186,opt,name=SamplerHostName,proto3" json:"SamplerHostName,omitempty"` + SrcHostName string `protobuf:"bytes,2180,opt,name=SrcHostName,proto3" json:"SrcHostName,omitempty"` + DstHostName string `protobuf:"bytes,2181,opt,name=DstHostName,proto3" json:"DstHostName,omitempty"` + NextHopHostName string `protobuf:"bytes,2182,opt,name=NextHopHostName,proto3" json:"NextHopHostName,omitempty"` + SrcASName string `protobuf:"bytes,2183,opt,name=SrcASName,proto3" json:"SrcASName,omitempty"` + DstASName string `protobuf:"bytes,2184,opt,name=DstASName,proto3" json:"DstASName,omitempty"` + NextHopASName string `protobuf:"bytes,2185,opt,name=NextHopASName,proto3" json:"NextHopASName,omitempty"` + SamplerHostName string `protobuf:"bytes,2186,opt,name=SamplerHostName,proto3" json:"SamplerHostName,omitempty"` // modify/snmp - SrcIfName string `protobuf:"bytes,1003,opt,name=SrcIfName,proto3" json:"SrcIfName,omitempty"` // TODO: rename to match InIf and OutIf - SrcIfDesc string `protobuf:"bytes,1004,opt,name=SrcIfDesc,proto3" json:"SrcIfDesc,omitempty"` // TODO: rename to match InIf and OutIf - SrcIfSpeed uint32 `protobuf:"varint,1005,opt,name=SrcIfSpeed,proto3" json:"SrcIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf - DstIfName string `protobuf:"bytes,1006,opt,name=DstIfName,proto3" json:"DstIfName,omitempty"` // TODO: rename to match InIf and OutIf - DstIfDesc string `protobuf:"bytes,1007,opt,name=DstIfDesc,proto3" json:"DstIfDesc,omitempty"` // TODO: rename to match InIf and OutIf - DstIfSpeed uint32 `protobuf:"varint,1008,opt,name=DstIfSpeed,proto3" json:"DstIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf + SrcIfName string `protobuf:"bytes,2003,opt,name=SrcIfName,proto3" json:"SrcIfName,omitempty"` // TODO: rename to match InIf and OutIf + SrcIfDesc string `protobuf:"bytes,2004,opt,name=SrcIfDesc,proto3" json:"SrcIfDesc,omitempty"` // TODO: rename to match InIf and OutIf + SrcIfSpeed uint32 `protobuf:"varint,2005,opt,name=SrcIfSpeed,proto3" json:"SrcIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf + DstIfName string `protobuf:"bytes,2006,opt,name=DstIfName,proto3" json:"DstIfName,omitempty"` // TODO: rename to match InIf and OutIf + DstIfDesc string `protobuf:"bytes,2007,opt,name=DstIfDesc,proto3" json:"DstIfDesc,omitempty"` // TODO: rename to match InIf and OutIf + DstIfSpeed uint32 `protobuf:"varint,2008,opt,name=DstIfSpeed,proto3" json:"DstIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf // general - Note string `protobuf:"bytes,1016,opt,name=Note,proto3" json:"Note,omitempty"` // free-form field to implement anything + Note string `protobuf:"bytes,2016,opt,name=Note,proto3" json:"Note,omitempty"` // free-form field to implement anything // modify/addrstrings - SourceIP string `protobuf:"bytes,1290,opt,name=SourceIP,proto3" json:"SourceIP,omitempty"` - DestinationIP string `protobuf:"bytes,1291,opt,name=DestinationIP,proto3" json:"DestinationIP,omitempty"` - NextHopIP string `protobuf:"bytes,1292,opt,name=NextHopIP,proto3" json:"NextHopIP,omitempty"` - SamplerIP string `protobuf:"bytes,1293,opt,name=SamplerIP,proto3" json:"SamplerIP,omitempty"` - SourceMAC string `protobuf:"bytes,1294,opt,name=SourceMAC,proto3" json:"SourceMAC,omitempty"` - DestinationMAC string `protobuf:"bytes,1295,opt,name=DestinationMAC,proto3" json:"DestinationMAC,omitempty"` + SourceIP string `protobuf:"bytes,2290,opt,name=SourceIP,proto3" json:"SourceIP,omitempty"` + DestinationIP string `protobuf:"bytes,2291,opt,name=DestinationIP,proto3" json:"DestinationIP,omitempty"` + NextHopIP string `protobuf:"bytes,2292,opt,name=NextHopIP,proto3" json:"NextHopIP,omitempty"` + SamplerIP string `protobuf:"bytes,2293,opt,name=SamplerIP,proto3" json:"SamplerIP,omitempty"` + SourceMAC string `protobuf:"bytes,2294,opt,name=SourceMAC,proto3" json:"SourceMAC,omitempty"` + DestinationMAC string `protobuf:"bytes,2295,opt,name=DestinationMAC,proto3" json:"DestinationMAC,omitempty"` + // VRF + IngressVrfIDBW uint32 `protobuf:"varint,2539,opt,name=IngressVrfIDBW,proto3" json:"IngressVrfIDBW,omitempty"` + EgressVrfIDBW uint32 `protobuf:"varint,2540,opt,name=EgressVrfIDBW,proto3" json:"EgressVrfIDBW,omitempty"` } func (x *EnrichedFlow) Reset() { *x = EnrichedFlow{} - if protoimpl.UnsafeEnabled { - mi := &file_pb_enrichedflow_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_enrichedflow_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *EnrichedFlow) String() string { @@ -440,8 +451,8 @@ func (x *EnrichedFlow) String() string { func (*EnrichedFlow) ProtoMessage() {} func (x *EnrichedFlow) ProtoReflect() protoreflect.Message { - mi := &file_pb_enrichedflow_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_enrichedflow_proto_msgTypes[0] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -453,7 +464,7 @@ func (x *EnrichedFlow) ProtoReflect() protoreflect.Message { // Deprecated: Use EnrichedFlow.ProtoReflect.Descriptor instead. func (*EnrichedFlow) Descriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0} + return file_enrichedflow_proto_rawDescGZIP(), []int{0} } func (x *EnrichedFlow) GetType() EnrichedFlow_FlowType { @@ -512,6 +523,20 @@ func (x *EnrichedFlow) GetTimeFlowEnd() uint64 { return 0 } +func (x *EnrichedFlow) GetTimeFlowStartMs() uint64 { + if x != nil { + return x.TimeFlowStartMs + } + return 0 +} + +func (x *EnrichedFlow) GetTimeFlowEndMs() uint64 { + if x != nil { + return x.TimeFlowEndMs + } + return 0 +} + func (x *EnrichedFlow) GetBytes() uint64 { if x != nil { return x.Bytes @@ -617,23 +642,23 @@ func (x *EnrichedFlow) GetVlanId() uint32 { return 0 } -func (x *EnrichedFlow) GetIngressVrfID() uint32 { +func (x *EnrichedFlow) GetIngressVrfId() uint32 { if x != nil { - return x.IngressVrfID + return x.IngressVrfId } return 0 } -func (x *EnrichedFlow) GetEgressVrfID() uint32 { +func (x *EnrichedFlow) GetEgressVrfId() uint32 { if x != nil { - return x.EgressVrfID + return x.EgressVrfId } return 0 } -func (x *EnrichedFlow) GetIPTos() uint32 { +func (x *EnrichedFlow) GetIpTos() uint32 { if x != nil { - return x.IPTos + return x.IpTos } return 0 } @@ -645,16 +670,16 @@ func (x *EnrichedFlow) GetForwardingStatus() uint32 { return 0 } -func (x *EnrichedFlow) GetIPTTL() uint32 { +func (x *EnrichedFlow) GetIpTtl() uint32 { if x != nil { - return x.IPTTL + return x.IpTtl } return 0 } -func (x *EnrichedFlow) GetTCPFlags() uint32 { +func (x *EnrichedFlow) GetTcpFlags() uint32 { if x != nil { - return x.TCPFlags + return x.TcpFlags } return 0 } @@ -673,9 +698,9 @@ func (x *EnrichedFlow) GetIcmpCode() uint32 { return 0 } -func (x *EnrichedFlow) GetIPv6FlowLabel() uint32 { +func (x *EnrichedFlow) GetIpv6FlowLabel() uint32 { if x != nil { - return x.IPv6FlowLabel + return x.Ipv6FlowLabel } return 0 } @@ -701,16 +726,16 @@ func (x *EnrichedFlow) GetBiFlowDirection() uint32 { return 0 } -func (x *EnrichedFlow) GetSrcAS() uint32 { +func (x *EnrichedFlow) GetSrcAs() uint32 { if x != nil { - return x.SrcAS + return x.SrcAs } return 0 } -func (x *EnrichedFlow) GetDstAS() uint32 { +func (x *EnrichedFlow) GetDstAs() uint32 { if x != nil { - return x.DstAS + return x.DstAs } return 0 } @@ -722,9 +747,9 @@ func (x *EnrichedFlow) GetNextHop() []byte { return nil } -func (x *EnrichedFlow) GetNextHopAS() uint32 { +func (x *EnrichedFlow) GetNextHopAs() uint32 { if x != nil { - return x.NextHopAS + return x.NextHopAs } return 0 } @@ -743,76 +768,132 @@ func (x *EnrichedFlow) GetDstNet() uint32 { return 0 } -func (x *EnrichedFlow) GetHasMPLS() bool { +func (x *EnrichedFlow) GetBgpNextHop() []byte { + if x != nil { + return x.BgpNextHop + } + return nil +} + +func (x *EnrichedFlow) GetBgpCommunities() []uint32 { + if x != nil { + return x.BgpCommunities + } + return nil +} + +func (x *EnrichedFlow) GetAsPath() []uint32 { + if x != nil { + return x.AsPath + } + return nil +} + +func (x *EnrichedFlow) GetHasMpls() bool { if x != nil { - return x.HasMPLS + return x.HasMpls } return false } -func (x *EnrichedFlow) GetMPLSCount() uint32 { +func (x *EnrichedFlow) GetMplsCount() uint32 { + if x != nil { + return x.MplsCount + } + return 0 +} + +func (x *EnrichedFlow) GetMpls_1Ttl() uint32 { + if x != nil { + return x.Mpls_1Ttl + } + return 0 +} + +func (x *EnrichedFlow) GetMpls_1Label() uint32 { if x != nil { - return x.MPLSCount + return x.Mpls_1Label } return 0 } -func (x *EnrichedFlow) GetMPLS1TTL() uint32 { +func (x *EnrichedFlow) GetMpls_2Ttl() uint32 { if x != nil { - return x.MPLS1TTL + return x.Mpls_2Ttl } return 0 } -func (x *EnrichedFlow) GetMPLS1Label() uint32 { +func (x *EnrichedFlow) GetMpls_2Label() uint32 { if x != nil { - return x.MPLS1Label + return x.Mpls_2Label } return 0 } -func (x *EnrichedFlow) GetMPLS2TTL() uint32 { +func (x *EnrichedFlow) GetMpls_3Ttl() uint32 { if x != nil { - return x.MPLS2TTL + return x.Mpls_3Ttl } return 0 } -func (x *EnrichedFlow) GetMPLS2Label() uint32 { +func (x *EnrichedFlow) GetMpls_3Label() uint32 { if x != nil { - return x.MPLS2Label + return x.Mpls_3Label } return 0 } -func (x *EnrichedFlow) GetMPLS3TTL() uint32 { +func (x *EnrichedFlow) GetMplsLastTtl() uint32 { if x != nil { - return x.MPLS3TTL + return x.MplsLastTtl } return 0 } -func (x *EnrichedFlow) GetMPLS3Label() uint32 { +func (x *EnrichedFlow) GetMplsLastLabel() uint32 { if x != nil { - return x.MPLS3Label + return x.MplsLastLabel } return 0 } -func (x *EnrichedFlow) GetMPLSLastTTL() uint32 { +func (x *EnrichedFlow) GetMplsLabelIp() []byte { if x != nil { - return x.MPLSLastTTL + return x.MplsLabelIp + } + return nil +} + +func (x *EnrichedFlow) GetObservationDomainId() uint32 { + if x != nil { + return x.ObservationDomainId } return 0 } -func (x *EnrichedFlow) GetMPLSLastLabel() uint32 { +func (x *EnrichedFlow) GetObservationPointId() uint32 { if x != nil { - return x.MPLSLastLabel + return x.ObservationPointId } return 0 } +func (x *EnrichedFlow) GetSrcCountry() string { + if x != nil { + return x.SrcCountry + } + return "" +} + +func (x *EnrichedFlow) GetDstCountry() string { + if x != nil { + return x.DstCountry + } + return "" +} + func (x *EnrichedFlow) GetPacketBytesMin() uint32 { if x != nil { return x.PacketBytesMin @@ -1065,13 +1146,6 @@ func (x *EnrichedFlow) GetSamplerAddrAnonPreservedPrefixLen() uint32 { return 0 } -func (x *EnrichedFlow) GetASPath() []uint32 { - if x != nil { - return x.ASPath - } - return nil -} - func (x *EnrichedFlow) GetMed() uint32 { if x != nil { return x.Med @@ -1100,16 +1174,16 @@ func (x *EnrichedFlow) GetRemoteCountry() string { return "" } -func (x *EnrichedFlow) GetSrcCountry() string { +func (x *EnrichedFlow) GetSrcCountryBW() string { if x != nil { - return x.SrcCountry + return x.SrcCountryBW } return "" } -func (x *EnrichedFlow) GetDstCountry() string { +func (x *EnrichedFlow) GetDstCountryBW() string { if x != nil { - return x.DstCountry + return x.DstCountryBW } return "" } @@ -1275,311 +1349,357 @@ func (x *EnrichedFlow) GetDestinationMAC() string { return "" } -var File_pb_enrichedflow_proto protoreflect.FileDescriptor - -var file_pb_enrichedflow_proto_rawDesc = []byte{ - 0x0a, 0x15, 0x70, 0x62, 0x2f, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x66, 0x6c, 0x6f, - 0x77, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x22, - 0xf1, 0x22, 0x0a, 0x0c, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, - 0x12, 0x31, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, - 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, - 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, - 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x26, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, - 0x45, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x44, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x44, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x4f, - 0x75, 0x74, 0x49, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4f, 0x75, 0x74, 0x49, - 0x66, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x18, 0x1b, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, - 0x4d, 0x61, 0x63, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4d, 0x61, - 0x63, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x21, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x44, - 0x73, 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x44, 0x73, - 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x18, - 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, - 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x18, 0x27, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, - 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, - 0x18, 0x28, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, - 0x66, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x18, 0x17, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x46, 0x6f, 0x72, - 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x18, 0x19, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x12, 0x1a, 0x0a, 0x08, 0x54, - 0x43, 0x50, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x54, - 0x43, 0x50, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, - 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x46, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x28, 0x0a, - 0x0f, 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, 0x12, 0x14, 0x0a, - 0x05, 0x44, 0x73, 0x74, 0x41, 0x53, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x44, 0x73, - 0x74, 0x41, 0x53, 0x12, 0x18, 0x0a, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1c, 0x0a, - 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x53, - 0x72, 0x63, 0x4e, 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, - 0x4e, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, - 0x61, 0x73, 0x4d, 0x50, 0x4c, 0x53, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x61, - 0x73, 0x4d, 0x50, 0x4c, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x18, - 0x37, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x12, - 0x1e, 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x1a, 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x18, 0x39, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, - 0x50, 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x4d, - 0x50, 0x4c, 0x53, 0x33, 0x54, 0x54, 0x4c, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, - 0x50, 0x4c, 0x53, 0x33, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x33, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, - 0x53, 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x50, 0x4c, 0x53, 0x4c, - 0x61, 0x73, 0x74, 0x54, 0x54, 0x4c, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, 0x50, - 0x4c, 0x53, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x54, 0x4c, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x50, 0x4c, - 0x53, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0d, 0x4d, 0x50, 0x4c, 0x53, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, - 0x6e, 0x18, 0xcc, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xcd, 0x08, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, - 0x78, 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xce, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, 0x0a, 0x11, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, - 0x76, 0x18, 0xcf, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, 0x0c, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xd6, 0x08, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, - 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, - 0x18, 0xd7, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, - 0x41, 0x54, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, - 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xd8, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x0f, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, - 0xd9, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, - 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0xe0, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x46, 0x49, - 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xea, 0x08, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x23, 0x0a, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0xeb, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xec, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, 0x53, 0x54, - 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x53, 0x48, - 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xed, 0x08, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, - 0x0a, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xee, - 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0xef, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, 0x47, 0x46, - 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, 0x52, 0x46, - 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf0, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, - 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf1, 0x08, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x73, 0x18, 0xf4, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x54, - 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xfe, 0x08, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, - 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x4d, 0x61, 0x78, 0x18, 0xff, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, - 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x80, 0x09, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, - 0x61, 0x6e, 0x12, 0x2b, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x81, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x54, - 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, - 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0x82, - 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, - 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, - 0x78, 0x18, 0x83, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, - 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, - 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x84, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, - 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, - 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x85, 0x09, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, - 0x44, 0x65, 0x76, 0x12, 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x03, 0x43, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, 0x64, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x18, - 0xf4, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x12, 0x17, - 0x0a, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x18, 0xf5, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, - 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x88, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, - 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, - 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, - 0x46, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x89, - 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, - 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, - 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, - 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x8a, - 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x44, 0x73, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, - 0x6e, 0x18, 0x8b, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, - 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x4e, 0x0a, - 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, - 0x18, 0x8c, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, +func (x *EnrichedFlow) GetIngressVrfIDBW() uint32 { + if x != nil { + return x.IngressVrfIDBW + } + return 0 +} + +func (x *EnrichedFlow) GetEgressVrfIDBW() uint32 { + if x != nil { + return x.EgressVrfIDBW + } + return 0 +} + +var File_enrichedflow_proto protoreflect.FileDescriptor + +var file_enrichedflow_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x22, 0xf5, 0x26, 0x0a, + 0x0c, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x31, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x66, 0x6c, + 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, + 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x2a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x26, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x69, + 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6d, 0x73, 0x18, + 0x3f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x4d, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, + 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x4d, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x73, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, + 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x64, 0x73, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x74, 0x79, 0x70, 0x65, 0x18, 0x1e, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x65, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x13, 0x0a, 0x05, 0x69, 0x6e, 0x5f, 0x69, 0x66, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x69, 0x6e, 0x49, 0x66, 0x12, 0x15, 0x0a, 0x06, + 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6f, 0x75, + 0x74, 0x49, 0x66, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x1b, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, + 0x64, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, + 0x73, 0x74, 0x4d, 0x61, 0x63, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x76, 0x6c, 0x61, + 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, + 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x76, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x76, + 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x6c, + 0x61, 0x6e, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, + 0x76, 0x72, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x69, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x65, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x72, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x64, 0x12, 0x15, + 0x0a, 0x06, 0x69, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x69, 0x70, 0x54, 0x6f, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x10, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x70, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x19, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x69, 0x70, 0x54, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x63, 0x70, + 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x74, 0x63, + 0x70, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, 0x6d, 0x70, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x69, 0x70, 0x76, 0x36, 0x46, + 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x24, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x69, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x62, + 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, + 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x73, 0x72, 0x63, 0x41, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x73, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x64, 0x73, 0x74, 0x41, 0x73, 0x12, 0x19, 0x0a, 0x08, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x6e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x68, 0x6f, 0x70, 0x5f, 0x61, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, + 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6e, + 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4e, 0x65, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x62, 0x67, 0x70, + 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0a, 0x62, 0x67, 0x70, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x62, + 0x67, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x65, + 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x62, 0x67, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x66, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x61, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, + 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x70, 0x6c, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x68, 0x61, 0x73, 0x4d, 0x70, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x70, + 0x6c, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, + 0x31, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, + 0x73, 0x31, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x31, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, + 0x73, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, + 0x32, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, + 0x73, 0x32, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x32, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, + 0x73, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, + 0x33, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, + 0x73, 0x33, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x33, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, + 0x73, 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x5f, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, + 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x74, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x6d, + 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x5f, 0x69, 0x70, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6d, 0x70, 0x6c, 0x73, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x49, 0x70, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x46, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x73, 0x72, 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xe8, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xe9, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x4d, 0x69, 0x6e, 0x18, 0xb4, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xb5, 0x10, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x4d, 0x61, 0x78, 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xb6, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, + 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, + 0x44, 0x65, 0x76, 0x18, 0xb7, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, + 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xbe, 0x10, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, + 0x69, 0x6e, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, + 0x61, 0x78, 0x18, 0xbf, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xc0, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, + 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, + 0x76, 0x18, 0xc1, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0xc8, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, + 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd2, 0x10, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0xd3, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, + 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, + 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd4, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, + 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, + 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd5, 0x10, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x23, 0x0a, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0xd6, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, + 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, + 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd8, 0x10, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x23, 0x0a, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0xd9, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0xdc, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, + 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xe6, + 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x4d, 0x61, 0x78, 0x18, 0xe7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, + 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, + 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xe8, 0x10, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2b, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xe9, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, + 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, + 0x18, 0xea, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, + 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, + 0x4d, 0x61, 0x78, 0x18, 0xeb, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, + 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, + 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xec, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, + 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xed, + 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, + 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xd0, 0x0f, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x03, 0x43, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0xd1, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, + 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, + 0x64, 0x18, 0xdc, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, + 0x12, 0x17, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x18, 0xdd, 0x0f, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x72, 0x63, + 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf0, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, + 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, + 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, + 0x18, 0xf1, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, - 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x53, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, - 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, - 0x65, 0x6e, 0x18, 0x8d, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x17, 0x0a, 0x06, - 0x41, 0x53, 0x50, 0x61, 0x74, 0x68, 0x18, 0x93, 0x09, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x41, - 0x53, 0x50, 0x61, 0x74, 0x68, 0x12, 0x11, 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0x94, 0x09, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0x95, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x12, 0x56, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x96, 0x09, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, - 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, - 0x18, 0xf2, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf6, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x72, 0x63, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf7, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x73, - 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, - 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, - 0x6c, 0x6f, 0x77, 0x2e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x1d, - 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xf1, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, - 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xf3, 0x07, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, - 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x9c, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, - 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9d, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x73, - 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x4e, 0x65, 0x78, - 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9e, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x9f, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0xa0, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0xa1, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, - 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xa2, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, - 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, - 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x18, - 0xef, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, - 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, - 0xf0, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, - 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xf8, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x50, 0x18, 0x8a, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, 0x8b, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x4e, - 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x18, 0x8c, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x18, 0x8d, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x18, 0x8e, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x18, 0x8f, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, - 0x43, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, - 0x0b, 0x46, 0x4c, 0x4f, 0x57, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x53, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x35, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, - 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x35, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, - 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x39, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x49, - 0x50, 0x46, 0x49, 0x58, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x42, 0x50, 0x46, 0x10, 0x05, - 0x22, 0x32, 0x0a, 0x0e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, - 0x7a, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x50, - 0x41, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, - 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x03, 0x22, - 0x21, 0x0a, 0x0e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x65, 0x73, - 0x10, 0x01, 0x22, 0x2f, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x10, - 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x73, - 0x74, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x62, 0x77, 0x4e, 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, 0x6c, 0x6f, 0x77, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, + 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, + 0x18, 0xf2, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, + 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x4c, 0x65, 0x6e, 0x18, 0xf3, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, + 0x4e, 0x0a, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, + 0x6f, 0x6e, 0x18, 0xf4, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, + 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, + 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, + 0x4d, 0x0a, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, + 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x4c, 0x65, 0x6e, 0x18, 0xf5, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x11, + 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0xfc, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, + 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0xfd, + 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, + 0x12, 0x56, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0xfe, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, + 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, + 0x77, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xda, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x23, 0x0a, 0x0c, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x18, + 0xde, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x42, 0x57, 0x12, 0x23, 0x0a, 0x0c, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x42, 0x57, 0x18, 0xdf, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x44, 0x73, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x12, 0x44, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0xd2, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, + 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, + 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, + 0x1d, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xd9, 0x0f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, + 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xdb, 0x0f, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, + 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x84, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x48, + 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x85, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, + 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x4e, 0x65, + 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x86, 0x11, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x87, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x88, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x89, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, + 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x8a, 0x11, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0xd3, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, + 0x63, 0x18, 0xd4, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, + 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, + 0x64, 0x18, 0xd5, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, + 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0xd6, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, + 0x18, 0xd7, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, + 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, + 0x18, 0xd8, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, + 0x65, 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xe0, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x49, 0x50, 0x18, 0xf2, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, 0xf3, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, + 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x18, 0xf4, 0x11, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x18, 0xf5, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x18, 0xf6, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x18, 0xf7, 0x11, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, + 0x49, 0x44, 0x42, 0x57, 0x18, 0xeb, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x12, 0x25, 0x0a, 0x0d, 0x45, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x18, 0xec, 0x13, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, + 0x42, 0x57, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, + 0x0a, 0x0b, 0x46, 0x4c, 0x4f, 0x57, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x0b, 0x0a, 0x07, 0x53, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x35, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, + 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x35, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, + 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x39, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, + 0x49, 0x50, 0x46, 0x49, 0x58, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x42, 0x50, 0x46, 0x10, + 0x05, 0x22, 0x32, 0x0a, 0x0e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, + 0x69, 0x7a, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, + 0x50, 0x41, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, + 0x64, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x03, + 0x22, 0x21, 0x0a, 0x0e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x65, + 0x73, 0x10, 0x01, 0x22, 0x2f, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, + 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, + 0x73, 0x74, 0x10, 0x02, 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x62, 0x77, 0x4e, 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, 0x6c, 0x6f, + 0x77, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x66, 0x6c, 0x6f, + 0x77, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_pb_enrichedflow_proto_rawDescOnce sync.Once - file_pb_enrichedflow_proto_rawDescData = file_pb_enrichedflow_proto_rawDesc + file_enrichedflow_proto_rawDescOnce sync.Once + file_enrichedflow_proto_rawDescData = file_enrichedflow_proto_rawDesc ) -func file_pb_enrichedflow_proto_rawDescGZIP() []byte { - file_pb_enrichedflow_proto_rawDescOnce.Do(func() { - file_pb_enrichedflow_proto_rawDescData = protoimpl.X.CompressGZIP(file_pb_enrichedflow_proto_rawDescData) +func file_enrichedflow_proto_rawDescGZIP() []byte { + file_enrichedflow_proto_rawDescOnce.Do(func() { + file_enrichedflow_proto_rawDescData = protoimpl.X.CompressGZIP(file_enrichedflow_proto_rawDescData) }) - return file_pb_enrichedflow_proto_rawDescData + return file_enrichedflow_proto_rawDescData } -var file_pb_enrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_pb_enrichedflow_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_pb_enrichedflow_proto_goTypes = []interface{}{ +var file_enrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_enrichedflow_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_enrichedflow_proto_goTypes = []any{ (EnrichedFlow_FlowType)(0), // 0: flowpb.EnrichedFlow.FlowType (EnrichedFlow_AnonymizedType)(0), // 1: flowpb.EnrichedFlow.AnonymizedType (EnrichedFlow_ValidationStatusType)(0), // 2: flowpb.EnrichedFlow.ValidationStatusType @@ -1587,8 +1707,8 @@ var file_pb_enrichedflow_proto_goTypes = []interface{}{ (EnrichedFlow_RemoteAddrType)(0), // 4: flowpb.EnrichedFlow.RemoteAddrType (*EnrichedFlow)(nil), // 5: flowpb.EnrichedFlow } -var file_pb_enrichedflow_proto_depIdxs = []int32{ - 0, // 0: flowpb.EnrichedFlow.Type:type_name -> flowpb.EnrichedFlow.FlowType +var file_enrichedflow_proto_depIdxs = []int32{ + 0, // 0: flowpb.EnrichedFlow.type:type_name -> flowpb.EnrichedFlow.FlowType 1, // 1: flowpb.EnrichedFlow.SrcAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType 1, // 2: flowpb.EnrichedFlow.DstAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType 1, // 3: flowpb.EnrichedFlow.SamplerAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType @@ -1602,42 +1722,28 @@ var file_pb_enrichedflow_proto_depIdxs = []int32{ 0, // [0:7] is the sub-list for field type_name } -func init() { file_pb_enrichedflow_proto_init() } -func file_pb_enrichedflow_proto_init() { - if File_pb_enrichedflow_proto != nil { +func init() { file_enrichedflow_proto_init() } +func file_enrichedflow_proto_init() { + if File_enrichedflow_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_pb_enrichedflow_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrichedFlow); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_pb_enrichedflow_proto_rawDesc, + RawDescriptor: file_enrichedflow_proto_rawDesc, NumEnums: 5, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_pb_enrichedflow_proto_goTypes, - DependencyIndexes: file_pb_enrichedflow_proto_depIdxs, - EnumInfos: file_pb_enrichedflow_proto_enumTypes, - MessageInfos: file_pb_enrichedflow_proto_msgTypes, + GoTypes: file_enrichedflow_proto_goTypes, + DependencyIndexes: file_enrichedflow_proto_depIdxs, + EnumInfos: file_enrichedflow_proto_enumTypes, + MessageInfos: file_enrichedflow_proto_msgTypes, }.Build() - File_pb_enrichedflow_proto = out.File - file_pb_enrichedflow_proto_rawDesc = nil - file_pb_enrichedflow_proto_goTypes = nil - file_pb_enrichedflow_proto_depIdxs = nil + File_enrichedflow_proto = out.File + file_enrichedflow_proto_rawDesc = nil + file_enrichedflow_proto_goTypes = nil + file_enrichedflow_proto_depIdxs = nil } diff --git a/pb/enrichedflow.proto b/pb/enrichedflow.proto index 705312d..70b78dc 100644 --- a/pb/enrichedflow.proto +++ b/pb/enrichedflow.proto @@ -1,6 +1,6 @@ syntax = "proto3"; package flowpb; -option go_package = "github.com/bwNetFlow/flowpipeline/pb;"; +option go_package = "github.com/bwNetFlow/flowpipeline/pb;flowpb"; message EnrichedFlow { @@ -12,92 +12,107 @@ message EnrichedFlow { IPFIX = 4; EBPF = 5; } - FlowType Type = 1; - uint64 TimeReceived = 2; - uint32 SequenceNum = 4; - uint64 SamplingRate = 3; + FlowType type = 1; - uint32 FlowDirection = 42; + uint64 time_received = 2; + uint32 sequence_num = 4; + uint64 sampling_rate = 3; + + uint32 flow_direction = 42; // Sampler information - bytes SamplerAddress = 11; + bytes sampler_address = 11; // Found inside packet - uint64 TimeFlowStart = 38; - uint64 TimeFlowEnd = 5; + uint64 time_flow_start = 38; + uint64 time_flow_end = 5; + uint64 time_flow_start_ms = 63; + uint64 time_flow_end_ms = 64; // Size of the sampled packet - uint64 Bytes = 9; - uint64 Packets = 10; + uint64 bytes = 9; + uint64 packets = 10; // Source/destination addresses - bytes SrcAddr = 6; - bytes DstAddr = 7; + bytes src_addr = 6; + bytes dst_addr = 7; // Layer 3 protocol (IPv4/IPv6/ARP/MPLS...) - uint32 Etype = 30; + uint32 etype = 30; // Layer 4 protocol - uint32 Proto = 20; + uint32 proto = 20; // Ports for UDP and TCP - uint32 SrcPort = 21; - uint32 DstPort = 22; + uint32 src_port = 21; + uint32 dst_port = 22; // Interfaces - uint32 InIf = 18; - uint32 OutIf = 19; + uint32 in_if = 18; + uint32 out_if = 19; // Ethernet information - uint64 SrcMac = 27; - uint64 DstMac = 28; + uint64 src_mac = 27; + uint64 dst_mac = 28; // Vlan - uint32 SrcVlan = 33; - uint32 DstVlan = 34; + uint32 src_vlan = 33; + uint32 dst_vlan = 34; // 802.1q VLAN in sampled packet - uint32 VlanId = 29; + uint32 vlan_id = 29; // VRF - uint32 IngressVrfID = 39; - uint32 EgressVrfID = 40; + uint32 ingress_vrf_id = 39; + uint32 egress_vrf_id = 40; // IP and TCP special flags - uint32 IPTos = 23; - uint32 ForwardingStatus = 24; - uint32 IPTTL = 25; - uint32 TCPFlags = 26; - uint32 IcmpType = 31; - uint32 IcmpCode = 32; - uint32 IPv6FlowLabel = 37; + uint32 ip_tos = 23; + uint32 forwarding_status = 24; + uint32 ip_ttl = 25; + uint32 tcp_flags = 26; + uint32 icmp_type = 31; + uint32 icmp_code = 32; + uint32 ipv6_flow_label = 37; // Fragments (IPv4/IPv6) - uint32 FragmentId = 35; - uint32 FragmentOffset = 36; - uint32 BiFlowDirection = 41; + uint32 fragment_id = 35; + uint32 fragment_offset = 36; + uint32 bi_flow_direction = 41; // Autonomous system information - uint32 SrcAS = 14; - uint32 DstAS = 15; + uint32 src_as = 14; + uint32 dst_as = 15; - bytes NextHop = 12; - uint32 NextHopAS = 13; + bytes next_hop = 12; + uint32 next_hop_as = 13; // Prefix size - uint32 SrcNet = 16; - uint32 DstNet = 17; + uint32 src_net = 16; + uint32 dst_net = 17; + + // BGP information + bytes bgp_next_hop = 100; + repeated uint32 bgp_communities = 101; + repeated uint32 as_path = 102; // MPLS information - bool HasMPLS = 53; - uint32 MPLSCount = 54; - uint32 MPLS1TTL = 55; // First TTL - uint32 MPLS1Label = 56; // First Label - uint32 MPLS2TTL = 57; // Second TTL - uint32 MPLS2Label = 58; // Second Label - uint32 MPLS3TTL = 59; // Third TTL - uint32 MPLS3Label = 60; // Third Label - uint32 MPLSLastTTL = 61; // Last TTL - uint32 MPLSLastLabel = 62; // Last Label + bool has_mpls = 53; + uint32 mpls_count = 54; + uint32 mpls_1_ttl = 55; // First TTL + uint32 mpls_1_label = 56; // First Label + uint32 mpls_2_ttl = 57; // Second TTL + uint32 mpls_2_label = 58; // Second Label + uint32 mpls_3_ttl = 59; // Third TTL + uint32 mpls_3_label = 60; // Third Label + uint32 mpls_last_ttl = 61; // Last TTL + uint32 mpls_last_label = 62; // Last Label + bytes mpls_label_ip = 65; // MPLS TOP Label IP + + uint32 observation_domain_id = 70; + uint32 observation_point_id = 71; + + string src_country = 1000; + string dst_country = 1001; // bwNET custom fields: @@ -107,85 +122,84 @@ message EnrichedFlow { // inspired by this list: // https://github.com/ahlashkari/CICFlowMeter/blob/master/ReadMe.txt - uint32 PacketBytesMin = 1100; // new, single packet means uint32 < MTU - uint32 PacketBytesMax = 1101; // new - uint32 PacketBytesMean = 1102; // new - uint32 PacketBytesStdDev = 1103; // new - - uint64 PacketIATMin = 1110; // new - uint64 PacketIATMax = 1111; // new - uint64 PacketIATMean = 1112; // new - uint64 PacketIATStdDev = 1113; // new - - uint32 HeaderBytes = 1120; // new - - uint64 FINFlagCount = 1130; // new - uint64 SYNFlagCount = 1131; // new - uint64 RSTFlagCount = 1132; // new - uint64 PSHFlagCount = 1133; // new - uint64 ACKFlagCount = 1134; // new - uint64 URGFlagCount = 1135; // new - uint64 CWRFlagCount = 1136; // new - uint64 ECEFlagCount = 1137; // new - - uint64 PayloadPackets = 1140; // new - - uint64 TimeActiveMin = 1150; // new - uint64 TimeActiveMax = 1151; // new - uint64 TimeActiveMean = 1152; // new - uint64 TimeActiveStdDev = 1153; // new - uint64 TimeIdleMin = 1154; // new - uint64 TimeIdleMax = 1155; // new - uint64 TimeIdleMean = 1156; // new - uint64 TimeIdleStdDev = 1157; // new + uint32 PacketBytesMin = 2100; // new, single packet means uint32 < MTU + uint32 PacketBytesMax = 2101; // new + uint32 PacketBytesMean = 2102; // new + uint32 PacketBytesStdDev = 2103; // new + + uint64 PacketIATMin = 2110; // new + uint64 PacketIATMax = 2111; // new + uint64 PacketIATMean = 2112; // new + uint64 PacketIATStdDev = 2113; // new + + uint32 HeaderBytes = 2120; // new + + uint64 FINFlagCount = 2130; // new + uint64 SYNFlagCount = 2131; // new + uint64 RSTFlagCount = 2132; // new + uint64 PSHFlagCount = 2133; // new + uint64 ACKFlagCount = 2134; // new + uint64 URGFlagCount = 2135; // new + uint64 CWRFlagCount = 2136; // new + uint64 ECEFlagCount = 2137; // new + + uint64 PayloadPackets = 2140; // new + + uint64 TimeActiveMin = 2150; // new + uint64 TimeActiveMax = 2151; // new + uint64 TimeActiveMean = 2152; // new + uint64 TimeActiveStdDev = 2153; // new + uint64 TimeIdleMin = 2154; // new + uint64 TimeIdleMax = 2155; // new + uint64 TimeIdleMean = 2156; // new + uint64 TimeIdleStdDev = 2157; // new // modify/addcid - uint32 Cid = 1000; // TODO: deprecate and provide as helper? - string CidString = 1001; // deprecated, delete for v1.0.0 - uint32 SrcCid = 1012; - uint32 DstCid = 1013; + uint32 Cid = 2000; // TODO: deprecate and provide as helper? + string CidString = 2001; // deprecated, delete for v1.0.0 + uint32 SrcCid = 2012; + uint32 DstCid = 2013; // modify/anonymize enum AnonymizedType { NotAnonymized = 0; CryptoPAN = 1; } - AnonymizedType SrcAddrAnon = 1160; - AnonymizedType DstAddrAnon = 1161; - uint32 SrcAddrPreservedLen = 1162; - uint32 DstAddrPreservedLen = 1163; + AnonymizedType SrcAddrAnon = 2160; + AnonymizedType DstAddrAnon = 2161; + uint32 SrcAddrPreservedLen = 2162; + uint32 DstAddrPreservedLen = 2163; - AnonymizedType SamplerAddrAnon = 1164; - uint32 SamplerAddrAnonPreservedPrefixLen = 1165; + AnonymizedType SamplerAddrAnon = 2164; + uint32 SamplerAddrAnonPreservedPrefixLen = 2165; // modify/bgp // as done by a number of Netflow implementations, these refer to the destination - repeated uint32 ASPath = 1171; - uint32 Med = 1172; - uint32 LocalPref = 1173; + uint32 Med = 2172; + uint32 LocalPref = 2173; enum ValidationStatusType { Unknown = 0; Valid = 1; NotFound = 2; Invalid = 3; } - ValidationStatusType ValidationStatus = 1174; + ValidationStatusType ValidationStatus = 2174; // modify/geolocation - string RemoteCountry = 1010; // TODO: deprecate and provide as helper - string SrcCountry = 1014; - string DstCountry = 1015; + string RemoteCountry = 2010; // TODO: deprecate and provide as helper + string SrcCountryBW = 2014; + string DstCountryBW = 2015; // modify/normalize enum NormalizedType { No = 0; Yes = 1; } - NormalizedType Normalized = 1002; // TODO: deprecate and replace with helper? + NormalizedType Normalized = 2002; // TODO: deprecate and replace with helper? // TODO: if not, replace with OriginalSamplingRate instead and set SamplingRate to 1? // modify/protomap - string ProtoName = 1009; // TODO: deprecate and replace with helper, why lug a string along... + string ProtoName = 2009; // TODO: deprecate and replace with helper, why lug a string along... // modify/remoteaddress enum RemoteAddrType { @@ -193,33 +207,41 @@ message EnrichedFlow { Src = 1; Dst = 2; } - RemoteAddrType RemoteAddr = 1011; // TODO: figure out a better system? applicable only to service providers right now... + RemoteAddrType RemoteAddr = 2011; // TODO: figure out a better system? applicable only to service providers right now... // modify/reversedns - string SrcHostName = 1180; - string DstHostName = 1181; - string NextHopHostName = 1182; - string SrcASName = 1183; - string DstASName = 1184; - string NextHopASName = 1185; - string SamplerHostName = 1186; + string SrcHostName = 2180; + string DstHostName = 2181; + string NextHopHostName = 2182; + string SrcASName = 2183; + string DstASName = 2184; + string NextHopASName = 2185; + string SamplerHostName = 2186; // modify/snmp - string SrcIfName = 1003; // TODO: rename to match InIf and OutIf - string SrcIfDesc = 1004; // TODO: rename to match InIf and OutIf - uint32 SrcIfSpeed = 1005; // TODO: rename to match InIf and OutIf - string DstIfName = 1006; // TODO: rename to match InIf and OutIf - string DstIfDesc = 1007; // TODO: rename to match InIf and OutIf - uint32 DstIfSpeed = 1008; // TODO: rename to match InIf and OutIf + string SrcIfName = 2003; // TODO: rename to match InIf and OutIf + string SrcIfDesc = 2004; // TODO: rename to match InIf and OutIf + uint32 SrcIfSpeed = 2005; // TODO: rename to match InIf and OutIf + string DstIfName = 2006; // TODO: rename to match InIf and OutIf + string DstIfDesc = 2007; // TODO: rename to match InIf and OutIf + uint32 DstIfSpeed = 2008; // TODO: rename to match InIf and OutIf // general - string Note = 1016; // free-form field to implement anything + string Note = 2016; // free-form field to implement anything // modify/addrstrings - string SourceIP = 1290; - string DestinationIP = 1291; - string NextHopIP = 1292; - string SamplerIP = 1293; - string SourceMAC = 1294; - string DestinationMAC = 1295; -} + string SourceIP = 2290; + string DestinationIP = 2291; + string NextHopIP = 2292; + string SamplerIP = 2293; + string SourceMAC = 2294; + string DestinationMAC = 2295; + +// VRF +uint32 IngressVrfIDBW = 2539; +uint32 EgressVrfIDBW = 2540; + +// Replaced by ns values +// uint64 TimeFlowStart = 2538; +// uint64 TimeFlowEnd = 2505; +} \ No newline at end of file diff --git a/pb/flow.proto b/pb/flow.proto new file mode 100644 index 0000000..3c4c961 --- /dev/null +++ b/pb/flow.proto @@ -0,0 +1,123 @@ +syntax = "proto3"; +package flowpb; +option go_package = "github.com/netsampler/goflow2/pb;flowpb"; + +message FlowMessage { + + enum FlowType { + FLOWUNKNOWN = 0; + SFLOW_5 = 1; + NETFLOW_V5 = 2; + NETFLOW_V9 = 3; + IPFIX = 4; + } + FlowType type = 1; + + uint64 time_received_ns = 110; + uint32 sequence_num = 4; + uint64 sampling_rate = 3; + + //uint32 flow_direction = 42; + + // Sampler information + bytes sampler_address = 11; + + // Found inside packet + uint64 time_flow_start_ns = 111; + uint64 time_flow_end_ns = 112; + + // Size of the sampled packet + uint64 bytes = 9; + uint64 packets = 10; + + // Source/destination addresses + bytes src_addr = 6; + bytes dst_addr = 7; + + // Layer 3 protocol (IPv4/IPv6/ARP/MPLS...) + uint32 etype = 30; + + // Layer 4 protocol + uint32 proto = 20; + + // Ports for UDP and TCP + uint32 src_port = 21; + uint32 dst_port = 22; + + // Interfaces + uint32 in_if = 18; + uint32 out_if = 19; + + // Ethernet information + uint64 src_mac = 27; + uint64 dst_mac = 28; + + // Vlan + uint32 src_vlan = 33; + uint32 dst_vlan = 34; + // 802.1q VLAN in sampled packet + uint32 vlan_id = 29; + + // IP and TCP special flags + uint32 ip_tos = 23; + uint32 forwarding_status = 24; + uint32 ip_ttl = 25; + uint32 ip_flags = 38; + uint32 tcp_flags = 26; + uint32 icmp_type = 31; + uint32 icmp_code = 32; + uint32 ipv6_flow_label = 37; + // Fragments (IPv4/IPv6) + uint32 fragment_id = 35; + uint32 fragment_offset = 36; + + // Autonomous system information + uint32 src_as = 14; + uint32 dst_as = 15; + + bytes next_hop = 12; + uint32 next_hop_as = 13; + + // Prefix size + uint32 src_net = 16; + uint32 dst_net = 17; + + // BGP information + bytes bgp_next_hop = 100; + repeated uint32 bgp_communities = 101; + repeated uint32 as_path = 102; + + // MPLS information + repeated uint32 mpls_ttl = 80; + repeated uint32 mpls_label = 81; + repeated bytes mpls_ip = 82; + + uint32 observation_domain_id = 70; + uint32 observation_point_id = 71; + + // Encapsulation + enum LayerStack { + Ethernet = 0; + IPv4 = 1; + IPv6 = 2; + TCP = 3; + UDP = 4; + MPLS = 5; + Dot1Q = 6; + ICMP = 7; + ICMPv6 = 8; + GRE = 9; + IPv6HeaderRouting = 10; + IPv6HeaderFragment = 11; + Geneve = 12; + Teredo = 13; + Custom = 99; + // todo: add nsh + } + repeated LayerStack layer_stack = 103; + repeated uint32 layer_size = 104; + + repeated bytes ipv6_routing_header_addresses = 105; // SRv6 + uint32 ipv6_routing_header_seg_left = 106; // SRv6 + +} \ No newline at end of file diff --git a/pb/proton_producer.go b/pb/proton_producer.go new file mode 100644 index 0000000..32b86d9 --- /dev/null +++ b/pb/proton_producer.go @@ -0,0 +1,17 @@ +package pb + +import ( + "bytes" + + "google.golang.org/protobuf/encoding/protodelim" +) + +type ProtoProducerMessage struct { + EnrichedFlow +} + +func (m *ProtoProducerMessage) MarshalBinary() ([]byte, error) { + buf := bytes.NewBuffer([]byte{}) + _, err := protodelim.MarshalTo(buf, m) + return buf.Bytes(), err +} diff --git a/segments/export/clickhouse/clickhouse.go b/segments/export/clickhouse/clickhouse.go index 2543445..8ff7de4 100644 --- a/segments/export/clickhouse/clickhouse.go +++ b/segments/export/clickhouse/clickhouse.go @@ -185,9 +185,9 @@ func (segment Clickhouse) bulkInsertFlowhouse(unsavedFlows []*pb.EnrichedFlow) e dstPfx, uint8(msg.DstNet), net.IP(msg.NextHop), - msg.NextHopAS, - msg.SrcAS, - msg.DstAS, + msg.NextHopAs, + msg.SrcAs, + msg.DstAs, uint8(msg.Proto), uint16(msg.SrcPort), uint16(msg.DstPort), diff --git a/segments/filter/aggregate/flowcache.go b/segments/filter/aggregate/flowcache.go index 2b88aa5..04732c0 100644 --- a/segments/filter/aggregate/flowcache.go +++ b/segments/filter/aggregate/flowcache.go @@ -31,7 +31,7 @@ func NewFlowKeyFromFlow(flow *pb.EnrichedFlow) FlowKey { SrcPort: uint16(flow.SrcPort), DstPort: uint16(flow.DstPort), Proto: flow.Proto, - IPTos: uint8(flow.IPTos), + IPTos: uint8(flow.IpTos), InIface: flow.InIf, } } @@ -79,9 +79,9 @@ func BuildFlow(f *FlowRecord) *pb.EnrichedFlow { msg := &pb.EnrichedFlow{} msg.Type = pb.EnrichedFlow_EBPF msg.SamplerAddress = f.SamplerAddress - msg.TimeReceived = uint64(f.TimeReceived.Unix()) - msg.TimeFlowStart = uint64(f.TimeReceived.Unix()) - msg.TimeFlowEnd = uint64(f.LastUpdated.Unix()) + msg.TimeReceived = uint64(f.TimeReceived.UnixNano()) + msg.TimeFlowStart = uint64(f.TimeReceived.UnixNano()) + msg.TimeFlowEnd = uint64(f.LastUpdated.UnixNano()) for i, pkt := range f.Packets { if i == 0 { msg.InIf = uint32(pkt.Metadata().InterfaceIndex) @@ -103,37 +103,37 @@ func BuildFlow(f *FlowRecord) *pb.EnrichedFlow { msg.SrcAddr = ip.SrcIP msg.DstAddr = ip.DstIP msg.Proto = uint32(ip.Protocol) - msg.IPTos = uint32(ip.TOS) - msg.IPTTL = uint32(ip.TTL) + msg.IpTos = uint32(ip.TOS) + msg.IpTtl = uint32(ip.TTL) case layers.LayerTypeIPv6: ip, _ := layer.(*layers.IPv6) msg.SrcAddr = ip.SrcIP msg.DstAddr = ip.DstIP msg.Proto = uint32(ip.NextHeader) - msg.IPTos = uint32(ip.TrafficClass) - msg.IPTTL = uint32(ip.HopLimit) - msg.IPv6FlowLabel = ip.FlowLabel + msg.IpTos = uint32(ip.TrafficClass) + msg.IpTtl = uint32(ip.HopLimit) + msg.Ipv6FlowLabel = ip.FlowLabel case layers.LayerTypeTCP: tcp, _ := layer.(*layers.TCP) msg.SrcPort = uint32(tcp.SrcPort) msg.DstPort = uint32(tcp.DstPort) if tcp.URG { - msg.TCPFlags = msg.TCPFlags | 0b100000 + msg.TcpFlags = msg.TcpFlags | 0b100000 } if tcp.ACK { - msg.TCPFlags = msg.TCPFlags | 0b010000 + msg.TcpFlags = msg.TcpFlags | 0b010000 } if tcp.PSH { - msg.TCPFlags = msg.TCPFlags | 0b001000 + msg.TcpFlags = msg.TcpFlags | 0b001000 } if tcp.RST { - msg.TCPFlags = msg.TCPFlags | 0b000100 + msg.TcpFlags = msg.TcpFlags | 0b000100 } if tcp.SYN { - msg.TCPFlags = msg.TCPFlags | 0b000010 + msg.TcpFlags = msg.TcpFlags | 0b000010 } if tcp.FIN { - msg.TCPFlags = msg.TCPFlags | 0b000001 + msg.TcpFlags = msg.TcpFlags | 0b000001 } case layers.LayerTypeUDP: udp, _ := layer.(*layers.UDP) @@ -272,7 +272,7 @@ func (f *FlowExporter) Insert(pkt gopacket.Packet) { record.SamplerAddress = f.samplerAddress record.Packets = append(record.Packets, pkt) - // shortcut flow export if we see TCP FIN + // shortcut flow export if we see Tcp FIN if tcpLayer := pkt.Layer(layers.LayerTypeTCP); tcpLayer != nil { tcp, _ := tcpLayer.(*layers.TCP) if tcp.FIN { diff --git a/segments/filter/flowfilter/flowfilter.go b/segments/filter/flowfilter/flowfilter.go index 248cffd..fd9f147 100644 --- a/segments/filter/flowfilter/flowfilter.go +++ b/segments/filter/flowfilter/flowfilter.go @@ -7,7 +7,6 @@ import ( "sync" "github.com/bwNetFlow/flowfilter/parser" - "github.com/bwNetFlow/flowfilter/visitors" "github.com/bwNetFlow/flowpipeline/pb" "github.com/bwNetFlow/flowpipeline/segments" ) @@ -32,7 +31,7 @@ func (segment FlowFilter) New(config map[string]string) segments.Segment { log.Printf("[error] FlowFilter: Syntax error in filter expression: %v", err) return nil } - filter := &visitors.Filter{} + filter := &Filter{} if _, err := filter.CheckFlow(newSegment.expression, &pb.EnrichedFlow{}); err != nil { log.Printf("[error] FlowFilter: Semantic error in filter expression: %v", err) return nil @@ -48,7 +47,7 @@ func (segment *FlowFilter) Run(wg *sync.WaitGroup) { log.Printf("[info] FlowFilter: Using filter expression: %s", segment.Filter) - filter := &visitors.Filter{} + filter := &Filter{} for msg := range segment.In { if match, _ := filter.CheckFlow(segment.expression, msg); match { segment.Out <- msg diff --git a/segments/filter/flowfilter/visitor.go b/segments/filter/flowfilter/visitor.go new file mode 100644 index 0000000..224e6c7 --- /dev/null +++ b/segments/filter/flowfilter/visitor.go @@ -0,0 +1,502 @@ +// FROM https://github.com/bwNetFlow/flowfilter/ +package flowfilter + +import ( + "fmt" + "net" + "strings" + + "github.com/bwNetFlow/flowfilter/parser" + "github.com/bwNetFlow/flowpipeline/pb" +) + +type Filter struct { + flowmsg *pb.EnrichedFlow + __direction string // this is super hacky +} + +func (f *Filter) CheckFlow(expr *parser.Expression, flowmsg *pb.EnrichedFlow) (bool, error) { + f.flowmsg = flowmsg // provide current flow to actual Visitor + err := parser.Visit(expr, f.Visit) // run the Visitor + return expr.EvalResult, err +} + +func (f *Filter) Visit(n parser.Node, next func() error) error { + // Before processing a node's children. + // This Visitor generally does nothing here, as we always want to know + // our childrens evaluation first. This serves to throw an error when + // new nodes haven't been added to this visitor yet. + switch node := n.(type) { + case *parser.AddressMatch: + case *parser.Address: + case *parser.AsnRangeMatch: + case *parser.Boolean: + case *parser.BpsRangeMatch: + case *parser.ByteRangeMatch: + case *parser.CidRangeMatch: + case *parser.DirectionalMatchGroup: + case *parser.DurationRangeMatch: + case *parser.DscpKey: + case *parser.DscpMatch: + case *parser.EcnKey: + case *parser.EcnMatch: + case *parser.EtypeKey: + case *parser.EtypeMatch: + case *parser.Expression: + case *parser.FlowDirectionMatch: + case *parser.IcmpMatch: + case *parser.IfSpeedRangeMatch: + case *parser.InterfaceMatch: + case *parser.IPTosRangeMatch: + case *parser.MedRangeMatch: + case *parser.LocalPrefRangeMatch: + case *parser.NetsizeRangeMatch: + case *parser.NextHopMatch: + case *parser.NextHopAsnMatch: + case *parser.NormalizedMatch: + case *parser.Number: + case *parser.PacketRangeMatch: + case *parser.PortRangeMatch: + case *parser.PpsRangeMatch: + case *parser.PassesThroughListMatch: + case *parser.ProtoKey: + case *parser.ProtoMatch: + case *parser.RangeEnd: + case *parser.RegularMatchGroup: + case *parser.RemoteCountryMatch: + case *parser.RouterMatch: + case *parser.RpkiKey: + case *parser.RpkiMatch: + case *parser.SamplingRateRangeMatch: + case *parser.Statement: + case *parser.StatusKey: + case *parser.StatusMatch: + case *parser.String: + case *parser.TcpFlagsKey: + case *parser.TcpFlagsMatch: + case *parser.VrfRangeMatch: + default: + return fmt.Errorf("Encountered unknown node type: %T", node) + } + + err := next() // descend to child nodes + if err != nil { + return err + } + + // After processing all children... + // This Visitor does all its work here. Leaf nodes are skipped over. + + switch node := n.(type) { + case *parser.AddressMatch: + if node.Mask != nil { + var mask net.IPMask + if node.Address.To4() != nil { + mask = net.CIDRMask(int(*node.Mask), 32) + } else { + mask = net.CIDRMask(int(*node.Mask), 128) + } + ipnet := &net.IPNet{IP: *node.Address, Mask: mask} + (*node).EvalResultSrc = ipnet.Contains(f.flowmsg.SrcAddr) + (*node).EvalResultDst = ipnet.Contains(f.flowmsg.DstAddr) + } else { + (*node).EvalResultSrc = net.IP(f.flowmsg.SrcAddr).Equal(*node.Address) + (*node).EvalResultDst = net.IP(f.flowmsg.DstAddr).Equal(*node.Address) + } + case *parser.AsnRangeMatch: + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.SrcAs)) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.DstAs)) + if err != nil { // errs from above calls will be the same anyways + return fmt.Errorf("Bad ASN range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.BpsRangeMatch: + duration := f.flowmsg.TimeFlowEnd - f.flowmsg.TimeFlowStart + if duration == 0 { + duration += 1 + } + bps := f.flowmsg.Bytes * 8 / duration + (*node).EvalResult, err = processNumericRange(node.NumericRange, bps) + case *parser.ByteRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, f.flowmsg.Bytes) + if err != nil { + return fmt.Errorf("Bad byte size range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.CidRangeMatch: + (*node).EvalResult, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.Cid)) + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.SrcCid)) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.DstCid)) + if err != nil { + return fmt.Errorf("Bad cid range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.RegularMatchGroup: + switch { + case node.Router != nil: + (*node).EvalResult = node.Router.EvalResult + case node.NextHop != nil: + (*node).EvalResult = node.NextHop.EvalResult + case node.NextHopAsn != nil: + (*node).EvalResult = node.NextHopAsn.EvalResult + case node.Bytes != nil: + (*node).EvalResult = node.Bytes.EvalResult + case node.Packets != nil: + (*node).EvalResult = node.Packets.EvalResult + case node.RemoteCountry != nil: + (*node).EvalResult = node.RemoteCountry.EvalResult + case node.FlowDirection != nil: + (*node).EvalResult = node.FlowDirection.EvalResult + case node.Normalized != nil: + (*node).EvalResult = node.Normalized.EvalResult + case node.Duration != nil: + (*node).EvalResult = node.Duration.EvalResult + case node.Etype != nil: + (*node).EvalResult = node.Etype.EvalResult + case node.Proto != nil: + (*node).EvalResult = node.Proto.EvalResult + case node.Status != nil: + (*node).EvalResult = node.Status.EvalResult + case node.TcpFlags != nil: + (*node).EvalResult = node.TcpFlags.EvalResult + case node.IPTos != nil: + (*node).EvalResult = node.IPTos.EvalResult + case node.LocalPref != nil: + (*node).EvalResult = node.LocalPref.EvalResult + case node.Med != nil: + (*node).EvalResult = node.Med.EvalResult + case node.Dscp != nil: + (*node).EvalResult = node.Dscp.EvalResult + case node.Ecn != nil: + (*node).EvalResult = node.Ecn.EvalResult + case node.SamplingRate != nil: + (*node).EvalResult = node.SamplingRate.EvalResult + case node.Icmp != nil: + (*node).EvalResult = node.Icmp.EvalResult + case node.Bps != nil: + (*node).EvalResult = node.Bps.EvalResult + case node.Pps != nil: + (*node).EvalResult = node.Pps.EvalResult + case node.PassesThrough != nil: + (*node).EvalResult = node.PassesThrough.EvalResult + case node.Rpki != nil: + (*node).EvalResult = node.Rpki.EvalResult + } + case *parser.DirectionalMatchGroup: + if node.Direction == nil { + switch { + case node.Address != nil: + (*node).EvalResult = node.Address.EvalResultSrc || node.Address.EvalResultDst + case node.Interface != nil: + (*node).EvalResult = node.Interface.EvalResultSrc || node.Interface.EvalResultDst + case node.Port != nil: + (*node).EvalResult = node.Port.EvalResultSrc || node.Port.EvalResultDst + case node.Asn != nil: + (*node).EvalResult = node.Asn.EvalResultSrc || node.Asn.EvalResultDst + case node.Netsize != nil: + (*node).EvalResult = node.Netsize.EvalResultSrc || node.Netsize.EvalResultDst + case node.Cid != nil: + (*node).EvalResult = node.Cid.EvalResult || node.Cid.EvalResultSrc || node.Cid.EvalResultDst + case node.Vrf != nil: + (*node).EvalResult = node.Vrf.EvalResultSrc || node.Vrf.EvalResultDst + } + } else if *node.Direction == "src" { + switch { + case node.Address != nil: + (*node).EvalResult = node.Address.EvalResultSrc + case node.Interface != nil: + (*node).EvalResult = node.Interface.EvalResultSrc + case node.Port != nil: + (*node).EvalResult = node.Port.EvalResultSrc + case node.Asn != nil: + (*node).EvalResult = node.Asn.EvalResultSrc + case node.Netsize != nil: + (*node).EvalResult = node.Netsize.EvalResultSrc + case node.Cid != nil: + (*node).EvalResult = node.Cid.EvalResultSrc + case node.Vrf != nil: + (*node).EvalResult = node.Vrf.EvalResultSrc + } + } else if *node.Direction == "dst" { + switch { + case node.Address != nil: + (*node).EvalResult = node.Address.EvalResultDst + case node.Interface != nil: + (*node).EvalResult = node.Interface.EvalResultDst + case node.Port != nil: + (*node).EvalResult = node.Port.EvalResultDst + case node.Asn != nil: + (*node).EvalResult = node.Asn.EvalResultDst + case node.Netsize != nil: + (*node).EvalResult = node.Netsize.EvalResultDst + case node.Cid != nil: + (*node).EvalResult = node.Cid.EvalResultDst + case node.Vrf != nil: + (*node).EvalResult = node.Vrf.EvalResultDst + } + } + case *parser.DurationRangeMatch: + duration := f.flowmsg.TimeFlowEnd - f.flowmsg.TimeFlowStart + (*node).EvalResult, err = processNumericRange(node.NumericRange, duration) + if err != nil { + return fmt.Errorf("Bad duration range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.DscpMatch: + switch { + case node.Dscp != nil: + (*node).EvalResult = f.flowmsg.IpTos>>2 == uint32(*node.Dscp) + case node.DscpKey != nil: + (*node).EvalResult = f.flowmsg.IpTos>>2 == uint32(*node.DscpKey) + } + case *parser.EcnMatch: + switch { + case node.Ecn != nil: + (*node).EvalResult = f.flowmsg.IpTos&0b00000011 == uint32(*node.Ecn) + case node.EcnKey != nil: + (*node).EvalResult = f.flowmsg.IpTos&0b00000011 == uint32(*node.EcnKey) + } + case *parser.EtypeMatch: + switch { + case node.Etype != nil: + (*node).EvalResult = f.flowmsg.Etype == uint32(*node.Etype) + case node.EtypeKey != nil: + (*node).EvalResult = f.flowmsg.Etype == uint32(*node.EtypeKey) + } + case *parser.Expression: + switch { + case node.Left == nil: + (*node).EvalResult = true // empty filters return all flows + case node.Conjunction == nil: + (*node).EvalResult = node.Left.EvalResult + case *node.Conjunction == "and": + (*node).EvalResult = node.Left.EvalResult && node.Right.EvalResult + case *node.Conjunction == "or": + (*node).EvalResult = node.Left.EvalResult || node.Right.EvalResult + } + case *parser.FlowDirectionMatch: + if *node.FlowDirection == "incoming" { + (*node).EvalResult = f.flowmsg.FlowDirection == 0 + } else if *node.FlowDirection == "outgoing" { + (*node).EvalResult = f.flowmsg.FlowDirection == 1 + } + case *parser.IcmpMatch: + if f.flowmsg.Proto != 1 { + (*node).EvalResult = false + break + } + switch { + case node.Type != nil: + (*node).EvalResult = uint32(*node.Type) == f.flowmsg.DstPort/256 + case node.Code != nil: + (*node).EvalResult = uint32(*node.Code) == f.flowmsg.DstPort%256 + } + case *parser.IfSpeedRangeMatch: + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.SrcIfSpeed)/1000) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.DstIfSpeed)/1000) + if err != nil { // errs from above calls will be the same anyways + return fmt.Errorf("Bad iface speed range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.InterfaceMatch: + switch { + case node.SnmpId != nil: + (*node).EvalResultSrc = uint32(*node.SnmpId) == f.flowmsg.InIf + (*node).EvalResultDst = uint32(*node.SnmpId) == f.flowmsg.OutIf + case node.Name != nil: + (*node).EvalResultSrc = strings.Contains( + strings.ToLower(f.flowmsg.SrcIfName), + strings.ToLower(string(*node.Name)), + ) + (*node).EvalResultDst = strings.Contains( + strings.ToLower(f.flowmsg.DstIfName), + strings.ToLower(string(*node.Name)), + ) + case node.Description != nil: + (*node).EvalResultSrc = strings.Contains( + strings.ToLower(f.flowmsg.SrcIfDesc), + strings.ToLower(string(*node.Description)), + ) + (*node).EvalResultDst = strings.Contains( + strings.ToLower(f.flowmsg.DstIfDesc), + strings.ToLower(string(*node.Description)), + ) + case node.Speed != nil: + (*node).EvalResultSrc = node.Speed.EvalResultSrc + (*node).EvalResultDst = node.Speed.EvalResultDst + } + case *parser.IPTosRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.IpTos)) + if err != nil { + return fmt.Errorf("Bad iptos range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.LocalPrefRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.LocalPref)) + if err != nil { + return fmt.Errorf("Bad localpref range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.MedRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.Med)) + if err != nil { + return fmt.Errorf("Bad med range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.NetsizeRangeMatch: + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.SrcNet)) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.DstNet)) + if err != nil { // errs from above calls will be the same anyways + return fmt.Errorf("Bad netsize range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.NextHopMatch: + (*node).EvalResult = net.IP(f.flowmsg.NextHop).Equal(*node.Address) + case *parser.NextHopAsnMatch: + (*node).EvalResult = f.flowmsg.NextHopAs == *node.Asn + case *parser.NormalizedMatch: + (*node).EvalResult = f.flowmsg.Normalized == 1 + case *parser.PacketRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, f.flowmsg.Packets) + if err != nil { + return fmt.Errorf("Bad packet count range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.PortRangeMatch: + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.SrcPort)) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.DstPort)) + if err != nil { // errs from above calls will be the same anyways + return fmt.Errorf("Bad port range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.PpsRangeMatch: + duration := f.flowmsg.TimeFlowEnd - f.flowmsg.TimeFlowStart + + if duration == 0 { + duration += 1 + } + pps := f.flowmsg.Packets / duration + (*node).EvalResult, err = processNumericRange(node.NumericRange, pps) + if err != nil { + return fmt.Errorf("Bad range: %v.", err) + } + case *parser.PassesThroughListMatch: + sliceEq := func(a []parser.Number, b []uint32) bool { + for i, v := range a { + if uint32(v) != b[i] { + return false + } + } + return true + } + + for i := range f.flowmsg.AsPath { + if i+len(node.Numbers) > len(f.flowmsg.AsPath) { + break + } + if sliceEq(node.Numbers, f.flowmsg.AsPath[i:i+len(node.Numbers)]) { + (*node).EvalResult = true + break + } else { + (*node).EvalResult = false + } + } + case *parser.ProtoMatch: + switch { + case node.Proto != nil: + (*node).EvalResult = f.flowmsg.Proto == uint32(*node.Proto) + case node.ProtoKey != nil: + (*node).EvalResult = f.flowmsg.Proto == uint32(*node.ProtoKey) + } + case *parser.RemoteCountryMatch: + (*node).EvalResult = strings.Contains(f.flowmsg.RemoteCountry, strings.ToUpper(string(*node.CountryCode))) + case *parser.RouterMatch: + (*node).EvalResult = net.IP(f.flowmsg.SamplerAddress).Equal(*node.Address) + case *parser.RpkiMatch: + if node.RpkiKey == nil { + (*node).EvalResult = false + break + } + (*node).EvalResult = f.flowmsg.ValidationStatus == pb.EnrichedFlow_ValidationStatusType(*node.RpkiKey) + case *parser.SamplingRateRangeMatch: + (*node).EvalResult, err = processNumericRange(node.NumericRange, f.flowmsg.SamplingRate) + if err != nil { + return fmt.Errorf("Bad samplingrate range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + case *parser.Statement: + switch { + case node.DirectionalMatch != nil: + (*node).EvalResult = node.DirectionalMatch.EvalResult + case node.RegularMatch != nil: + (*node).EvalResult = node.RegularMatch.EvalResult + case node.SubExpression != nil: + (*node).EvalResult = node.SubExpression.EvalResult + } + if node.Negated != nil && *node.Negated == true { + (*node).EvalResult = !(*node).EvalResult + } + case *parser.StatusMatch: + switch { + case node.Status != nil: + (*node).EvalResult = f.flowmsg.ForwardingStatus == uint32(*node.Status) + case node.StatusKey != nil: + (*node).EvalResult = f.flowmsg.ForwardingStatus&uint32(*node.StatusKey) == uint32(*node.StatusKey) + } + case *parser.TcpFlagsMatch: + if f.flowmsg.Proto != 6 { + (*node).EvalResult = false + break + } + switch { + case node.TcpFlags != nil: + (*node).EvalResult = f.flowmsg.TcpFlags == uint32(*node.TcpFlags) + case node.TcpFlagsKey != nil: + (*node).EvalResult = f.flowmsg.TcpFlags&uint32(*node.TcpFlagsKey) == uint32(*node.TcpFlagsKey) + } + case *parser.VrfRangeMatch: + (*node).EvalResultSrc, _ = processNumericRange(node.NumericRange, uint64(f.flowmsg.IngressVrfIDBW)) + (*node).EvalResultDst, err = processNumericRange(node.NumericRange, uint64(f.flowmsg.EgressVrfIDBW)) + if err != nil { // errs from above calls will be the same anyways + return fmt.Errorf("Bad ASN range, lower %d > upper %d", + *node.Lower, + *node.Upper) + } + } + return nil +} + +func processNumericRange(node parser.NumericRange, compare uint64) (bool, error) { + var err error + if node.Lower != nil && node.Upper != nil { + if uint64(*node.Lower) > uint64(*node.Upper) { + err = fmt.Errorf("Bad range, %d - %d", *node.Lower, *node.Upper) + } + return uint64(*node.Lower) <= compare && compare <= uint64(*node.Upper), err + } else { + var unary string + if node.Unary != nil { + unary = string(*node.Unary) + } + switch unary { + case "<": + return compare < uint64(*node.Number), err + case ">": + return compare > uint64(*node.Number), err + default: + return compare == uint64(*node.Number), err + } + } +} diff --git a/segments/input/bpf/bpf.go b/segments/input/bpf/bpf.go index abf9591..dc4d543 100644 --- a/segments/input/bpf/bpf.go +++ b/segments/input/bpf/bpf.go @@ -9,17 +9,14 @@ import ( "sync" "time" - "github.com/bwNetFlow/bpf_flowexport/flowexport" - "github.com/bwNetFlow/bpf_flowexport/packetdump" "github.com/bwNetFlow/flowpipeline/segments" ) -// FIXME: the bpf_flowexport projects needs to adopt the new flowmsg too type Bpf struct { segments.BaseSegment - dumper *packetdump.PacketDumper - exporter *flowexport.FlowExporter + dumper PacketDumper + exporter *FlowExporter Device string // required, the name of the device to capture, e.g. "eth0" ActiveTimeout string // optional, default is 30m @@ -53,7 +50,7 @@ func (segment Bpf) New(config map[string]string) segments.Segment { } // setup bpf dumping - newsegment.dumper = &packetdump.PacketDumper{BufSize: newsegment.BufferSize} + newsegment.dumper = PacketDumper{BufSize: newsegment.BufferSize} err := newsegment.dumper.Setup(newsegment.Device) if err != nil { @@ -88,7 +85,7 @@ func (segment Bpf) New(config map[string]string) segments.Segment { log.Printf("[info] Bpf: 'inactivetimeout' set to '%s'.", config["inactivetimeout"]) } - newsegment.exporter, err = flowexport.NewFlowExporter(newsegment.ActiveTimeout, newsegment.InactiveTimeout) + newsegment.exporter, err = NewFlowExporter(newsegment.ActiveTimeout, newsegment.InactiveTimeout) if err != nil { log.Printf("[error] Bpf: error setting up exporter: %s", err) return nil diff --git a/segments/input/bpf/bpf_bpfeb.o b/segments/input/bpf/bpf_bpfeb.o new file mode 100644 index 0000000000000000000000000000000000000000..5f9ddf1aa235d81602687fc0a9cd8897cd5b92cb GIT binary patch literal 18544 zcmds8eRx#WnLqc=X99!?1PEVpp@2a{2oPiZKocO4C?6vPL2I21$%M=@BtvF`pev@< zR?RL%ne&?J!bLIeR zcc1-h&%?d%`+MK_yyu+veBAfm47aqdS>?KpC=^Hh4!j{KXuvE#AyKowPZrKoNy&@D zF-32Bc=QxGP-zSLrp6V+5`9o_fTWQ7lVl2#mUmbB`_l89+Lr;Xl07VW-G3cO$A-;$=MjowLW zv@7G5oHlx|A@|T98DGfnx8!dT!|&asup1%WdEV$g(rq5^!riRsr4dCd5T{vG{E6eK z@yFxOzcHS>=m*#z&&P<*Fdo?-L;gDL_UL$Mc{A40AuTt@N%;{iKR{~O4->=BK~h70 zlvvM8BjWQ3Vn049wVq;_-*FH-pxg^##Ki+Wdt92S6%~Fw;P*ZXF#c1ds6T-e{>Fk- zYQGmlK8f!#XR8|8~7^?ez!wZ|MK2 zD|p8`ZTn zS5!I^aPqhfB2dvj@$#t`kGW)wi_ruer+p$0q}if<;)R%k&|DZ?Hf9XiFxfFQ617S~R;H4NndUcS_N4 zN`r8#i?ABd&`upA-3T#lrn7h=J#HCu&6v$-Z93dkFGfo^@&h)ofoS#2g(__(LgwQ#~G{>H)^BrZ~MVq>%{5T`=6=mpfl8 z3n(F`5X_Z)x@-t?ABo9f2Qw|EMWcbikW4!T0A(5OCqlgx!PgEV}q`BpL&GH5ja^1bsyC{+Pr26E5%H4)XqT znD>z=?{AIe{Zu9HPH-~sv6;M2pUr#C0^TpE<9+!e-q$VR{o19xr>^6D=k>e~ZRPzF z+jxHZ+GQW82x5_H_Cpy)#vkGQ_K5B z7xUhB3GbUO-ea@XQ|E?h&& z;fRYx>%J6OjC;nZ!u^+uXJk1!?vKLf(d1tvt8l+dn@HXdzI!TMFVA??Kncd3Yq8b> zPA|az$x^=^O|1zza$p2^DRhonzm zr`o&sj5^iceP`4ils-RM(D{9FPeIY7`V!pd`~?osq^}Fap=;B+?>m15-A@a;1JHR| z_k{B~=)QsD5`mnBK)vK7BXQ@-C|JywGt*gvtW5+kNbqZ;WsI{(R@!mE<3g{QFzUe^&C>ts;L=@*h}D{;QI|zK#5ol25dge@^n9S1=Y_ z-GQ824K{?O6}ZoxgoPfsJ?c=>hG1Rp)I_SBnXLFaM9(_s$Uw0J&pNXl%HIY5n&Y|P zgV+<`X9vkok^G!6c~9EEkAV%&mHgZ?@(ZQSymIgiNazh`{#fz|2>5ej>}2RT1n)!( zoqQ`ipIu*$>SLl)$!5SdMyJvCk6>?dmPTrv^XMM|hoAG==OA(e^sQF*Ed~BrXQAxd zPRZ9r*sfX(i{t`Oi=kdF0JRtv%LPy)7sC>deG9Yc$DC!63g-gW=j6TSG|Cup@?LW; zlySKS{2NY_Z2MD^zevX7GvJ?fF6NknpO^e4@hq5f^T!Zg<@Y81ix3{uY&*~KHH!< z6eWl#@RhMN!?aQJ)fhEA!2tfIieQcck5?0%ufW%45MWKw?CT!EIvk=2*v((B|)z;d$Nrnr@-H>A>g5dcD@-Wz(yf>s)OJT1)knQ z!1D*1Z(T=#&=Wk~o>m z3(@_v@OXJahVC`UeglBK2CL*lSTYkrvG3haaHp#G;sF9I40=5FIXc1g9FHEPljC#} zeh}w;6@YXS2`bZ<4$0Ky7~uxwZIntr$cc{r4ig<7YzkFPfrrp9aCsp-ItYHHz*Lvu zqyp1|1lTp9^FvkB!vJA8BbX5(z(bQ@rtHsj1W-d~kcSBXP$_bV#;BlpdFH&H3 zg$L%Np{hBt+33R@qECma-Y4cnai<|xM0r`LYOahCRs_MkprGN?p{jGm98^1(hFdVO zH$qi4(lDvOf|v{ow+$j#Rm=4f#)Fbh7BswOT5p42sO;j)f}AICQ=GE6X`Ry-6y^$gQB(c;#4bh47b@w+e2B@Z++h zmE*Y;!cQtqjB7mntOAv?&o3%4p@EuzRCOjc5nu;nXq8oM1h1p(KMYk)TEn3UEamXq z?z9kg^>p@UYqn<*uDUK!ClZ--SE?_U5?#H?0g*_wY}n9pO=4sFwXKPcYvQemgvchl zwx{wrk>8U|iF99{)f2hxTN9c7WOrigo_s1NGW~tqJn9Dfa_Mb-scs1piNU2yq|-8eWE>HWLK;;z-kl34YQ6FMXT1;MLxc% z$ZuL%+q$mkwjFa}gk;_Nb;S;?+}Kg#Y;BvG>XKPr z9$%GMm1tkLvUN*hZOg_hg%YgTv|$668Zj|NO$eXCe&Ud*VW&h68Wwy8cA-;iSG13sw~7Fg2J; z>_}#_>Ar1ZS0>q)$PT1(IHMHEccpzPXF5BO?jK0!_h3D2gIO+-?n(D`r*;dUA`D8< zwN>;cbG_(#qAQckr*tPwq%(_UM^RAgqlYI?yo7KDwy zP%a{6Dp?t|9Vs-ym6+I`+LIG~y$GYo%R3hd#wOQmF3~fP+$PeX=>aToAEo-bl36Yw zWye_19$PDgm77!T=+(QcA%TT0b=Y#)0u2c)Z8D8gAsI?!cht_{L!;QcJoX2+-VIpI zT#8~_u0N4WVSVSei>>{Gecg%f)GkC=?ns7%8Z~J5f5n zi9}96i*o%~XtKfdjVTNww>`0S5V2}+TO-ub@~ej&JT*l%Z^+Z}cFe167ZGz_6lPM6 zw8HZq)boX;C^TcD#Vh37f%kAxND*`JskpRSoWo}|3ZBzSrrV<3eAMwkkKn4uh1^7z z2F-h*%QW8%x?J;}pmEI)fnKBe1E4*c9|rB${0QicikIC&GRn3b50vRA`DRci#N<0c zKZk1!_#sdxSdhCODDxZg&7g;Ik?#a$c0+y$l*tYG1EAm2{4nUtnjZoEiQ*Y@@h`Z> zBK#icZ#91a^j%!=6ZFuJa?Lk`=eq~xouDk^zz;z_3;cNS!{FzGhm8#TBF%fCER~Qq z!=?#5ZHBFE3en> zA%}Ikb$b*w<1*{t1c($|6;}~t;d0Qd29dKDGy-}nf=Jm!baRFF$@MIoGWyE+v7flg z+VuLI3=Gql`mU zxc+|}=x04BjRTBHb|E=pIE&{jQXV8eGR;0c*Tz}PC!?7Q@oY@x7mGT+ALw@kc=QaL znp}Qhuq*Esro=lBUKV&a2@l0jMLaxfy=C4_H(#Q}+w*nIqacFu!pp2@s4{}OMr!@% zw6|=T7jIc{Wot*GZT-d$wBapU_jvsLx9(N9QZjWY@h&sVLR?f%A=}8M`?^wI zI)84?Q`Ks{8&c;Eq`Z7@%2W9$d&zOgj1)e4^Zk7}9Ya38k-#k|#@4W0=HXo-5yuOb zKXG(*`imWX)k@non*9*zWrVxdqp1#7Ina?ao<4Zy`?7kOsR>?uwl}d z@9)jkn7)cxtJSQYSY0V&RMHyQFB;4ZEJ8dpgWah`Thsa6BH0jL8tQt5ht-lF9O%Q6 zR__sAh+;m8ch#j!yc!C3TTSZ8K0}jQW7*3?sbt{(F;yHr(hpcPc;|V>2y`0n&G+he z*Y{|zH+!i}4l4uO<&0B$b>shjQX9@ZsWtX|6!QKBx^F%8EDJ8XY)O4_Ozht2lU{fo zC^bCW)R(?kSdlG#|I!m;E*!g~_4Pe0rA;%d>`kNg)>LByR-Q2fN+nx8+bU^nIP)rD z)lC0cy=MBYu`q)@OD~k_4EAU7Py5sSpS}u>moya+e@$uAWuE^f2Hy_;CyUBE-@|&w zc~N}FtMwK)SOX}$)*?nl!#epQTAZNwI+Y4-883Y}ovgMBuhnSFFsx&mQEW>tSpT)# zvgC_p(eh93Rq;i&*7F0v%BOu2Q)lgb^#sk;dZ&F8K{(OBS}%w9mi`{@{RJ50&HBro z{~fOmZ?yOzr@!j4rD8fDJI&W0{f6V|bgT*#SMWMqSuH~*=X?UZpW)Gl87O6~%EtL5 z@FT)GKu8_&^TIjEM6pxjp9$v(v&dcpQ;&9N??#04B=K$oBh%(bOQ~-X&NF-yJD~AS z;S4jY#G8=Re@ZwnQ-4(BsFSaC|@ zF5#R)f1H@cw;_)vZqoQE{5ct)T%BeE!=KZp@rZC|;BCW+8yH!)vqj-xK)5l)$IF?cKcMjsgc-^@xuf)A(NDHp8Ajbm4r3ejwbHXwUTw zjP~3bjo%e+6Z+>i8JPNJjp+|-(TyvNzb3eC_(<<=(Rhz=*GvZPRO1hSK{&ODm)mRT zSwE}sF}R}rZp(hi(9?dO#-sRiIqmmb_V*il+8%03 z!TE|3v%Zc;^drJOLcNZM#MJBYMh^-1Ui#DH5xN9)f1@Xb`wZ4guu1tZYZ2}X{uwit zKd%VlB{KTw_@E%qB)`5-gXp(AB!a;I7ImEes2GRuFb*Bya&W+v=6cE8j)mJ&eW`(T zSE=GO%f3`TjjPlulkOYbT`FSsDF1|lKcApUyd5pfWEvZgN8nUuzGS3 z2516`4nqkBW9Ku6x-ew?^NC7BfpYn7`s1fs)`7$~MJ>ER>z8^&_m{#6Rg~9$3&Vl^3cf92Xxf~R2nX)G#lzpS0)K#Pe7Fv^=7s~e z-clD13^`tC=Jn8dp;>S@5p+^`CTLw~N_cKC5-JaT`4%tegeC>PPlvOm=rJw&2Z(0P zkhRW1EqV!s8^eKj_IhX|@G%E1{C4jaHoYGW%_?o6Dm*7NqdqiQ`8*!fiFTl zZ;ces!_c7)e19)v6L=IF1nsrGS711SuQ>UTbDJ9|eE8#>oUuF*6r(54q`_*yKf5@b zU0;64(Eiepj~McI4EZaD9A}2_$1&x@MLG9fp?sq#=lS9n2Oo!gKRh=I<(~|BTR|$s ze-`EL2}6FYC=ZzOpBVCC!~WNX{C-2u&J;cvS@NifeIEAm0P(R;A&>dINg*$MIWy#! zKnRstc>ahvc%aE0X=vDw6y(^nC50yy3V+QZf3NGGb+lt&eE*C&suwW(V`4l*__eN} zXHH}4@r>pPBrgzgJ}y&#AuxUTXUG~$ztO_iTDS)o&*egW9D*hO@3t`K&usr&7Jk{n zuUYu#rP#qU#`K5Z7L{WBI;cdy)WZ0oL5coy3%6SMN(*0Q;msEQfQ7p(oVIYkg$FIn zuenD2oDW*~b_;*p!uMGC(-wZn!jD?`ix&Q>g?V{=9{UEqol<=wIMRmi{eEf2ve3&ugQ8aB8W&{E?5TuebEpdI|D*Y1(&K zxYNQJ3tQ_WXswUne#`zr3m>#F*N54kVGF-t;a4pDx`nOv5d34QKE&sr(O#&^!t*R_ z#WTd`msx+gh1Xj68Vjc^ywk!rTlfwO-)G^6E&P~;t@APTT}yB6uh594x6Z#1b3SAI zVdfDg9%o@|y@sv$h8J7*%Pib(Ve32#GaoS9-)Uhho?$DVVJn_tE1qF1p5bp={=Z{k zE1uyuEd5CfThEIK&pu;3k!lND@rx|6^j1C*vGS{kwH_l@{32F96&bSpf84?kSeWOb z*?(()NB-W@ThHT&m48LvwCvw5#ZjKkMte~!e$g40eu0G>Exf|QaSMOI!Z%uYpM|aU z6@A3gKV{+XS(wiQV|-=Sek-f6^nBi#_B9s1z{1w~Rkq&JUuWU8g?Cxl%IC_yWa*Du z*xD~;)_GobvedrZ%BRY$@t0fqRQda?`qp_~Zk;#fS6KE|eqG*e>33RquZ5W}81qqn zzl9&Qu$AAITkE6TdLEYl*sA}FQY`bGNst9`p~(Nv!S^qXMJ;&lAs;tenCsuvcUm}W z;UNp}x9|ZAAF}YUg^yc!#KI>^F}H`=Uw$ty!JdWdE!=G3xP?0{oVDIwKj zk00*}{H!KZx4dIj9fAIld)aLjlP|2@{WDVsh-G?6%*JU!hb|m<-82qPz;{P-- z%;{*(?9&PzcrkNjU&7{(M*tTb@?}$FmgjVAV3_SUwJ0cFh*{q5pgV zcDM%KqrUvU>DMKV76Jc@D*yI*rm~3n4hz>kpL_l|{rZ%jhs$r@*F(f2-(Si2_T*Vi z%$)gb_4#~fF~%#gZ%=R+E)z=wbqhYI!5xN>tZ7f)#D-~z?*}OSJ8DTW?XRRkiM9a3 z%s)}e-%_-2H|_b&>1^?DQZ>enfHMBRogY8OzaE$GkGxST`M!!0nXPEy?%R{{ox;Zj z1I1Los_59CSqjts5OjXOEVE@?n=BqK_J1rc7PJ3+r#1aa19hACq@sm&i+^lx@Cd@ literal 0 HcmV?d00001 diff --git a/segments/input/bpf/flow_exporter.go b/segments/input/bpf/flow_exporter.go new file mode 100644 index 0000000..54da853 --- /dev/null +++ b/segments/input/bpf/flow_exporter.go @@ -0,0 +1,205 @@ +package bpf + +import ( + "fmt" + "log" + "net" + "sync" + "time" + + "github.com/bwNetFlow/flowpipeline/pb" +) + +type FlowKey struct { + SrcAddr string + DstAddr string + SrcPort uint16 + DstPort uint16 + Proto uint32 + IPTos uint8 + InIface uint32 +} + +type FlowExporter struct { + activeTimeout time.Duration + inactiveTimeout time.Duration + samplerAddress net.IP + + Flows chan *pb.EnrichedFlow + + mutex *sync.RWMutex + stop chan bool + cache map[FlowKey]*FlowRecord +} + +type FlowRecord struct { + TimeReceived time.Time + LastUpdated time.Time + SamplerAddress net.IP + Packets []Packet +} + +func NewFlowExporter(activeTimeout string, inactiveTimeout string) (*FlowExporter, error) { + activeTimeoutDuration, err := time.ParseDuration(activeTimeout) + if err != nil { + return nil, fmt.Errorf("active timeout misconfigured") + } + inactiveTimeoutDuration, err := time.ParseDuration(inactiveTimeout) + if err != nil { + return nil, fmt.Errorf("inactive timeout misconfigured") + } + + fe := &FlowExporter{activeTimeout: activeTimeoutDuration, inactiveTimeout: inactiveTimeoutDuration} + fe.Flows = make(chan *pb.EnrichedFlow) + + fe.mutex = &sync.RWMutex{} + fe.cache = make(map[FlowKey]*FlowRecord) + + return fe, nil +} + +func (f *FlowExporter) Start(samplerAddress net.IP) { + log.Println("[info] FlowExporter: Starting export goroutines.") + + f.samplerAddress = samplerAddress + f.stop = make(chan bool) + go f.exportInactive() + go f.exportActive() +} + +func (f *FlowExporter) Stop() { + log.Println("[info] FlowExporter: Stopping export goroutines.") + close(f.stop) +} + +func (f *FlowExporter) exportInactive() { + ticker := time.NewTicker(f.inactiveTimeout) + for { + select { + case <-ticker.C: + now := time.Now() + + f.mutex.Lock() + for key, record := range f.cache { + if now.Sub(record.LastUpdated) > f.inactiveTimeout { + f.export(key) + } + } + f.mutex.Unlock() + case <-f.stop: + ticker.Stop() + return + } + } +} + +func (f *FlowExporter) exportActive() { + ticker := time.NewTicker(f.activeTimeout) + for { + select { + case <-ticker.C: + now := time.Now() + + f.mutex.Lock() + for key, record := range f.cache { + if now.Sub(record.TimeReceived) > f.activeTimeout { + f.export(key) + } + } + f.mutex.Unlock() + case <-f.stop: + ticker.Stop() + return + } + } +} + +func (f *FlowExporter) export(key FlowKey) { + flowRecord := f.cache[key] + delete(f.cache, key) + + f.Flows <- BuildFlow(flowRecord) +} + +func BuildFlow(f *FlowRecord) *pb.EnrichedFlow { + msg := &pb.EnrichedFlow{} + msg.Type = pb.EnrichedFlow_EBPF + msg.SamplerAddress = f.SamplerAddress + msg.TimeReceived = uint64(f.TimeReceived.UnixNano()) + msg.TimeFlowStart = uint64(f.TimeReceived.UnixNano()) + msg.TimeFlowEnd = uint64(f.LastUpdated.UnixNano()) + for i, pkt := range f.Packets { + if i == 0 { + // flow key 7-tuple + msg.SrcAddr = pkt.SrcAddr + msg.DstAddr = pkt.DstAddr + msg.SrcPort = uint32(pkt.SrcPort) + msg.DstPort = uint32(pkt.DstPort) + msg.Proto = pkt.Proto + msg.IpTos = uint32(pkt.IPTos) + msg.InIf = pkt.InIf + + // other presumably static data, this will be set to the first packets fields + msg.OutIf = pkt.OutIf + msg.FlowDirection = uint32(pkt.FlowDirection) // this is derived from the packets type + msg.RemoteAddr = pb.EnrichedFlow_RemoteAddrType(pkt.RemoteAddr) // this is derived from the packets type + msg.Etype = pkt.Etype + msg.Ipv6FlowLabel = pkt.Ipv6FlowLabel // TODO: no differences possible? + msg.IpTtl = uint32(pkt.IPTtl) // TODO: set to lowest if differ? + msg.IcmpType = uint32(pkt.IcmpType) // TODO: differences could occur between packets + msg.IcmpCode = uint32(pkt.IcmpCode) // TODO: differences could occur between packets + } + // special handling + msg.TcpFlags = msg.TcpFlags | uint32(pkt.TcpFlags) + msg.Bytes += uint64(pkt.Bytes) + msg.Packets += 1 + } + return msg +} + +func (f *FlowExporter) ConsumeFrom(pkts chan Packet) { + for { + select { + case pkt, ok := <-pkts: + f.Insert(pkt) + if !ok { + return + } + case <-f.stop: + return + } + } +} + +func (f *FlowExporter) Insert(pkt Packet) { + key := NewFlowKey(pkt) + + var record *FlowRecord + var exists bool + + f.mutex.Lock() + if record, exists = f.cache[key]; !exists { + f.cache[key] = new(FlowRecord) + f.cache[key].TimeReceived = time.Now() + record = f.cache[key] + } + record.LastUpdated = time.Now() + record.SamplerAddress = f.samplerAddress + record.Packets = append(record.Packets, pkt) + if pkt.TcpFlags&0b1 == 1 { // short cut flow export if we see TCP FIN + f.export(key) + } + f.mutex.Unlock() +} + +func NewFlowKey(pkt Packet) FlowKey { + return FlowKey{ + SrcAddr: string(pkt.SrcAddr.To16()), + DstAddr: string(pkt.DstAddr.To16()), + SrcPort: pkt.SrcPort, + DstPort: pkt.DstPort, + Proto: pkt.Proto, + IPTos: pkt.IPTos, + InIface: pkt.InIf, + } +} diff --git a/segments/input/bpf/packet_dumper.go b/segments/input/bpf/packet_dumper.go new file mode 100644 index 0000000..c238399 --- /dev/null +++ b/segments/input/bpf/packet_dumper.go @@ -0,0 +1,289 @@ +//go:build linux +// +build linux + +// based on https://github.com/bwNetFlow/bpf_flowexport/blob/master/packetdump/packetdump.go +package bpf + +import ( + "bytes" + _ "embed" + "encoding/binary" + "errors" + "fmt" + "io" + "log" + "net" + "syscall" + + "github.com/cilium/ebpf" + "github.com/cilium/ebpf/perf" + "github.com/cilium/ebpf/rlimit" +) + +// $BPF_CLANG and $BPF_CFLAGS are set by the Makefile. +// +//go:generate go run github.com/cilium/ebpf/cmd/bpf2go -cc clang-13 -cflags "-O2 -g -Wall -Werror" bpf ./bpf/bpf.c +type rawPacket struct { + SrcAddrHi uint64 + SrcAddrLo uint64 + DstAddrHi uint64 + DstAddrLo uint64 + InIf uint32 + OutIf uint32 + Bytes uint32 + Etype uint32 + Proto uint32 + Ipv6FlowLabel uint32 + SrcAddr uint32 + DstAddr uint32 + SrcPort uint16 + DstPort uint16 + IPTtl uint8 + IPTos uint8 + IcmpType uint8 + IcmpCode uint8 + TcpFlags uint8 + FlowDirection uint8 + RemoteAddr uint8 +} + +type Packet struct { + SrcAddr net.IP + DstAddr net.IP + InIf uint32 + OutIf uint32 + Bytes uint32 + Etype uint32 + Proto uint32 + Ipv6FlowLabel uint32 + SrcPort uint16 + DstPort uint16 + IPTtl uint8 + IPTos uint8 + IcmpType uint8 + IcmpCode uint8 + TcpFlags uint8 + FlowDirection uint8 + RemoteAddr uint8 +} + +func parseRawPacket(rawPacket rawPacket) Packet { + var srcip, dstip net.IP + if rawPacket.Etype == 0x0800 { + srcip = make(net.IP, 4) + binary.BigEndian.PutUint32(srcip, rawPacket.SrcAddr) + dstip = make(net.IP, 4) + binary.BigEndian.PutUint32(dstip, rawPacket.DstAddr) + } else if rawPacket.Etype == 0x86dd { + srcip = make(net.IP, 16) + binary.BigEndian.PutUint64(srcip, rawPacket.SrcAddrHi) + binary.BigEndian.PutUint64(srcip[8:], rawPacket.SrcAddrLo) + dstip = make(net.IP, 16) + binary.BigEndian.PutUint64(dstip, rawPacket.DstAddrHi) + binary.BigEndian.PutUint64(dstip[8:], rawPacket.DstAddrLo) + } + return Packet{SrcAddr: srcip, + DstAddr: dstip, + InIf: rawPacket.InIf, + OutIf: rawPacket.OutIf, + Bytes: rawPacket.Bytes, + Etype: rawPacket.Etype, + Proto: rawPacket.Proto, + Ipv6FlowLabel: rawPacket.Ipv6FlowLabel, + SrcPort: rawPacket.SrcPort, + DstPort: rawPacket.DstPort, + IPTtl: rawPacket.IPTtl, + IPTos: rawPacket.IPTos, + IcmpType: rawPacket.IcmpType, + IcmpCode: rawPacket.IcmpCode, + TcpFlags: rawPacket.TcpFlags, + FlowDirection: rawPacket.FlowDirection, + RemoteAddr: rawPacket.RemoteAddr, + } +} + +type PacketDumper struct { + BufSize int // Determines kernel perf map allocation. It is rounded up to the nearest multiple of the current page size. + + packets chan Packet // exported through .Packets() + + // setup + objs bpfObjects + socketFilterFd int + iface *net.Interface + SamplerAddress net.IP + + // start + socketFd int + perfReader *perf.Reader +} + +func (b *PacketDumper) Packets() chan Packet { + if b.packets != nil { + return b.packets + } + b.packets = make(chan Packet) + go func() { + var rawPacket rawPacket + for { + record, err := b.perfReader.Read() + if err != nil { + if errors.Is(err, perf.ErrClosed) { + return + } + log.Printf("[error] BPF packet dump: Error reading from kernel perf event reader: %s", err) + continue + } + + if record.LostSamples != 0 { + log.Printf("[warning] BPF packet dump: Dropped %d samples from kernel perf buffer, consider increasing BufSize (currently %d bytes)", record.LostSamples, b.BufSize) + continue + } + + // Parse the perf event entry into an Event structure. + if err := binary.Read(bytes.NewBuffer(record.RawSample), binary.LittleEndian, &rawPacket); err != nil { + log.Printf("[error] BPF packet dump: Skipped 1 sample, error decoding raw perf event data: %s", err) + continue + } + b.packets <- parseRawPacket(rawPacket) + } + }() + return b.packets +} + +func (b *PacketDumper) Setup(device string) error { + // allow the current process to lock memory for eBPF resources + if err := rlimit.RemoveMemlock(); err != nil { + log.Fatalf("[error] BPF packet dump: Error during required memlock removal: %s", err) + } + + b.objs = bpfObjects{} // load pre-compiled programs and maps into the kernel + if err := loadBpfObjects(&b.objs, nil); err != nil { + log.Fatalf("[error] BPF packet dump: Error loading objects: %v", err) + } + + var err error + if b.iface, err = net.InterfaceByName(device); err != nil { + return fmt.Errorf("Unable to get interface, err: %v", err) + } + + var addrs []net.Addr + addrs, err = b.iface.Addrs() + for _, a := range addrs { + if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + b.SamplerAddress = ipnet.IP + break + } + } + + return nil +} + +func (b *PacketDumper) Start() error { + var err error + // 768 is the network byte order representation of 0x3 (constant syscall.ETH_P_ALL) + if b.socketFd, err = syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, 768); err != nil { + return fmt.Errorf("Unable to open raw socket, err: %v", err) + } + + sll := syscall.SockaddrLinklayer{ + Ifindex: b.iface.Index, + Protocol: 768, + } + if err := syscall.Bind(b.socketFd, &sll); err != nil { + return fmt.Errorf("Unable to bind interface to raw socket, err: %v", err) + } + + if err := syscall.SetsockoptInt(b.socketFd, syscall.SOL_SOCKET, 50, b.objs.PacketDump.FD()); err != nil { + return fmt.Errorf("Unable to attach BPF socket filter: %v", err) + } + + if b.BufSize == 0 { + // Set to a reasonably conservative value thats safe for + // client-side pps levels. + // Cilium docs set this to os.Getpagesize, which will return + // 4096 bytes on any resonably modern platform. This however + // leads to dropped samples in high load situations for dev + // machines and containers, so the default is to increase that + // by a factor of 2. + b.BufSize = 2 * 4096 + } + b.perfReader, err = perf.NewReader(b.objs.Packets, b.BufSize) + if err != nil { + return fmt.Errorf("Unable to connect kernel perf event reader: %s", err) + } + + return nil +} + +func (b *PacketDumper) Stop() { + b.objs.Close() + syscall.Close(b.socketFd) + b.perfReader.Close() +} + +// bpfObjects contains all objects after they have been loaded into the kernel. +// +// It can be passed to loadBpfObjects or ebpf.CollectionSpec.LoadAndAssign. +type bpfObjects struct { + bpfPrograms + bpfMaps +} +type bpfPrograms struct { + PacketDump *ebpf.Program `ebpf:"packet_dump"` +} + +// Close implements io.Closer. +func (b *bpfPrograms) Close() error { + panic("unimplemented") +} + +type bpfMaps struct { + Packets *ebpf.Map `ebpf:"packets"` +} + +// Close implements io.Closer. +func (b *bpfMaps) Close() error { + panic("unimplemented") +} + +func loadBpfObjects(obj interface{}, opts *ebpf.CollectionOptions) error { + spec, err := loadBpf() + if err != nil { + return err + } + + return spec.LoadAndAssign(obj, opts) +} + +// loadBpf returns the embedded CollectionSpec for bpf. +func loadBpf() (*ebpf.CollectionSpec, error) { + reader := bytes.NewReader(_BpfBytes) + spec, err := ebpf.LoadCollectionSpecFromReader(reader) + if err != nil { + return nil, fmt.Errorf("can't load bpf: %w", err) + } + + return spec, err +} + +func (o *bpfObjects) Close() error { + return _BpfClose( + &o.bpfPrograms, + &o.bpfMaps, + ) +} + +func _BpfClose(closers ...io.Closer) error { + for _, closer := range closers { + if err := closer.Close(); err != nil { + return err + } + } + return nil +} + +// Do not access this directly. +// +//go:embed bpf_bpfeb.o +var _BpfBytes []byte diff --git a/segments/input/goflow/goflow.go b/segments/input/goflow/goflow.go index d1799c6..fdb3e6a 100644 --- a/segments/input/goflow/goflow.go +++ b/segments/input/goflow/goflow.go @@ -8,7 +8,9 @@ import ( "context" "fmt" "log" + "log/slog" "net/url" + "os" "strconv" "strings" "sync" @@ -17,16 +19,26 @@ import ( "github.com/bwNetFlow/flowpipeline/segments" "google.golang.org/protobuf/proto" - "github.com/netsampler/goflow2/transport" - "github.com/netsampler/goflow2/utils" + _ "github.com/netsampler/goflow2/v2/format/binary" + "github.com/netsampler/goflow2/v2/utils/debug" + + "github.com/netsampler/goflow2/v2/transport" + _ "github.com/netsampler/goflow2/v2/transport/file" + _ "github.com/netsampler/goflow2/v2/transport/kafka" + + "github.com/netsampler/goflow2/v2/metrics" + rawproducer "github.com/netsampler/goflow2/v2/producer/raw" + "github.com/netsampler/goflow2/v2/utils" ) type Goflow struct { segments.BaseSegment - Listen []url.URL // optional, default config value for this slice is "sflow://:6343,netflow://:2055" - Workers uint64 // optional, amunt of workers to spawn for each endpoint, default is 1 - - goflow_in chan *pb.EnrichedFlow + Listen []url.URL // optional, default config value for this slice is "sflow://:6343,netflow://:2055" + Workers uint64 // optional, amunt of workers to spawn for each endpoint, default is 1 + Blocking bool //optional, default is false + QueueSize int //default is 1000000 + NumSockets int //default is 1 + goflow_in chan *pb.EnrichedFlow } func (segment Goflow) New(config map[string]string) segments.Segment { @@ -148,37 +160,72 @@ func (d *myProtobufDriver) Init(context.Context) error { return nil } func (segment *Goflow) startGoFlow(transport transport.TransportInterface) { formatter := &myProtobufDriver{} + var pipes []utils.FlowPipe for _, listenAddrUrl := range segment.Listen { go func(listenAddrUrl url.URL) { + var err error hostname := listenAddrUrl.Hostname() port, _ := strconv.ParseUint(listenAddrUrl.Port(), 10, 64) - var err error + if segment.NumSockets == 0 { + segment.NumSockets = 1 + } + + if segment.QueueSize == 0 { + segment.QueueSize = 1000000 + } + + cfg := &utils.UDPReceiverConfig{ + Sockets: segment.NumSockets, + Workers: int(segment.Workers), + QueueSize: segment.QueueSize, + Blocking: segment.Blocking, + ReceiverCallback: metrics.NewReceiverMetric(), + } + recv, err := utils.NewUDPReceiver(cfg) + if err != nil { + log.Println("error creating UDP receiver", slog.String("error", err.Error())) + os.Exit(1) + } + + if err != nil { + slog.Error("error transporter", slog.String("error", err.Error())) + os.Exit(1) + } + + cfgPipe := &utils.PipeConfig{ + Format: formatter, + Transport: transport, + Producer: &rawproducer.RawProducer{}, + NetFlowTemplater: metrics.NewDefaultPromTemplateSystem, // wrap template system to get Prometheus info + } + + var pipeline utils.FlowPipe switch scheme := listenAddrUrl.Scheme; scheme { case "netflow": - sNF := &utils.StateNetFlow{ - Format: formatter, - Transport: transport, - } + pipeline = utils.NewNetFlowPipe(cfgPipe) log.Printf("[info] Goflow: Listening for Netflow v9 on port %d...", port) - err = sNF.FlowRoutine(int(segment.Workers), hostname, int(port), false) case "sflow": - sSFlow := &utils.StateSFlow{ - Format: formatter, - Transport: transport, - } + pipeline = utils.NewSFlowPipe(cfgPipe) log.Printf("[info] Goflow: Listening for sflow on port %d...", port) - err = sSFlow.FlowRoutine(int(segment.Workers), hostname, int(port), false) - case "nfl": - sNFL := &utils.StateNFLegacy{ - Format: formatter, - Transport: transport, - } + case "flow": + pipeline = utils.NewFlowPipe(cfgPipe) log.Printf("[info] Goflow: Listening for netflow legacy on port %d...", port) - err = sNFL.FlowRoutine(int(segment.Workers), hostname, int(port), false) + default: + log.Fatal("scheme does not exist", slog.String("error", listenAddrUrl.Scheme)) } + + decodeFunc := pipeline.DecodeFlow + // intercept panic and generate error + decodeFunc = debug.PanicDecoderWrapper(decodeFunc) + // wrap decoder with Prometheus metrics + decodeFunc = metrics.PromDecoderWrapper(decodeFunc, listenAddrUrl.Scheme) + pipes = append(pipes, pipeline) + + err = recv.Start(hostname, int(port), decodeFunc) + if err != nil { log.Fatalf("[error] Goflow: %s", err.Error()) } @@ -186,8 +233,3 @@ func (segment *Goflow) startGoFlow(transport transport.TransportInterface) { }(listenAddrUrl) } } - -func init() { - segment := &Goflow{} - segments.RegisterSegment("goflow", segment) -} diff --git a/segments/input/kafkaconsumer/handler.go b/segments/input/kafkaconsumer/handler.go index cc26337..b6477be 100644 --- a/segments/input/kafkaconsumer/handler.go +++ b/segments/input/kafkaconsumer/handler.go @@ -1,12 +1,14 @@ package kafkaconsumer import ( + "bytes" "context" "log" + "log/slog" "github.com/Shopify/sarama" "github.com/bwNetFlow/flowpipeline/pb" - "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/encoding/protodelim" ) // Handler represents a Sarama consumer group consumer @@ -33,17 +35,17 @@ func (h *Handler) Cleanup(sarama.ConsumerGroupSession) error { } // ConsumeClaim must start a consumer loop of ConsumerGroupClaim's Messages(). + func (h *Handler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error { for { select { case message := <-claim.Messages(): - session.MarkMessage(message, "") - flowMsg := new(pb.EnrichedFlow) - if err := proto.Unmarshal(message.Value, flowMsg); err == nil { - h.flows <- flowMsg - } else { - log.Printf("[warning] KafkaConsumer: Error decoding flow, this might be due to the use of Goflow custom fields. Original error:\n %s", err) + var msg pb.ProtoProducerMessage + if err := protodelim.UnmarshalFrom(bytes.NewReader(message.Value), &msg); err != nil { + slog.Error("error unmarshalling message", slog.String("error", err.Error())) + continue } + h.flows <- &msg.EnrichedFlow case <-session.Context().Done(): return nil } diff --git a/segments/modify/aslookup/aslookup.go b/segments/modify/aslookup/aslookup.go index a3ddb37..533392e 100644 --- a/segments/modify/aslookup/aslookup.go +++ b/segments/modify/aslookup/aslookup.go @@ -1,75 +1,74 @@ package aslookup import ( - "os" "log" - "net" + "net" + "os" "sync" - "github.com/banviktor/asnlookup/pkg/database" + "github.com/banviktor/asnlookup/pkg/database" "github.com/bwNetFlow/flowpipeline/segments" ) type AsLookup struct { segments.BaseSegment - FileName string - Type string + FileName string + Type string - asDatabase database.Database + asDatabase database.Database } func (segment AsLookup) New(config map[string]string) segments.Segment { - newSegment := &AsLookup{} + newSegment := &AsLookup{} - // parse options + // parse options if config["filename"] == "" { log.Println("[error] AsLookup: This segment requires a 'filename' parameter.") return nil } - newSegment.FileName = config["filename"] + newSegment.FileName = config["filename"] - if config["type"] == "db" { - newSegment.Type = "db" - } else if config["type"] == "mrt" { - newSegment.Type = "mrt" - } else { + if config["type"] == "db" { + newSegment.Type = "db" + } else if config["type"] == "mrt" { + newSegment.Type = "mrt" + } else { log.Println("[info] AsLookup: 'type' set to default 'db'.") - newSegment.Type = "db" - } + newSegment.Type = "db" + } - // open lookup file + // open lookup file lookupfile, err := os.OpenFile(config["filename"], os.O_RDONLY, 0) if err != nil { log.Printf("[error] AsLookup: Error opening lookup file: %s", err) return nil } - defer lookupfile.Close() + defer lookupfile.Close() // lookup file can either be an MRT file or a lookup database generated with asnlookup - // see: https://github.com/banviktor/asnlookup - if newSegment.Type == "db" { - // open lookup db - db, err := database.NewFromDump(lookupfile) - if err != nil { - log.Printf("[error] AsLookup: Error parsing database file: %s", err) - } - newSegment.asDatabase = db - } else { - // parse with asnlookup - builder := database.NewBuilder() - if err = builder.ImportMRT(lookupfile); err != nil { - log.Printf("[error] AsLookup: Error parsing MRT file: %s", err) - } - - // build lookup database - db, err := builder.Build() - if err != nil { - log.Printf("[error] AsLookup: Error building lookup database: %s", err) - } - newSegment.asDatabase = db - } - + // see: https://github.com/banviktor/asnlookup + if newSegment.Type == "db" { + // open lookup db + db, err := database.NewFromDump(lookupfile) + if err != nil { + log.Printf("[error] AsLookup: Error parsing database file: %s", err) + } + newSegment.asDatabase = db + } else { + // parse with asnlookup + builder := database.NewBuilder() + if err = builder.ImportMRT(lookupfile); err != nil { + log.Printf("[error] AsLookup: Error parsing MRT file: %s", err) + } + + // build lookup database + db, err := builder.Build() + if err != nil { + log.Printf("[error] AsLookup: Error building lookup database: %s", err) + } + newSegment.asDatabase = db + } return newSegment } @@ -81,24 +80,24 @@ func (segment *AsLookup) Run(wg *sync.WaitGroup) { }() for msg := range segment.In { // Look up destination AS - dstIp := net.ParseIP(msg.DstAddrObj().String()) - dstAs, err := segment.asDatabase.Lookup(dstIp) - if err != nil { - log.Printf("[warning] AsLookup: Failed to look up ASN for %s: %s", msg.DstAddrObj().String(), err) - segment.Out <- msg - continue - } - msg.DstAS = dstAs.Number + dstIp := net.ParseIP(msg.DstAddrObj().String()) + dstAs, err := segment.asDatabase.Lookup(dstIp) + if err != nil { + log.Printf("[warning] AsLookup: Failed to look up ASN for %s: %s", msg.DstAddrObj().String(), err) + segment.Out <- msg + continue + } + msg.DstAs = dstAs.Number // Look up source AS - srcIp := net.ParseIP(msg.SrcAddrObj().String()) - srcAs, err := segment.asDatabase.Lookup(srcIp) - if err != nil { - log.Printf("[warning] AsLookup: Failed to look up ASN for %s: %s", msg.SrcAddrObj().String(), err) - segment.Out <- msg - continue - } - msg.SrcAS = srcAs.Number + srcIp := net.ParseIP(msg.SrcAddrObj().String()) + srcAs, err := segment.asDatabase.Lookup(srcIp) + if err != nil { + log.Printf("[warning] AsLookup: Failed to look up ASN for %s: %s", msg.SrcAddrObj().String(), err) + segment.Out <- msg + continue + } + msg.SrcAs = srcAs.Number segment.Out <- msg } diff --git a/segments/modify/aslookup/aslookup_test.go b/segments/modify/aslookup/aslookup_test.go index 80b3f57..ccd34c7 100644 --- a/segments/modify/aslookup/aslookup_test.go +++ b/segments/modify/aslookup/aslookup_test.go @@ -9,23 +9,23 @@ import ( // TODO: write tests for this func TestSegment_AsLookup_existingIp(t *testing.T) { - result := segments.TestSegment("aslookup", map[string]string{"filename": "../../../examples/enricher/lookup.db", "type": "db"}, + result := segments.TestSegment("aslookup", map[string]string{"filename": "../../../examples/enricher/lookup.db", "type": "db"}, &pb.EnrichedFlow{SrcAddr: []byte{192, 168, 1, 10}, DstAddr: []byte{192, 168, 1, 10}}) - if result.SrcAS != 65015 { + if result.SrcAs != 65015 { t.Error("Segment AsLookup is not setting the source AS when the corresponding IP exists in the lookup database") } - if result.DstAS != 65015 { + if result.DstAs != 65015 { t.Error("Segment AsLookup is not setting the destination AS when the corresponding IP exists in the lookup database") } } func TestSegment_AsLookup_nonexistingIp(t *testing.T) { - result := segments.TestSegment("aslookup", map[string]string{"filename": "../../../examples/enricher/lookup.db", "type": "db"}, + result := segments.TestSegment("aslookup", map[string]string{"filename": "../../../examples/enricher/lookup.db", "type": "db"}, &pb.EnrichedFlow{SrcAddr: []byte{2, 125, 160, 218}, DstAddr: []byte{2, 125, 160, 218}}) - if result.SrcAS != 0 { + if result.SrcAs != 0 { t.Error("Segment AsLookup is setting the source AS when the corresponding IP does not exist in the lookup database.") } - if result.DstAS != 0 { + if result.DstAs != 0 { t.Error("Segment AsLookup is setting the destination AS when the corresponding IP does not exist in the lookup database.") } } diff --git a/segments/modify/bgp/bgp.go b/segments/modify/bgp/bgp.go index 3de8589..830afa7 100644 --- a/segments/modify/bgp/bgp.go +++ b/segments/modify/bgp/bgp.go @@ -92,7 +92,7 @@ func (segment *Bgp) Run(wg *sync.WaitGroup) { if !path.Best { continue } - msg.ASPath = path.AsPath + msg.AsPath = path.AsPath msg.Med = path.Med msg.LocalPref = path.LocalPref switch path.Validation { @@ -106,8 +106,8 @@ func (segment *Bgp) Run(wg *sync.WaitGroup) { msg.ValidationStatus = pb.EnrichedFlow_Unknown } // for router exported netflow, the following are likely overwriting their own annotations - msg.DstAS = path.AsPath[len(path.AsPath)-1] - msg.NextHopAS = path.AsPath[0] + msg.DstAs = path.AsPath[len(path.AsPath)-1] + msg.NextHopAs = path.AsPath[0] if nh := net.ParseIP(path.NextHop); nh != nil { msg.NextHop = nh } diff --git a/segments/output/kafkaproducer/kafkaproducer.go b/segments/output/kafkaproducer/kafkaproducer.go index f731b58..64a55d3 100644 --- a/segments/output/kafkaproducer/kafkaproducer.go +++ b/segments/output/kafkaproducer/kafkaproducer.go @@ -16,7 +16,6 @@ import ( "github.com/Shopify/sarama" "github.com/bwNetFlow/flowpipeline/pb" "github.com/bwNetFlow/flowpipeline/segments" - "google.golang.org/protobuf/proto" ) // All configuration parameters are the same as in the kafkaconsumer segment, @@ -163,7 +162,9 @@ func (segment *KafkaProducer) Run(wg *sync.WaitGroup) { for msg := range segment.In { segment.Out <- msg var binary []byte - if binary, err = proto.Marshal(msg); err != nil { + protoProducerMessage := pb.ProtoProducerMessage{} + protoProducerMessage.EnrichedFlow = *msg + if binary, err = protoProducerMessage.MarshalBinary(); err != nil { log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) continue } diff --git a/segments/print/printflowdump/printflowdump.go b/segments/print/printflowdump/printflowdump.go index 743004b..2f0891b 100644 --- a/segments/print/printflowdump/printflowdump.go +++ b/segments/print/printflowdump/printflowdump.go @@ -91,11 +91,11 @@ func (segment PrintFlowdump) format_flow(flowmsg *pb.EnrichedFlow) string { var srcas, dstas string if segment.Verbose { - if flowmsg.SrcAS != 0 { - srcas = fmt.Sprintf("AS%d/", flowmsg.SrcAS) + if flowmsg.SrcAs != 0 { + srcas = fmt.Sprintf("AS%d/", flowmsg.SrcAs) } - if flowmsg.DstAS != 0 { - dstas = fmt.Sprintf("AS%d/", flowmsg.DstAS) + if flowmsg.DstAs != 0 { + dstas = fmt.Sprintf("AS%d/", flowmsg.DstAs) } } var proto string From 5761694aefeb2ac1b33e5b48bf50552f8c3b8d85 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Mon, 4 Nov 2024 16:47:56 +0100 Subject: [PATCH 2/6] Added kafka legacy mode goflow2 change the format of kafka messages. To ensure the functionallity of existing 3rd party software a legacy flag was added --- segments/input/kafkaconsumer/handler.go | 22 ++++++++++--- segments/input/kafkaconsumer/kafkaconsumer.go | 18 +++++++++-- .../output/kafkaproducer/kafkaproducer.go | 31 ++++++++++++++++--- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/segments/input/kafkaconsumer/handler.go b/segments/input/kafkaconsumer/handler.go index b6477be..1d18b7f 100644 --- a/segments/input/kafkaconsumer/handler.go +++ b/segments/input/kafkaconsumer/handler.go @@ -9,12 +9,14 @@ import ( "github.com/Shopify/sarama" "github.com/bwNetFlow/flowpipeline/pb" "google.golang.org/protobuf/encoding/protodelim" + "google.golang.org/protobuf/proto" ) // Handler represents a Sarama consumer group consumer type Handler struct { ready chan bool flows chan *pb.EnrichedFlow + legacy bool cancel context.CancelFunc } @@ -40,12 +42,22 @@ func (h *Handler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama for { select { case message := <-claim.Messages(): - var msg pb.ProtoProducerMessage - if err := protodelim.UnmarshalFrom(bytes.NewReader(message.Value), &msg); err != nil { - slog.Error("error unmarshalling message", slog.String("error", err.Error())) - continue + if h.legacy { + session.MarkMessage(message, "") + flowMsg := new(pb.EnrichedFlow) + if err := proto.Unmarshal(message.Value, flowMsg); err == nil { + h.flows <- flowMsg + } else { + log.Printf("[warning] KafkaConsumer: Error decoding flow, this might be due to the use of Goflow custom fields. Original error:\n %s", err) + } + } else { + var msg pb.ProtoProducerMessage + if err := protodelim.UnmarshalFrom(bytes.NewReader(message.Value), &msg); err != nil { + slog.Error("error unmarshalling message", slog.String("error", err.Error())) + continue + } + h.flows <- &msg.EnrichedFlow } - h.flows <- &msg.EnrichedFlow case <-session.Context().Done(): return nil } diff --git a/segments/input/kafkaconsumer/kafkaconsumer.go b/segments/input/kafkaconsumer/kafkaconsumer.go index dccda25..79afb3f 100644 --- a/segments/input/kafkaconsumer/kafkaconsumer.go +++ b/segments/input/kafkaconsumer/kafkaconsumer.go @@ -30,6 +30,7 @@ type KafkaConsumer struct { Auth bool // optional, default is true StartAt string // optional, one of "oldest" or "newest", default is "newest" Timeout time.Duration // optional, default is 15s, any parsable duration + Legacy bool //optional, default is false startingOffset int64 saramaConfig *sarama.Config @@ -49,6 +50,18 @@ func (segment KafkaConsumer) New(config map[string]string) segments.Segment { newsegment.Group = config["group"] } + var legacy bool = false + if config["legacy"] != "" { + if parsedTls, err := strconv.ParseBool(config["legacy"]); err == nil { + legacy = parsedTls + } else { + log.Println("[Error] KafkaConsumer: Could not parse 'legacy' parameter, using default false.") + } + } else { + log.Println("[Debug] KafkaConsumer: 'legacy' set to default false.") + } + newsegment.Legacy = legacy + // set some unconfigurable defaults // newsegment.saramaConfig.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategySticky newsegment.saramaConfig.Consumer.Group.Rebalance.GroupStrategies = []sarama.BalanceStrategy{sarama.BalanceStrategySticky} @@ -170,8 +183,9 @@ func (segment *KafkaConsumer) Run(wg *sync.WaitGroup) { handlerCtx, handlerCancel := context.WithCancel(context.Background()) var handler = &Handler{ - ready: make(chan bool), - flows: make(chan *pb.EnrichedFlow), + ready: make(chan bool), + flows: make(chan *pb.EnrichedFlow), + legacy: segment.Legacy, } handlerWg := sync.WaitGroup{} handlerWg.Add(1) diff --git a/segments/output/kafkaproducer/kafkaproducer.go b/segments/output/kafkaproducer/kafkaproducer.go index 64a55d3..3fd553a 100644 --- a/segments/output/kafkaproducer/kafkaproducer.go +++ b/segments/output/kafkaproducer/kafkaproducer.go @@ -16,6 +16,7 @@ import ( "github.com/Shopify/sarama" "github.com/bwNetFlow/flowpipeline/pb" "github.com/bwNetFlow/flowpipeline/segments" + "google.golang.org/protobuf/proto" ) // All configuration parameters are the same as in the kafkaconsumer segment, @@ -39,6 +40,7 @@ type KafkaProducer struct { Pass string // required if auth is true Tls bool // optional, default is true Auth bool // optional, default is true + Legacy bool // optional, default is false saramaConfig *sarama.Config } @@ -56,6 +58,18 @@ func (segment KafkaProducer) New(config map[string]string) segments.Segment { newsegment.Topic = config["topic"] } + var legacy bool = false + if config["legacy"] != "" { + if parsedTls, err := strconv.ParseBool(config["legacy"]); err == nil { + legacy = parsedTls + } else { + log.Println("[Error] KafkaProducer: Could not parse 'legacy' parameter, using default false.") + } + } else { + log.Println("[Debug] KafkaProducer: 'legacy' set to default false.") + } + newsegment.Legacy = legacy + // set some unconfigurable defaults newsegment.saramaConfig.Producer.RequiredAcks = sarama.WaitForLocal // Only wait for the leader to ack newsegment.saramaConfig.Producer.Compression = sarama.CompressionSnappy // Compress messages @@ -162,11 +176,18 @@ func (segment *KafkaProducer) Run(wg *sync.WaitGroup) { for msg := range segment.In { segment.Out <- msg var binary []byte - protoProducerMessage := pb.ProtoProducerMessage{} - protoProducerMessage.EnrichedFlow = *msg - if binary, err = protoProducerMessage.MarshalBinary(); err != nil { - log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) - continue + if segment.Legacy { + if binary, err = proto.Marshal(msg); err != nil { + log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) + continue + } + } else { + protoProducerMessage := pb.ProtoProducerMessage{} + protoProducerMessage.EnrichedFlow = *msg + if binary, err = protoProducerMessage.MarshalBinary(); err != nil { + log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) + continue + } } if segment.TopicSuffix == "" { From 9632a6dc2596ba9fbc408dc814a083ec141e56b1 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Wed, 20 Nov 2024 08:57:43 +0100 Subject: [PATCH 3/6] Bugfix: missing timestamps flowmessages didnt contain start/end timestamps --- go.mod | 3 +- go.sum | 22 +- pb/enrichedflow.pb.go | 995 ++++++---- pb/enrichedflow.proto | 36 +- pb/legacyconverter.go | 294 +++ pb/legacyenrichedflow.pb.go | 1630 +++++++++++++++++ pb/legacyenrichedflow.proto | 225 +++ segments/input/kafkaconsumer/handler.go | 8 +- segments/output/csv/csv.go | 2 +- .../output/kafkaproducer/kafkaproducer.go | 3 +- segments/output/sqlite/sqlite.go | 2 +- 11 files changed, 2825 insertions(+), 395 deletions(-) create mode 100644 pb/legacyconverter.go create mode 100644 pb/legacyenrichedflow.pb.go create mode 100644 pb/legacyenrichedflow.proto diff --git a/go.mod b/go.mod index 4cb0a73..70e6a23 100644 --- a/go.mod +++ b/go.mod @@ -31,6 +31,8 @@ require ( ) require ( + github.com/golang/protobuf v1.5.3 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect github.com/montanaflynn/stats v0.7.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect @@ -58,7 +60,6 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.6.1 // indirect - github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.3.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect diff --git a/go.sum b/go.sum index ea4bdb0..1491e18 100644 --- a/go.sum +++ b/go.sum @@ -214,8 +214,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -298,6 +296,7 @@ github.com/jcmturner/gokrb5/v8 v8.4.3 h1:iTonLeSJOn7MVUtyMT+arAn5AKAPrkilzhGw8wE github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -559,15 +558,22 @@ github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207 h1:nn7SOQy8xCu3i github.com/vishvananda/netns v0.0.0-20220913150850-18c4f4234207/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -602,6 +608,8 @@ golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -636,6 +644,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -675,6 +684,7 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= @@ -708,10 +718,13 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7 h1:ZrnxWX62AgTKOSagEqxvb3ffipvEDX2pl7E1TdqLqIc= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -766,6 +779,7 @@ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -789,10 +803,13 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -848,6 +865,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pb/enrichedflow.pb.go b/pb/enrichedflow.pb.go index cd38533..972f97f 100644 --- a/pb/enrichedflow.pb.go +++ b/pb/enrichedflow.pb.go @@ -78,6 +78,92 @@ func (EnrichedFlow_FlowType) EnumDescriptor() ([]byte, []int) { return file_enrichedflow_proto_rawDescGZIP(), []int{0, 0} } +// Encapsulation +type EnrichedFlow_LayerStack int32 + +const ( + EnrichedFlow_Ethernet EnrichedFlow_LayerStack = 0 + EnrichedFlow_IPv4 EnrichedFlow_LayerStack = 1 + EnrichedFlow_IPv6 EnrichedFlow_LayerStack = 2 + EnrichedFlow_TCP EnrichedFlow_LayerStack = 3 + EnrichedFlow_UDP EnrichedFlow_LayerStack = 4 + EnrichedFlow_MPLS EnrichedFlow_LayerStack = 5 + EnrichedFlow_Dot1Q EnrichedFlow_LayerStack = 6 + EnrichedFlow_ICMP EnrichedFlow_LayerStack = 7 + EnrichedFlow_ICMPv6 EnrichedFlow_LayerStack = 8 + EnrichedFlow_GRE EnrichedFlow_LayerStack = 9 + EnrichedFlow_IPv6HeaderRouting EnrichedFlow_LayerStack = 10 + EnrichedFlow_IPv6HeaderFragment EnrichedFlow_LayerStack = 11 + EnrichedFlow_Geneve EnrichedFlow_LayerStack = 12 + EnrichedFlow_Teredo EnrichedFlow_LayerStack = 13 + EnrichedFlow_Custom EnrichedFlow_LayerStack = 99 // todo: add nsh +) + +// Enum value maps for EnrichedFlow_LayerStack. +var ( + EnrichedFlow_LayerStack_name = map[int32]string{ + 0: "Ethernet", + 1: "IPv4", + 2: "IPv6", + 3: "TCP", + 4: "UDP", + 5: "MPLS", + 6: "Dot1Q", + 7: "ICMP", + 8: "ICMPv6", + 9: "GRE", + 10: "IPv6HeaderRouting", + 11: "IPv6HeaderFragment", + 12: "Geneve", + 13: "Teredo", + 99: "Custom", + } + EnrichedFlow_LayerStack_value = map[string]int32{ + "Ethernet": 0, + "IPv4": 1, + "IPv6": 2, + "TCP": 3, + "UDP": 4, + "MPLS": 5, + "Dot1Q": 6, + "ICMP": 7, + "ICMPv6": 8, + "GRE": 9, + "IPv6HeaderRouting": 10, + "IPv6HeaderFragment": 11, + "Geneve": 12, + "Teredo": 13, + "Custom": 99, + } +) + +func (x EnrichedFlow_LayerStack) Enum() *EnrichedFlow_LayerStack { + p := new(EnrichedFlow_LayerStack) + *p = x + return p +} + +func (x EnrichedFlow_LayerStack) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EnrichedFlow_LayerStack) Descriptor() protoreflect.EnumDescriptor { + return file_enrichedflow_proto_enumTypes[1].Descriptor() +} + +func (EnrichedFlow_LayerStack) Type() protoreflect.EnumType { + return &file_enrichedflow_proto_enumTypes[1] +} + +func (x EnrichedFlow_LayerStack) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EnrichedFlow_LayerStack.Descriptor instead. +func (EnrichedFlow_LayerStack) EnumDescriptor() ([]byte, []int) { + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 1} +} + // modify/anonymize type EnrichedFlow_AnonymizedType int32 @@ -109,11 +195,11 @@ func (x EnrichedFlow_AnonymizedType) String() string { } func (EnrichedFlow_AnonymizedType) Descriptor() protoreflect.EnumDescriptor { - return file_enrichedflow_proto_enumTypes[1].Descriptor() + return file_enrichedflow_proto_enumTypes[2].Descriptor() } func (EnrichedFlow_AnonymizedType) Type() protoreflect.EnumType { - return &file_enrichedflow_proto_enumTypes[1] + return &file_enrichedflow_proto_enumTypes[2] } func (x EnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { @@ -122,7 +208,7 @@ func (x EnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_AnonymizedType.Descriptor instead. func (EnrichedFlow_AnonymizedType) EnumDescriptor() ([]byte, []int) { - return file_enrichedflow_proto_rawDescGZIP(), []int{0, 1} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 2} } type EnrichedFlow_ValidationStatusType int32 @@ -161,11 +247,11 @@ func (x EnrichedFlow_ValidationStatusType) String() string { } func (EnrichedFlow_ValidationStatusType) Descriptor() protoreflect.EnumDescriptor { - return file_enrichedflow_proto_enumTypes[2].Descriptor() + return file_enrichedflow_proto_enumTypes[3].Descriptor() } func (EnrichedFlow_ValidationStatusType) Type() protoreflect.EnumType { - return &file_enrichedflow_proto_enumTypes[2] + return &file_enrichedflow_proto_enumTypes[3] } func (x EnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { @@ -174,7 +260,7 @@ func (x EnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_ValidationStatusType.Descriptor instead. func (EnrichedFlow_ValidationStatusType) EnumDescriptor() ([]byte, []int) { - return file_enrichedflow_proto_rawDescGZIP(), []int{0, 2} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 3} } // modify/normalize @@ -208,11 +294,11 @@ func (x EnrichedFlow_NormalizedType) String() string { } func (EnrichedFlow_NormalizedType) Descriptor() protoreflect.EnumDescriptor { - return file_enrichedflow_proto_enumTypes[3].Descriptor() + return file_enrichedflow_proto_enumTypes[4].Descriptor() } func (EnrichedFlow_NormalizedType) Type() protoreflect.EnumType { - return &file_enrichedflow_proto_enumTypes[3] + return &file_enrichedflow_proto_enumTypes[4] } func (x EnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { @@ -221,7 +307,7 @@ func (x EnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_NormalizedType.Descriptor instead. func (EnrichedFlow_NormalizedType) EnumDescriptor() ([]byte, []int) { - return file_enrichedflow_proto_rawDescGZIP(), []int{0, 3} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 4} } // modify/remoteaddress @@ -258,11 +344,11 @@ func (x EnrichedFlow_RemoteAddrType) String() string { } func (EnrichedFlow_RemoteAddrType) Descriptor() protoreflect.EnumDescriptor { - return file_enrichedflow_proto_enumTypes[4].Descriptor() + return file_enrichedflow_proto_enumTypes[5].Descriptor() } func (EnrichedFlow_RemoteAddrType) Type() protoreflect.EnumType { - return &file_enrichedflow_proto_enumTypes[4] + return &file_enrichedflow_proto_enumTypes[5] } func (x EnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { @@ -271,7 +357,7 @@ func (x EnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_RemoteAddrType.Descriptor instead. func (EnrichedFlow_RemoteAddrType) EnumDescriptor() ([]byte, []int) { - return file_enrichedflow_proto_rawDescGZIP(), []int{0, 4} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 5} } type EnrichedFlow struct { @@ -279,15 +365,17 @@ type EnrichedFlow struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type EnrichedFlow_FlowType `protobuf:"varint,1,opt,name=type,proto3,enum=flowpb.EnrichedFlow_FlowType" json:"type,omitempty"` - TimeReceived uint64 `protobuf:"varint,2,opt,name=time_received,json=timeReceived,proto3" json:"time_received,omitempty"` - SequenceNum uint32 `protobuf:"varint,4,opt,name=sequence_num,json=sequenceNum,proto3" json:"sequence_num,omitempty"` - SamplingRate uint64 `protobuf:"varint,3,opt,name=sampling_rate,json=samplingRate,proto3" json:"sampling_rate,omitempty"` - FlowDirection uint32 `protobuf:"varint,42,opt,name=flow_direction,json=flowDirection,proto3" json:"flow_direction,omitempty"` + Type EnrichedFlow_FlowType `protobuf:"varint,1,opt,name=type,proto3,enum=flowpb.EnrichedFlow_FlowType" json:"type,omitempty"` + TimeReceived uint64 `protobuf:"varint,2,opt,name=time_received,json=timeReceived,proto3" json:"time_received,omitempty"` + TimeReceivedNs uint64 `protobuf:"varint,110,opt,name=time_received_ns,json=timeReceivedNs,proto3" json:"time_received_ns,omitempty"` + SequenceNum uint32 `protobuf:"varint,4,opt,name=sequence_num,json=sequenceNum,proto3" json:"sequence_num,omitempty"` + SamplingRate uint64 `protobuf:"varint,3,opt,name=sampling_rate,json=samplingRate,proto3" json:"sampling_rate,omitempty"` + FlowDirection uint32 `protobuf:"varint,42,opt,name=flow_direction,json=flowDirection,proto3" json:"flow_direction,omitempty"` + TimeFlowStartNs uint64 `protobuf:"varint,111,opt,name=time_flow_start_ns,json=timeFlowStartNs,proto3" json:"time_flow_start_ns,omitempty"` + TimeFlowEndNs uint64 `protobuf:"varint,112,opt,name=time_flow_end_ns,json=timeFlowEndNs,proto3" json:"time_flow_end_ns,omitempty"` // Sampler information SamplerAddress []byte `protobuf:"bytes,11,opt,name=sampler_address,json=samplerAddress,proto3" json:"sampler_address,omitempty"` // Found inside packet - TimeFlowStart uint64 `protobuf:"varint,38,opt,name=time_flow_start,json=timeFlowStart,proto3" json:"time_flow_start,omitempty"` TimeFlowEnd uint64 `protobuf:"varint,5,opt,name=time_flow_end,json=timeFlowEnd,proto3" json:"time_flow_end,omitempty"` TimeFlowStartMs uint64 `protobuf:"varint,63,opt,name=time_flow_start_ms,json=timeFlowStartMs,proto3" json:"time_flow_start_ms,omitempty"` TimeFlowEndMs uint64 `protobuf:"varint,64,opt,name=time_flow_end_ms,json=timeFlowEndMs,proto3" json:"time_flow_end_ms,omitempty"` @@ -322,6 +410,7 @@ type EnrichedFlow struct { IpTos uint32 `protobuf:"varint,23,opt,name=ip_tos,json=ipTos,proto3" json:"ip_tos,omitempty"` ForwardingStatus uint32 `protobuf:"varint,24,opt,name=forwarding_status,json=forwardingStatus,proto3" json:"forwarding_status,omitempty"` IpTtl uint32 `protobuf:"varint,25,opt,name=ip_ttl,json=ipTtl,proto3" json:"ip_ttl,omitempty"` + IpFlags uint32 `protobuf:"varint,38,opt,name=ip_flags,json=ipFlags,proto3" json:"ip_flags,omitempty"` TcpFlags uint32 `protobuf:"varint,26,opt,name=tcp_flags,json=tcpFlags,proto3" json:"tcp_flags,omitempty"` IcmpType uint32 `protobuf:"varint,31,opt,name=icmp_type,json=icmpType,proto3" json:"icmp_type,omitempty"` IcmpCode uint32 `protobuf:"varint,32,opt,name=icmp_code,json=icmpCode,proto3" json:"icmp_code,omitempty"` @@ -343,47 +432,54 @@ type EnrichedFlow struct { BgpCommunities []uint32 `protobuf:"varint,101,rep,packed,name=bgp_communities,json=bgpCommunities,proto3" json:"bgp_communities,omitempty"` AsPath []uint32 `protobuf:"varint,102,rep,packed,name=as_path,json=asPath,proto3" json:"as_path,omitempty"` // MPLS information - HasMpls bool `protobuf:"varint,53,opt,name=has_mpls,json=hasMpls,proto3" json:"has_mpls,omitempty"` - MplsCount uint32 `protobuf:"varint,54,opt,name=mpls_count,json=mplsCount,proto3" json:"mpls_count,omitempty"` - Mpls_1Ttl uint32 `protobuf:"varint,55,opt,name=mpls_1_ttl,json=mpls1Ttl,proto3" json:"mpls_1_ttl,omitempty"` // First TTL - Mpls_1Label uint32 `protobuf:"varint,56,opt,name=mpls_1_label,json=mpls1Label,proto3" json:"mpls_1_label,omitempty"` // First Label - Mpls_2Ttl uint32 `protobuf:"varint,57,opt,name=mpls_2_ttl,json=mpls2Ttl,proto3" json:"mpls_2_ttl,omitempty"` // Second TTL - Mpls_2Label uint32 `protobuf:"varint,58,opt,name=mpls_2_label,json=mpls2Label,proto3" json:"mpls_2_label,omitempty"` // Second Label - Mpls_3Ttl uint32 `protobuf:"varint,59,opt,name=mpls_3_ttl,json=mpls3Ttl,proto3" json:"mpls_3_ttl,omitempty"` // Third TTL - Mpls_3Label uint32 `protobuf:"varint,60,opt,name=mpls_3_label,json=mpls3Label,proto3" json:"mpls_3_label,omitempty"` // Third Label - MplsLastTtl uint32 `protobuf:"varint,61,opt,name=mpls_last_ttl,json=mplsLastTtl,proto3" json:"mpls_last_ttl,omitempty"` // Last TTL - MplsLastLabel uint32 `protobuf:"varint,62,opt,name=mpls_last_label,json=mplsLastLabel,proto3" json:"mpls_last_label,omitempty"` // Last Label - MplsLabelIp []byte `protobuf:"bytes,65,opt,name=mpls_label_ip,json=mplsLabelIp,proto3" json:"mpls_label_ip,omitempty"` // MPLS TOP Label IP - ObservationDomainId uint32 `protobuf:"varint,70,opt,name=observation_domain_id,json=observationDomainId,proto3" json:"observation_domain_id,omitempty"` - ObservationPointId uint32 `protobuf:"varint,71,opt,name=observation_point_id,json=observationPointId,proto3" json:"observation_point_id,omitempty"` - SrcCountry string `protobuf:"bytes,1000,opt,name=src_country,json=srcCountry,proto3" json:"src_country,omitempty"` - DstCountry string `protobuf:"bytes,1001,opt,name=dst_country,json=dstCountry,proto3" json:"dst_country,omitempty"` - PacketBytesMin uint32 `protobuf:"varint,2100,opt,name=PacketBytesMin,proto3" json:"PacketBytesMin,omitempty"` // new, single packet means uint32 < MTU - PacketBytesMax uint32 `protobuf:"varint,2101,opt,name=PacketBytesMax,proto3" json:"PacketBytesMax,omitempty"` // new - PacketBytesMean uint32 `protobuf:"varint,2102,opt,name=PacketBytesMean,proto3" json:"PacketBytesMean,omitempty"` // new - PacketBytesStdDev uint32 `protobuf:"varint,2103,opt,name=PacketBytesStdDev,proto3" json:"PacketBytesStdDev,omitempty"` // new - PacketIATMin uint64 `protobuf:"varint,2110,opt,name=PacketIATMin,proto3" json:"PacketIATMin,omitempty"` // new - PacketIATMax uint64 `protobuf:"varint,2111,opt,name=PacketIATMax,proto3" json:"PacketIATMax,omitempty"` // new - PacketIATMean uint64 `protobuf:"varint,2112,opt,name=PacketIATMean,proto3" json:"PacketIATMean,omitempty"` // new - PacketIATStdDev uint64 `protobuf:"varint,2113,opt,name=PacketIATStdDev,proto3" json:"PacketIATStdDev,omitempty"` // new - HeaderBytes uint32 `protobuf:"varint,2120,opt,name=HeaderBytes,proto3" json:"HeaderBytes,omitempty"` // new - FINFlagCount uint64 `protobuf:"varint,2130,opt,name=FINFlagCount,proto3" json:"FINFlagCount,omitempty"` // new - SYNFlagCount uint64 `protobuf:"varint,2131,opt,name=SYNFlagCount,proto3" json:"SYNFlagCount,omitempty"` // new - RSTFlagCount uint64 `protobuf:"varint,2132,opt,name=RSTFlagCount,proto3" json:"RSTFlagCount,omitempty"` // new - PSHFlagCount uint64 `protobuf:"varint,2133,opt,name=PSHFlagCount,proto3" json:"PSHFlagCount,omitempty"` // new - ACKFlagCount uint64 `protobuf:"varint,2134,opt,name=ACKFlagCount,proto3" json:"ACKFlagCount,omitempty"` // new - URGFlagCount uint64 `protobuf:"varint,2135,opt,name=URGFlagCount,proto3" json:"URGFlagCount,omitempty"` // new - CWRFlagCount uint64 `protobuf:"varint,2136,opt,name=CWRFlagCount,proto3" json:"CWRFlagCount,omitempty"` // new - ECEFlagCount uint64 `protobuf:"varint,2137,opt,name=ECEFlagCount,proto3" json:"ECEFlagCount,omitempty"` // new - PayloadPackets uint64 `protobuf:"varint,2140,opt,name=PayloadPackets,proto3" json:"PayloadPackets,omitempty"` // new - TimeActiveMin uint64 `protobuf:"varint,2150,opt,name=TimeActiveMin,proto3" json:"TimeActiveMin,omitempty"` // new - TimeActiveMax uint64 `protobuf:"varint,2151,opt,name=TimeActiveMax,proto3" json:"TimeActiveMax,omitempty"` // new - TimeActiveMean uint64 `protobuf:"varint,2152,opt,name=TimeActiveMean,proto3" json:"TimeActiveMean,omitempty"` // new - TimeActiveStdDev uint64 `protobuf:"varint,2153,opt,name=TimeActiveStdDev,proto3" json:"TimeActiveStdDev,omitempty"` // new - TimeIdleMin uint64 `protobuf:"varint,2154,opt,name=TimeIdleMin,proto3" json:"TimeIdleMin,omitempty"` // new - TimeIdleMax uint64 `protobuf:"varint,2155,opt,name=TimeIdleMax,proto3" json:"TimeIdleMax,omitempty"` // new - TimeIdleMean uint64 `protobuf:"varint,2156,opt,name=TimeIdleMean,proto3" json:"TimeIdleMean,omitempty"` // new - TimeIdleStdDev uint64 `protobuf:"varint,2157,opt,name=TimeIdleStdDev,proto3" json:"TimeIdleStdDev,omitempty"` // new + MplsTtl []uint32 `protobuf:"varint,80,rep,packed,name=mpls_ttl,json=mplsTtl,proto3" json:"mpls_ttl,omitempty"` + MplsLabel []uint32 `protobuf:"varint,81,rep,packed,name=mpls_label,json=mplsLabel,proto3" json:"mpls_label,omitempty"` + MplsIp [][]byte `protobuf:"bytes,82,rep,name=mpls_ip,json=mplsIp,proto3" json:"mpls_ip,omitempty"` + HasMpls bool `protobuf:"varint,53,opt,name=has_mpls,json=hasMpls,proto3" json:"has_mpls,omitempty"` + MplsCount uint32 `protobuf:"varint,54,opt,name=mpls_count,json=mplsCount,proto3" json:"mpls_count,omitempty"` + Mpls_1Ttl uint32 `protobuf:"varint,55,opt,name=mpls_1_ttl,json=mpls1Ttl,proto3" json:"mpls_1_ttl,omitempty"` // First TTL + Mpls_1Label uint32 `protobuf:"varint,56,opt,name=mpls_1_label,json=mpls1Label,proto3" json:"mpls_1_label,omitempty"` // First Label + Mpls_2Ttl uint32 `protobuf:"varint,57,opt,name=mpls_2_ttl,json=mpls2Ttl,proto3" json:"mpls_2_ttl,omitempty"` // Second TTL + Mpls_2Label uint32 `protobuf:"varint,58,opt,name=mpls_2_label,json=mpls2Label,proto3" json:"mpls_2_label,omitempty"` // Second Label + Mpls_3Ttl uint32 `protobuf:"varint,59,opt,name=mpls_3_ttl,json=mpls3Ttl,proto3" json:"mpls_3_ttl,omitempty"` // Third TTL + Mpls_3Label uint32 `protobuf:"varint,60,opt,name=mpls_3_label,json=mpls3Label,proto3" json:"mpls_3_label,omitempty"` // Third Label + MplsLastTtl uint32 `protobuf:"varint,61,opt,name=mpls_last_ttl,json=mplsLastTtl,proto3" json:"mpls_last_ttl,omitempty"` // Last TTL + MplsLastLabel uint32 `protobuf:"varint,62,opt,name=mpls_last_label,json=mplsLastLabel,proto3" json:"mpls_last_label,omitempty"` // Last Label + MplsLabelIp []byte `protobuf:"bytes,65,opt,name=mpls_label_ip,json=mplsLabelIp,proto3" json:"mpls_label_ip,omitempty"` // MPLS TOP Label IP + ObservationDomainId uint32 `protobuf:"varint,70,opt,name=observation_domain_id,json=observationDomainId,proto3" json:"observation_domain_id,omitempty"` + ObservationPointId uint32 `protobuf:"varint,71,opt,name=observation_point_id,json=observationPointId,proto3" json:"observation_point_id,omitempty"` + SrcCountry string `protobuf:"bytes,1000,opt,name=src_country,json=srcCountry,proto3" json:"src_country,omitempty"` + DstCountry string `protobuf:"bytes,1001,opt,name=dst_country,json=dstCountry,proto3" json:"dst_country,omitempty"` + LayerStack []EnrichedFlow_LayerStack `protobuf:"varint,103,rep,packed,name=layer_stack,json=layerStack,proto3,enum=flowpb.EnrichedFlow_LayerStack" json:"layer_stack,omitempty"` + LayerSize []uint32 `protobuf:"varint,104,rep,packed,name=layer_size,json=layerSize,proto3" json:"layer_size,omitempty"` + Ipv6RoutingHeaderAddresses [][]byte `protobuf:"bytes,105,rep,name=ipv6_routing_header_addresses,json=ipv6RoutingHeaderAddresses,proto3" json:"ipv6_routing_header_addresses,omitempty"` // SRv6 + Ipv6RoutingHeaderSegLeft uint32 `protobuf:"varint,106,opt,name=ipv6_routing_header_seg_left,json=ipv6RoutingHeaderSegLeft,proto3" json:"ipv6_routing_header_seg_left,omitempty"` // SRv6 + PacketBytesMin uint32 `protobuf:"varint,2100,opt,name=PacketBytesMin,proto3" json:"PacketBytesMin,omitempty"` // new, single packet means uint32 < MTU + PacketBytesMax uint32 `protobuf:"varint,2101,opt,name=PacketBytesMax,proto3" json:"PacketBytesMax,omitempty"` // new + PacketBytesMean uint32 `protobuf:"varint,2102,opt,name=PacketBytesMean,proto3" json:"PacketBytesMean,omitempty"` // new + PacketBytesStdDev uint32 `protobuf:"varint,2103,opt,name=PacketBytesStdDev,proto3" json:"PacketBytesStdDev,omitempty"` // new + PacketIATMin uint64 `protobuf:"varint,2110,opt,name=PacketIATMin,proto3" json:"PacketIATMin,omitempty"` // new + PacketIATMax uint64 `protobuf:"varint,2111,opt,name=PacketIATMax,proto3" json:"PacketIATMax,omitempty"` // new + PacketIATMean uint64 `protobuf:"varint,2112,opt,name=PacketIATMean,proto3" json:"PacketIATMean,omitempty"` // new + PacketIATStdDev uint64 `protobuf:"varint,2113,opt,name=PacketIATStdDev,proto3" json:"PacketIATStdDev,omitempty"` // new + HeaderBytes uint32 `protobuf:"varint,2120,opt,name=HeaderBytes,proto3" json:"HeaderBytes,omitempty"` // new + FINFlagCount uint64 `protobuf:"varint,2130,opt,name=FINFlagCount,proto3" json:"FINFlagCount,omitempty"` // new + SYNFlagCount uint64 `protobuf:"varint,2131,opt,name=SYNFlagCount,proto3" json:"SYNFlagCount,omitempty"` // new + RSTFlagCount uint64 `protobuf:"varint,2132,opt,name=RSTFlagCount,proto3" json:"RSTFlagCount,omitempty"` // new + PSHFlagCount uint64 `protobuf:"varint,2133,opt,name=PSHFlagCount,proto3" json:"PSHFlagCount,omitempty"` // new + ACKFlagCount uint64 `protobuf:"varint,2134,opt,name=ACKFlagCount,proto3" json:"ACKFlagCount,omitempty"` // new + URGFlagCount uint64 `protobuf:"varint,2135,opt,name=URGFlagCount,proto3" json:"URGFlagCount,omitempty"` // new + CWRFlagCount uint64 `protobuf:"varint,2136,opt,name=CWRFlagCount,proto3" json:"CWRFlagCount,omitempty"` // new + ECEFlagCount uint64 `protobuf:"varint,2137,opt,name=ECEFlagCount,proto3" json:"ECEFlagCount,omitempty"` // new + PayloadPackets uint64 `protobuf:"varint,2140,opt,name=PayloadPackets,proto3" json:"PayloadPackets,omitempty"` // new + TimeActiveMin uint64 `protobuf:"varint,2150,opt,name=TimeActiveMin,proto3" json:"TimeActiveMin,omitempty"` // new + TimeActiveMax uint64 `protobuf:"varint,2151,opt,name=TimeActiveMax,proto3" json:"TimeActiveMax,omitempty"` // new + TimeActiveMean uint64 `protobuf:"varint,2152,opt,name=TimeActiveMean,proto3" json:"TimeActiveMean,omitempty"` // new + TimeActiveStdDev uint64 `protobuf:"varint,2153,opt,name=TimeActiveStdDev,proto3" json:"TimeActiveStdDev,omitempty"` // new + TimeIdleMin uint64 `protobuf:"varint,2154,opt,name=TimeIdleMin,proto3" json:"TimeIdleMin,omitempty"` // new + TimeIdleMax uint64 `protobuf:"varint,2155,opt,name=TimeIdleMax,proto3" json:"TimeIdleMax,omitempty"` // new + TimeIdleMean uint64 `protobuf:"varint,2156,opt,name=TimeIdleMean,proto3" json:"TimeIdleMean,omitempty"` // new + TimeIdleStdDev uint64 `protobuf:"varint,2157,opt,name=TimeIdleStdDev,proto3" json:"TimeIdleStdDev,omitempty"` // new // modify/addcid Cid uint32 `protobuf:"varint,2000,opt,name=Cid,proto3" json:"Cid,omitempty"` // TODO: deprecate and provide as helper? CidString string `protobuf:"bytes,2001,opt,name=CidString,proto3" json:"CidString,omitempty"` // deprecated, delete for v1.0.0 @@ -435,6 +531,8 @@ type EnrichedFlow struct { // VRF IngressVrfIDBW uint32 `protobuf:"varint,2539,opt,name=IngressVrfIDBW,proto3" json:"IngressVrfIDBW,omitempty"` EgressVrfIDBW uint32 `protobuf:"varint,2540,opt,name=EgressVrfIDBW,proto3" json:"EgressVrfIDBW,omitempty"` + // Replaced by ns values + TimeFlowStart uint64 `protobuf:"varint,2538,opt,name=TimeFlowStart,proto3" json:"TimeFlowStart,omitempty"` } func (x *EnrichedFlow) Reset() { @@ -481,6 +579,13 @@ func (x *EnrichedFlow) GetTimeReceived() uint64 { return 0 } +func (x *EnrichedFlow) GetTimeReceivedNs() uint64 { + if x != nil { + return x.TimeReceivedNs + } + return 0 +} + func (x *EnrichedFlow) GetSequenceNum() uint32 { if x != nil { return x.SequenceNum @@ -502,20 +607,27 @@ func (x *EnrichedFlow) GetFlowDirection() uint32 { return 0 } -func (x *EnrichedFlow) GetSamplerAddress() []byte { +func (x *EnrichedFlow) GetTimeFlowStartNs() uint64 { if x != nil { - return x.SamplerAddress + return x.TimeFlowStartNs } - return nil + return 0 } -func (x *EnrichedFlow) GetTimeFlowStart() uint64 { +func (x *EnrichedFlow) GetTimeFlowEndNs() uint64 { if x != nil { - return x.TimeFlowStart + return x.TimeFlowEndNs } return 0 } +func (x *EnrichedFlow) GetSamplerAddress() []byte { + if x != nil { + return x.SamplerAddress + } + return nil +} + func (x *EnrichedFlow) GetTimeFlowEnd() uint64 { if x != nil { return x.TimeFlowEnd @@ -677,6 +789,13 @@ func (x *EnrichedFlow) GetIpTtl() uint32 { return 0 } +func (x *EnrichedFlow) GetIpFlags() uint32 { + if x != nil { + return x.IpFlags + } + return 0 +} + func (x *EnrichedFlow) GetTcpFlags() uint32 { if x != nil { return x.TcpFlags @@ -789,6 +908,27 @@ func (x *EnrichedFlow) GetAsPath() []uint32 { return nil } +func (x *EnrichedFlow) GetMplsTtl() []uint32 { + if x != nil { + return x.MplsTtl + } + return nil +} + +func (x *EnrichedFlow) GetMplsLabel() []uint32 { + if x != nil { + return x.MplsLabel + } + return nil +} + +func (x *EnrichedFlow) GetMplsIp() [][]byte { + if x != nil { + return x.MplsIp + } + return nil +} + func (x *EnrichedFlow) GetHasMpls() bool { if x != nil { return x.HasMpls @@ -894,6 +1034,34 @@ func (x *EnrichedFlow) GetDstCountry() string { return "" } +func (x *EnrichedFlow) GetLayerStack() []EnrichedFlow_LayerStack { + if x != nil { + return x.LayerStack + } + return nil +} + +func (x *EnrichedFlow) GetLayerSize() []uint32 { + if x != nil { + return x.LayerSize + } + return nil +} + +func (x *EnrichedFlow) GetIpv6RoutingHeaderAddresses() [][]byte { + if x != nil { + return x.Ipv6RoutingHeaderAddresses + } + return nil +} + +func (x *EnrichedFlow) GetIpv6RoutingHeaderSegLeft() uint32 { + if x != nil { + return x.Ipv6RoutingHeaderSegLeft + } + return 0 +} + func (x *EnrichedFlow) GetPacketBytesMin() uint32 { if x != nil { return x.PacketBytesMin @@ -1363,326 +1531,384 @@ func (x *EnrichedFlow) GetEgressVrfIDBW() uint32 { return 0 } +func (x *EnrichedFlow) GetTimeFlowStart() uint64 { + if x != nil { + return x.TimeFlowStart + } + return 0 +} + var File_enrichedflow_proto protoreflect.FileDescriptor var file_enrichedflow_proto_rawDesc = []byte{ 0x0a, 0x12, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x22, 0xf5, 0x26, 0x0a, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x22, 0x9f, 0x2d, 0x0a, 0x0c, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x31, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x65, 0x71, - 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x2a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x5f, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x73, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x4e, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, + 0x75, 0x6d, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x6c, 0x6f, 0x77, 0x5f, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, + 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x6e, 0x73, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, + 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x6e, 0x73, 0x18, + 0x70, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, + 0x6e, 0x64, 0x4e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, - 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x26, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, - 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x69, - 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6d, 0x73, 0x18, - 0x3f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x4d, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, - 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x4d, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, - 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x73, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, - 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x64, 0x73, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x74, 0x79, 0x70, 0x65, 0x18, 0x1e, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x65, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, - 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x13, 0x0a, 0x05, 0x69, 0x6e, 0x5f, 0x69, 0x66, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x69, 0x6e, 0x49, 0x66, 0x12, 0x15, 0x0a, 0x06, - 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6f, 0x75, - 0x74, 0x49, 0x66, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x1b, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, - 0x64, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, - 0x73, 0x74, 0x4d, 0x61, 0x63, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x76, 0x6c, 0x61, - 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, - 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x76, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x76, - 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x6c, - 0x61, 0x6e, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, - 0x76, 0x72, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x69, 0x6e, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x65, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x72, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x64, 0x12, 0x15, - 0x0a, 0x06, 0x69, 0x70, 0x5f, 0x74, 0x6f, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x69, 0x70, 0x54, 0x6f, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x10, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x70, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x19, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x69, 0x70, 0x54, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x63, 0x70, - 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x74, 0x63, - 0x70, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, 0x6d, 0x70, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x69, 0x70, 0x76, 0x36, 0x46, - 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x24, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x69, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x62, - 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, - 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x73, 0x72, 0x63, 0x41, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x73, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x64, 0x73, 0x74, 0x41, 0x73, 0x12, 0x19, 0x0a, 0x08, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x6e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x68, 0x6f, 0x70, 0x5f, 0x61, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, - 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x6e, - 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x72, 0x63, 0x4e, 0x65, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x62, 0x67, 0x70, - 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0a, 0x62, 0x67, 0x70, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x62, - 0x67, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x65, - 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x62, 0x67, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x66, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x61, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, - 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x70, 0x6c, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x68, 0x61, 0x73, 0x4d, 0x70, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x70, - 0x6c, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, - 0x31, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, - 0x73, 0x31, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x31, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, - 0x73, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, - 0x32, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, - 0x73, 0x32, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x32, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, - 0x73, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, - 0x33, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, - 0x73, 0x33, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x33, 0x5f, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, - 0x73, 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x5f, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x74, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x6d, - 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x5f, 0x69, 0x70, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6d, 0x70, 0x6c, 0x73, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x49, 0x70, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x46, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x73, 0x72, 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xe8, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xe9, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x4d, 0x69, 0x6e, 0x18, 0xb4, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xb5, 0x10, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x4d, 0x61, 0x78, 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xb6, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, - 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, - 0x44, 0x65, 0x76, 0x18, 0xb7, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, - 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xbe, 0x10, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, - 0x69, 0x6e, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, - 0x61, 0x78, 0x18, 0xbf, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, - 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, - 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xc0, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, - 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, - 0x76, 0x18, 0xc1, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0xc8, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, - 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd2, 0x10, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0xd3, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, - 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, - 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd4, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, - 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, - 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd5, 0x10, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x23, 0x0a, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0xd6, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, - 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, - 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd8, 0x10, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x23, 0x0a, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0xd9, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0xdc, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, - 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xe6, - 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x4d, 0x61, 0x78, 0x18, 0xe7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, - 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, - 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xe8, 0x10, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2b, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xe9, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, - 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, - 0x18, 0xea, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, - 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, - 0x4d, 0x61, 0x78, 0x18, 0xeb, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, - 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, - 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xec, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, - 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, - 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xed, - 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, - 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xd0, 0x0f, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x43, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0xd1, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, - 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, - 0x64, 0x18, 0xdc, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, - 0x12, 0x17, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x18, 0xdd, 0x0f, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x72, 0x63, - 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf0, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, - 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, - 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, - 0x18, 0xf1, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, - 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, - 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, - 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, - 0x18, 0xf2, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, - 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x4c, 0x65, 0x6e, 0x18, 0xf3, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, - 0x4e, 0x0a, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, - 0x6f, 0x6e, 0x18, 0xf4, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x22, 0x0a, + 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, + 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x74, + 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x73, 0x12, 0x27, + 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, 0x5f, + 0x6d, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, + 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x4d, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x73, 0x72, 0x63, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x64, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x74, 0x79, 0x70, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x65, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x13, 0x0a, 0x05, 0x69, 0x6e, 0x5f, 0x69, 0x66, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x69, 0x6e, 0x49, 0x66, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x66, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6f, 0x75, 0x74, 0x49, 0x66, 0x12, 0x17, 0x0a, 0x07, 0x73, + 0x72, 0x63, 0x5f, 0x6d, 0x61, 0x63, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x72, + 0x63, 0x4d, 0x61, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x12, 0x19, 0x0a, + 0x08, 0x73, 0x72, 0x63, 0x5f, 0x76, 0x6c, 0x61, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x73, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, + 0x76, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x56, + 0x6c, 0x61, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x76, 0x6c, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x1d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x76, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x72, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x27, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, + 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x76, 0x72, 0x66, + 0x5f, 0x69, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x65, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x56, 0x72, 0x66, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x70, 0x5f, 0x74, 0x6f, 0x73, + 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x70, 0x54, 0x6f, 0x73, 0x12, 0x2b, 0x0a, + 0x11, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x70, + 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x70, 0x54, 0x74, + 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x70, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x26, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x69, 0x70, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x74, 0x63, 0x70, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x74, 0x63, 0x70, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, + 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, + 0x6d, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x63, 0x6d, 0x70, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x66, 0x6c, 0x6f, 0x77, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x69, 0x70, + 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, + 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x24, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x69, 0x5f, 0x66, 0x6c, 0x6f, 0x77, + 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0f, 0x62, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x73, 0x72, 0x63, 0x41, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x73, 0x74, 0x5f, + 0x61, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x64, 0x73, 0x74, 0x41, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x5f, 0x61, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x6e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, + 0x63, 0x5f, 0x6e, 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x72, 0x63, + 0x4e, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x74, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x64, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0c, + 0x62, 0x67, 0x70, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x64, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0a, 0x62, 0x67, 0x70, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x27, + 0x0a, 0x0f, 0x62, 0x67, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x62, 0x67, 0x70, 0x43, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x73, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x61, 0x73, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x50, 0x20, 0x03, + 0x28, 0x0d, 0x52, 0x07, 0x6d, 0x70, 0x6c, 0x73, 0x54, 0x74, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x51, 0x20, 0x03, 0x28, 0x0d, 0x52, + 0x09, 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x70, + 0x6c, 0x73, 0x5f, 0x69, 0x70, 0x18, 0x52, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x06, 0x6d, 0x70, 0x6c, + 0x73, 0x49, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x70, 0x6c, 0x73, 0x18, + 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4d, 0x70, 0x6c, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x36, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x70, 0x6c, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, + 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x31, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x37, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, 0x73, 0x31, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, + 0x70, 0x6c, 0x73, 0x5f, 0x31, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, + 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x32, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, 0x73, 0x32, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, + 0x70, 0x6c, 0x73, 0x5f, 0x32, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1c, 0x0a, + 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x33, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3b, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x6d, 0x70, 0x6c, 0x73, 0x33, 0x54, 0x74, 0x6c, 0x12, 0x20, 0x0a, 0x0c, 0x6d, + 0x70, 0x6c, 0x73, 0x5f, 0x33, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x6d, 0x70, 0x6c, 0x73, 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, + 0x0d, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x3d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x74, + 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x70, 0x6c, 0x73, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x70, 0x6c, 0x73, + 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x70, 0x6c, + 0x73, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x69, 0x70, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0b, 0x6d, 0x70, 0x6c, 0x73, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x49, 0x70, 0x12, 0x32, 0x0a, + 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x49, + 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x69, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x72, 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x72, 0x63, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x73, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x40, 0x0a, 0x0b, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x67, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x66, + 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, + 0x6f, 0x77, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x0a, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x68, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x09, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x41, 0x0a, 0x1d, 0x69, 0x70, 0x76, 0x36, + 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x69, 0x20, 0x03, 0x28, 0x0c, 0x52, + 0x1a, 0x69, 0x70, 0x76, 0x36, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x69, + 0x70, 0x76, 0x36, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x67, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x18, 0x69, 0x70, 0x76, 0x36, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x53, 0x65, 0x67, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x18, 0xb4, 0x10, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xb5, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x29, 0x0a, + 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, + 0x18, 0xb6, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xb7, 0x10, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xbe, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x12, 0x23, 0x0a, 0x0c, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, 0x18, 0xbf, 0x10, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, + 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, + 0x61, 0x6e, 0x18, 0xc0, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xc1, 0x10, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, + 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x18, 0xc8, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, + 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd2, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x46, + 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x53, + 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd3, 0x10, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0xd4, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd5, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x53, + 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x41, 0x43, + 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd6, 0x10, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0xd7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd8, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x43, 0x57, 0x52, + 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x45, 0x43, 0x45, + 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd9, 0x10, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, + 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x18, 0xdc, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xe6, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x25, + 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x18, + 0xe7, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xe8, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, + 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2b, + 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, + 0x65, 0x76, 0x18, 0xe9, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x54, + 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xea, 0x10, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x21, + 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x18, 0xeb, 0x10, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, + 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, + 0x6e, 0x18, 0xec, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, + 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, + 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xed, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, + 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xd0, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x43, + 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, + 0xd1, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x18, 0xdc, 0x0f, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x06, 0x44, 0x73, + 0x74, 0x43, 0x69, 0x64, 0x18, 0xdd, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, + 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, + 0x6f, 0x6e, 0x18, 0xf0, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, - 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, - 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, - 0x4d, 0x0a, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, - 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x4c, 0x65, 0x6e, 0x18, 0xf5, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, + 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, + 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x44, + 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf1, 0x10, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, + 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, + 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, + 0x6e, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0xf2, 0x10, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, + 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0xf3, 0x10, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x4e, 0x0a, 0x0f, 0x53, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf4, 0x10, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, + 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, + 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x11, - 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0xfc, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, - 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0xfd, - 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, - 0x12, 0x56, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0xfe, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, - 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, - 0x77, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xda, 0x0f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x23, 0x0a, 0x0c, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x18, - 0xde, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x72, 0x79, 0x42, 0x57, 0x12, 0x23, 0x0a, 0x0c, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x72, 0x79, 0x42, 0x57, 0x18, 0xdf, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x44, 0x73, 0x74, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x12, 0x44, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, - 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0xd2, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x18, 0xf5, + 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, + 0x48, 0x6f, 0x70, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf6, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, - 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, - 0x1d, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xd9, 0x0f, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, - 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xdb, 0x0f, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, - 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x84, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x48, - 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, - 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x85, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, - 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x4e, 0x65, - 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x86, 0x11, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x87, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x88, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x89, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, - 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x53, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x8a, 0x11, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0xd3, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, - 0x63, 0x18, 0xd4, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, - 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, - 0x64, 0x18, 0xd5, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, - 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0xd6, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, - 0x18, 0xd7, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, - 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x18, 0xd8, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xe0, 0x0f, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x50, 0x18, 0xf2, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, 0xf3, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, - 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x18, 0xf4, 0x11, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x18, 0xf5, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x18, 0xf6, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x18, 0xf7, 0x11, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, - 0x49, 0x44, 0x42, 0x57, 0x18, 0xeb, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x49, 0x6e, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x12, 0x25, 0x0a, 0x0d, 0x45, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x18, 0xec, 0x13, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, - 0x42, 0x57, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, + 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x6e, 0x6f, 0x6e, + 0x12, 0x45, 0x0a, 0x1d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x6e, 0x6f, 0x6e, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, + 0x6e, 0x18, 0xf7, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, + 0x70, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x11, 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0xfc, + 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0xfd, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x12, 0x56, 0x0a, 0x10, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xfe, 0x10, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, + 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x18, 0xda, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0c, 0x53, 0x72, 0x63, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x18, 0xde, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x12, 0x23, 0x0a, + 0x0c, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x57, 0x18, 0xdf, 0x0f, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, + 0x42, 0x57, 0x12, 0x44, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x18, 0xd2, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, + 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x4e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x4e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xd9, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xdb, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, + 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, + 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, + 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x84, 0x11, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x85, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x86, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, + 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x87, 0x11, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x88, 0x11, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, + 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x89, 0x11, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x8a, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xd3, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x18, 0xd4, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, + 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0xd5, 0x0f, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, + 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xd6, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, + 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x18, 0xd7, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, + 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0xd8, 0x0f, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, + 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xe0, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, + 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, 0xf2, 0x11, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, + 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, + 0xf3, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, + 0x49, 0x50, 0x18, 0xf4, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, + 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, + 0x50, 0x18, 0xf5, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, + 0x18, 0xf6, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, + 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x41, 0x43, 0x18, 0xf7, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x49, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x18, 0xeb, 0x13, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, + 0x49, 0x44, 0x42, 0x57, 0x12, 0x25, 0x0a, 0x0d, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, + 0x66, 0x49, 0x44, 0x42, 0x57, 0x18, 0xec, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x45, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x42, 0x57, 0x12, 0x25, 0x0a, 0x0d, 0x54, + 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0xea, 0x13, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4c, 0x4f, 0x57, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x35, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x35, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x39, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x50, 0x46, 0x49, 0x58, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x42, 0x50, 0x46, 0x10, - 0x05, 0x22, 0x32, 0x0a, 0x0e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, - 0x69, 0x7a, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, - 0x50, 0x41, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, - 0x64, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x03, - 0x22, 0x21, 0x0a, 0x0e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x65, - 0x73, 0x10, 0x01, 0x22, 0x2f, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, - 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, - 0x73, 0x74, 0x10, 0x02, 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x62, 0x77, 0x4e, 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, 0x6c, 0x6f, - 0x77, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x66, 0x6c, 0x6f, - 0x77, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x05, 0x22, 0xc7, 0x01, 0x0a, 0x0a, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x49, 0x50, 0x76, 0x34, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x50, 0x76, 0x36, + 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x55, + 0x44, 0x50, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x50, 0x4c, 0x53, 0x10, 0x05, 0x12, 0x09, + 0x0a, 0x05, 0x44, 0x6f, 0x74, 0x31, 0x51, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x43, 0x4d, + 0x50, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x43, 0x4d, 0x50, 0x76, 0x36, 0x10, 0x08, 0x12, + 0x07, 0x0a, 0x03, 0x47, 0x52, 0x45, 0x10, 0x09, 0x12, 0x15, 0x0a, 0x11, 0x49, 0x50, 0x76, 0x36, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x0a, 0x12, + 0x16, 0x0a, 0x12, 0x49, 0x50, 0x76, 0x36, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x10, 0x0b, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x65, 0x6e, 0x65, 0x76, + 0x65, 0x10, 0x0c, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x65, 0x72, 0x65, 0x64, 0x6f, 0x10, 0x0d, 0x12, + 0x0a, 0x0a, 0x06, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x10, 0x63, 0x22, 0x32, 0x0a, 0x0e, 0x41, + 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, + 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x50, 0x41, 0x4e, 0x10, 0x01, 0x22, + 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x01, 0x12, + 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x03, 0x22, 0x21, 0x0a, 0x0e, 0x4e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x06, 0x0a, 0x02, + 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x65, 0x73, 0x10, 0x01, 0x22, 0x2f, 0x0a, + 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, + 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x73, 0x74, 0x10, 0x02, 0x42, 0x2d, + 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x77, 0x4e, + 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1697,29 +1923,32 @@ func file_enrichedflow_proto_rawDescGZIP() []byte { return file_enrichedflow_proto_rawDescData } -var file_enrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_enrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 6) var file_enrichedflow_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_enrichedflow_proto_goTypes = []any{ (EnrichedFlow_FlowType)(0), // 0: flowpb.EnrichedFlow.FlowType - (EnrichedFlow_AnonymizedType)(0), // 1: flowpb.EnrichedFlow.AnonymizedType - (EnrichedFlow_ValidationStatusType)(0), // 2: flowpb.EnrichedFlow.ValidationStatusType - (EnrichedFlow_NormalizedType)(0), // 3: flowpb.EnrichedFlow.NormalizedType - (EnrichedFlow_RemoteAddrType)(0), // 4: flowpb.EnrichedFlow.RemoteAddrType - (*EnrichedFlow)(nil), // 5: flowpb.EnrichedFlow + (EnrichedFlow_LayerStack)(0), // 1: flowpb.EnrichedFlow.LayerStack + (EnrichedFlow_AnonymizedType)(0), // 2: flowpb.EnrichedFlow.AnonymizedType + (EnrichedFlow_ValidationStatusType)(0), // 3: flowpb.EnrichedFlow.ValidationStatusType + (EnrichedFlow_NormalizedType)(0), // 4: flowpb.EnrichedFlow.NormalizedType + (EnrichedFlow_RemoteAddrType)(0), // 5: flowpb.EnrichedFlow.RemoteAddrType + (*EnrichedFlow)(nil), // 6: flowpb.EnrichedFlow } var file_enrichedflow_proto_depIdxs = []int32{ 0, // 0: flowpb.EnrichedFlow.type:type_name -> flowpb.EnrichedFlow.FlowType - 1, // 1: flowpb.EnrichedFlow.SrcAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType - 1, // 2: flowpb.EnrichedFlow.DstAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType - 1, // 3: flowpb.EnrichedFlow.SamplerAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType - 2, // 4: flowpb.EnrichedFlow.ValidationStatus:type_name -> flowpb.EnrichedFlow.ValidationStatusType - 3, // 5: flowpb.EnrichedFlow.Normalized:type_name -> flowpb.EnrichedFlow.NormalizedType - 4, // 6: flowpb.EnrichedFlow.RemoteAddr:type_name -> flowpb.EnrichedFlow.RemoteAddrType - 7, // [7:7] is the sub-list for method output_type - 7, // [7:7] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 1, // 1: flowpb.EnrichedFlow.layer_stack:type_name -> flowpb.EnrichedFlow.LayerStack + 2, // 2: flowpb.EnrichedFlow.SrcAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType + 2, // 3: flowpb.EnrichedFlow.DstAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType + 2, // 4: flowpb.EnrichedFlow.SamplerAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType + 2, // 5: flowpb.EnrichedFlow.NextHopAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType + 3, // 6: flowpb.EnrichedFlow.ValidationStatus:type_name -> flowpb.EnrichedFlow.ValidationStatusType + 4, // 7: flowpb.EnrichedFlow.Normalized:type_name -> flowpb.EnrichedFlow.NormalizedType + 5, // 8: flowpb.EnrichedFlow.RemoteAddr:type_name -> flowpb.EnrichedFlow.RemoteAddrType + 9, // [9:9] is the sub-list for method output_type + 9, // [9:9] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_enrichedflow_proto_init() } @@ -1732,7 +1961,7 @@ func file_enrichedflow_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_enrichedflow_proto_rawDesc, - NumEnums: 5, + NumEnums: 6, NumMessages: 1, NumExtensions: 0, NumServices: 0, diff --git a/pb/enrichedflow.proto b/pb/enrichedflow.proto index 70b78dc..fe9d911 100644 --- a/pb/enrichedflow.proto +++ b/pb/enrichedflow.proto @@ -16,16 +16,18 @@ message EnrichedFlow { FlowType type = 1; uint64 time_received = 2; + uint64 time_received_ns = 110; uint32 sequence_num = 4; uint64 sampling_rate = 3; uint32 flow_direction = 42; + uint64 time_flow_start_ns = 111; + uint64 time_flow_end_ns = 112; // Sampler information bytes sampler_address = 11; // Found inside packet - uint64 time_flow_start = 38; uint64 time_flow_end = 5; uint64 time_flow_start_ms = 63; uint64 time_flow_end_ms = 64; @@ -70,6 +72,7 @@ message EnrichedFlow { uint32 ip_tos = 23; uint32 forwarding_status = 24; uint32 ip_ttl = 25; + uint32 ip_flags = 38; uint32 tcp_flags = 26; uint32 icmp_type = 31; uint32 icmp_code = 32; @@ -96,6 +99,9 @@ message EnrichedFlow { repeated uint32 as_path = 102; // MPLS information + repeated uint32 mpls_ttl = 80; + repeated uint32 mpls_label = 81; + repeated bytes mpls_ip = 82; bool has_mpls = 53; uint32 mpls_count = 54; uint32 mpls_1_ttl = 55; // First TTL @@ -114,6 +120,31 @@ message EnrichedFlow { string src_country = 1000; string dst_country = 1001; + // Encapsulation + enum LayerStack { + Ethernet = 0; + IPv4 = 1; + IPv6 = 2; + TCP = 3; + UDP = 4; + MPLS = 5; + Dot1Q = 6; + ICMP = 7; + ICMPv6 = 8; + GRE = 9; + IPv6HeaderRouting = 10; + IPv6HeaderFragment = 11; + Geneve = 12; + Teredo = 13; + Custom = 99; + // todo: add nsh + } + repeated LayerStack layer_stack = 103; + repeated uint32 layer_size = 104; + + repeated bytes ipv6_routing_header_addresses = 105; // SRv6 + uint32 ipv6_routing_header_seg_left = 106; // SRv6 + // bwNET custom fields: // input/bpf: @@ -242,6 +273,7 @@ uint32 IngressVrfIDBW = 2539; uint32 EgressVrfIDBW = 2540; // Replaced by ns values -// uint64 TimeFlowStart = 2538; +uint64 TimeFlowStart = 2538; // uint64 TimeFlowEnd = 2505; +// Kept for legacy support } \ No newline at end of file diff --git a/pb/legacyconverter.go b/pb/legacyconverter.go new file mode 100644 index 0000000..eb24cc4 --- /dev/null +++ b/pb/legacyconverter.go @@ -0,0 +1,294 @@ +package pb + +import "math" + +func (legacy *LegacyEnrichedFlow) ConvertToEnrichedFlow() *EnrichedFlow { + enrichedFlow := EnrichedFlow{ + Type: EnrichedFlow_FlowType(legacy.Type), + TimeReceived: legacy.TimeReceived, + SequenceNum: legacy.SequenceNum, + SamplingRate: legacy.SamplingRate, + FlowDirection: legacy.FlowDirection, + SamplerAddress: legacy.SamplerAddress, + TimeFlowStart: legacy.TimeFlowStart, + TimeFlowEnd: legacy.TimeFlowEnd, + Bytes: legacy.Bytes, + Packets: legacy.Packets, + SrcAddr: legacy.SrcAddr, + DstAddr: legacy.DstAddr, + Etype: legacy.Etype, + Proto: legacy.Proto, + SrcPort: legacy.SrcPort, + DstPort: legacy.DstPort, + InIf: legacy.InIf, + OutIf: legacy.OutIf, + SrcMac: legacy.SrcMac, + DstMac: legacy.DstMac, + SrcVlan: legacy.SrcVlan, + DstVlan: legacy.DstVlan, + VlanId: legacy.VlanId, + IngressVrfId: legacy.IngressVrfID, + EgressVrfId: legacy.EgressVrfID, + IpTos: legacy.IPTos, + ForwardingStatus: legacy.ForwardingStatus, + IpTtl: legacy.IPTTL, + TcpFlags: legacy.TCPFlags, + IcmpType: legacy.IcmpType, + IcmpCode: legacy.IcmpCode, + Ipv6FlowLabel: legacy.IPv6FlowLabel, + FragmentId: legacy.FragmentId, + FragmentOffset: legacy.FragmentOffset, + BiFlowDirection: legacy.BiFlowDirection, + SrcAs: legacy.SrcAS, + DstAs: legacy.DstAS, + NextHop: legacy.NextHop, + NextHopAs: legacy.NextHopAS, + SrcNet: legacy.SrcNet, + DstNet: legacy.DstNet, + HasMpls: legacy.HasMPLS, + MplsCount: legacy.MPLSCount, + Mpls_1Ttl: legacy.MPLS1TTL, + Mpls_1Label: legacy.MPLS1Label, + Mpls_2Ttl: legacy.MPLS2TTL, + Mpls_2Label: legacy.MPLS2Label, + Mpls_3Ttl: legacy.MPLS3TTL, + Mpls_3Label: legacy.MPLS3Label, + MplsLastTtl: legacy.MPLSLastTTL, + MplsLastLabel: legacy.MPLSLastLabel, + SrcCountry: legacy.SrcCountry, + DstCountry: legacy.DstCountry, + + AsPath: legacy.ASPath, + //state: legacy.state, + sizeCache: legacy.sizeCache, + unknownFields: legacy.unknownFields, + PacketBytesMin: legacy.PacketBytesMin, + PacketBytesMax: legacy.PacketBytesMax, + PacketBytesMean: legacy.PacketBytesMean, + PacketBytesStdDev: legacy.PacketBytesStdDev, + PacketIATMin: legacy.PacketIATMin, + PacketIATMax: legacy.PacketIATMax, + PacketIATMean: legacy.PacketIATMean, + PacketIATStdDev: legacy.PacketIATStdDev, + HeaderBytes: legacy.HeaderBytes, + FINFlagCount: legacy.FINFlagCount, + SYNFlagCount: legacy.SYNFlagCount, + RSTFlagCount: legacy.RSTFlagCount, + PSHFlagCount: legacy.PSHFlagCount, + ACKFlagCount: legacy.ACKFlagCount, + URGFlagCount: legacy.URGFlagCount, + CWRFlagCount: legacy.CWRFlagCount, + ECEFlagCount: legacy.ECEFlagCount, + PayloadPackets: legacy.PayloadPackets, + TimeActiveMin: legacy.TimeActiveMin, + TimeActiveMax: legacy.TimeActiveMax, + TimeActiveMean: legacy.TimeActiveMean, + TimeActiveStdDev: legacy.TimeActiveStdDev, + TimeIdleMin: legacy.TimeIdleMin, + TimeIdleMax: legacy.TimeIdleMax, + TimeIdleMean: legacy.TimeIdleMean, + TimeIdleStdDev: legacy.TimeIdleStdDev, + Cid: legacy.Cid, + CidString: legacy.CidString, + SrcCid: legacy.SrcCid, + DstCid: legacy.DstCid, + SrcAddrAnon: EnrichedFlow_AnonymizedType(legacy.SrcAddrAnon), + DstAddrAnon: EnrichedFlow_AnonymizedType(legacy.DstAddrAnon), + SrcAddrPreservedLen: legacy.SrcAddrPreservedLen, + DstAddrPreservedLen: legacy.DstAddrPreservedLen, + SamplerAddrAnon: EnrichedFlow_AnonymizedType(legacy.SamplerAddrAnon), + SamplerAddrAnonPreservedPrefixLen: legacy.SamplerAddrAnonPreservedPrefixLen, + Med: legacy.Med, + LocalPref: legacy.LocalPref, + ValidationStatus: EnrichedFlow_ValidationStatusType(legacy.ValidationStatus), + RemoteCountry: legacy.RemoteCountry, + Normalized: EnrichedFlow_NormalizedType(legacy.Normalized), + ProtoName: legacy.ProtoName, + RemoteAddr: EnrichedFlow_RemoteAddrType(legacy.RemoteAddr), + SrcHostName: legacy.SrcHostName, + DstHostName: legacy.DstHostName, + NextHopHostName: legacy.NextHopHostName, + SrcASName: legacy.SrcASName, + DstASName: legacy.DstASName, + NextHopASName: legacy.NextHopASName, + SamplerHostName: legacy.SamplerHostName, + SrcIfName: legacy.SrcIfName, + SrcIfDesc: legacy.SrcIfDesc, + SrcIfSpeed: legacy.SrcIfSpeed, + DstIfName: legacy.DstIfName, + DstIfDesc: legacy.DstIfDesc, + DstIfSpeed: legacy.DstIfSpeed, + Note: legacy.Note, + SourceIP: legacy.SourceIP, + DestinationIP: legacy.DestinationIP, + NextHopIP: legacy.NextHopIP, + SamplerIP: legacy.SamplerIP, + SourceMAC: legacy.SourceMAC, + DestinationMAC: legacy.DestinationMAC, + } + enrichedFlow.SyncMissingTimeStamps() + return &enrichedFlow +} + +func (flow *EnrichedFlow) ConvertToLegacyEnrichedFlow() *LegacyEnrichedFlow { + flow.SyncMissingTimeStamps() + + legacyFlow := LegacyEnrichedFlow{ + Type: LegacyEnrichedFlow_FlowType(flow.Type), + TimeReceived: flow.TimeReceived, + SequenceNum: flow.SequenceNum, + SamplingRate: flow.SamplingRate, + FlowDirection: flow.FlowDirection, + SamplerAddress: flow.SamplerAddress, + Bytes: flow.Bytes, + Packets: flow.Packets, + SrcAddr: flow.SrcAddr, + DstAddr: flow.DstAddr, + Etype: flow.Etype, + Proto: flow.Proto, + SrcPort: flow.SrcPort, + DstPort: flow.DstPort, + InIf: flow.InIf, + OutIf: flow.OutIf, + SrcMac: flow.SrcMac, + DstMac: flow.DstMac, + SrcVlan: flow.SrcVlan, + DstVlan: flow.DstVlan, + VlanId: flow.VlanId, + IngressVrfID: flow.IngressVrfId, + EgressVrfID: flow.EgressVrfId, + IPTos: flow.IpTos, + ForwardingStatus: flow.ForwardingStatus, + IPTTL: flow.IpTtl, + TCPFlags: flow.TcpFlags, + IcmpType: flow.IcmpType, + IcmpCode: flow.IcmpCode, + IPv6FlowLabel: flow.Ipv6FlowLabel, + FragmentId: flow.FragmentId, + FragmentOffset: flow.FragmentOffset, + BiFlowDirection: flow.BiFlowDirection, + SrcAS: flow.SrcAs, + DstAS: flow.DstAs, + NextHop: flow.NextHop, + NextHopAS: flow.NextHopAs, + SrcNet: flow.SrcNet, + DstNet: flow.DstNet, + HasMPLS: flow.HasMpls, + MPLSCount: flow.MplsCount, + MPLS1TTL: flow.Mpls_1Ttl, + MPLS1Label: flow.Mpls_1Label, + MPLS2TTL: flow.Mpls_2Ttl, + MPLS2Label: flow.Mpls_2Label, + MPLS3TTL: flow.Mpls_3Ttl, + MPLS3Label: flow.Mpls_3Label, + MPLSLastTTL: flow.MplsLastTtl, + MPLSLastLabel: flow.MplsLastLabel, + SrcCountry: flow.SrcCountry, + DstCountry: flow.DstCountry, + + TimeFlowStart: flow.TimeFlowStart, + TimeFlowEnd: flow.TimeFlowStart, + + ASPath: flow.AsPath, + sizeCache: flow.sizeCache, + unknownFields: flow.unknownFields, + PacketBytesMin: flow.PacketBytesMin, + PacketBytesMax: flow.PacketBytesMax, + PacketBytesMean: flow.PacketBytesMean, + PacketBytesStdDev: flow.PacketBytesStdDev, + PacketIATMin: flow.PacketIATMin, + PacketIATMax: flow.PacketIATMax, + PacketIATMean: flow.PacketIATMean, + PacketIATStdDev: flow.PacketIATStdDev, + HeaderBytes: flow.HeaderBytes, + FINFlagCount: flow.FINFlagCount, + SYNFlagCount: flow.SYNFlagCount, + RSTFlagCount: flow.RSTFlagCount, + PSHFlagCount: flow.PSHFlagCount, + ACKFlagCount: flow.ACKFlagCount, + URGFlagCount: flow.URGFlagCount, + CWRFlagCount: flow.CWRFlagCount, + ECEFlagCount: flow.ECEFlagCount, + PayloadPackets: flow.PayloadPackets, + TimeActiveMin: flow.TimeActiveMin, + TimeActiveMax: flow.TimeActiveMax, + TimeActiveMean: flow.TimeActiveMean, + TimeActiveStdDev: flow.TimeActiveStdDev, + TimeIdleMin: flow.TimeIdleMin, + TimeIdleMax: flow.TimeIdleMax, + TimeIdleMean: flow.TimeIdleMean, + TimeIdleStdDev: flow.TimeIdleStdDev, + Cid: flow.Cid, + CidString: flow.CidString, + SrcCid: flow.SrcCid, + DstCid: flow.DstCid, + SrcAddrAnon: LegacyEnrichedFlow_AnonymizedType(flow.SrcAddrAnon), + DstAddrAnon: LegacyEnrichedFlow_AnonymizedType(flow.DstAddrAnon), + SrcAddrPreservedLen: flow.SrcAddrPreservedLen, + DstAddrPreservedLen: flow.DstAddrPreservedLen, + SamplerAddrAnon: LegacyEnrichedFlow_AnonymizedType(flow.SamplerAddrAnon), + SamplerAddrAnonPreservedPrefixLen: flow.SamplerAddrAnonPreservedPrefixLen, + Med: flow.Med, + LocalPref: flow.LocalPref, + ValidationStatus: LegacyEnrichedFlow_ValidationStatusType(flow.ValidationStatus), + RemoteCountry: flow.RemoteCountry, + Normalized: LegacyEnrichedFlow_NormalizedType(flow.Normalized), + ProtoName: flow.ProtoName, + RemoteAddr: LegacyEnrichedFlow_RemoteAddrType(flow.RemoteAddr), + SrcHostName: flow.SrcHostName, + DstHostName: flow.DstHostName, + NextHopHostName: flow.NextHopHostName, + SrcASName: flow.SrcASName, + DstASName: flow.DstASName, + NextHopASName: flow.NextHopASName, + SamplerHostName: flow.SamplerHostName, + SrcIfName: flow.SrcIfName, + SrcIfDesc: flow.SrcIfDesc, + SrcIfSpeed: flow.SrcIfSpeed, + DstIfName: flow.DstIfName, + DstIfDesc: flow.DstIfDesc, + DstIfSpeed: flow.DstIfSpeed, + Note: flow.Note, + SourceIP: flow.SourceIP, + DestinationIP: flow.DestinationIP, + NextHopIP: flow.NextHopIP, + SamplerIP: flow.SamplerIP, + SourceMAC: flow.SourceMAC, + DestinationMAC: flow.DestinationMAC, + } + return &legacyFlow + +} + +func (flow *EnrichedFlow) SyncMissingTimeStamps() { + fillTimeIfEmptyWithFallback(&flow.TimeFlowEnd, &flow.TimeFlowEndNs, 1e-9, &flow.TimeFlowEndMs, 1e-3) + fillTimeIfEmptyWithFallback(&flow.TimeFlowEndMs, &flow.TimeFlowEndNs, 1e-6, &flow.TimeFlowEnd, 1e3) + fillTimeIfEmptyWithFallback(&flow.TimeFlowEndNs, &flow.TimeFlowEndMs, 1e6, &flow.TimeFlowEnd, 1e9) + + fillTimeIfEmptyWithFallback(&flow.TimeFlowStart, &flow.TimeFlowStartNs, 1e-9, &flow.TimeFlowStartMs, 1e-3) + fillTimeIfEmptyWithFallback(&flow.TimeFlowStartMs, &flow.TimeFlowStartNs, 1e-6, &flow.TimeFlowStart, 1e3) + fillTimeIfEmptyWithFallback(&flow.TimeFlowStartNs, &flow.TimeFlowStartMs, 1e6, &flow.TimeFlowStart, 1e9) + + fillTimeIfEmpty(&flow.TimeReceived, &flow.TimeReceivedNs, 1e-9) + fillTimeIfEmpty(&flow.TimeReceivedNs, &flow.TimeReceived, 1e9) +} + +/** +** Fills time1 with the value of time2 using factor12 and time3 as fallback if time2 is empty +**/ +func fillTimeIfEmptyWithFallback(time1 *uint64, time2 *uint64, factor12 float64, time3 *uint64, factor13 float64) { + fillTimeIfEmpty(time1, time2, factor12) + fillTimeIfEmpty(time1, time3, factor13) +} + +/** +** Fills time1 with the value of time2 using factor12 +**/ +func fillTimeIfEmpty(time1 *uint64, time2 *uint64, factor12 float64) { + if *time1 != 0 { + return + } + if *time2 != 0 { + *time1 = uint64(math.Round(float64(*time2) * factor12)) + } +} diff --git a/pb/legacyenrichedflow.pb.go b/pb/legacyenrichedflow.pb.go new file mode 100644 index 0000000..6764dc7 --- /dev/null +++ b/pb/legacyenrichedflow.pb.go @@ -0,0 +1,1630 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.1 +// protoc v3.21.12 +// source: legacyenrichedflow.proto + +package pb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type LegacyEnrichedFlow_FlowType int32 + +const ( + LegacyEnrichedFlow_FLOWUNKNOWN LegacyEnrichedFlow_FlowType = 0 + LegacyEnrichedFlow_SFLOW_5 LegacyEnrichedFlow_FlowType = 1 + LegacyEnrichedFlow_NETFLOW_V5 LegacyEnrichedFlow_FlowType = 2 + LegacyEnrichedFlow_NETFLOW_V9 LegacyEnrichedFlow_FlowType = 3 + LegacyEnrichedFlow_IPFIX LegacyEnrichedFlow_FlowType = 4 + LegacyEnrichedFlow_EBPF LegacyEnrichedFlow_FlowType = 5 +) + +// Enum value maps for LegacyEnrichedFlow_FlowType. +var ( + LegacyEnrichedFlow_FlowType_name = map[int32]string{ + 0: "FLOWUNKNOWN", + 1: "SFLOW_5", + 2: "NETFLOW_V5", + 3: "NETFLOW_V9", + 4: "IPFIX", + 5: "EBPF", + } + LegacyEnrichedFlow_FlowType_value = map[string]int32{ + "FLOWUNKNOWN": 0, + "SFLOW_5": 1, + "NETFLOW_V5": 2, + "NETFLOW_V9": 3, + "IPFIX": 4, + "EBPF": 5, + } +) + +func (x LegacyEnrichedFlow_FlowType) Enum() *LegacyEnrichedFlow_FlowType { + p := new(LegacyEnrichedFlow_FlowType) + *p = x + return p +} + +func (x LegacyEnrichedFlow_FlowType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LegacyEnrichedFlow_FlowType) Descriptor() protoreflect.EnumDescriptor { + return file_legacyenrichedflow_proto_enumTypes[0].Descriptor() +} + +func (LegacyEnrichedFlow_FlowType) Type() protoreflect.EnumType { + return &file_legacyenrichedflow_proto_enumTypes[0] +} + +func (x LegacyEnrichedFlow_FlowType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LegacyEnrichedFlow_FlowType.Descriptor instead. +func (LegacyEnrichedFlow_FlowType) EnumDescriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0, 0} +} + +// modify/anonymize +type LegacyEnrichedFlow_AnonymizedType int32 + +const ( + LegacyEnrichedFlow_NotAnonymized LegacyEnrichedFlow_AnonymizedType = 0 + LegacyEnrichedFlow_CryptoPAN LegacyEnrichedFlow_AnonymizedType = 1 +) + +// Enum value maps for LegacyEnrichedFlow_AnonymizedType. +var ( + LegacyEnrichedFlow_AnonymizedType_name = map[int32]string{ + 0: "NotAnonymized", + 1: "CryptoPAN", + } + LegacyEnrichedFlow_AnonymizedType_value = map[string]int32{ + "NotAnonymized": 0, + "CryptoPAN": 1, + } +) + +func (x LegacyEnrichedFlow_AnonymizedType) Enum() *LegacyEnrichedFlow_AnonymizedType { + p := new(LegacyEnrichedFlow_AnonymizedType) + *p = x + return p +} + +func (x LegacyEnrichedFlow_AnonymizedType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LegacyEnrichedFlow_AnonymizedType) Descriptor() protoreflect.EnumDescriptor { + return file_legacyenrichedflow_proto_enumTypes[1].Descriptor() +} + +func (LegacyEnrichedFlow_AnonymizedType) Type() protoreflect.EnumType { + return &file_legacyenrichedflow_proto_enumTypes[1] +} + +func (x LegacyEnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LegacyEnrichedFlow_AnonymizedType.Descriptor instead. +func (LegacyEnrichedFlow_AnonymizedType) EnumDescriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0, 1} +} + +type LegacyEnrichedFlow_ValidationStatusType int32 + +const ( + LegacyEnrichedFlow_Unknown LegacyEnrichedFlow_ValidationStatusType = 0 + LegacyEnrichedFlow_Valid LegacyEnrichedFlow_ValidationStatusType = 1 + LegacyEnrichedFlow_NotFound LegacyEnrichedFlow_ValidationStatusType = 2 + LegacyEnrichedFlow_Invalid LegacyEnrichedFlow_ValidationStatusType = 3 +) + +// Enum value maps for LegacyEnrichedFlow_ValidationStatusType. +var ( + LegacyEnrichedFlow_ValidationStatusType_name = map[int32]string{ + 0: "Unknown", + 1: "Valid", + 2: "NotFound", + 3: "Invalid", + } + LegacyEnrichedFlow_ValidationStatusType_value = map[string]int32{ + "Unknown": 0, + "Valid": 1, + "NotFound": 2, + "Invalid": 3, + } +) + +func (x LegacyEnrichedFlow_ValidationStatusType) Enum() *LegacyEnrichedFlow_ValidationStatusType { + p := new(LegacyEnrichedFlow_ValidationStatusType) + *p = x + return p +} + +func (x LegacyEnrichedFlow_ValidationStatusType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LegacyEnrichedFlow_ValidationStatusType) Descriptor() protoreflect.EnumDescriptor { + return file_legacyenrichedflow_proto_enumTypes[2].Descriptor() +} + +func (LegacyEnrichedFlow_ValidationStatusType) Type() protoreflect.EnumType { + return &file_legacyenrichedflow_proto_enumTypes[2] +} + +func (x LegacyEnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LegacyEnrichedFlow_ValidationStatusType.Descriptor instead. +func (LegacyEnrichedFlow_ValidationStatusType) EnumDescriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0, 2} +} + +// modify/normalize +type LegacyEnrichedFlow_NormalizedType int32 + +const ( + LegacyEnrichedFlow_No LegacyEnrichedFlow_NormalizedType = 0 + LegacyEnrichedFlow_Yes LegacyEnrichedFlow_NormalizedType = 1 +) + +// Enum value maps for LegacyEnrichedFlow_NormalizedType. +var ( + LegacyEnrichedFlow_NormalizedType_name = map[int32]string{ + 0: "No", + 1: "Yes", + } + LegacyEnrichedFlow_NormalizedType_value = map[string]int32{ + "No": 0, + "Yes": 1, + } +) + +func (x LegacyEnrichedFlow_NormalizedType) Enum() *LegacyEnrichedFlow_NormalizedType { + p := new(LegacyEnrichedFlow_NormalizedType) + *p = x + return p +} + +func (x LegacyEnrichedFlow_NormalizedType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LegacyEnrichedFlow_NormalizedType) Descriptor() protoreflect.EnumDescriptor { + return file_legacyenrichedflow_proto_enumTypes[3].Descriptor() +} + +func (LegacyEnrichedFlow_NormalizedType) Type() protoreflect.EnumType { + return &file_legacyenrichedflow_proto_enumTypes[3] +} + +func (x LegacyEnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LegacyEnrichedFlow_NormalizedType.Descriptor instead. +func (LegacyEnrichedFlow_NormalizedType) EnumDescriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0, 3} +} + +// modify/remoteaddress +type LegacyEnrichedFlow_RemoteAddrType int32 + +const ( + LegacyEnrichedFlow_Neither LegacyEnrichedFlow_RemoteAddrType = 0 + LegacyEnrichedFlow_Src LegacyEnrichedFlow_RemoteAddrType = 1 + LegacyEnrichedFlow_Dst LegacyEnrichedFlow_RemoteAddrType = 2 +) + +// Enum value maps for LegacyEnrichedFlow_RemoteAddrType. +var ( + LegacyEnrichedFlow_RemoteAddrType_name = map[int32]string{ + 0: "Neither", + 1: "Src", + 2: "Dst", + } + LegacyEnrichedFlow_RemoteAddrType_value = map[string]int32{ + "Neither": 0, + "Src": 1, + "Dst": 2, + } +) + +func (x LegacyEnrichedFlow_RemoteAddrType) Enum() *LegacyEnrichedFlow_RemoteAddrType { + p := new(LegacyEnrichedFlow_RemoteAddrType) + *p = x + return p +} + +func (x LegacyEnrichedFlow_RemoteAddrType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LegacyEnrichedFlow_RemoteAddrType) Descriptor() protoreflect.EnumDescriptor { + return file_legacyenrichedflow_proto_enumTypes[4].Descriptor() +} + +func (LegacyEnrichedFlow_RemoteAddrType) Type() protoreflect.EnumType { + return &file_legacyenrichedflow_proto_enumTypes[4] +} + +func (x LegacyEnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LegacyEnrichedFlow_RemoteAddrType.Descriptor instead. +func (LegacyEnrichedFlow_RemoteAddrType) EnumDescriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0, 4} +} + +type LegacyEnrichedFlow struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type LegacyEnrichedFlow_FlowType `protobuf:"varint,1,opt,name=Type,proto3,enum=flowpb.LegacyEnrichedFlow_FlowType" json:"Type,omitempty"` + TimeReceived uint64 `protobuf:"varint,2,opt,name=TimeReceived,proto3" json:"TimeReceived,omitempty"` + SequenceNum uint32 `protobuf:"varint,4,opt,name=SequenceNum,proto3" json:"SequenceNum,omitempty"` + SamplingRate uint64 `protobuf:"varint,3,opt,name=SamplingRate,proto3" json:"SamplingRate,omitempty"` + FlowDirection uint32 `protobuf:"varint,42,opt,name=FlowDirection,proto3" json:"FlowDirection,omitempty"` + // Sampler information + SamplerAddress []byte `protobuf:"bytes,11,opt,name=SamplerAddress,proto3" json:"SamplerAddress,omitempty"` + // Found inside packet + TimeFlowStart uint64 `protobuf:"varint,38,opt,name=TimeFlowStart,proto3" json:"TimeFlowStart,omitempty"` + TimeFlowEnd uint64 `protobuf:"varint,5,opt,name=TimeFlowEnd,proto3" json:"TimeFlowEnd,omitempty"` + // Size of the sampled packet + Bytes uint64 `protobuf:"varint,9,opt,name=Bytes,proto3" json:"Bytes,omitempty"` + Packets uint64 `protobuf:"varint,10,opt,name=Packets,proto3" json:"Packets,omitempty"` + // Source/destination addresses + SrcAddr []byte `protobuf:"bytes,6,opt,name=SrcAddr,proto3" json:"SrcAddr,omitempty"` + DstAddr []byte `protobuf:"bytes,7,opt,name=DstAddr,proto3" json:"DstAddr,omitempty"` + // Layer 3 protocol (IPv4/IPv6/ARP/MPLS...) + Etype uint32 `protobuf:"varint,30,opt,name=Etype,proto3" json:"Etype,omitempty"` + // Layer 4 protocol + Proto uint32 `protobuf:"varint,20,opt,name=Proto,proto3" json:"Proto,omitempty"` + // Ports for UDP and TCP + SrcPort uint32 `protobuf:"varint,21,opt,name=SrcPort,proto3" json:"SrcPort,omitempty"` + DstPort uint32 `protobuf:"varint,22,opt,name=DstPort,proto3" json:"DstPort,omitempty"` + // Interfaces + InIf uint32 `protobuf:"varint,18,opt,name=InIf,proto3" json:"InIf,omitempty"` + OutIf uint32 `protobuf:"varint,19,opt,name=OutIf,proto3" json:"OutIf,omitempty"` + // Ethernet information + SrcMac uint64 `protobuf:"varint,27,opt,name=SrcMac,proto3" json:"SrcMac,omitempty"` + DstMac uint64 `protobuf:"varint,28,opt,name=DstMac,proto3" json:"DstMac,omitempty"` + // Vlan + SrcVlan uint32 `protobuf:"varint,33,opt,name=SrcVlan,proto3" json:"SrcVlan,omitempty"` + DstVlan uint32 `protobuf:"varint,34,opt,name=DstVlan,proto3" json:"DstVlan,omitempty"` + // 802.1q VLAN in sampled packet + VlanId uint32 `protobuf:"varint,29,opt,name=VlanId,proto3" json:"VlanId,omitempty"` + // VRF + IngressVrfID uint32 `protobuf:"varint,39,opt,name=IngressVrfID,proto3" json:"IngressVrfID,omitempty"` + EgressVrfID uint32 `protobuf:"varint,40,opt,name=EgressVrfID,proto3" json:"EgressVrfID,omitempty"` + // IP and TCP special flags + IPTos uint32 `protobuf:"varint,23,opt,name=IPTos,proto3" json:"IPTos,omitempty"` + ForwardingStatus uint32 `protobuf:"varint,24,opt,name=ForwardingStatus,proto3" json:"ForwardingStatus,omitempty"` + IPTTL uint32 `protobuf:"varint,25,opt,name=IPTTL,proto3" json:"IPTTL,omitempty"` + TCPFlags uint32 `protobuf:"varint,26,opt,name=TCPFlags,proto3" json:"TCPFlags,omitempty"` + IcmpType uint32 `protobuf:"varint,31,opt,name=IcmpType,proto3" json:"IcmpType,omitempty"` + IcmpCode uint32 `protobuf:"varint,32,opt,name=IcmpCode,proto3" json:"IcmpCode,omitempty"` + IPv6FlowLabel uint32 `protobuf:"varint,37,opt,name=IPv6FlowLabel,proto3" json:"IPv6FlowLabel,omitempty"` + // Fragments (IPv4/IPv6) + FragmentId uint32 `protobuf:"varint,35,opt,name=FragmentId,proto3" json:"FragmentId,omitempty"` + FragmentOffset uint32 `protobuf:"varint,36,opt,name=FragmentOffset,proto3" json:"FragmentOffset,omitempty"` + BiFlowDirection uint32 `protobuf:"varint,41,opt,name=BiFlowDirection,proto3" json:"BiFlowDirection,omitempty"` + // Autonomous system information + SrcAS uint32 `protobuf:"varint,14,opt,name=SrcAS,proto3" json:"SrcAS,omitempty"` + DstAS uint32 `protobuf:"varint,15,opt,name=DstAS,proto3" json:"DstAS,omitempty"` + NextHop []byte `protobuf:"bytes,12,opt,name=NextHop,proto3" json:"NextHop,omitempty"` + NextHopAS uint32 `protobuf:"varint,13,opt,name=NextHopAS,proto3" json:"NextHopAS,omitempty"` + // Prefix size + SrcNet uint32 `protobuf:"varint,16,opt,name=SrcNet,proto3" json:"SrcNet,omitempty"` + DstNet uint32 `protobuf:"varint,17,opt,name=DstNet,proto3" json:"DstNet,omitempty"` + // MPLS information + HasMPLS bool `protobuf:"varint,53,opt,name=HasMPLS,proto3" json:"HasMPLS,omitempty"` + MPLSCount uint32 `protobuf:"varint,54,opt,name=MPLSCount,proto3" json:"MPLSCount,omitempty"` + MPLS1TTL uint32 `protobuf:"varint,55,opt,name=MPLS1TTL,proto3" json:"MPLS1TTL,omitempty"` // First TTL + MPLS1Label uint32 `protobuf:"varint,56,opt,name=MPLS1Label,proto3" json:"MPLS1Label,omitempty"` // First Label + MPLS2TTL uint32 `protobuf:"varint,57,opt,name=MPLS2TTL,proto3" json:"MPLS2TTL,omitempty"` // Second TTL + MPLS2Label uint32 `protobuf:"varint,58,opt,name=MPLS2Label,proto3" json:"MPLS2Label,omitempty"` // Second Label + MPLS3TTL uint32 `protobuf:"varint,59,opt,name=MPLS3TTL,proto3" json:"MPLS3TTL,omitempty"` // Third TTL + MPLS3Label uint32 `protobuf:"varint,60,opt,name=MPLS3Label,proto3" json:"MPLS3Label,omitempty"` // Third Label + MPLSLastTTL uint32 `protobuf:"varint,61,opt,name=MPLSLastTTL,proto3" json:"MPLSLastTTL,omitempty"` // Last TTL + MPLSLastLabel uint32 `protobuf:"varint,62,opt,name=MPLSLastLabel,proto3" json:"MPLSLastLabel,omitempty"` // Last Label + PacketBytesMin uint32 `protobuf:"varint,1100,opt,name=PacketBytesMin,proto3" json:"PacketBytesMin,omitempty"` // new, single packet means uint32 < MTU + PacketBytesMax uint32 `protobuf:"varint,1101,opt,name=PacketBytesMax,proto3" json:"PacketBytesMax,omitempty"` // new + PacketBytesMean uint32 `protobuf:"varint,1102,opt,name=PacketBytesMean,proto3" json:"PacketBytesMean,omitempty"` // new + PacketBytesStdDev uint32 `protobuf:"varint,1103,opt,name=PacketBytesStdDev,proto3" json:"PacketBytesStdDev,omitempty"` // new + PacketIATMin uint64 `protobuf:"varint,1110,opt,name=PacketIATMin,proto3" json:"PacketIATMin,omitempty"` // new + PacketIATMax uint64 `protobuf:"varint,1111,opt,name=PacketIATMax,proto3" json:"PacketIATMax,omitempty"` // new + PacketIATMean uint64 `protobuf:"varint,1112,opt,name=PacketIATMean,proto3" json:"PacketIATMean,omitempty"` // new + PacketIATStdDev uint64 `protobuf:"varint,1113,opt,name=PacketIATStdDev,proto3" json:"PacketIATStdDev,omitempty"` // new + HeaderBytes uint32 `protobuf:"varint,1120,opt,name=HeaderBytes,proto3" json:"HeaderBytes,omitempty"` // new + FINFlagCount uint64 `protobuf:"varint,1130,opt,name=FINFlagCount,proto3" json:"FINFlagCount,omitempty"` // new + SYNFlagCount uint64 `protobuf:"varint,1131,opt,name=SYNFlagCount,proto3" json:"SYNFlagCount,omitempty"` // new + RSTFlagCount uint64 `protobuf:"varint,1132,opt,name=RSTFlagCount,proto3" json:"RSTFlagCount,omitempty"` // new + PSHFlagCount uint64 `protobuf:"varint,1133,opt,name=PSHFlagCount,proto3" json:"PSHFlagCount,omitempty"` // new + ACKFlagCount uint64 `protobuf:"varint,1134,opt,name=ACKFlagCount,proto3" json:"ACKFlagCount,omitempty"` // new + URGFlagCount uint64 `protobuf:"varint,1135,opt,name=URGFlagCount,proto3" json:"URGFlagCount,omitempty"` // new + CWRFlagCount uint64 `protobuf:"varint,1136,opt,name=CWRFlagCount,proto3" json:"CWRFlagCount,omitempty"` // new + ECEFlagCount uint64 `protobuf:"varint,1137,opt,name=ECEFlagCount,proto3" json:"ECEFlagCount,omitempty"` // new + PayloadPackets uint64 `protobuf:"varint,1140,opt,name=PayloadPackets,proto3" json:"PayloadPackets,omitempty"` // new + TimeActiveMin uint64 `protobuf:"varint,1150,opt,name=TimeActiveMin,proto3" json:"TimeActiveMin,omitempty"` // new + TimeActiveMax uint64 `protobuf:"varint,1151,opt,name=TimeActiveMax,proto3" json:"TimeActiveMax,omitempty"` // new + TimeActiveMean uint64 `protobuf:"varint,1152,opt,name=TimeActiveMean,proto3" json:"TimeActiveMean,omitempty"` // new + TimeActiveStdDev uint64 `protobuf:"varint,1153,opt,name=TimeActiveStdDev,proto3" json:"TimeActiveStdDev,omitempty"` // new + TimeIdleMin uint64 `protobuf:"varint,1154,opt,name=TimeIdleMin,proto3" json:"TimeIdleMin,omitempty"` // new + TimeIdleMax uint64 `protobuf:"varint,1155,opt,name=TimeIdleMax,proto3" json:"TimeIdleMax,omitempty"` // new + TimeIdleMean uint64 `protobuf:"varint,1156,opt,name=TimeIdleMean,proto3" json:"TimeIdleMean,omitempty"` // new + TimeIdleStdDev uint64 `protobuf:"varint,1157,opt,name=TimeIdleStdDev,proto3" json:"TimeIdleStdDev,omitempty"` // new + // modify/addcid + Cid uint32 `protobuf:"varint,1000,opt,name=Cid,proto3" json:"Cid,omitempty"` // TODO: deprecate and provide as helper? + CidString string `protobuf:"bytes,1001,opt,name=CidString,proto3" json:"CidString,omitempty"` // deprecated, delete for v1.0.0 + SrcCid uint32 `protobuf:"varint,1012,opt,name=SrcCid,proto3" json:"SrcCid,omitempty"` + DstCid uint32 `protobuf:"varint,1013,opt,name=DstCid,proto3" json:"DstCid,omitempty"` + SrcAddrAnon LegacyEnrichedFlow_AnonymizedType `protobuf:"varint,1160,opt,name=SrcAddrAnon,proto3,enum=flowpb.LegacyEnrichedFlow_AnonymizedType" json:"SrcAddrAnon,omitempty"` + DstAddrAnon LegacyEnrichedFlow_AnonymizedType `protobuf:"varint,1161,opt,name=DstAddrAnon,proto3,enum=flowpb.LegacyEnrichedFlow_AnonymizedType" json:"DstAddrAnon,omitempty"` + SrcAddrPreservedLen uint32 `protobuf:"varint,1162,opt,name=SrcAddrPreservedLen,proto3" json:"SrcAddrPreservedLen,omitempty"` + DstAddrPreservedLen uint32 `protobuf:"varint,1163,opt,name=DstAddrPreservedLen,proto3" json:"DstAddrPreservedLen,omitempty"` + SamplerAddrAnon LegacyEnrichedFlow_AnonymizedType `protobuf:"varint,1164,opt,name=SamplerAddrAnon,proto3,enum=flowpb.LegacyEnrichedFlow_AnonymizedType" json:"SamplerAddrAnon,omitempty"` + SamplerAddrAnonPreservedPrefixLen uint32 `protobuf:"varint,1165,opt,name=SamplerAddrAnonPreservedPrefixLen,proto3" json:"SamplerAddrAnonPreservedPrefixLen,omitempty"` + // modify/bgp + // as done by a number of Netflow implementations, these refer to the destination + ASPath []uint32 `protobuf:"varint,1171,rep,packed,name=ASPath,proto3" json:"ASPath,omitempty"` + Med uint32 `protobuf:"varint,1172,opt,name=Med,proto3" json:"Med,omitempty"` + LocalPref uint32 `protobuf:"varint,1173,opt,name=LocalPref,proto3" json:"LocalPref,omitempty"` + ValidationStatus LegacyEnrichedFlow_ValidationStatusType `protobuf:"varint,1174,opt,name=ValidationStatus,proto3,enum=flowpb.LegacyEnrichedFlow_ValidationStatusType" json:"ValidationStatus,omitempty"` + // modify/geolocation + RemoteCountry string `protobuf:"bytes,1010,opt,name=RemoteCountry,proto3" json:"RemoteCountry,omitempty"` // TODO: deprecate and provide as helper + SrcCountry string `protobuf:"bytes,1014,opt,name=SrcCountry,proto3" json:"SrcCountry,omitempty"` + DstCountry string `protobuf:"bytes,1015,opt,name=DstCountry,proto3" json:"DstCountry,omitempty"` + Normalized LegacyEnrichedFlow_NormalizedType `protobuf:"varint,1002,opt,name=Normalized,proto3,enum=flowpb.LegacyEnrichedFlow_NormalizedType" json:"Normalized,omitempty"` // TODO: deprecate and replace with helper? + // modify/protomap + ProtoName string `protobuf:"bytes,1009,opt,name=ProtoName,proto3" json:"ProtoName,omitempty"` // TODO: deprecate and replace with helper, why lug a string along... + RemoteAddr LegacyEnrichedFlow_RemoteAddrType `protobuf:"varint,1011,opt,name=RemoteAddr,proto3,enum=flowpb.LegacyEnrichedFlow_RemoteAddrType" json:"RemoteAddr,omitempty"` // TODO: figure out a better system? applicable only to service providers right now... + // modify/reversedns + SrcHostName string `protobuf:"bytes,1180,opt,name=SrcHostName,proto3" json:"SrcHostName,omitempty"` + DstHostName string `protobuf:"bytes,1181,opt,name=DstHostName,proto3" json:"DstHostName,omitempty"` + NextHopHostName string `protobuf:"bytes,1182,opt,name=NextHopHostName,proto3" json:"NextHopHostName,omitempty"` + SrcASName string `protobuf:"bytes,1183,opt,name=SrcASName,proto3" json:"SrcASName,omitempty"` + DstASName string `protobuf:"bytes,1184,opt,name=DstASName,proto3" json:"DstASName,omitempty"` + NextHopASName string `protobuf:"bytes,1185,opt,name=NextHopASName,proto3" json:"NextHopASName,omitempty"` + SamplerHostName string `protobuf:"bytes,1186,opt,name=SamplerHostName,proto3" json:"SamplerHostName,omitempty"` + // modify/snmp + SrcIfName string `protobuf:"bytes,1003,opt,name=SrcIfName,proto3" json:"SrcIfName,omitempty"` // TODO: rename to match InIf and OutIf + SrcIfDesc string `protobuf:"bytes,1004,opt,name=SrcIfDesc,proto3" json:"SrcIfDesc,omitempty"` // TODO: rename to match InIf and OutIf + SrcIfSpeed uint32 `protobuf:"varint,1005,opt,name=SrcIfSpeed,proto3" json:"SrcIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf + DstIfName string `protobuf:"bytes,1006,opt,name=DstIfName,proto3" json:"DstIfName,omitempty"` // TODO: rename to match InIf and OutIf + DstIfDesc string `protobuf:"bytes,1007,opt,name=DstIfDesc,proto3" json:"DstIfDesc,omitempty"` // TODO: rename to match InIf and OutIf + DstIfSpeed uint32 `protobuf:"varint,1008,opt,name=DstIfSpeed,proto3" json:"DstIfSpeed,omitempty"` // TODO: rename to match InIf and OutIf + // general + Note string `protobuf:"bytes,1016,opt,name=Note,proto3" json:"Note,omitempty"` // free-form field to implement anything + // modify/addrstrings + SourceIP string `protobuf:"bytes,1290,opt,name=SourceIP,proto3" json:"SourceIP,omitempty"` + DestinationIP string `protobuf:"bytes,1291,opt,name=DestinationIP,proto3" json:"DestinationIP,omitempty"` + NextHopIP string `protobuf:"bytes,1292,opt,name=NextHopIP,proto3" json:"NextHopIP,omitempty"` + SamplerIP string `protobuf:"bytes,1293,opt,name=SamplerIP,proto3" json:"SamplerIP,omitempty"` + SourceMAC string `protobuf:"bytes,1294,opt,name=SourceMAC,proto3" json:"SourceMAC,omitempty"` + DestinationMAC string `protobuf:"bytes,1295,opt,name=DestinationMAC,proto3" json:"DestinationMAC,omitempty"` +} + +func (x *LegacyEnrichedFlow) Reset() { + *x = LegacyEnrichedFlow{} + mi := &file_legacyenrichedflow_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LegacyEnrichedFlow) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LegacyEnrichedFlow) ProtoMessage() {} + +func (x *LegacyEnrichedFlow) ProtoReflect() protoreflect.Message { + mi := &file_legacyenrichedflow_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LegacyEnrichedFlow.ProtoReflect.Descriptor instead. +func (*LegacyEnrichedFlow) Descriptor() ([]byte, []int) { + return file_legacyenrichedflow_proto_rawDescGZIP(), []int{0} +} + +func (x *LegacyEnrichedFlow) GetType() LegacyEnrichedFlow_FlowType { + if x != nil { + return x.Type + } + return LegacyEnrichedFlow_FLOWUNKNOWN +} + +func (x *LegacyEnrichedFlow) GetTimeReceived() uint64 { + if x != nil { + return x.TimeReceived + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSequenceNum() uint32 { + if x != nil { + return x.SequenceNum + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSamplingRate() uint64 { + if x != nil { + return x.SamplingRate + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetFlowDirection() uint32 { + if x != nil { + return x.FlowDirection + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSamplerAddress() []byte { + if x != nil { + return x.SamplerAddress + } + return nil +} + +func (x *LegacyEnrichedFlow) GetTimeFlowStart() uint64 { + if x != nil { + return x.TimeFlowStart + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeFlowEnd() uint64 { + if x != nil { + return x.TimeFlowEnd + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetBytes() uint64 { + if x != nil { + return x.Bytes + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPackets() uint64 { + if x != nil { + return x.Packets + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcAddr() []byte { + if x != nil { + return x.SrcAddr + } + return nil +} + +func (x *LegacyEnrichedFlow) GetDstAddr() []byte { + if x != nil { + return x.DstAddr + } + return nil +} + +func (x *LegacyEnrichedFlow) GetEtype() uint32 { + if x != nil { + return x.Etype + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetProto() uint32 { + if x != nil { + return x.Proto + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcPort() uint32 { + if x != nil { + return x.SrcPort + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstPort() uint32 { + if x != nil { + return x.DstPort + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetInIf() uint32 { + if x != nil { + return x.InIf + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetOutIf() uint32 { + if x != nil { + return x.OutIf + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcMac() uint64 { + if x != nil { + return x.SrcMac + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstMac() uint64 { + if x != nil { + return x.DstMac + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcVlan() uint32 { + if x != nil { + return x.SrcVlan + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstVlan() uint32 { + if x != nil { + return x.DstVlan + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetVlanId() uint32 { + if x != nil { + return x.VlanId + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIngressVrfID() uint32 { + if x != nil { + return x.IngressVrfID + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetEgressVrfID() uint32 { + if x != nil { + return x.EgressVrfID + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIPTos() uint32 { + if x != nil { + return x.IPTos + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetForwardingStatus() uint32 { + if x != nil { + return x.ForwardingStatus + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIPTTL() uint32 { + if x != nil { + return x.IPTTL + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTCPFlags() uint32 { + if x != nil { + return x.TCPFlags + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIcmpType() uint32 { + if x != nil { + return x.IcmpType + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIcmpCode() uint32 { + if x != nil { + return x.IcmpCode + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetIPv6FlowLabel() uint32 { + if x != nil { + return x.IPv6FlowLabel + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetFragmentId() uint32 { + if x != nil { + return x.FragmentId + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetFragmentOffset() uint32 { + if x != nil { + return x.FragmentOffset + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetBiFlowDirection() uint32 { + if x != nil { + return x.BiFlowDirection + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcAS() uint32 { + if x != nil { + return x.SrcAS + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstAS() uint32 { + if x != nil { + return x.DstAS + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetNextHop() []byte { + if x != nil { + return x.NextHop + } + return nil +} + +func (x *LegacyEnrichedFlow) GetNextHopAS() uint32 { + if x != nil { + return x.NextHopAS + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcNet() uint32 { + if x != nil { + return x.SrcNet + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstNet() uint32 { + if x != nil { + return x.DstNet + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetHasMPLS() bool { + if x != nil { + return x.HasMPLS + } + return false +} + +func (x *LegacyEnrichedFlow) GetMPLSCount() uint32 { + if x != nil { + return x.MPLSCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS1TTL() uint32 { + if x != nil { + return x.MPLS1TTL + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS1Label() uint32 { + if x != nil { + return x.MPLS1Label + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS2TTL() uint32 { + if x != nil { + return x.MPLS2TTL + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS2Label() uint32 { + if x != nil { + return x.MPLS2Label + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS3TTL() uint32 { + if x != nil { + return x.MPLS3TTL + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLS3Label() uint32 { + if x != nil { + return x.MPLS3Label + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLSLastTTL() uint32 { + if x != nil { + return x.MPLSLastTTL + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetMPLSLastLabel() uint32 { + if x != nil { + return x.MPLSLastLabel + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketBytesMin() uint32 { + if x != nil { + return x.PacketBytesMin + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketBytesMax() uint32 { + if x != nil { + return x.PacketBytesMax + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketBytesMean() uint32 { + if x != nil { + return x.PacketBytesMean + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketBytesStdDev() uint32 { + if x != nil { + return x.PacketBytesStdDev + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketIATMin() uint64 { + if x != nil { + return x.PacketIATMin + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketIATMax() uint64 { + if x != nil { + return x.PacketIATMax + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketIATMean() uint64 { + if x != nil { + return x.PacketIATMean + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPacketIATStdDev() uint64 { + if x != nil { + return x.PacketIATStdDev + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetHeaderBytes() uint32 { + if x != nil { + return x.HeaderBytes + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetFINFlagCount() uint64 { + if x != nil { + return x.FINFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSYNFlagCount() uint64 { + if x != nil { + return x.SYNFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetRSTFlagCount() uint64 { + if x != nil { + return x.RSTFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPSHFlagCount() uint64 { + if x != nil { + return x.PSHFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetACKFlagCount() uint64 { + if x != nil { + return x.ACKFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetURGFlagCount() uint64 { + if x != nil { + return x.URGFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetCWRFlagCount() uint64 { + if x != nil { + return x.CWRFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetECEFlagCount() uint64 { + if x != nil { + return x.ECEFlagCount + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetPayloadPackets() uint64 { + if x != nil { + return x.PayloadPackets + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeActiveMin() uint64 { + if x != nil { + return x.TimeActiveMin + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeActiveMax() uint64 { + if x != nil { + return x.TimeActiveMax + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeActiveMean() uint64 { + if x != nil { + return x.TimeActiveMean + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeActiveStdDev() uint64 { + if x != nil { + return x.TimeActiveStdDev + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeIdleMin() uint64 { + if x != nil { + return x.TimeIdleMin + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeIdleMax() uint64 { + if x != nil { + return x.TimeIdleMax + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeIdleMean() uint64 { + if x != nil { + return x.TimeIdleMean + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetTimeIdleStdDev() uint64 { + if x != nil { + return x.TimeIdleStdDev + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetCid() uint32 { + if x != nil { + return x.Cid + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetCidString() string { + if x != nil { + return x.CidString + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcCid() uint32 { + if x != nil { + return x.SrcCid + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstCid() uint32 { + if x != nil { + return x.DstCid + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSrcAddrAnon() LegacyEnrichedFlow_AnonymizedType { + if x != nil { + return x.SrcAddrAnon + } + return LegacyEnrichedFlow_NotAnonymized +} + +func (x *LegacyEnrichedFlow) GetDstAddrAnon() LegacyEnrichedFlow_AnonymizedType { + if x != nil { + return x.DstAddrAnon + } + return LegacyEnrichedFlow_NotAnonymized +} + +func (x *LegacyEnrichedFlow) GetSrcAddrPreservedLen() uint32 { + if x != nil { + return x.SrcAddrPreservedLen + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstAddrPreservedLen() uint32 { + if x != nil { + return x.DstAddrPreservedLen + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetSamplerAddrAnon() LegacyEnrichedFlow_AnonymizedType { + if x != nil { + return x.SamplerAddrAnon + } + return LegacyEnrichedFlow_NotAnonymized +} + +func (x *LegacyEnrichedFlow) GetSamplerAddrAnonPreservedPrefixLen() uint32 { + if x != nil { + return x.SamplerAddrAnonPreservedPrefixLen + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetASPath() []uint32 { + if x != nil { + return x.ASPath + } + return nil +} + +func (x *LegacyEnrichedFlow) GetMed() uint32 { + if x != nil { + return x.Med + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetLocalPref() uint32 { + if x != nil { + return x.LocalPref + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetValidationStatus() LegacyEnrichedFlow_ValidationStatusType { + if x != nil { + return x.ValidationStatus + } + return LegacyEnrichedFlow_Unknown +} + +func (x *LegacyEnrichedFlow) GetRemoteCountry() string { + if x != nil { + return x.RemoteCountry + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcCountry() string { + if x != nil { + return x.SrcCountry + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDstCountry() string { + if x != nil { + return x.DstCountry + } + return "" +} + +func (x *LegacyEnrichedFlow) GetNormalized() LegacyEnrichedFlow_NormalizedType { + if x != nil { + return x.Normalized + } + return LegacyEnrichedFlow_No +} + +func (x *LegacyEnrichedFlow) GetProtoName() string { + if x != nil { + return x.ProtoName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetRemoteAddr() LegacyEnrichedFlow_RemoteAddrType { + if x != nil { + return x.RemoteAddr + } + return LegacyEnrichedFlow_Neither +} + +func (x *LegacyEnrichedFlow) GetSrcHostName() string { + if x != nil { + return x.SrcHostName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDstHostName() string { + if x != nil { + return x.DstHostName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetNextHopHostName() string { + if x != nil { + return x.NextHopHostName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcASName() string { + if x != nil { + return x.SrcASName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDstASName() string { + if x != nil { + return x.DstASName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetNextHopASName() string { + if x != nil { + return x.NextHopASName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSamplerHostName() string { + if x != nil { + return x.SamplerHostName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcIfName() string { + if x != nil { + return x.SrcIfName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcIfDesc() string { + if x != nil { + return x.SrcIfDesc + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSrcIfSpeed() uint32 { + if x != nil { + return x.SrcIfSpeed + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetDstIfName() string { + if x != nil { + return x.DstIfName + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDstIfDesc() string { + if x != nil { + return x.DstIfDesc + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDstIfSpeed() uint32 { + if x != nil { + return x.DstIfSpeed + } + return 0 +} + +func (x *LegacyEnrichedFlow) GetNote() string { + if x != nil { + return x.Note + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSourceIP() string { + if x != nil { + return x.SourceIP + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDestinationIP() string { + if x != nil { + return x.DestinationIP + } + return "" +} + +func (x *LegacyEnrichedFlow) GetNextHopIP() string { + if x != nil { + return x.NextHopIP + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSamplerIP() string { + if x != nil { + return x.SamplerIP + } + return "" +} + +func (x *LegacyEnrichedFlow) GetSourceMAC() string { + if x != nil { + return x.SourceMAC + } + return "" +} + +func (x *LegacyEnrichedFlow) GetDestinationMAC() string { + if x != nil { + return x.DestinationMAC + } + return "" +} + +var File_legacyenrichedflow_proto protoreflect.FileDescriptor + +var file_legacyenrichedflow_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, + 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, + 0x70, 0x62, 0x22, 0xa1, 0x23, 0x0a, 0x12, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, + 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x37, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, + 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, + 0x6c, 0x6f, 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x69, + 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x26, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, + 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x44, + 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x44, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x44, + 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x18, 0x12, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x75, + 0x74, 0x49, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4f, 0x75, 0x74, 0x49, 0x66, + 0x12, 0x16, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x4d, + 0x61, 0x63, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4d, 0x61, 0x63, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x73, + 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x44, 0x73, 0x74, + 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x18, 0x1d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, + 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x18, 0x27, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, + 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x18, + 0x28, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, + 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x46, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x10, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x43, + 0x50, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x54, 0x43, + 0x50, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x20, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, + 0x0a, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, + 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x46, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, 0x12, 0x14, 0x0a, 0x05, + 0x44, 0x73, 0x74, 0x41, 0x53, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x44, 0x73, 0x74, + 0x41, 0x53, 0x12, 0x18, 0x0a, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1c, 0x0a, 0x09, + 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x72, + 0x63, 0x4e, 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x4e, + 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x61, + 0x73, 0x4d, 0x50, 0x4c, 0x53, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x61, 0x73, + 0x4d, 0x50, 0x4c, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x18, 0x37, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x12, 0x1e, + 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, + 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x50, + 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x50, + 0x4c, 0x53, 0x33, 0x54, 0x54, 0x4c, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x50, + 0x4c, 0x53, 0x33, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x33, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, 0x53, + 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x50, 0x4c, 0x53, 0x4c, 0x61, + 0x73, 0x74, 0x54, 0x54, 0x4c, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, 0x50, 0x4c, + 0x53, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x54, 0x4c, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x50, 0x4c, 0x53, + 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0d, 0x4d, 0x50, 0x4c, 0x53, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x27, + 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, + 0x18, 0xcc, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xcd, 0x08, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, + 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, + 0x65, 0x61, 0x6e, 0x18, 0xce, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, 0x0a, 0x11, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, + 0x18, 0xcf, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xd6, 0x08, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x12, + 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, 0x18, + 0xd7, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, + 0x54, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, + 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xd8, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x0f, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xd9, + 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, + 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0xe0, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x46, 0x49, 0x4e, + 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xea, 0x08, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, + 0x0a, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xeb, + 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0xec, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, 0x53, 0x54, 0x46, + 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x53, 0x48, 0x46, + 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xed, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, + 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xee, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0xef, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, + 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, + 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf0, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, + 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf1, 0x08, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x18, 0xf4, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, + 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xfe, 0x08, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, + 0x6e, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, + 0x61, 0x78, 0x18, 0xff, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x80, 0x09, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, + 0x6e, 0x12, 0x2b, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, + 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x81, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x54, 0x69, + 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, + 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0x82, 0x09, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, + 0x6e, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, 0x78, + 0x18, 0x83, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, + 0x65, 0x4d, 0x61, 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, + 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x84, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, + 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, + 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x85, 0x09, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, + 0x65, 0x76, 0x12, 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x03, 0x43, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x18, 0xf4, + 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x12, 0x17, 0x0a, + 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x18, 0xf5, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, + 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x12, 0x4c, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, + 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x88, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, + 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, + 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, + 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, + 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, + 0x6e, 0x6f, 0x6e, 0x18, 0x89, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, + 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, + 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, + 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x8a, 0x09, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x8b, 0x09, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x54, 0x0a, 0x0f, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x8c, 0x09, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x67, 0x61, + 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, + 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x4d, + 0x0a, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, + 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x4c, 0x65, 0x6e, 0x18, 0x8d, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x17, 0x0a, + 0x06, 0x41, 0x53, 0x50, 0x61, 0x74, 0x68, 0x18, 0x93, 0x09, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, + 0x41, 0x53, 0x50, 0x61, 0x74, 0x68, 0x12, 0x11, 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0x94, 0x09, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0x95, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x12, 0x5c, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x96, 0x09, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x67, + 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf2, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, + 0x0a, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf6, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, + 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf7, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x4a, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0xea, 0x07, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, + 0x2e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xf1, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xf3, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x45, + 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9c, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, + 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, + 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9d, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, + 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x9e, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, + 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9f, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, + 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0xa0, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, + 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, + 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xa1, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, + 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0xa2, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, + 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, + 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, + 0x65, 0x73, 0x63, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, + 0x66, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, + 0x65, 0x65, 0x64, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, + 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, + 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, + 0x73, 0x63, 0x18, 0xef, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, + 0x44, 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, + 0x65, 0x64, 0x18, 0xf0, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, + 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xf8, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, 0x8a, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, 0x8b, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, + 0x0a, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x18, 0x8c, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, + 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x18, 0x8d, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x18, 0x8e, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x18, 0x8f, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x41, 0x43, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4c, 0x4f, 0x57, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x35, 0x10, 0x01, 0x12, 0x0e, + 0x0a, 0x0a, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x35, 0x10, 0x02, 0x12, 0x0e, + 0x0a, 0x0a, 0x4e, 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x39, 0x10, 0x03, 0x12, 0x09, + 0x0a, 0x05, 0x49, 0x50, 0x46, 0x49, 0x58, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x42, 0x50, + 0x46, 0x10, 0x05, 0x22, 0x32, 0x0a, 0x0e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, + 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, + 0x74, 0x6f, 0x50, 0x41, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, + 0x75, 0x6e, 0x64, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x10, 0x03, 0x22, 0x21, 0x0a, 0x0e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, + 0x59, 0x65, 0x73, 0x10, 0x01, 0x22, 0x2f, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, + 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, + 0x65, 0x72, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, + 0x03, 0x44, 0x73, 0x74, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x77, 0x4e, 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, + 0x6c, 0x6f, 0x77, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_legacyenrichedflow_proto_rawDescOnce sync.Once + file_legacyenrichedflow_proto_rawDescData = file_legacyenrichedflow_proto_rawDesc +) + +func file_legacyenrichedflow_proto_rawDescGZIP() []byte { + file_legacyenrichedflow_proto_rawDescOnce.Do(func() { + file_legacyenrichedflow_proto_rawDescData = protoimpl.X.CompressGZIP(file_legacyenrichedflow_proto_rawDescData) + }) + return file_legacyenrichedflow_proto_rawDescData +} + +var file_legacyenrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_legacyenrichedflow_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_legacyenrichedflow_proto_goTypes = []any{ + (LegacyEnrichedFlow_FlowType)(0), // 0: flowpb.LegacyEnrichedFlow.FlowType + (LegacyEnrichedFlow_AnonymizedType)(0), // 1: flowpb.LegacyEnrichedFlow.AnonymizedType + (LegacyEnrichedFlow_ValidationStatusType)(0), // 2: flowpb.LegacyEnrichedFlow.ValidationStatusType + (LegacyEnrichedFlow_NormalizedType)(0), // 3: flowpb.LegacyEnrichedFlow.NormalizedType + (LegacyEnrichedFlow_RemoteAddrType)(0), // 4: flowpb.LegacyEnrichedFlow.RemoteAddrType + (*LegacyEnrichedFlow)(nil), // 5: flowpb.LegacyEnrichedFlow +} +var file_legacyenrichedflow_proto_depIdxs = []int32{ + 0, // 0: flowpb.LegacyEnrichedFlow.Type:type_name -> flowpb.LegacyEnrichedFlow.FlowType + 1, // 1: flowpb.LegacyEnrichedFlow.SrcAddrAnon:type_name -> flowpb.LegacyEnrichedFlow.AnonymizedType + 1, // 2: flowpb.LegacyEnrichedFlow.DstAddrAnon:type_name -> flowpb.LegacyEnrichedFlow.AnonymizedType + 1, // 3: flowpb.LegacyEnrichedFlow.SamplerAddrAnon:type_name -> flowpb.LegacyEnrichedFlow.AnonymizedType + 2, // 4: flowpb.LegacyEnrichedFlow.ValidationStatus:type_name -> flowpb.LegacyEnrichedFlow.ValidationStatusType + 3, // 5: flowpb.LegacyEnrichedFlow.Normalized:type_name -> flowpb.LegacyEnrichedFlow.NormalizedType + 4, // 6: flowpb.LegacyEnrichedFlow.RemoteAddr:type_name -> flowpb.LegacyEnrichedFlow.RemoteAddrType + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_legacyenrichedflow_proto_init() } +func file_legacyenrichedflow_proto_init() { + if File_legacyenrichedflow_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_legacyenrichedflow_proto_rawDesc, + NumEnums: 5, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_legacyenrichedflow_proto_goTypes, + DependencyIndexes: file_legacyenrichedflow_proto_depIdxs, + EnumInfos: file_legacyenrichedflow_proto_enumTypes, + MessageInfos: file_legacyenrichedflow_proto_msgTypes, + }.Build() + File_legacyenrichedflow_proto = out.File + file_legacyenrichedflow_proto_rawDesc = nil + file_legacyenrichedflow_proto_goTypes = nil + file_legacyenrichedflow_proto_depIdxs = nil +} diff --git a/pb/legacyenrichedflow.proto b/pb/legacyenrichedflow.proto new file mode 100644 index 0000000..6853040 --- /dev/null +++ b/pb/legacyenrichedflow.proto @@ -0,0 +1,225 @@ +syntax = "proto3"; +package flowpb; +option go_package = "github.com/bwNetFlow/flowpipeline/pb;"; + +message LegacyEnrichedFlow { + + enum FlowType { + FLOWUNKNOWN = 0; + SFLOW_5 = 1; + NETFLOW_V5 = 2; + NETFLOW_V9 = 3; + IPFIX = 4; + EBPF = 5; + } + FlowType Type = 1; + + uint64 TimeReceived = 2; + uint32 SequenceNum = 4; + uint64 SamplingRate = 3; + + uint32 FlowDirection = 42; + + // Sampler information + bytes SamplerAddress = 11; + + // Found inside packet + uint64 TimeFlowStart = 38; + uint64 TimeFlowEnd = 5; + + // Size of the sampled packet + uint64 Bytes = 9; + uint64 Packets = 10; + + // Source/destination addresses + bytes SrcAddr = 6; + bytes DstAddr = 7; + + // Layer 3 protocol (IPv4/IPv6/ARP/MPLS...) + uint32 Etype = 30; + + // Layer 4 protocol + uint32 Proto = 20; + + // Ports for UDP and TCP + uint32 SrcPort = 21; + uint32 DstPort = 22; + + // Interfaces + uint32 InIf = 18; + uint32 OutIf = 19; + + // Ethernet information + uint64 SrcMac = 27; + uint64 DstMac = 28; + + // Vlan + uint32 SrcVlan = 33; + uint32 DstVlan = 34; + // 802.1q VLAN in sampled packet + uint32 VlanId = 29; + + // VRF + uint32 IngressVrfID = 39; + uint32 EgressVrfID = 40; + + // IP and TCP special flags + uint32 IPTos = 23; + uint32 ForwardingStatus = 24; + uint32 IPTTL = 25; + uint32 TCPFlags = 26; + uint32 IcmpType = 31; + uint32 IcmpCode = 32; + uint32 IPv6FlowLabel = 37; + // Fragments (IPv4/IPv6) + uint32 FragmentId = 35; + uint32 FragmentOffset = 36; + uint32 BiFlowDirection = 41; + + // Autonomous system information + uint32 SrcAS = 14; + uint32 DstAS = 15; + + bytes NextHop = 12; + uint32 NextHopAS = 13; + + // Prefix size + uint32 SrcNet = 16; + uint32 DstNet = 17; + + // MPLS information + bool HasMPLS = 53; + uint32 MPLSCount = 54; + uint32 MPLS1TTL = 55; // First TTL + uint32 MPLS1Label = 56; // First Label + uint32 MPLS2TTL = 57; // Second TTL + uint32 MPLS2Label = 58; // Second Label + uint32 MPLS3TTL = 59; // Third TTL + uint32 MPLS3Label = 60; // Third Label + uint32 MPLSLastTTL = 61; // Last TTL + uint32 MPLSLastLabel = 62; // Last Label + + // bwNET custom fields: + + // input/bpf: + // Many of the above fields can not be filled when creating flows from eBPF. + // However, there are some additional packet level metrics available, + // inspired by this list: + // https://github.com/ahlashkari/CICFlowMeter/blob/master/ReadMe.txt + + uint32 PacketBytesMin = 1100; // new, single packet means uint32 < MTU + uint32 PacketBytesMax = 1101; // new + uint32 PacketBytesMean = 1102; // new + uint32 PacketBytesStdDev = 1103; // new + + uint64 PacketIATMin = 1110; // new + uint64 PacketIATMax = 1111; // new + uint64 PacketIATMean = 1112; // new + uint64 PacketIATStdDev = 1113; // new + + uint32 HeaderBytes = 1120; // new + + uint64 FINFlagCount = 1130; // new + uint64 SYNFlagCount = 1131; // new + uint64 RSTFlagCount = 1132; // new + uint64 PSHFlagCount = 1133; // new + uint64 ACKFlagCount = 1134; // new + uint64 URGFlagCount = 1135; // new + uint64 CWRFlagCount = 1136; // new + uint64 ECEFlagCount = 1137; // new + + uint64 PayloadPackets = 1140; // new + + uint64 TimeActiveMin = 1150; // new + uint64 TimeActiveMax = 1151; // new + uint64 TimeActiveMean = 1152; // new + uint64 TimeActiveStdDev = 1153; // new + uint64 TimeIdleMin = 1154; // new + uint64 TimeIdleMax = 1155; // new + uint64 TimeIdleMean = 1156; // new + uint64 TimeIdleStdDev = 1157; // new + + // modify/addcid + uint32 Cid = 1000; // TODO: deprecate and provide as helper? + string CidString = 1001; // deprecated, delete for v1.0.0 + uint32 SrcCid = 1012; + uint32 DstCid = 1013; + + // modify/anonymize + enum AnonymizedType { + NotAnonymized = 0; + CryptoPAN = 1; + } + AnonymizedType SrcAddrAnon = 1160; + AnonymizedType DstAddrAnon = 1161; + uint32 SrcAddrPreservedLen = 1162; + uint32 DstAddrPreservedLen = 1163; + + AnonymizedType SamplerAddrAnon = 1164; + uint32 SamplerAddrAnonPreservedPrefixLen = 1165; + + // modify/bgp + // as done by a number of Netflow implementations, these refer to the destination + repeated uint32 ASPath = 1171; + uint32 Med = 1172; + uint32 LocalPref = 1173; + enum ValidationStatusType { + Unknown = 0; + Valid = 1; + NotFound = 2; + Invalid = 3; + } + ValidationStatusType ValidationStatus = 1174; + + // modify/geolocation + string RemoteCountry = 1010; // TODO: deprecate and provide as helper + string SrcCountry = 1014; + string DstCountry = 1015; + + // modify/normalize + enum NormalizedType { + No = 0; + Yes = 1; + } + NormalizedType Normalized = 1002; // TODO: deprecate and replace with helper? + // TODO: if not, replace with OriginalSamplingRate instead and set SamplingRate to 1? + + // modify/protomap + string ProtoName = 1009; // TODO: deprecate and replace with helper, why lug a string along... + + // modify/remoteaddress + enum RemoteAddrType { + Neither = 0; + Src = 1; + Dst = 2; + } + RemoteAddrType RemoteAddr = 1011; // TODO: figure out a better system? applicable only to service providers right now... + + // modify/reversedns + string SrcHostName = 1180; + string DstHostName = 1181; + string NextHopHostName = 1182; + string SrcASName = 1183; + string DstASName = 1184; + string NextHopASName = 1185; + string SamplerHostName = 1186; + + // modify/snmp + string SrcIfName = 1003; // TODO: rename to match InIf and OutIf + string SrcIfDesc = 1004; // TODO: rename to match InIf and OutIf + uint32 SrcIfSpeed = 1005; // TODO: rename to match InIf and OutIf + string DstIfName = 1006; // TODO: rename to match InIf and OutIf + string DstIfDesc = 1007; // TODO: rename to match InIf and OutIf + uint32 DstIfSpeed = 1008; // TODO: rename to match InIf and OutIf + + // general + string Note = 1016; // free-form field to implement anything + + // modify/addrstrings + string SourceIP = 1290; + string DestinationIP = 1291; + string NextHopIP = 1292; + string SamplerIP = 1293; + string SourceMAC = 1294; + string DestinationMAC = 1295; +} \ No newline at end of file diff --git a/segments/input/kafkaconsumer/handler.go b/segments/input/kafkaconsumer/handler.go index 1d18b7f..551569c 100644 --- a/segments/input/kafkaconsumer/handler.go +++ b/segments/input/kafkaconsumer/handler.go @@ -44,15 +44,15 @@ func (h *Handler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama case message := <-claim.Messages(): if h.legacy { session.MarkMessage(message, "") - flowMsg := new(pb.EnrichedFlow) + flowMsg := new(pb.LegacyEnrichedFlow) if err := proto.Unmarshal(message.Value, flowMsg); err == nil { - h.flows <- flowMsg + h.flows <- flowMsg.ConvertToEnrichedFlow() } else { log.Printf("[warning] KafkaConsumer: Error decoding flow, this might be due to the use of Goflow custom fields. Original error:\n %s", err) } } else { - var msg pb.ProtoProducerMessage - if err := protodelim.UnmarshalFrom(bytes.NewReader(message.Value), &msg); err != nil { + msg := new(pb.ProtoProducerMessage) + if err := protodelim.UnmarshalFrom(bytes.NewReader(message.Value), msg); err != nil { slog.Error("error unmarshalling message", slog.String("error", err.Error())) continue } diff --git a/segments/output/csv/csv.go b/segments/output/csv/csv.go index 9a48d59..7e17a70 100644 --- a/segments/output/csv/csv.go +++ b/segments/output/csv/csv.go @@ -53,7 +53,7 @@ func (segment Csv) New(config map[string]string) segments.Segment { field = strings.TrimSpace(field) _, found := protofields.FieldByName(field) if !found { - log.Printf("[error] Csv: Field specified in 'fields' does not exist.") + log.Printf("[error] Csv: Field '%s' specified in 'fields' does not exist.", field) return nil } heading = append(heading, field) diff --git a/segments/output/kafkaproducer/kafkaproducer.go b/segments/output/kafkaproducer/kafkaproducer.go index 3fd553a..a8c7b32 100644 --- a/segments/output/kafkaproducer/kafkaproducer.go +++ b/segments/output/kafkaproducer/kafkaproducer.go @@ -177,7 +177,8 @@ func (segment *KafkaProducer) Run(wg *sync.WaitGroup) { segment.Out <- msg var binary []byte if segment.Legacy { - if binary, err = proto.Marshal(msg); err != nil { + legacyFlow := msg.ConvertToLegacyEnrichedFlow() + if binary, err = proto.Marshal(legacyFlow); err != nil { log.Printf("[error] KafkaProducer: Error encoding protobuf. %s", err) continue } diff --git a/segments/output/sqlite/sqlite.go b/segments/output/sqlite/sqlite.go index 2c35a29..dc8d0fb 100644 --- a/segments/output/sqlite/sqlite.go +++ b/segments/output/sqlite/sqlite.go @@ -72,7 +72,7 @@ func (segment Sqlite) New(config map[string]string) segments.Segment { for _, field := range conffields { protofield, found := protofields.FieldByName(field) if !found { - log.Printf("[error] Csv: Field specified in 'fields' does not exist.") + log.Printf("[error] sqlite: Field '%s' specified in 'fields' does not exist.", field) return nil } newsegment.fieldNames = append(newsegment.fieldNames, field) From 06368cd030028f8f81e7d25420fa132dee79fc47 Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Mon, 18 Nov 2024 12:37:28 +0100 Subject: [PATCH 4/6] Bugfix: segment anonymize not filling AddrAnon fields --- go.mod | 2 +- pb/enrichedflow.pb.go | 725 +++++++++++++------------ pb/enrichedflow.proto | 3 + segments/modify/anonymize/anonymize.go | 4 + 4 files changed, 375 insertions(+), 359 deletions(-) diff --git a/go.mod b/go.mod index 1928f1a..ec97f55 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( github.com/google/gopacket v1.1.19 github.com/hashicorp/logutils v1.0.0 github.com/influxdata/influxdb-client-go/v2 v2.12.2 + github.com/klauspost/compress v1.15.15 github.com/mattn/go-sqlite3 v1.14.16 github.com/netsampler/goflow2 v1.1.1 github.com/oschwald/maxminddb-golang v1.10.0 @@ -64,7 +65,6 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/k-sone/critbitgo v1.4.0 // indirect github.com/kaorimatz/go-mrt v0.0.0-20210326003454-aa11f3646f93 // indirect - github.com/klauspost/compress v1.15.15 // indirect github.com/libp2p/go-reuseport v0.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect diff --git a/pb/enrichedflow.pb.go b/pb/enrichedflow.pb.go index a64ec93..393cc5c 100644 --- a/pb/enrichedflow.pb.go +++ b/pb/enrichedflow.pb.go @@ -1,8 +1,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v4.23.2 -// source: pb/enrichedflow.proto +// protoc-gen-go v1.35.1 +// protoc v3.21.12 +// source: enrichedflow.proto package pb @@ -62,11 +62,11 @@ func (x EnrichedFlow_FlowType) String() string { } func (EnrichedFlow_FlowType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[0].Descriptor() + return file_enrichedflow_proto_enumTypes[0].Descriptor() } func (EnrichedFlow_FlowType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[0] + return &file_enrichedflow_proto_enumTypes[0] } func (x EnrichedFlow_FlowType) Number() protoreflect.EnumNumber { @@ -75,7 +75,7 @@ func (x EnrichedFlow_FlowType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_FlowType.Descriptor instead. func (EnrichedFlow_FlowType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 0} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 0} } // modify/anonymize @@ -109,11 +109,11 @@ func (x EnrichedFlow_AnonymizedType) String() string { } func (EnrichedFlow_AnonymizedType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[1].Descriptor() + return file_enrichedflow_proto_enumTypes[1].Descriptor() } func (EnrichedFlow_AnonymizedType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[1] + return &file_enrichedflow_proto_enumTypes[1] } func (x EnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { @@ -122,7 +122,7 @@ func (x EnrichedFlow_AnonymizedType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_AnonymizedType.Descriptor instead. func (EnrichedFlow_AnonymizedType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 1} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 1} } type EnrichedFlow_ValidationStatusType int32 @@ -161,11 +161,11 @@ func (x EnrichedFlow_ValidationStatusType) String() string { } func (EnrichedFlow_ValidationStatusType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[2].Descriptor() + return file_enrichedflow_proto_enumTypes[2].Descriptor() } func (EnrichedFlow_ValidationStatusType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[2] + return &file_enrichedflow_proto_enumTypes[2] } func (x EnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { @@ -174,7 +174,7 @@ func (x EnrichedFlow_ValidationStatusType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_ValidationStatusType.Descriptor instead. func (EnrichedFlow_ValidationStatusType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 2} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 2} } // modify/normalize @@ -208,11 +208,11 @@ func (x EnrichedFlow_NormalizedType) String() string { } func (EnrichedFlow_NormalizedType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[3].Descriptor() + return file_enrichedflow_proto_enumTypes[3].Descriptor() } func (EnrichedFlow_NormalizedType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[3] + return &file_enrichedflow_proto_enumTypes[3] } func (x EnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { @@ -221,7 +221,7 @@ func (x EnrichedFlow_NormalizedType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_NormalizedType.Descriptor instead. func (EnrichedFlow_NormalizedType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 3} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 3} } // modify/remoteaddress @@ -258,11 +258,11 @@ func (x EnrichedFlow_RemoteAddrType) String() string { } func (EnrichedFlow_RemoteAddrType) Descriptor() protoreflect.EnumDescriptor { - return file_pb_enrichedflow_proto_enumTypes[4].Descriptor() + return file_enrichedflow_proto_enumTypes[4].Descriptor() } func (EnrichedFlow_RemoteAddrType) Type() protoreflect.EnumType { - return &file_pb_enrichedflow_proto_enumTypes[4] + return &file_enrichedflow_proto_enumTypes[4] } func (x EnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { @@ -271,7 +271,7 @@ func (x EnrichedFlow_RemoteAddrType) Number() protoreflect.EnumNumber { // Deprecated: Use EnrichedFlow_RemoteAddrType.Descriptor instead. func (EnrichedFlow_RemoteAddrType) EnumDescriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0, 4} + return file_enrichedflow_proto_rawDescGZIP(), []int{0, 4} } type EnrichedFlow struct { @@ -384,6 +384,8 @@ type EnrichedFlow struct { DstAddrPreservedLen uint32 `protobuf:"varint,1163,opt,name=DstAddrPreservedLen,proto3" json:"DstAddrPreservedLen,omitempty"` SamplerAddrAnon EnrichedFlow_AnonymizedType `protobuf:"varint,1164,opt,name=SamplerAddrAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"SamplerAddrAnon,omitempty"` SamplerAddrAnonPreservedPrefixLen uint32 `protobuf:"varint,1165,opt,name=SamplerAddrAnonPreservedPrefixLen,proto3" json:"SamplerAddrAnonPreservedPrefixLen,omitempty"` + NextHopAnon EnrichedFlow_AnonymizedType `protobuf:"varint,2166,opt,name=NextHopAnon,proto3,enum=flowpb.EnrichedFlow_AnonymizedType" json:"NextHopAnon,omitempty"` + NextHopAnonPreservedPrefixLen uint32 `protobuf:"varint,2167,opt,name=NextHopAnonPreservedPrefixLen,proto3" json:"NextHopAnonPreservedPrefixLen,omitempty"` // modify/bgp // as done by a number of Netflow implementations, these refer to the destination ASPath []uint32 `protobuf:"varint,1171,rep,packed,name=ASPath,proto3" json:"ASPath,omitempty"` @@ -426,11 +428,9 @@ type EnrichedFlow struct { func (x *EnrichedFlow) Reset() { *x = EnrichedFlow{} - if protoimpl.UnsafeEnabled { - mi := &file_pb_enrichedflow_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_enrichedflow_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *EnrichedFlow) String() string { @@ -440,8 +440,8 @@ func (x *EnrichedFlow) String() string { func (*EnrichedFlow) ProtoMessage() {} func (x *EnrichedFlow) ProtoReflect() protoreflect.Message { - mi := &file_pb_enrichedflow_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_enrichedflow_proto_msgTypes[0] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -453,7 +453,7 @@ func (x *EnrichedFlow) ProtoReflect() protoreflect.Message { // Deprecated: Use EnrichedFlow.ProtoReflect.Descriptor instead. func (*EnrichedFlow) Descriptor() ([]byte, []int) { - return file_pb_enrichedflow_proto_rawDescGZIP(), []int{0} + return file_enrichedflow_proto_rawDescGZIP(), []int{0} } func (x *EnrichedFlow) GetType() EnrichedFlow_FlowType { @@ -1065,6 +1065,20 @@ func (x *EnrichedFlow) GetSamplerAddrAnonPreservedPrefixLen() uint32 { return 0 } +func (x *EnrichedFlow) GetNextHopAnon() EnrichedFlow_AnonymizedType { + if x != nil { + return x.NextHopAnon + } + return EnrichedFlow_NotAnonymized +} + +func (x *EnrichedFlow) GetNextHopAnonPreservedPrefixLen() uint32 { + if x != nil { + return x.NextHopAnonPreservedPrefixLen + } + return 0 +} + func (x *EnrichedFlow) GetASPath() []uint32 { if x != nil { return x.ASPath @@ -1275,311 +1289,319 @@ func (x *EnrichedFlow) GetDestinationMAC() string { return "" } -var File_pb_enrichedflow_proto protoreflect.FileDescriptor - -var file_pb_enrichedflow_proto_rawDesc = []byte{ - 0x0a, 0x15, 0x70, 0x62, 0x2f, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x66, 0x6c, 0x6f, - 0x77, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x22, - 0xf1, 0x22, 0x0a, 0x0c, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, - 0x12, 0x31, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, - 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, - 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, - 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x26, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, - 0x45, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x44, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x44, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x4f, - 0x75, 0x74, 0x49, 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4f, 0x75, 0x74, 0x49, - 0x66, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x18, 0x1b, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, - 0x4d, 0x61, 0x63, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4d, 0x61, - 0x63, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x21, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x44, - 0x73, 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x44, 0x73, - 0x74, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x18, - 0x1d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, - 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x18, 0x27, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, - 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, - 0x18, 0x28, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, - 0x66, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x18, 0x17, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x46, 0x6f, 0x72, - 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x18, 0x19, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x12, 0x1a, 0x0a, 0x08, 0x54, - 0x43, 0x50, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x54, - 0x43, 0x50, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, - 0x20, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x18, 0x25, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x46, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x28, 0x0a, - 0x0f, 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, 0x12, 0x14, 0x0a, - 0x05, 0x44, 0x73, 0x74, 0x41, 0x53, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x44, 0x73, - 0x74, 0x41, 0x53, 0x12, 0x18, 0x0a, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1c, 0x0a, - 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x53, - 0x72, 0x63, 0x4e, 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, - 0x4e, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, - 0x61, 0x73, 0x4d, 0x50, 0x4c, 0x53, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x61, - 0x73, 0x4d, 0x50, 0x4c, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x18, - 0x37, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x12, - 0x1e, 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x1a, 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x18, 0x39, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, - 0x50, 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x4d, - 0x50, 0x4c, 0x53, 0x33, 0x54, 0x54, 0x4c, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, - 0x50, 0x4c, 0x53, 0x33, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x33, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, - 0x53, 0x33, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x50, 0x4c, 0x53, 0x4c, - 0x61, 0x73, 0x74, 0x54, 0x54, 0x4c, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, 0x50, - 0x4c, 0x53, 0x4c, 0x61, 0x73, 0x74, 0x54, 0x54, 0x4c, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x50, 0x4c, - 0x53, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0d, 0x4d, 0x50, 0x4c, 0x53, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, - 0x6e, 0x18, 0xcc, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, - 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xcd, 0x08, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, - 0x78, 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xce, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, 0x0a, 0x11, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, - 0x76, 0x18, 0xcf, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, 0x0c, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xd6, 0x08, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, - 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, - 0x18, 0xd7, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, - 0x41, 0x54, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, - 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0xd8, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x0f, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, - 0xd9, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, - 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0xe0, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x46, 0x49, - 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xea, 0x08, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x23, 0x0a, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0xeb, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xec, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, 0x53, 0x54, - 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x53, 0x48, - 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xed, 0x08, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, - 0x0a, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xee, - 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0xef, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, 0x47, 0x46, - 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, 0x52, 0x46, - 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf0, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, - 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf1, 0x08, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, - 0x6b, 0x65, 0x74, 0x73, 0x18, 0xf4, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x54, - 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xfe, 0x08, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, - 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x4d, 0x61, 0x78, 0x18, 0xff, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, - 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x80, 0x09, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, - 0x61, 0x6e, 0x12, 0x2b, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x81, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x54, - 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, - 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0x82, +var File_enrichedflow_proto protoreflect.FileDescriptor + +var file_enrichedflow_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x65, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x22, 0x80, 0x24, 0x0a, + 0x0c, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x31, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x66, 0x6c, + 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, + 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, + 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x46, 0x6c, + 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0d, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, + 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x26, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x73, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x44, 0x73, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, 0x18, 0x1e, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x45, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x53, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x73, + 0x74, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x44, 0x73, 0x74, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x49, 0x6e, 0x49, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x75, 0x74, 0x49, + 0x66, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4f, 0x75, 0x74, 0x49, 0x66, 0x12, 0x16, + 0x0a, 0x06, 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, + 0x53, 0x72, 0x63, 0x4d, 0x61, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x4d, 0x61, 0x63, + 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x44, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x12, 0x18, + 0x0a, 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x53, 0x72, 0x63, 0x56, 0x6c, 0x61, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x73, 0x74, 0x56, + 0x6c, 0x61, 0x6e, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x44, 0x73, 0x74, 0x56, 0x6c, + 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x18, 0x1d, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x06, 0x56, 0x6c, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x12, 0x20, + 0x0a, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, 0x18, 0x28, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x45, 0x67, 0x72, 0x65, 0x73, 0x73, 0x56, 0x72, 0x66, 0x49, 0x44, + 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x49, 0x50, 0x54, 0x6f, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x10, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x18, 0x19, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x49, 0x50, 0x54, 0x54, 0x4c, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x46, + 0x6c, 0x61, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x54, 0x43, 0x50, 0x46, + 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x20, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x49, 0x63, 0x6d, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x25, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x49, 0x50, 0x76, 0x36, 0x46, 0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x23, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x46, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x42, 0x69, + 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x29, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x42, 0x69, 0x46, 0x6c, 0x6f, 0x77, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x53, 0x72, 0x63, 0x41, 0x53, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x73, + 0x74, 0x41, 0x53, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x44, 0x73, 0x74, 0x41, 0x53, + 0x12, 0x18, 0x0a, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x4e, 0x65, + 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4e, + 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x4e, + 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x4e, 0x65, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x06, 0x44, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x61, 0x73, 0x4d, + 0x50, 0x4c, 0x53, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x61, 0x73, 0x4d, 0x50, + 0x4c, 0x53, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x36, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4d, 0x50, 0x4c, 0x53, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x18, 0x37, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, + 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x31, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, + 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, + 0x4d, 0x50, 0x4c, 0x53, 0x32, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, + 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, + 0x4c, 0x53, 0x32, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x50, 0x4c, 0x53, + 0x33, 0x54, 0x54, 0x4c, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x4d, 0x50, 0x4c, 0x53, + 0x33, 0x54, 0x54, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x33, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x4d, 0x50, 0x4c, 0x53, 0x33, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x50, 0x4c, 0x53, 0x4c, 0x61, 0x73, 0x74, + 0x54, 0x54, 0x4c, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4d, 0x50, 0x4c, 0x53, 0x4c, + 0x61, 0x73, 0x74, 0x54, 0x54, 0x4c, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x50, 0x4c, 0x53, 0x4c, 0x61, + 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4d, + 0x50, 0x4c, 0x53, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x27, 0x0a, 0x0e, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x18, 0xcc, + 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x18, 0xcd, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x29, + 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, + 0x6e, 0x18, 0xce, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x2d, 0x0a, 0x11, 0x50, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xcf, + 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x18, 0xd6, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x69, 0x6e, 0x12, 0x23, 0x0a, + 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x61, 0x78, 0x18, 0xd7, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, + 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, + 0x65, 0x61, 0x6e, 0x18, 0xd8, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x49, 0x41, 0x54, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x0f, 0x50, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0xd9, 0x08, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x41, 0x54, 0x53, 0x74, + 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x18, 0xe0, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0c, 0x46, 0x49, 0x4e, 0x46, 0x6c, + 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xea, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x46, 0x49, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, + 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xeb, 0x08, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x53, 0x59, 0x4e, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0xec, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x52, 0x53, 0x54, 0x46, 0x6c, 0x61, + 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x50, 0x53, 0x48, 0x46, 0x6c, 0x61, + 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xed, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, + 0x53, 0x48, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x41, + 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xee, 0x08, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x41, 0x43, 0x4b, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x23, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0xef, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x55, 0x52, 0x47, 0x46, 0x6c, 0x61, 0x67, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x43, 0x57, 0x52, 0x46, 0x6c, 0x61, 0x67, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf0, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x43, 0x57, + 0x52, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0c, 0x45, 0x43, + 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xf1, 0x08, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x45, 0x43, 0x45, 0x46, 0x6c, 0x61, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x27, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x18, 0xf4, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0xfe, 0x08, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x12, + 0x25, 0x0a, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, + 0x18, 0xff, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x80, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, + 0x2b, 0x0a, 0x10, 0x54, 0x69, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, + 0x44, 0x65, 0x76, 0x18, 0x81, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x54, 0x69, 0x6d, 0x65, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x12, 0x21, 0x0a, 0x0b, + 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x18, 0x82, 0x09, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x69, 0x6e, 0x12, + 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x18, 0x83, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, - 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x61, - 0x78, 0x18, 0x83, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, - 0x6c, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, - 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x18, 0x84, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, - 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, - 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x85, 0x09, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, - 0x44, 0x65, 0x76, 0x12, 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x03, 0x43, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, 0x64, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x18, - 0xf4, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x12, 0x17, - 0x0a, 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x18, 0xf5, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x06, 0x44, 0x73, 0x74, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, - 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x88, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, - 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, - 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, - 0x46, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x89, - 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, - 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, - 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, - 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x8a, - 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x44, 0x73, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, - 0x6e, 0x18, 0x8b, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, - 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x4e, 0x0a, - 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, - 0x18, 0x8c, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, - 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, - 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x53, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, - 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, - 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, - 0x65, 0x6e, 0x18, 0x8d, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x17, 0x0a, 0x06, - 0x41, 0x53, 0x50, 0x61, 0x74, 0x68, 0x18, 0x93, 0x09, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x41, - 0x53, 0x50, 0x61, 0x74, 0x68, 0x12, 0x11, 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0x94, 0x09, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x4d, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, - 0x6c, 0x50, 0x72, 0x65, 0x66, 0x18, 0x95, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x12, 0x56, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x96, 0x09, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, - 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x25, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, - 0x18, 0xf2, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf6, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x72, 0x63, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf7, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x73, - 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, - 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, - 0x6c, 0x6f, 0x77, 0x2e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x1d, - 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xf1, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, - 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xf3, 0x07, 0x20, 0x01, + 0x61, 0x78, 0x12, 0x23, 0x0a, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x4d, 0x65, + 0x61, 0x6e, 0x18, 0x84, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x54, 0x69, 0x6d, 0x65, 0x49, + 0x64, 0x6c, 0x65, 0x4d, 0x65, 0x61, 0x6e, 0x12, 0x27, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, + 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, 0x18, 0x85, 0x09, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x6c, 0x65, 0x53, 0x74, 0x64, 0x44, 0x65, 0x76, + 0x12, 0x11, 0x0a, 0x03, 0x43, 0x69, 0x64, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, + 0x43, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x69, 0x64, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x18, 0xf4, 0x07, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x06, 0x53, 0x72, 0x63, 0x43, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x06, 0x44, + 0x73, 0x74, 0x43, 0x69, 0x64, 0x18, 0xf5, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x44, 0x73, + 0x74, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, + 0x6e, 0x6f, 0x6e, 0x18, 0x88, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, + 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, + 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0b, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0b, + 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x89, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, - 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x9c, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, - 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9d, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x73, - 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x4e, 0x65, 0x78, - 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9e, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x9f, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0xa0, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0xa1, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, - 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xa2, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, - 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, - 0x73, 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x18, - 0xef, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, - 0x63, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, - 0xf0, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, - 0x65, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xf8, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x50, 0x18, 0x8a, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x50, 0x12, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x18, 0x8b, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x4e, - 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x18, 0x8c, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x18, 0x8d, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x18, 0x8e, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x18, 0x8f, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, - 0x43, 0x22, 0x5d, 0x0a, 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, - 0x0b, 0x46, 0x4c, 0x4f, 0x57, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x53, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x35, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, - 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x35, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, - 0x45, 0x54, 0x46, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x39, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x49, - 0x50, 0x46, 0x49, 0x58, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x42, 0x50, 0x46, 0x10, 0x05, - 0x22, 0x32, 0x0a, 0x0e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, - 0x7a, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x50, - 0x41, 0x4e, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, - 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x03, 0x22, - 0x21, 0x0a, 0x0e, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x65, 0x73, - 0x10, 0x01, 0x22, 0x2f, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x10, - 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x73, - 0x74, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x62, 0x77, 0x4e, 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, 0x6c, 0x6f, 0x77, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, + 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x8a, 0x09, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x13, 0x53, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x31, 0x0a, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, + 0x64, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x18, 0x8b, + 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x44, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x50, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x12, 0x4e, 0x0a, 0x0f, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0x8c, 0x09, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, + 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, + 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x21, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x18, + 0x8d, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x21, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x72, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x4e, 0x65, 0x78, + 0x74, 0x48, 0x6f, 0x70, 0x41, 0x6e, 0x6f, 0x6e, 0x18, 0xf6, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, + 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x6e, 0x6f, + 0x6e, 0x12, 0x45, 0x0a, 0x1d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x6e, 0x6f, 0x6e, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, + 0x65, 0x6e, 0x18, 0xf7, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1d, 0x4e, 0x65, 0x78, 0x74, 0x48, + 0x6f, 0x70, 0x41, 0x6e, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x50, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x12, 0x17, 0x0a, 0x06, 0x41, 0x53, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x93, 0x09, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x41, 0x53, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x11, 0x0a, 0x03, 0x4d, 0x65, 0x64, 0x18, 0x94, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x03, 0x4d, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x72, 0x65, + 0x66, 0x18, 0x95, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x50, + 0x72, 0x65, 0x66, 0x12, 0x56, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x96, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, + 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, + 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0d, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0xf2, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, + 0x18, 0xf6, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0a, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x72, + 0x79, 0x18, 0xf7, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x0a, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x66, 0x6c, 0x6f, 0x77, + 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x77, 0x2e, + 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, + 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x09, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xf1, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x18, 0xf3, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, + 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x72, 0x69, 0x63, 0x68, 0x65, 0x64, + 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x21, 0x0a, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9c, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x72, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x9d, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x73, 0x74, 0x48, 0x6f, 0x73, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, + 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9e, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x9f, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xa0, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, + 0x0a, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0xa1, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4e, 0x65, 0x78, 0x74, 0x48, 0x6f, 0x70, 0x41, + 0x53, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, + 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xa2, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xeb, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x18, 0xec, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x72, 0x63, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1f, + 0x0a, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0xed, 0x07, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x72, 0x63, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, + 0x1d, 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0xee, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x18, 0xef, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x44, 0x73, 0x74, 0x49, 0x66, 0x44, 0x65, 0x73, 0x63, 0x12, 0x1f, 0x0a, + 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0xf0, 0x07, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x44, 0x73, 0x74, 0x49, 0x66, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x13, + 0x0a, 0x04, 0x4e, 0x6f, 0x74, 0x65, 0x18, 0xf8, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x18, + 0x8a, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, + 0x12, 0x25, 0x0a, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x50, 0x18, 0x8b, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x4e, 0x65, 0x78, 0x74, 0x48, + 0x6f, 0x70, 0x49, 0x50, 0x18, 0x8c, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4e, 0x65, 0x78, + 0x74, 0x48, 0x6f, 0x70, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x72, 0x49, 0x50, 0x18, 0x8d, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x72, 0x49, 0x50, 0x12, 0x1d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, + 0x41, 0x43, 0x18, 0x8e, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4d, 0x41, 0x43, 0x12, 0x27, 0x0a, 0x0e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x18, 0x8f, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x41, 0x43, 0x22, 0x5d, 0x0a, + 0x08, 0x46, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4c, 0x4f, + 0x57, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x46, + 0x4c, 0x4f, 0x57, 0x5f, 0x35, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x54, 0x46, 0x4c, + 0x4f, 0x57, 0x5f, 0x56, 0x35, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x54, 0x46, 0x4c, + 0x4f, 0x57, 0x5f, 0x56, 0x39, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x50, 0x46, 0x49, 0x58, + 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x42, 0x50, 0x46, 0x10, 0x05, 0x22, 0x32, 0x0a, 0x0e, + 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, + 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x50, 0x41, 0x4e, 0x10, 0x01, + 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x01, + 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x10, 0x02, 0x12, 0x0b, + 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x10, 0x03, 0x22, 0x21, 0x0a, 0x0e, 0x4e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x06, 0x0a, + 0x02, 0x4e, 0x6f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x65, 0x73, 0x10, 0x01, 0x22, 0x2f, + 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x10, 0x00, 0x12, 0x07, 0x0a, + 0x03, 0x53, 0x72, 0x63, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x73, 0x74, 0x10, 0x02, 0x42, + 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x77, + 0x4e, 0x65, 0x74, 0x46, 0x6c, 0x6f, 0x77, 0x2f, 0x66, 0x6c, 0x6f, 0x77, 0x70, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x2f, 0x70, 0x62, 0x3b, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_pb_enrichedflow_proto_rawDescOnce sync.Once - file_pb_enrichedflow_proto_rawDescData = file_pb_enrichedflow_proto_rawDesc + file_enrichedflow_proto_rawDescOnce sync.Once + file_enrichedflow_proto_rawDescData = file_enrichedflow_proto_rawDesc ) -func file_pb_enrichedflow_proto_rawDescGZIP() []byte { - file_pb_enrichedflow_proto_rawDescOnce.Do(func() { - file_pb_enrichedflow_proto_rawDescData = protoimpl.X.CompressGZIP(file_pb_enrichedflow_proto_rawDescData) +func file_enrichedflow_proto_rawDescGZIP() []byte { + file_enrichedflow_proto_rawDescOnce.Do(func() { + file_enrichedflow_proto_rawDescData = protoimpl.X.CompressGZIP(file_enrichedflow_proto_rawDescData) }) - return file_pb_enrichedflow_proto_rawDescData + return file_enrichedflow_proto_rawDescData } -var file_pb_enrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_pb_enrichedflow_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_pb_enrichedflow_proto_goTypes = []interface{}{ +var file_enrichedflow_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_enrichedflow_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_enrichedflow_proto_goTypes = []any{ (EnrichedFlow_FlowType)(0), // 0: flowpb.EnrichedFlow.FlowType (EnrichedFlow_AnonymizedType)(0), // 1: flowpb.EnrichedFlow.AnonymizedType (EnrichedFlow_ValidationStatusType)(0), // 2: flowpb.EnrichedFlow.ValidationStatusType @@ -1587,57 +1609,44 @@ var file_pb_enrichedflow_proto_goTypes = []interface{}{ (EnrichedFlow_RemoteAddrType)(0), // 4: flowpb.EnrichedFlow.RemoteAddrType (*EnrichedFlow)(nil), // 5: flowpb.EnrichedFlow } -var file_pb_enrichedflow_proto_depIdxs = []int32{ +var file_enrichedflow_proto_depIdxs = []int32{ 0, // 0: flowpb.EnrichedFlow.Type:type_name -> flowpb.EnrichedFlow.FlowType 1, // 1: flowpb.EnrichedFlow.SrcAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType 1, // 2: flowpb.EnrichedFlow.DstAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType 1, // 3: flowpb.EnrichedFlow.SamplerAddrAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType - 2, // 4: flowpb.EnrichedFlow.ValidationStatus:type_name -> flowpb.EnrichedFlow.ValidationStatusType - 3, // 5: flowpb.EnrichedFlow.Normalized:type_name -> flowpb.EnrichedFlow.NormalizedType - 4, // 6: flowpb.EnrichedFlow.RemoteAddr:type_name -> flowpb.EnrichedFlow.RemoteAddrType - 7, // [7:7] is the sub-list for method output_type - 7, // [7:7] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name -} - -func init() { file_pb_enrichedflow_proto_init() } -func file_pb_enrichedflow_proto_init() { - if File_pb_enrichedflow_proto != nil { + 1, // 4: flowpb.EnrichedFlow.NextHopAnon:type_name -> flowpb.EnrichedFlow.AnonymizedType + 2, // 5: flowpb.EnrichedFlow.ValidationStatus:type_name -> flowpb.EnrichedFlow.ValidationStatusType + 3, // 6: flowpb.EnrichedFlow.Normalized:type_name -> flowpb.EnrichedFlow.NormalizedType + 4, // 7: flowpb.EnrichedFlow.RemoteAddr:type_name -> flowpb.EnrichedFlow.RemoteAddrType + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name +} + +func init() { file_enrichedflow_proto_init() } +func file_enrichedflow_proto_init() { + if File_enrichedflow_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_pb_enrichedflow_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnrichedFlow); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_pb_enrichedflow_proto_rawDesc, + RawDescriptor: file_enrichedflow_proto_rawDesc, NumEnums: 5, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_pb_enrichedflow_proto_goTypes, - DependencyIndexes: file_pb_enrichedflow_proto_depIdxs, - EnumInfos: file_pb_enrichedflow_proto_enumTypes, - MessageInfos: file_pb_enrichedflow_proto_msgTypes, + GoTypes: file_enrichedflow_proto_goTypes, + DependencyIndexes: file_enrichedflow_proto_depIdxs, + EnumInfos: file_enrichedflow_proto_enumTypes, + MessageInfos: file_enrichedflow_proto_msgTypes, }.Build() - File_pb_enrichedflow_proto = out.File - file_pb_enrichedflow_proto_rawDesc = nil - file_pb_enrichedflow_proto_goTypes = nil - file_pb_enrichedflow_proto_depIdxs = nil + File_enrichedflow_proto = out.File + file_enrichedflow_proto_rawDesc = nil + file_enrichedflow_proto_goTypes = nil + file_enrichedflow_proto_depIdxs = nil } diff --git a/pb/enrichedflow.proto b/pb/enrichedflow.proto index 705312d..10a902b 100644 --- a/pb/enrichedflow.proto +++ b/pb/enrichedflow.proto @@ -158,6 +158,9 @@ message EnrichedFlow { AnonymizedType SamplerAddrAnon = 1164; uint32 SamplerAddrAnonPreservedPrefixLen = 1165; + AnonymizedType NextHopAnon = 2166; + uint32 NextHopAnonPreservedPrefixLen = 2167; + // modify/bgp // as done by a number of Netflow implementations, these refer to the destination repeated uint32 ASPath = 1171; diff --git a/segments/modify/anonymize/anonymize.go b/segments/modify/anonymize/anonymize.go index 13a3d98..618d818 100644 --- a/segments/modify/anonymize/anonymize.go +++ b/segments/modify/anonymize/anonymize.go @@ -77,21 +77,25 @@ func (segment *Anonymize) Run(wg *sync.WaitGroup) { continue } msg.SrcAddr = segment.anonymizer.Anonymize(msg.SrcAddr) + msg.SrcAddrAnon = 1 case "DstAddr": if msg.DstAddrObj() == nil { continue } msg.DstAddr = segment.anonymizer.Anonymize(msg.DstAddr) + msg.DstAddrAnon = 1 case "SamplerAddress": if msg.SamplerAddressObj() == nil { continue } msg.SamplerAddress = segment.anonymizer.Anonymize(msg.SamplerAddress) + msg.SamplerAddrAnon = 1 case "NextHop": if msg.NextHopObj() == nil { continue } msg.NextHop = segment.anonymizer.Anonymize(msg.NextHop) + msg.NextHopAnon = 1 } } segment.Out <- msg From ada50470e812cbffc3a38247c3fe6fb2d939bf9a Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Tue, 5 Nov 2024 14:21:49 +0100 Subject: [PATCH 5/6] vacuum_interval for prometheus Export Added a parameter that defines a fixed intervall at which all prometheus exporter counters are getting reset --- go.mod | 29 ++++++++++--- go.sum | 55 ++++++++++++++++++++++++ segments/export/prometheus/exporter.go | 14 ++++++ segments/export/prometheus/prometheus.go | 54 +++++++++++++++++++---- 4 files changed, 136 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 1928f1a..dd39ce2 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,19 @@ require ( gopkg.in/yaml.v2 v2.4.0 ) +require ( + github.com/jonboulle/clockwork v0.4.0 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + go.uber.org/atomic v1.10.0 // indirect + golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect +) + require ( github.com/ClickHouse/ch-go v0.53.0 // indirect github.com/alecthomas/participle/v2 v2.0.0-beta.1 // indirect @@ -46,11 +59,13 @@ require ( github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-co-op/gocron v1.37.0 + github.com/go-co-op/gocron/v2 v2.12.3 github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.6.1 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect @@ -64,7 +79,7 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/k-sone/critbitgo v1.4.0 // indirect github.com/kaorimatz/go-mrt v0.0.0-20210326003454-aa11f3646f93 // indirect - github.com/klauspost/compress v1.15.15 // indirect + github.com/klauspost/compress v1.15.15 github.com/libp2p/go-reuseport v0.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect @@ -94,11 +109,11 @@ require ( github.com/vishvananda/netns v0.0.4 // indirect go.opentelemetry.io/otel v1.13.0 // indirect go.opentelemetry.io/otel/trace v1.13.0 // indirect - golang.org/x/crypto v0.6.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/crypto v0.22.0 // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.19.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec // indirect google.golang.org/grpc v1.53.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 5d47c55..ab27c23 100644 --- a/go.sum +++ b/go.sum @@ -151,6 +151,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= @@ -158,6 +159,10 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0= +github.com/go-co-op/gocron v1.37.0/go.mod h1:3L/n6BkO7ABj+TrfSVXLRzsP26zmikL4ISkLQ0O8iNY= +github.com/go-co-op/gocron/v2 v2.12.3 h1:3JkKjkFoAPp/i0YE+sonlF5gi+xnBChwYh75nX16MaE= +github.com/go-co-op/gocron/v2 v2.12.3/go.mod h1:xY7bJxGazKam1cz04EebrlP4S9q4iWdiAylMGP3jY9w= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= github.com/go-faster/errors v0.6.1 h1:nNIPOBkprlKzkThvS/0YaX8Zs9KewLCOSFQS5BU06FI= @@ -183,6 +188,7 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= @@ -254,6 +260,12 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -275,6 +287,7 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/influxdata/influxdb-client-go/v2 v2.11.0 h1:BrHYv38rWkAnp22gIaHFp5LpOCazOqRMRvVE1yW3ym8= @@ -295,6 +308,8 @@ github.com/jcmturner/gokrb5/v8 v8.4.3 h1:iTonLeSJOn7MVUtyMT+arAn5AKAPrkilzhGw8wE github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -376,11 +391,16 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/netsampler/goflow2 v1.1.1 h1:GpVlvPq4yRbyzoiz0Vp3XilNr5js/0UhHcQI7Ol/MDk= github.com/netsampler/goflow2 v1.1.1/go.mod h1:oNIeGj67SjwrRSTEukErjNT1zZ02W9+8M5mSgQCkZC8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/oschwald/maxminddb-golang v1.10.0 h1:Xp1u0ZhqkSuopaKmk1WwHtjF0H9Hd9181uj2MQ5Vndg= github.com/oschwald/maxminddb-golang v1.10.0/go.mod h1:Y2ELenReaLAZ0b400URyGwvYxHV1dLIxBuyOsyYjHK0= github.com/osrg/gobgp/v3 v3.7.0 h1:h+Liq90TsxNKTB/443V8b1o/pwOm94yIsm+gP0RHwOo= @@ -445,10 +465,13 @@ github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJf github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 h1:Lt9DzQALzHoDwMBGJ6v8ObDPR0dzr2a6sXTB1Fq7IHs= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -491,6 +514,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= @@ -512,13 +538,17 @@ github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1Y github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -534,6 +564,9 @@ go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZ go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA= go.opentelemetry.io/otel/trace v1.13.0 h1:CBgRZ6ntv+Amuj1jDsMhZtlAPT6gbyIRdaIzFhfBSdY= go.opentelemetry.io/otel/trace v1.13.0/go.mod h1:muCvmmO9KKpvuXSf3KKAXXB2ygNYHQ+ZfI5X08d3tds= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -553,6 +586,8 @@ golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -563,6 +598,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -587,8 +624,10 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -626,11 +665,14 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -653,12 +695,16 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7 h1:ZrnxWX62AgTKOSagEqxvb3ffipvEDX2pl7E1TdqLqIc= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -711,6 +757,7 @@ golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -718,6 +765,8 @@ golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -728,10 +777,13 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -787,6 +839,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -902,8 +955,10 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/segments/export/prometheus/exporter.go b/segments/export/prometheus/exporter.go index 48e7f0b..2e1cd4a 100644 --- a/segments/export/prometheus/exporter.go +++ b/segments/export/prometheus/exporter.go @@ -51,6 +51,20 @@ func (e *Exporter) Initialize(labels []string) { } +func (e *Exporter) ResetCounter() { + log.Printf("[INFO] prometheus export: resetting counter") + e.kafkaOffsets.Reset() + e.flowBits.Reset() + + e.MetaReg.Unregister(e.kafkaMessageCount) + e.kafkaMessageCount = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "kafka_messages_total", + Help: "Number of Kafka messages", + }) + e.MetaReg.MustRegister(e.kafkaMessageCount) +} + // listen on given endpoint addr with Handler for metricPath and flowdataPath func (e *Exporter) ServeEndpoints(segment *Prometheus) { mux := http.NewServeMux() diff --git a/segments/export/prometheus/prometheus.go b/segments/export/prometheus/prometheus.go index c9779ba..c18d8c4 100644 --- a/segments/export/prometheus/prometheus.go +++ b/segments/export/prometheus/prometheus.go @@ -23,17 +23,20 @@ import ( "strconv" "strings" "sync" + "time" "github.com/bwNetFlow/flowpipeline/pb" "github.com/bwNetFlow/flowpipeline/segments" + "github.com/go-co-op/gocron/v2" ) type Prometheus struct { segments.BaseSegment - Endpoint string // optional, default value is ":8080" - MetricsPath string // optional, default is "/metrics" - FlowdataPath string // optional, default is "/flowdata" - Labels []string // optional, list of labels to be exported + Endpoint string // optional, default value is ":8080" + MetricsPath string // optional, default is "/metrics" + FlowdataPath string // optional, default is "/flowdata" + Labels []string // optional, list of labels to be exported + VacuumInterval *time.Duration // optional, intervall in which counters should be reset } func (segment Prometheus) New(config map[string]string) segments.Segment { @@ -55,11 +58,21 @@ func (segment Prometheus) New(config map[string]string) segments.Segment { } else { flowdataPath = config["flowdatapath"] } + var vacuumInterval *time.Duration + if config["vacuum_interval"] != "" { + vacuumIntervalDuration, err := time.ParseDuration(config["vacuum_interval"]) + if err != nil { + log.Println("[info] prometheus: Missing configuration parameter 'flowdatapath'. Using default path \"/flowdata\"") + } else { + vacuumInterval = &vacuumIntervalDuration + } + } newsegment := &Prometheus{ - Endpoint: endpoint, - MetricsPath: metricsPath, - FlowdataPath: flowdataPath, + Endpoint: endpoint, + MetricsPath: metricsPath, + FlowdataPath: flowdataPath, + VacuumInterval: vacuumInterval, } // set default labels if not configured @@ -90,8 +103,10 @@ func (segment *Prometheus) Run(wg *sync.WaitGroup) { }() var promExporter = Exporter{} - promExporter.Initialize(segment.Labels) - promExporter.ServeEndpoints(segment) + segment.initializeExporter(&promExporter) + if segment.VacuumInterval != nil { + segment.AddVacuumCronJob(&promExporter) + } for msg := range segment.In { labelset := make(map[string]string) @@ -120,6 +135,27 @@ func (segment *Prometheus) Run(wg *sync.WaitGroup) { } } +func (segment *Prometheus) initializeExporter(exporter *Exporter) { + exporter.Initialize(segment.Labels) + exporter.ServeEndpoints(segment) +} + +func (segment *Prometheus) AddVacuumCronJob(promExporter *Exporter) { + scheduler, err := gocron.NewScheduler() + if err != nil { + log.Printf("[Error] Failed inizialiozing prometheus exporter vacuum job: " + err.Error()) + } + _, err = scheduler.NewJob( + gocron.DurationJob(*segment.VacuumInterval), + gocron.NewTask(promExporter.ResetCounter), + ) + if err != nil { + log.Printf("[Error] Failed inizialiozing prometheus exporter vacuum job: " + err.Error()) + } + // start the scheduler + scheduler.Start() +} + func init() { segment := &Prometheus{} segments.RegisterSegment("prometheus", segment) From b99091f08115fb013f7e5f6465accd3c73c6ce2f Mon Sep 17 00:00:00 2001 From: Yannick Huber Date: Thu, 21 Nov 2024 08:51:01 +0100 Subject: [PATCH 6/6] bugfix: goflow segment not registered --- segments/input/goflow/goflow.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/segments/input/goflow/goflow.go b/segments/input/goflow/goflow.go index d1799c6..2b1944b 100644 --- a/segments/input/goflow/goflow.go +++ b/segments/input/goflow/goflow.go @@ -146,6 +146,11 @@ func (d *myProtobufDriver) Format(data interface{}) ([]byte, []byte, error) { func (d *myProtobufDriver) Prepare() error { return nil } func (d *myProtobufDriver) Init(context.Context) error { return nil } +func init() { + segment := &Goflow{} + segments.RegisterSegment("goflow", segment) +} + func (segment *Goflow) startGoFlow(transport transport.TransportInterface) { formatter := &myProtobufDriver{}