general update for library compatibility, [VOL-3202], some TechProf processing restructuring

Signed-off-by: mpagenko <michael.pagenkopf@adtran.com>
Change-Id: I451c663fea4dc3ea5acd141069e64a1ad2a68d58
diff --git a/vendor/github.com/opencord/omci-lib-go/VERSION b/vendor/github.com/opencord/omci-lib-go/VERSION
index c317a91..9beb74d 100644
--- a/vendor/github.com/opencord/omci-lib-go/VERSION
+++ b/vendor/github.com/opencord/omci-lib-go/VERSION
@@ -1 +1 @@
-0.13.1
+0.13.2
diff --git a/vendor/github.com/opencord/omci-lib-go/generated/classidmap.go b/vendor/github.com/opencord/omci-lib-go/generated/classidmap.go
index d2c9fb4..7538d66 100644
--- a/vendor/github.com/opencord/omci-lib-go/generated/classidmap.go
+++ b/vendor/github.com/opencord/omci-lib-go/generated/classidmap.go
@@ -55,7 +55,7 @@
 
 func init() {
 	// Create mapping of 16-bit managed entity class IDs to ME-type
-	classToManagedEntityMap = make(map[ClassID]CreateME, 176)
+	classToManagedEntityMap = make(map[ClassID]CreateME, 177)
 
 	classToManagedEntityMap[2] = NewOnuData
 	classToManagedEntityMap[5] = NewCardholder
@@ -172,6 +172,7 @@
 	classToManagedEntityMap[305] = NewDot1AgCfmStack
 	classToManagedEntityMap[306] = NewDot1AgChassisManagementInfo
 	classToManagedEntityMap[307] = NewOctetString
+	classToManagedEntityMap[309] = NewMulticastOperationsProfile
 	classToManagedEntityMap[310] = NewMulticastSubscriberConfigInfo
 	classToManagedEntityMap[311] = NewMulticastSubscriberMonitor
 	classToManagedEntityMap[313] = NewReAniG
diff --git a/vendor/github.com/opencord/omci-lib-go/generated/multicastoperationsprofileframe.go b/vendor/github.com/opencord/omci-lib-go/generated/multicastoperationsprofileframe.go
new file mode 100644
index 0000000..61f36fb
--- /dev/null
+++ b/vendor/github.com/opencord/omci-lib-go/generated/multicastoperationsprofileframe.go
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2018 - present.  Boling Consulting Solutions (bcsw.net)
+ * Copyright 2020-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+* NOTE: This file was generated, manual edits will be overwritten!
+*
+* Generated by 'goCodeGenerator.py':
+*              https://github.com/cboling/OMCI-parser/README.md
+*/
+package generated
+
+import "github.com/deckarep/golang-set"
+
+const MulticastOperationsProfileClassID ClassID = ClassID(309)
+
+var multicastoperationsprofileME *ManagedEntityDefinition
+
+type MulticastOperationsProfile struct{
+	ManagedEntityDefinition
+	Attributes AttributeValueMap
+}
+
+func init(){
+	multicastoperationsprofileME = &ManagedEntityDefinition{
+		Name: "MulticastOperationsProfile",
+		ClassID: 309,
+		MessageTypes: mapset.NewSetWith(
+			Create,
+			Delete,
+			Get,
+			Set,
+			GetNext,
+			),
+		AllowedAttributeMask: 0xffff,
+		AttributeDefinitions: AttributeDefinitionMap{
+			0: Uint16Field("ManagedEntityId", PointerAttributeType, 0x0000, 0, mapset.NewSetWith(Read, SetByCreate), false,false,false,0),
+			1: ByteField("IgmpVersion", EnumerationAttributeType, 0x8000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 1),
+			2: ByteField("IgmpFunction", EnumerationAttributeType, 0x4000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 2),
+			3: ByteField("ImmediateLeave", EnumerationAttributeType, 0x2000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 3),
+			4: Uint16Field("USIgmpTci", PointerAttributeType, 0x1000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 4),
+            5: ByteField("USIgmpTagCtrl", EnumerationAttributeType, 0x0800, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, true, false, 5),
+			6: Uint32Field("USIgmpRate", CounterAttributeType, 0x0400, 0, mapset.NewSetWith(Read), false, true, false, 6),
+			7: MultiByteField("DynamicAccessControlListTable", StringAttributeType, 0x0200, 24, toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAA="), mapset.NewSetWith(Read), false, false, false, 7),
+			8: MultiByteField("StaticAccessControlListTable", StringAttributeType, 0x0100, 24, toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAA="), mapset.NewSetWith(Read), false, true, false, 8),
+			9: MultiByteField("LostGroupsListTable", StringAttributeType, 0x0080, 10, toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAA="), mapset.NewSetWith(Read), false, true, false, 9),
+			10: ByteField("Robustness", EnumerationAttributeType, 0x0040, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 10),
+			11: Uint32Field("QuerierIp", CounterAttributeType, 0x0020, 0, mapset.NewSetWith(Read), false, false, false, 11),
+			12: Uint32Field("QueryInterval", CounterAttributeType, 0x0010, 0, mapset.NewSetWith(Read), false, false, false, 12),
+			13: Uint32Field("QuerierMaxResponseTime", CounterAttributeType, 0x0008, 0, mapset.NewSetWith(Read), false, false, false, 13),
+			14: Uint32Field("LastMemberResponseTime", CounterAttributeType, 0x0004, 0, mapset.NewSetWith(Read), false, false, false, 14),
+			15: ByteField("UnauthorizedJoinBehaviour", EnumerationAttributeType, 0x0002, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 15),
+			16: MultiByteField("DSIgmpMcastTci", StringAttributeType, 0x0001, 10, toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAA="), mapset.NewSetWith(Read), false, true, false, 16),
+		},
+		Access: CreatedByOlt,
+		Support: UnknownSupport,
+	}
+}
+
+// NewMulticastOperationsProfilePoint (class ID 309) creates the basic
+// Managed Entity definition that is used to validate an ME of this type that
+// is received from or transmitted to the OMCC.
+func NewMulticastOperationsProfile(params ...ParamData) (*ManagedEntity, OmciErrors){
+	return NewManagedEntity(*multicastoperationsprofileME, params...)
+}
\ No newline at end of file
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/request_handler.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/request_handler.go
index a97ae62..62d8cdd 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/request_handler.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/request_handler.go
@@ -524,43 +524,6 @@
 	return cap, nil
 }
 
-func (rhp *RequestHandlerProxy) Get_ofp_port_info(args []*ic.Argument) (*ic.PortCapability, error) {
-	if len(args) < 3 {
-		logger.Warn("invalid-number-of-args", log.Fields{"args": args})
-		err := errors.New("invalid-number-of-args")
-		return nil, err
-	}
-	device := &voltha.Device{}
-	pNo := &ic.IntType{}
-	transactionID := &ic.StrType{}
-	for _, arg := range args {
-		switch arg.Key {
-		case "device":
-			if err := ptypes.UnmarshalAny(arg.Value, device); err != nil {
-				logger.Warnw("cannot-unmarshal-device", log.Fields{"error": err})
-				return nil, err
-			}
-		case "port_no":
-			if err := ptypes.UnmarshalAny(arg.Value, pNo); err != nil {
-				logger.Warnw("cannot-unmarshal-port-no", log.Fields{"error": err})
-				return nil, err
-			}
-		case kafka.TransactionKey:
-			if err := ptypes.UnmarshalAny(arg.Value, transactionID); err != nil {
-				logger.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
-				return nil, err
-			}
-		}
-	}
-	logger.Debugw("Get_ofp_port_info", log.Fields{"deviceId": device.Id, "portNo": pNo.Val})
-	var cap *ic.PortCapability
-	var err error
-	if cap, err = rhp.adapter.Get_ofp_port_info(device, pNo.Val); err != nil {
-		return nil, status.Errorf(codes.NotFound, "%s", err.Error())
-	}
-	return cap, nil
-}
-
 func (rhp *RequestHandlerProxy) Process_inter_adapter_message(args []*ic.Argument) (*empty.Empty, error) {
 	if len(args) < 2 {
 		logger.Warn("invalid-number-of-args", log.Fields{"args": args})
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/iAdapter.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/iAdapter.go
index 9436963..1e81890 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/iAdapter.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/iAdapter.go
@@ -42,7 +42,6 @@
 	Suppress_event(filter *voltha.EventFilter) error
 	Unsuppress_event(filter *voltha.EventFilter) error
 	Get_ofp_device_info(device *voltha.Device) (*ic.SwitchCapability, error)
-	Get_ofp_port_info(device *voltha.Device, port_no int64) (*ic.PortCapability, error)
 	Process_inter_adapter_message(msg *ic.InterAdapterMessage) error
 	Download_image(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error)
 	Get_image_download_status(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error)
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/config/configmanager.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/config/configmanager.go
index 0dafc7a..24988be 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/config/configmanager.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/config/configmanager.go
@@ -18,16 +18,19 @@
 import (
 	"context"
 	"fmt"
+	"os"
+	"strings"
+	"time"
+
 	"github.com/opencord/voltha-lib-go/v3/pkg/db"
 	"github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
 	"github.com/opencord/voltha-lib-go/v3/pkg/log"
-	"strings"
 )
 
 const (
-	defaultkvStoreConfigPath = "config"
-	kvStoreDataPathPrefix    = "service/voltha"
-	kvStorePathSeparator     = "/"
+	defaultkvStoreConfigPath     = "config"
+	defaultkvStoreDataPathPrefix = "service/voltha"
+	kvStorePathSeparator         = "/"
 )
 
 // ConfigType represents the type for which config is created inside the kvstore
@@ -67,8 +70,9 @@
 // ConfigManager is a wrapper over Backend to maintain Configuration of voltha components
 // in kvstore based persistent storage
 type ConfigManager struct {
-	Backend             *db.Backend
-	KvStoreConfigPrefix string
+	Backend               *db.Backend
+	KVStoreConfigPrefix   string
+	KVStoreDataPathPrefix string
 }
 
 // ComponentConfig represents a category of configuration for a specific VOLTHA component type
@@ -92,24 +96,31 @@
 	kvStoreEventChan chan *kvstore.Event
 }
 
-func NewConfigManager(kvClient kvstore.Client, kvStoreType, kvStoreHost string, kvStorePort, kvStoreTimeout int) *ConfigManager {
-
+func NewConfigManager(kvClient kvstore.Client, kvStoreType, kvStoreAddress string, kvStoreTimeout time.Duration) *ConfigManager {
+	var kvStorePrefix string
+	if prefix, present := os.LookupEnv("KV_STORE_DATAPATH_PREFIX"); present {
+		kvStorePrefix = prefix
+		logger.Infow("KV_STORE_DATAPATH_PREFIX env variable is set, ", log.Fields{"kvStoreDataPathPrefix": kvStorePrefix})
+	} else {
+		kvStorePrefix = defaultkvStoreDataPathPrefix
+		logger.Infow("KV_STORE_DATAPATH_PREFIX env variable is not set, using default", log.Fields{"kvStoreDataPathPrefix": defaultkvStoreDataPathPrefix})
+	}
 	return &ConfigManager{
-		KvStoreConfigPrefix: defaultkvStoreConfigPath,
+		KVStoreConfigPrefix:   defaultkvStoreConfigPath,
+		KVStoreDataPathPrefix: kvStorePrefix,
 		Backend: &db.Backend{
 			Client:     kvClient,
 			StoreType:  kvStoreType,
-			Host:       kvStoreHost,
-			Port:       kvStorePort,
+			Address:    kvStoreAddress,
 			Timeout:    kvStoreTimeout,
-			PathPrefix: kvStoreDataPathPrefix,
+			PathPrefix: kvStorePrefix,
 		},
 	}
 }
 
 // RetrieveComponentList list the component Names for which loglevel is stored in kvstore
 func (c *ConfigManager) RetrieveComponentList(ctx context.Context, configType ConfigType) ([]string, error) {
-	data, err := c.Backend.List(ctx, c.KvStoreConfigPrefix)
+	data, err := c.Backend.List(ctx, c.KVStoreConfigPrefix)
 	if err != nil {
 		return nil, err
 	}
@@ -119,7 +130,7 @@
 	// For Example, recieved key would be <Backend Prefix Path>/<Config Prefix>/<Component Name>/<Config Type>/default and value \"DEBUG\"
 	// Then in default will be stored as PackageName,componentName as <Component Name> and DEBUG will be stored as value in List struct
 	ccPathPrefix := kvStorePathSeparator + configType.String() + kvStorePathSeparator
-	pathPrefix := kvStoreDataPathPrefix + kvStorePathSeparator + c.KvStoreConfigPrefix + kvStorePathSeparator
+	pathPrefix := c.KVStoreDataPathPrefix + kvStorePathSeparator + c.KVStoreConfigPrefix + kvStorePathSeparator
 	var list []string
 	keys := make(map[string]interface{})
 	for attr := range data {
@@ -152,7 +163,7 @@
 func (c *ComponentConfig) makeConfigPath() string {
 
 	cType := c.configType.String()
-	return c.cManager.KvStoreConfigPrefix + kvStorePathSeparator +
+	return c.cManager.KVStoreConfigPrefix + kvStorePathSeparator +
 		c.componentLabel + kvStorePathSeparator + cType
 }
 
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/backend.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/backend.go
index 55fda64..1e23a0f 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/backend.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/backend.go
@@ -20,8 +20,6 @@
 	"context"
 	"errors"
 	"fmt"
-	"strconv"
-	"sync"
 	"time"
 
 	"github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
@@ -37,12 +35,10 @@
 
 // Backend structure holds details for accessing the kv store
 type Backend struct {
-	sync.RWMutex
 	Client                  kvstore.Client
 	StoreType               string
-	Host                    string
-	Port                    int
-	Timeout                 int
+	Timeout                 time.Duration
+	Address                 string
 	PathPrefix              string
 	alive                   bool          // Is this backend connection alive?
 	liveness                chan bool     // channel to post alive state
@@ -51,24 +47,22 @@
 }
 
 // NewBackend creates a new instance of a Backend structure
-func NewBackend(storeType string, host string, port int, timeout int, pathPrefix string) *Backend {
+func NewBackend(storeType string, address string, timeout time.Duration, pathPrefix string) *Backend {
 	var err error
 
 	b := &Backend{
 		StoreType:               storeType,
-		Host:                    host,
-		Port:                    port,
+		Address:                 address,
 		Timeout:                 timeout,
 		LivenessChannelInterval: DefaultLivenessChannelInterval,
 		PathPrefix:              pathPrefix,
 		alive:                   false, // connection considered down at start
 	}
 
-	address := host + ":" + strconv.Itoa(port)
 	if b.Client, err = b.newClient(address, timeout); err != nil {
 		logger.Errorw("failed-to-create-kv-client",
 			log.Fields{
-				"type": storeType, "host": host, "port": port,
+				"type": storeType, "address": address,
 				"timeout": timeout, "prefix": pathPrefix,
 				"error": err.Error(),
 			})
@@ -77,7 +71,7 @@
 	return b
 }
 
-func (b *Backend) newClient(address string, timeout int) (kvstore.Client, error) {
+func (b *Backend) newClient(address string, timeout time.Duration) (kvstore.Client, error) {
 	switch b.StoreType {
 	case "consul":
 		return kvstore.NewConsulClient(address, timeout)
@@ -188,9 +182,6 @@
 
 // List retrieves one or more items that match the specified key
 func (b *Backend) List(ctx context.Context, key string) (map[string]*kvstore.KVPair, error) {
-	b.Lock()
-	defer b.Unlock()
-
 	formattedPath := b.makePath(key)
 	logger.Debugw("listing-key", log.Fields{"key": key, "path": formattedPath})
 
@@ -203,9 +194,6 @@
 
 // Get retrieves an item that matches the specified key
 func (b *Backend) Get(ctx context.Context, key string) (*kvstore.KVPair, error) {
-	b.Lock()
-	defer b.Unlock()
-
 	formattedPath := b.makePath(key)
 	logger.Debugw("getting-key", log.Fields{"key": key, "path": formattedPath})
 
@@ -218,9 +206,6 @@
 
 // Put stores an item value under the specifed key
 func (b *Backend) Put(ctx context.Context, key string, value interface{}) error {
-	b.Lock()
-	defer b.Unlock()
-
 	formattedPath := b.makePath(key)
 	logger.Debugw("putting-key", log.Fields{"key": key, "path": formattedPath})
 
@@ -233,9 +218,6 @@
 
 // Delete removes an item under the specified key
 func (b *Backend) Delete(ctx context.Context, key string) error {
-	b.Lock()
-	defer b.Unlock()
-
 	formattedPath := b.makePath(key)
 	logger.Debugw("deleting-key", log.Fields{"key": key, "path": formattedPath})
 
@@ -248,9 +230,6 @@
 
 // CreateWatch starts watching events for the specified key
 func (b *Backend) CreateWatch(ctx context.Context, key string, withPrefix bool) chan *kvstore.Event {
-	b.Lock()
-	defer b.Unlock()
-
 	formattedPath := b.makePath(key)
 	logger.Debugw("creating-key-watch", log.Fields{"key": key, "path": formattedPath})
 
@@ -259,9 +238,6 @@
 
 // DeleteWatch stops watching events for the specified key
 func (b *Backend) DeleteWatch(key string, ch chan *kvstore.Event) {
-	b.Lock()
-	defer b.Unlock()
-
 	formattedPath := b.makePath(key)
 	logger.Debugw("deleting-key-watch", log.Fields{"key": key, "path": formattedPath})
 
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/client.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/client.go
index b9cb1ee..158e626 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/client.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/client.go
@@ -15,11 +15,14 @@
  */
 package kvstore
 
-import "context"
+import (
+	"context"
+	"time"
+)
 
 const (
 	// Default timeout in seconds when making a kvstore request
-	defaultKVGetTimeout = 5
+	defaultKVGetTimeout = 5 * time.Second
 	// Maximum channel buffer between publisher/subscriber goroutines
 	maxClientChannelBufferSize = 10
 )
@@ -77,12 +80,12 @@
 	Get(ctx context.Context, key string) (*KVPair, error)
 	Put(ctx context.Context, key string, value interface{}) error
 	Delete(ctx context.Context, key string) error
-	Reserve(ctx context.Context, key string, value interface{}, ttl int64) (interface{}, error)
+	Reserve(ctx context.Context, key string, value interface{}, ttl time.Duration) (interface{}, error)
 	ReleaseReservation(ctx context.Context, key string) error
 	ReleaseAllReservations(ctx context.Context) error
 	RenewReservation(ctx context.Context, key string) error
 	Watch(ctx context.Context, key string, withPrefix bool) chan *Event
-	AcquireLock(ctx context.Context, lockName string, timeout int) error
+	AcquireLock(ctx context.Context, lockName string, timeout time.Duration) error
 	ReleaseLock(lockName string) error
 	IsConnectionUp(ctx context.Context) bool // timeout in second
 	CloseWatch(key string, ch chan *Event)
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/consulclient.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/consulclient.go
index bdf2d10..d2544dd 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/consulclient.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/consulclient.go
@@ -44,13 +44,11 @@
 }
 
 // NewConsulClient returns a new client for the Consul KV store
-func NewConsulClient(addr string, timeout int) (*ConsulClient, error) {
-
-	duration := GetDuration(timeout)
+func NewConsulClient(addr string, timeout time.Duration) (*ConsulClient, error) {
 
 	config := consulapi.DefaultConfig()
 	config.Address = addr
-	config.WaitTime = duration
+	config.WaitTime = timeout
 	consul, err := consulapi.NewClient(config)
 	if err != nil {
 		logger.Error(err)
@@ -76,7 +74,9 @@
 	deadline, _ := ctx.Deadline()
 	kv := c.consul.KV()
 	var queryOptions consulapi.QueryOptions
-	queryOptions.WaitTime = GetDuration(deadline.Second())
+	// Substract current time from deadline to get the waitTime duration
+	queryOptions.WaitTime = time.Until(deadline)
+
 	// For now we ignore meta data
 	kvps, _, err := kv.List(key, &queryOptions)
 	if err != nil {
@@ -97,7 +97,9 @@
 	deadline, _ := ctx.Deadline()
 	kv := c.consul.KV()
 	var queryOptions consulapi.QueryOptions
-	queryOptions.WaitTime = GetDuration(deadline.Second())
+	// Substract current time from deadline to get the waitTime duration
+	queryOptions.WaitTime = time.Until(deadline)
+
 	// For now we ignore meta data
 	kvp, _, err := kv.Get(key, &queryOptions)
 	if err != nil {
@@ -166,11 +168,11 @@
 	c.session = nil
 }
 
-func (c *ConsulClient) createSession(ttl int64, retries int) (*consulapi.Session, string, error) {
+func (c *ConsulClient) createSession(ttl time.Duration, retries int) (*consulapi.Session, string, error) {
 	session := c.consul.Session()
 	entry := &consulapi.SessionEntry{
 		Behavior: consulapi.SessionBehaviorDelete,
-		TTL:      "10s", // strconv.FormatInt(ttl, 10) + "s", // disable ttl
+		TTL:      ttl.String(),
 	}
 
 	for {
@@ -218,7 +220,7 @@
 // defines how long that reservation is valid.  When TTL expires the key is unreserved by the KV store itself.
 // If the key is acquired then the value returned will be the value passed in.  If the key is already acquired
 // then the value assigned to that key will be returned.
-func (c *ConsulClient) Reserve(ctx context.Context, key string, value interface{}, ttl int64) (interface{}, error) {
+func (c *ConsulClient) Reserve(ctx context.Context, key string, value interface{}, ttl time.Duration) (interface{}, error) {
 
 	// Validate that we can create a byte array from the value as consul API expects a byte array
 	var val []byte
@@ -432,10 +434,9 @@
 	logger.Debugw("start-watching-channel", log.Fields{"key": key, "channel": ch})
 
 	defer c.CloseWatch(key, ch)
-	duration := GetDuration(defaultKVGetTimeout)
 	kv := c.consul.KV()
 	var queryOptions consulapi.QueryOptions
-	queryOptions.WaitTime = duration
+	queryOptions.WaitTime = defaultKVGetTimeout
 
 	// Get the existing value, if any
 	previousKVPair, meta, err := kv.Get(key, &queryOptions)
@@ -503,7 +504,7 @@
 	}
 }
 
-func (c *ConsulClient) AcquireLock(ctx context.Context, lockName string, timeout int) error {
+func (c *ConsulClient) AcquireLock(ctx context.Context, lockName string, timeout time.Duration) error {
 	return nil
 }
 
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/etcdclient.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/etcdclient.go
index 90158bc..8d4a462 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/etcdclient.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/etcdclient.go
@@ -20,6 +20,7 @@
 	"errors"
 	"fmt"
 	"sync"
+	"time"
 
 	"github.com/opencord/voltha-lib-go/v3/pkg/log"
 	v3Client "go.etcd.io/etcd/clientv3"
@@ -39,13 +40,12 @@
 }
 
 // NewEtcdClient returns a new client for the Etcd KV store
-func NewEtcdClient(addr string, timeout int, level log.LogLevel) (*EtcdClient, error) {
-	duration := GetDuration(timeout)
+func NewEtcdClient(addr string, timeout time.Duration, level log.LogLevel) (*EtcdClient, error) {
 	logconfig := log.ConstructZapConfig(log.JSON, level, log.Fields{})
 
 	c, err := v3Client.New(v3Client.Config{
 		Endpoints:   []string{addr},
-		DialTimeout: duration,
+		DialTimeout: timeout,
 		LogConfig:   &logconfig,
 	})
 	if err != nil {
@@ -162,7 +162,7 @@
 // defines how long that reservation is valid.  When TTL expires the key is unreserved by the KV store itself.
 // If the key is acquired then the value returned will be the value passed in.  If the key is already acquired
 // then the value assigned to that key will be returned.
-func (c *EtcdClient) Reserve(ctx context.Context, key string, value interface{}, ttl int64) (interface{}, error) {
+func (c *EtcdClient) Reserve(ctx context.Context, key string, value interface{}, ttl time.Duration) (interface{}, error) {
 	// Validate that we can convert value to a string as etcd API expects a string
 	var val string
 	var er error
@@ -170,7 +170,7 @@
 		return nil, fmt.Errorf("unexpected-type%T", value)
 	}
 
-	resp, err := c.ectdAPI.Grant(ctx, ttl)
+	resp, err := c.ectdAPI.Grant(ctx, int64(ttl.Seconds()))
 	if err != nil {
 		logger.Error(err)
 		return nil, err
@@ -457,7 +457,7 @@
 	return lock, session
 }
 
-func (c *EtcdClient) AcquireLock(ctx context.Context, lockName string, timeout int) error {
+func (c *EtcdClient) AcquireLock(ctx context.Context, lockName string, timeout time.Duration) error {
 	session, _ := v3Concurrency.NewSession(c.ectdAPI, v3Concurrency.WithContext(ctx))
 	mu := v3Concurrency.NewMutex(session, "/devicelock_"+lockName)
 	if err := mu.Lock(context.Background()); err != nil {
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/kvutils.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/kvutils.go
index cf9a95c..64e7d30 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/kvutils.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/kvutils.go
@@ -15,19 +15,7 @@
  */
 package kvstore
 
-import (
-	"fmt"
-	"time"
-)
-
-// GetDuration converts a timeout value from int to duration.  If the timeout value is
-// either not set of -ve then we default KV timeout (configurable) is used.
-func GetDuration(timeout int) time.Duration {
-	if timeout <= 0 {
-		return defaultKVGetTimeout * time.Second
-	}
-	return time.Duration(timeout) * time.Second
-}
+import "fmt"
 
 // ToString converts an interface value to a string.  The interface should either be of
 // a string type or []byte.  Otherwise, an error is returned.
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/flows/flow_utils.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/flows/flow_utils.go
index b2086cd..3139144 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/flows/flow_utils.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/flows/flow_utils.go
@@ -18,14 +18,15 @@
 import (
 	"bytes"
 	"crypto/md5"
-	"errors"
+	"encoding/binary"
 	"fmt"
+	"hash"
+	"sort"
+
 	"github.com/cevaris/ordered_map"
 	"github.com/gogo/protobuf/proto"
 	"github.com/opencord/voltha-lib-go/v3/pkg/log"
 	ofp "github.com/opencord/voltha-protos/v3/go/openflow_13"
-	"math/big"
-	"strings"
 )
 
 var (
@@ -677,25 +678,229 @@
 	return 0
 }
 
-// Return unique 64-bit integer hash for flow covering the following attributes:
-// 'table_id', 'priority', 'flags', 'cookie', 'match', '_instruction_string'
+// HashFlowStats returns a unique 64-bit integer hash of 'table_id', 'priority', and 'match'
+// The OF spec states that:
+// A flow table entry is identified by its match fields and priority: the match fields
+// and priority taken together identify a unique flow entry in the flow table.
 func HashFlowStats(flow *ofp.OfpFlowStats) (uint64, error) {
-	if flow == nil { // Should never happen
-		return 0, errors.New("hash-flow-stats-nil-flow")
+	// first we need to make sure the oxm fields are in a predictable order (the specific order doesn't matter)
+	sort.Slice(flow.Match.OxmFields, func(a, b int) bool {
+		fieldsA, fieldsB := flow.Match.OxmFields[a], flow.Match.OxmFields[b]
+		if fieldsA.OxmClass < fieldsB.OxmClass {
+			return true
+		}
+		switch fieldA := fieldsA.Field.(type) {
+		case *ofp.OfpOxmField_OfbField:
+			switch fieldB := fieldsB.Field.(type) {
+			case *ofp.OfpOxmField_ExperimenterField:
+				return true // ofp < experimenter
+			case *ofp.OfpOxmField_OfbField:
+				return fieldA.OfbField.Type < fieldB.OfbField.Type
+			}
+		case *ofp.OfpOxmField_ExperimenterField:
+			switch fieldB := fieldsB.Field.(type) {
+			case *ofp.OfpOxmField_OfbField:
+				return false // ofp < experimenter
+			case *ofp.OfpOxmField_ExperimenterField:
+				eFieldA, eFieldB := fieldA.ExperimenterField, fieldB.ExperimenterField
+				if eFieldA.Experimenter != eFieldB.Experimenter {
+					return eFieldA.Experimenter < eFieldB.Experimenter
+				}
+				return eFieldA.OxmHeader < eFieldB.OxmHeader
+			}
+		}
+		return false
+	})
+
+	md5Hash := md5.New() // note that write errors will never occur with md5 hashing
+	var tmp [12]byte
+
+	binary.BigEndian.PutUint32(tmp[0:4], flow.TableId)             // tableId
+	binary.BigEndian.PutUint32(tmp[4:8], flow.Priority)            // priority
+	binary.BigEndian.PutUint32(tmp[8:12], uint32(flow.Match.Type)) // match type
+	_, _ = md5Hash.Write(tmp[:12])
+
+	for _, field := range flow.Match.OxmFields { // for all match fields
+		binary.BigEndian.PutUint32(tmp[:4], uint32(field.OxmClass)) // match class
+		_, _ = md5Hash.Write(tmp[:4])
+
+		switch oxmField := field.Field.(type) {
+		case *ofp.OfpOxmField_ExperimenterField:
+			binary.BigEndian.PutUint32(tmp[0:4], oxmField.ExperimenterField.Experimenter)
+			binary.BigEndian.PutUint32(tmp[4:8], oxmField.ExperimenterField.OxmHeader)
+			_, _ = md5Hash.Write(tmp[:8])
+
+		case *ofp.OfpOxmField_OfbField:
+			if err := hashWriteOfbField(md5Hash, oxmField.OfbField); err != nil {
+				return 0, err
+			}
+
+		default:
+			return 0, fmt.Errorf("unknown OfpOxmField type: %T", field.Field)
+		}
 	}
-	// Create string with the instructions field first
-	var instructionString bytes.Buffer
-	for _, instruction := range flow.Instructions {
-		instructionString.WriteString(instruction.String())
+
+	ret := md5Hash.Sum(nil)
+	return binary.BigEndian.Uint64(ret[0:8]), nil
+}
+
+func hashWriteOfbField(md5Hash hash.Hash, field *ofp.OfpOxmOfbField) error {
+	var tmp [8]byte
+	binary.BigEndian.PutUint32(tmp[:4], uint32(field.Type)) // type
+	_, _ = md5Hash.Write(tmp[:4])
+
+	// value
+	valType, val32, val64, valSlice := uint8(0), uint32(0), uint64(0), []byte(nil)
+	switch val := field.Value.(type) {
+	case *ofp.OfpOxmOfbField_Port:
+		valType, val32 = 4, val.Port
+	case *ofp.OfpOxmOfbField_PhysicalPort:
+		valType, val32 = 4, val.PhysicalPort
+	case *ofp.OfpOxmOfbField_TableMetadata:
+		valType, val64 = 8, val.TableMetadata
+	case *ofp.OfpOxmOfbField_EthDst:
+		valType, valSlice = 1, val.EthDst
+	case *ofp.OfpOxmOfbField_EthSrc:
+		valType, valSlice = 1, val.EthSrc
+	case *ofp.OfpOxmOfbField_EthType:
+		valType, val32 = 4, val.EthType
+	case *ofp.OfpOxmOfbField_VlanVid:
+		valType, val32 = 4, val.VlanVid
+	case *ofp.OfpOxmOfbField_VlanPcp:
+		valType, val32 = 4, val.VlanPcp
+	case *ofp.OfpOxmOfbField_IpDscp:
+		valType, val32 = 4, val.IpDscp
+	case *ofp.OfpOxmOfbField_IpEcn:
+		valType, val32 = 4, val.IpEcn
+	case *ofp.OfpOxmOfbField_IpProto:
+		valType, val32 = 4, val.IpProto
+	case *ofp.OfpOxmOfbField_Ipv4Src:
+		valType, val32 = 4, val.Ipv4Src
+	case *ofp.OfpOxmOfbField_Ipv4Dst:
+		valType, val32 = 4, val.Ipv4Dst
+	case *ofp.OfpOxmOfbField_TcpSrc:
+		valType, val32 = 4, val.TcpSrc
+	case *ofp.OfpOxmOfbField_TcpDst:
+		valType, val32 = 4, val.TcpDst
+	case *ofp.OfpOxmOfbField_UdpSrc:
+		valType, val32 = 4, val.UdpSrc
+	case *ofp.OfpOxmOfbField_UdpDst:
+		valType, val32 = 4, val.UdpDst
+	case *ofp.OfpOxmOfbField_SctpSrc:
+		valType, val32 = 4, val.SctpSrc
+	case *ofp.OfpOxmOfbField_SctpDst:
+		valType, val32 = 4, val.SctpDst
+	case *ofp.OfpOxmOfbField_Icmpv4Type:
+		valType, val32 = 4, val.Icmpv4Type
+	case *ofp.OfpOxmOfbField_Icmpv4Code:
+		valType, val32 = 4, val.Icmpv4Code
+	case *ofp.OfpOxmOfbField_ArpOp:
+		valType, val32 = 4, val.ArpOp
+	case *ofp.OfpOxmOfbField_ArpSpa:
+		valType, val32 = 4, val.ArpSpa
+	case *ofp.OfpOxmOfbField_ArpTpa:
+		valType, val32 = 4, val.ArpTpa
+	case *ofp.OfpOxmOfbField_ArpSha:
+		valType, valSlice = 1, val.ArpSha
+	case *ofp.OfpOxmOfbField_ArpTha:
+		valType, valSlice = 1, val.ArpTha
+	case *ofp.OfpOxmOfbField_Ipv6Src:
+		valType, valSlice = 1, val.Ipv6Src
+	case *ofp.OfpOxmOfbField_Ipv6Dst:
+		valType, valSlice = 1, val.Ipv6Dst
+	case *ofp.OfpOxmOfbField_Ipv6Flabel:
+		valType, val32 = 4, val.Ipv6Flabel
+	case *ofp.OfpOxmOfbField_Icmpv6Type:
+		valType, val32 = 4, val.Icmpv6Type
+	case *ofp.OfpOxmOfbField_Icmpv6Code:
+		valType, val32 = 4, val.Icmpv6Code
+	case *ofp.OfpOxmOfbField_Ipv6NdTarget:
+		valType, valSlice = 1, val.Ipv6NdTarget
+	case *ofp.OfpOxmOfbField_Ipv6NdSsl:
+		valType, valSlice = 1, val.Ipv6NdSsl
+	case *ofp.OfpOxmOfbField_Ipv6NdTll:
+		valType, valSlice = 1, val.Ipv6NdTll
+	case *ofp.OfpOxmOfbField_MplsLabel:
+		valType, val32 = 4, val.MplsLabel
+	case *ofp.OfpOxmOfbField_MplsTc:
+		valType, val32 = 4, val.MplsTc
+	case *ofp.OfpOxmOfbField_MplsBos:
+		valType, val32 = 4, val.MplsBos
+	case *ofp.OfpOxmOfbField_PbbIsid:
+		valType, val32 = 4, val.PbbIsid
+	case *ofp.OfpOxmOfbField_TunnelId:
+		valType, val64 = 8, val.TunnelId
+	case *ofp.OfpOxmOfbField_Ipv6Exthdr:
+		valType, val32 = 4, val.Ipv6Exthdr
+	default:
+		return fmt.Errorf("unknown OfpOxmField value type: %T", val)
 	}
-	var flowString = fmt.Sprintf("%d%d%d%d%s%s", flow.TableId, flow.Priority, flow.Flags, flow.Cookie, flow.Match.String(), instructionString.String())
-	h := md5.New()
-	if _, err := h.Write([]byte(flowString)); err != nil {
-		return 0, fmt.Errorf("hash-flow-stats-failed-hash: %v", err)
+	switch valType {
+	case 1: // slice
+		_, _ = md5Hash.Write(valSlice)
+	case 4: // uint32
+		binary.BigEndian.PutUint32(tmp[:4], val32)
+		_, _ = md5Hash.Write(tmp[:4])
+	case 8: // uint64
+		binary.BigEndian.PutUint64(tmp[:8], val64)
+		_, _ = md5Hash.Write(tmp[:8])
 	}
-	hash := big.NewInt(0)
-	hash.SetBytes(h.Sum(nil))
-	return hash.Uint64(), nil
+
+	// mask
+	if !field.HasMask {
+		tmp[0] = 0x00
+		_, _ = md5Hash.Write(tmp[:1]) // match hasMask = false
+	} else {
+		tmp[0] = 0x01
+		_, _ = md5Hash.Write(tmp[:1]) // match hasMask = true
+
+		maskType, mask32, mask64, maskSlice := uint8(0), uint32(0), uint64(0), []byte(nil)
+		switch mask := field.Mask.(type) {
+		case *ofp.OfpOxmOfbField_TableMetadataMask:
+			maskType, mask64 = 8, mask.TableMetadataMask
+		case *ofp.OfpOxmOfbField_EthDstMask:
+			maskType, maskSlice = 1, mask.EthDstMask
+		case *ofp.OfpOxmOfbField_EthSrcMask:
+			maskType, maskSlice = 1, mask.EthSrcMask
+		case *ofp.OfpOxmOfbField_VlanVidMask:
+			maskType, mask32 = 4, mask.VlanVidMask
+		case *ofp.OfpOxmOfbField_Ipv4SrcMask:
+			maskType, mask32 = 4, mask.Ipv4SrcMask
+		case *ofp.OfpOxmOfbField_Ipv4DstMask:
+			maskType, mask32 = 4, mask.Ipv4DstMask
+		case *ofp.OfpOxmOfbField_ArpSpaMask:
+			maskType, mask32 = 4, mask.ArpSpaMask
+		case *ofp.OfpOxmOfbField_ArpTpaMask:
+			maskType, mask32 = 4, mask.ArpTpaMask
+		case *ofp.OfpOxmOfbField_Ipv6SrcMask:
+			maskType, maskSlice = 1, mask.Ipv6SrcMask
+		case *ofp.OfpOxmOfbField_Ipv6DstMask:
+			maskType, maskSlice = 1, mask.Ipv6DstMask
+		case *ofp.OfpOxmOfbField_Ipv6FlabelMask:
+			maskType, mask32 = 4, mask.Ipv6FlabelMask
+		case *ofp.OfpOxmOfbField_PbbIsidMask:
+			maskType, mask32 = 4, mask.PbbIsidMask
+		case *ofp.OfpOxmOfbField_TunnelIdMask:
+			maskType, mask64 = 8, mask.TunnelIdMask
+		case *ofp.OfpOxmOfbField_Ipv6ExthdrMask:
+			maskType, mask32 = 4, mask.Ipv6ExthdrMask
+		case nil:
+			return fmt.Errorf("hasMask set to true, but no mask present")
+		default:
+			return fmt.Errorf("unknown OfpOxmField mask type: %T", mask)
+		}
+		switch maskType {
+		case 1: // slice
+			_, _ = md5Hash.Write(maskSlice)
+		case 4: // uint32
+			binary.BigEndian.PutUint32(tmp[:4], mask32)
+			_, _ = md5Hash.Write(tmp[:4])
+		case 8: // uint64
+			binary.BigEndian.PutUint64(tmp[:8], mask64)
+			_, _ = md5Hash.Write(tmp[:8])
+		}
+	}
+	return nil
 }
 
 // flowStatsEntryFromFlowModMessage maps an ofp_flow_mod message to an ofp_flow_stats message
@@ -1184,7 +1389,7 @@
 // FindFlows returns the index in flows where flow if present.  Otherwise, it returns -1
 func FindFlows(flows []*ofp.OfpFlowStats, flow *ofp.OfpFlowStats) int {
 	for idx, f := range flows {
-		if FlowMatch(f, flow) {
+		if f.Id == flow.Id {
 			return idx
 		}
 	}
@@ -1194,35 +1399,7 @@
 //FlowMatch returns true if two flows matches on the following flow attributes:
 //TableId, Priority, Flags, Cookie, Match
 func FlowMatch(f1 *ofp.OfpFlowStats, f2 *ofp.OfpFlowStats) bool {
-	if f1 == nil || f2 == nil {
-		return false
-	}
-	keysMatter := []string{"TableId", "Priority", "Flags", "Cookie", "Match"}
-	for _, key := range keysMatter {
-		switch key {
-		case "TableId":
-			if f1.TableId != f2.TableId {
-				return false
-			}
-		case "Priority":
-			if f1.Priority != f2.Priority {
-				return false
-			}
-		case "Flags":
-			if f1.Flags != f2.Flags {
-				return false
-			}
-		case "Cookie":
-			if f1.Cookie != f2.Cookie {
-				return false
-			}
-		case "Match":
-			if strings.Compare(f1.Match.String(), f2.Match.String()) != 0 {
-				return false
-			}
-		}
-	}
-	return true
+	return f1 != nil && f2 != nil && f1.Id == f2.Id
 }
 
 //FlowMatchesMod returns True if given flow is "covered" by the wildcard flow_mod, taking into consideration of
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/client.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/client.go
index 0919a0c..0d9e3a5 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/client.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/client.go
@@ -39,6 +39,7 @@
 const (
 	DefaultKafkaHost                = "127.0.0.1"
 	DefaultKafkaPort                = 9092
+	DefaultKafkaAddress             = DefaultKafkaHost + ":" + string(DefaultKafkaPort)
 	DefaultGroupName                = "voltha"
 	DefaultSleepOnError             = 1
 	DefaultProducerFlushFrequency   = 10
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/kafka_inter_container_library.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/kafka_inter_container_library.go
index beda537..cbde834 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/kafka_inter_container_library.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/kafka_inter_container_library.go
@@ -19,13 +19,14 @@
 	"context"
 	"errors"
 	"fmt"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
 	"reflect"
 	"strings"
 	"sync"
 	"time"
 
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+
 	"github.com/golang/protobuf/proto"
 	"github.com/golang/protobuf/ptypes"
 	"github.com/golang/protobuf/ptypes/any"
@@ -66,7 +67,6 @@
 	Start() error
 	Stop()
 	GetDefaultTopic() *Topic
-	DeviceDiscovered(deviceId string, deviceType string, parentId string, publisher string) error
 	InvokeRPC(ctx context.Context, rpc string, toTopic *Topic, replyToTopic *Topic, waitForResponse bool, key string, kvArgs ...*KVArg) (bool, *any.Any)
 	InvokeAsyncRPC(ctx context.Context, rpc string, toTopic *Topic, replyToTopic *Topic, waitForResponse bool, key string, kvArgs ...*KVArg) chan *RpcResponse
 	SubscribeWithRequestHandlerInterface(topic Topic, handler interface{}) error
@@ -79,11 +79,9 @@
 
 // interContainerProxy represents the messaging proxy
 type interContainerProxy struct {
-	kafkaHost                      string
-	kafkaPort                      int
+	kafkaAddress                   string
 	defaultTopic                   *Topic
 	defaultRequestHandlerInterface interface{}
-	deviceDiscoveryTopic           *Topic
 	kafkaClient                    Client
 	doneCh                         chan struct{}
 	doneOnce                       sync.Once
@@ -107,15 +105,9 @@
 
 type InterContainerProxyOption func(*interContainerProxy)
 
-func InterContainerHost(host string) InterContainerProxyOption {
+func InterContainerAddress(address string) InterContainerProxyOption {
 	return func(args *interContainerProxy) {
-		args.kafkaHost = host
-	}
-}
-
-func InterContainerPort(port int) InterContainerProxyOption {
-	return func(args *interContainerProxy) {
-		args.kafkaPort = port
+		args.kafkaAddress = address
 	}
 }
 
@@ -125,12 +117,6 @@
 	}
 }
 
-func DeviceDiscoveryTopic(topic *Topic) InterContainerProxyOption {
-	return func(args *interContainerProxy) {
-		args.deviceDiscoveryTopic = topic
-	}
-}
-
 func RequestHandlerInterface(handler interface{}) InterContainerProxyOption {
 	return func(args *interContainerProxy) {
 		args.defaultRequestHandlerInterface = handler
@@ -145,9 +131,8 @@
 
 func newInterContainerProxy(opts ...InterContainerProxyOption) *interContainerProxy {
 	proxy := &interContainerProxy{
-		kafkaHost: DefaultKafkaHost,
-		kafkaPort: DefaultKafkaPort,
-		doneCh:    make(chan struct{}),
+		kafkaAddress: DefaultKafkaAddress,
+		doneCh:       make(chan struct{}),
 	}
 
 	for _, option := range opts {
@@ -207,48 +192,6 @@
 	return kp.defaultTopic
 }
 
-// DeviceDiscovered publish the discovered device onto the kafka messaging bus
-func (kp *interContainerProxy) DeviceDiscovered(deviceId string, deviceType string, parentId string, publisher string) error {
-	logger.Debugw("sending-device-discovery-msg", log.Fields{"deviceId": deviceId})
-	//	Simple validation
-	if deviceId == "" || deviceType == "" {
-		logger.Errorw("invalid-parameters", log.Fields{"id": deviceId, "type": deviceType})
-		return errors.New("invalid-parameters")
-	}
-	//	Create the device discovery message
-	header := &ic.Header{
-		Id:        uuid.New().String(),
-		Type:      ic.MessageType_DEVICE_DISCOVERED,
-		FromTopic: kp.defaultTopic.Name,
-		ToTopic:   kp.deviceDiscoveryTopic.Name,
-		Timestamp: ptypes.TimestampNow(),
-	}
-	body := &ic.DeviceDiscovered{
-		Id:         deviceId,
-		DeviceType: deviceType,
-		ParentId:   parentId,
-		Publisher:  publisher,
-	}
-
-	var marshalledData *any.Any
-	var err error
-	if marshalledData, err = ptypes.MarshalAny(body); err != nil {
-		logger.Errorw("cannot-marshal-request", log.Fields{"error": err})
-		return err
-	}
-	msg := &ic.InterContainerMessage{
-		Header: header,
-		Body:   marshalledData,
-	}
-
-	// Send the message
-	if err := kp.kafkaClient.Send(msg, kp.deviceDiscoveryTopic); err != nil {
-		logger.Errorw("cannot-send-device-discovery-message", log.Fields{"error": err})
-		return err
-	}
-	return nil
-}
-
 // InvokeAsyncRPC is used to make an RPC request asynchronously
 func (kp *interContainerProxy) InvokeAsyncRPC(ctx context.Context, rpc string, toTopic *Topic, replyToTopic *Topic,
 	waitForResponse bool, key string, kvArgs ...*KVArg) chan *RpcResponse {
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/sarama_client.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/sarama_client.go
index 468e546..581cf49 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/sarama_client.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/sarama_client.go
@@ -47,8 +47,7 @@
 // SaramaClient represents the messaging proxy
 type SaramaClient struct {
 	cAdmin                        sarama.ClusterAdmin
-	KafkaHost                     string
-	KafkaPort                     int
+	KafkaAddress                  string
 	producer                      sarama.AsyncProducer
 	consumer                      sarama.Consumer
 	groupConsumers                map[string]*scc.Consumer
@@ -86,15 +85,9 @@
 
 type SaramaClientOption func(*SaramaClient)
 
-func Host(host string) SaramaClientOption {
+func Address(address string) SaramaClientOption {
 	return func(args *SaramaClient) {
-		args.KafkaHost = host
-	}
-}
-
-func Port(port int) SaramaClientOption {
-	return func(args *SaramaClient) {
-		args.KafkaPort = port
+		args.KafkaAddress = address
 	}
 }
 
@@ -202,8 +195,7 @@
 
 func NewSaramaClient(opts ...SaramaClientOption) *SaramaClient {
 	client := &SaramaClient{
-		KafkaHost: DefaultKafkaHost,
-		KafkaPort: DefaultKafkaPort,
+		KafkaAddress: DefaultKafkaAddress,
 	}
 	client.consumerType = DefaultConsumerType
 	client.producerFlushFrequency = DefaultProducerFlushFrequency
@@ -695,15 +687,14 @@
 }
 
 func (sc *SaramaClient) createClusterAdmin() error {
-	kafkaFullAddr := fmt.Sprintf("%s:%d", sc.KafkaHost, sc.KafkaPort)
 	config := sarama.NewConfig()
 	config.Version = sarama.V1_0_0_0
 
 	// Create a cluster Admin
 	var cAdmin sarama.ClusterAdmin
 	var err error
-	if cAdmin, err = sarama.NewClusterAdmin([]string{kafkaFullAddr}, config); err != nil {
-		logger.Errorw("cluster-admin-failure", log.Fields{"error": err, "broker-address": kafkaFullAddr})
+	if cAdmin, err = sarama.NewClusterAdmin([]string{sc.KafkaAddress}, config); err != nil {
+		logger.Errorw("cluster-admin-failure", log.Fields{"error": err, "broker-address": sc.KafkaAddress})
 		return err
 	}
 	sc.cAdmin = cAdmin
@@ -841,8 +832,7 @@
 	//config.Producer.RequiredAcks = sarama.WaitForAll
 	config.Producer.RequiredAcks = sarama.WaitForLocal
 
-	kafkaFullAddr := fmt.Sprintf("%s:%d", sc.KafkaHost, sc.KafkaPort)
-	brokers := []string{kafkaFullAddr}
+	brokers := []string{sc.KafkaAddress}
 
 	if producer, err := sarama.NewAsyncProducer(brokers, config); err != nil {
 		logger.Errorw("error-starting-publisher", log.Fields{"error": err})
@@ -862,8 +852,7 @@
 	config.Consumer.MaxProcessingTime = time.Duration(sc.maxProcessingTime) * time.Millisecond
 	config.Consumer.Offsets.Initial = sarama.OffsetNewest
 	config.Metadata.Retry.Max = sc.metadataMaxRetry
-	kafkaFullAddr := fmt.Sprintf("%s:%d", sc.KafkaHost, sc.KafkaPort)
-	brokers := []string{kafkaFullAddr}
+	brokers := []string{sc.KafkaAddress}
 
 	if consumer, err := sarama.NewConsumer(brokers, config); err != nil {
 		logger.Errorw("error-starting-consumers", log.Fields{"error": err})
@@ -887,8 +876,7 @@
 	//config.Consumer.MaxProcessingTime = time.Duration(DefaultMaxProcessingTime) * time.Millisecond
 	config.Consumer.Offsets.Initial = initialOffset
 	//config.Consumer.Offsets.Initial = sarama.OffsetOldest
-	kafkaFullAddr := fmt.Sprintf("%s:%d", sc.KafkaHost, sc.KafkaPort)
-	brokers := []string{kafkaFullAddr}
+	brokers := []string{sc.KafkaAddress}
 
 	topics := []string{topic.Name}
 	var consumer *scc.Consumer
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/log/log.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/log/log.go
index 6b7087f..1e23da1 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/log/log.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/log/log.go
@@ -41,6 +41,7 @@
 package log
 
 import (
+	"context"
 	"errors"
 	"fmt"
 	zp "go.uber.org/zap"
@@ -71,41 +72,41 @@
 // JSON formats the log using json format, mostly used by an automated logging system consumption
 const JSON = "json"
 
-// Logger represents an abstract logging interface.  Any logging implementation used
+// Context Aware Logger represents an abstract logging interface.  Any logging implementation used
 // will need to abide by this interface
-type Logger interface {
-	Debug(...interface{})
-	Debugln(...interface{})
-	Debugf(string, ...interface{})
-	Debugw(string, Fields)
+type CLogger interface {
+	Debug(context.Context, ...interface{})
+	Debugln(context.Context, ...interface{})
+	Debugf(context.Context, string, ...interface{})
+	Debugw(context.Context, string, Fields)
 
-	Info(...interface{})
-	Infoln(...interface{})
-	Infof(string, ...interface{})
-	Infow(string, Fields)
+	Info(context.Context, ...interface{})
+	Infoln(context.Context, ...interface{})
+	Infof(context.Context, string, ...interface{})
+	Infow(context.Context, string, Fields)
 
-	Warn(...interface{})
-	Warnln(...interface{})
-	Warnf(string, ...interface{})
-	Warnw(string, Fields)
+	Warn(context.Context, ...interface{})
+	Warnln(context.Context, ...interface{})
+	Warnf(context.Context, string, ...interface{})
+	Warnw(context.Context, string, Fields)
 
-	Error(...interface{})
-	Errorln(...interface{})
-	Errorf(string, ...interface{})
-	Errorw(string, Fields)
+	Error(context.Context, ...interface{})
+	Errorln(context.Context, ...interface{})
+	Errorf(context.Context, string, ...interface{})
+	Errorw(context.Context, string, Fields)
 
-	Fatal(...interface{})
-	Fatalln(...interface{})
-	Fatalf(string, ...interface{})
-	Fatalw(string, Fields)
+	Fatal(context.Context, ...interface{})
+	Fatalln(context.Context, ...interface{})
+	Fatalf(context.Context, string, ...interface{})
+	Fatalw(context.Context, string, Fields)
 
-	With(Fields) Logger
+	With(Fields) CLogger
 
 	// The following are added to be able to use this logger as a gRPC LoggerV2 if needed
 	//
-	Warning(...interface{})
-	Warningln(...interface{})
-	Warningf(string, ...interface{})
+	Warning(context.Context, ...interface{})
+	Warningln(context.Context, ...interface{})
+	Warningf(context.Context, string, ...interface{})
 
 	// V reports whether verbosity level l is at least the requested verbose level.
 	V(l LogLevel) bool
@@ -117,13 +118,13 @@
 // Fields is used as key-value pairs for structured logging
 type Fields map[string]interface{}
 
-var defaultLogger *logger
+var defaultLogger *clogger
 var cfg zp.Config
 
-var loggers map[string]*logger
+var loggers map[string]*clogger
 var cfgs map[string]zp.Config
 
-type logger struct {
+type clogger struct {
 	log         *zp.SugaredLogger
 	parent      *zp.Logger
 	packageName string
@@ -238,7 +239,7 @@
 
 // SetLogger needs to be invoked before the logger API can be invoked.  This function
 // initialize the default logger (zap's sugaredlogger)
-func SetDefaultLogger(outputType string, level LogLevel, defaultFields Fields) (Logger, error) {
+func SetDefaultLogger(outputType string, level LogLevel, defaultFields Fields) (CLogger, error) {
 	// Build a custom config using zap
 	cfg = getDefaultConfig(outputType, level, defaultFields)
 
@@ -247,7 +248,7 @@
 		return nil, err
 	}
 
-	defaultLogger = &logger{
+	defaultLogger = &clogger{
 		log:    l.Sugar(),
 		parent: l,
 	}
@@ -264,12 +265,12 @@
 // be available to it, notably log tracing with filename.functionname.linenumber annotation.
 //
 // pkgNames parameter should be used for testing only as this function detects the caller's package.
-func AddPackage(outputType string, level LogLevel, defaultFields Fields, pkgNames ...string) (Logger, error) {
+func RegisterPackage(outputType string, level LogLevel, defaultFields Fields, pkgNames ...string) (CLogger, error) {
 	if cfgs == nil {
 		cfgs = make(map[string]zp.Config)
 	}
 	if loggers == nil {
-		loggers = make(map[string]*logger)
+		loggers = make(map[string]*clogger)
 	}
 
 	var pkgName string
@@ -292,7 +293,7 @@
 		return nil, err
 	}
 
-	loggers[pkgName] = &logger{
+	loggers[pkgName] = &clogger{
 		log:         l.Sugar(),
 		parent:      l,
 		packageName: pkgName,
@@ -502,301 +503,149 @@
 	return packageName, fileName, funcName, foundFrame.Line
 }
 
-func getPackageLevelSugaredLogger() *zp.SugaredLogger {
-	pkgName, _, _, _ := getCallerInfo()
-	if _, exist := loggers[pkgName]; exist {
-		return loggers[pkgName].log
-	}
-	return defaultLogger.log
-}
-
-func getPackageLevelLogger() Logger {
-	pkgName, _, _, _ := getCallerInfo()
-	if _, exist := loggers[pkgName]; exist {
-		return loggers[pkgName]
-	}
-	return defaultLogger
-}
-
-func serializeMap(fields Fields) []interface{} {
-	data := make([]interface{}, len(fields)*2)
-	i := 0
-	for k, v := range fields {
-		data[i] = k
-		data[i+1] = v
-		i = i + 2
-	}
-	return data
-}
-
 // With returns a logger initialized with the key-value pairs
-func (l logger) With(keysAndValues Fields) Logger {
-	return logger{log: l.log.With(serializeMap(keysAndValues)...), parent: l.parent}
+func (l clogger) With(keysAndValues Fields) CLogger {
+	return clogger{log: l.log.With(serializeMap(keysAndValues)...), parent: l.parent}
 }
 
 // Debug logs a message at level Debug on the standard logger.
-func (l logger) Debug(args ...interface{}) {
-	l.log.Debug(args...)
+func (l clogger) Debug(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Debug(args...)
 }
 
 // Debugln logs a message at level Debug on the standard logger with a line feed. Default in any case.
-func (l logger) Debugln(args ...interface{}) {
-	l.log.Debug(args...)
+func (l clogger) Debugln(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Debug(args...)
 }
 
 // Debugw logs a message at level Debug on the standard logger.
-func (l logger) Debugf(format string, args ...interface{}) {
-	l.log.Debugf(format, args...)
+func (l clogger) Debugf(ctx context.Context, format string, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Debugf(format, args...)
 }
 
 // Debugw logs a message with some additional context. The variadic key-value
 // pairs are treated as they are in With.
-func (l logger) Debugw(msg string, keysAndValues Fields) {
-	l.log.Debugw(msg, serializeMap(keysAndValues)...)
+func (l clogger) Debugw(ctx context.Context, msg string, keysAndValues Fields) {
+	if l.V(DebugLevel) {
+		l.log.With(ExtractContextAttributes(ctx)...).Debugw(msg, serializeMap(keysAndValues)...)
+	}
 }
 
 // Info logs a message at level Info on the standard logger.
-func (l logger) Info(args ...interface{}) {
-	l.log.Info(args...)
+func (l clogger) Info(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Info(args...)
 }
 
 // Infoln logs a message at level Info on the standard logger with a line feed. Default in any case.
-func (l logger) Infoln(args ...interface{}) {
-	l.log.Info(args...)
+func (l clogger) Infoln(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Info(args...)
 	//msg := fmt.Sprintln(args...)
 	//l.sourced().Info(msg[:len(msg)-1])
 }
 
 // Infof logs a message at level Info on the standard logger.
-func (l logger) Infof(format string, args ...interface{}) {
-	l.log.Infof(format, args...)
+func (l clogger) Infof(ctx context.Context, format string, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Infof(format, args...)
 }
 
 // Infow logs a message with some additional context. The variadic key-value
 // pairs are treated as they are in With.
-func (l logger) Infow(msg string, keysAndValues Fields) {
-	l.log.Infow(msg, serializeMap(keysAndValues)...)
+func (l clogger) Infow(ctx context.Context, msg string, keysAndValues Fields) {
+	if l.V(InfoLevel) {
+		l.log.With(ExtractContextAttributes(ctx)...).Infow(msg, serializeMap(keysAndValues)...)
+	}
 }
 
 // Warn logs a message at level Warn on the standard logger.
-func (l logger) Warn(args ...interface{}) {
-	l.log.Warn(args...)
+func (l clogger) Warn(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Warn(args...)
 }
 
 // Warnln logs a message at level Warn on the standard logger with a line feed. Default in any case.
-func (l logger) Warnln(args ...interface{}) {
-	l.log.Warn(args...)
+func (l clogger) Warnln(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Warn(args...)
 }
 
 // Warnf logs a message at level Warn on the standard logger.
-func (l logger) Warnf(format string, args ...interface{}) {
-	l.log.Warnf(format, args...)
+func (l clogger) Warnf(ctx context.Context, format string, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Warnf(format, args...)
 }
 
 // Warnw logs a message with some additional context. The variadic key-value
 // pairs are treated as they are in With.
-func (l logger) Warnw(msg string, keysAndValues Fields) {
-	l.log.Warnw(msg, serializeMap(keysAndValues)...)
+func (l clogger) Warnw(ctx context.Context, msg string, keysAndValues Fields) {
+	if l.V(WarnLevel) {
+		l.log.With(ExtractContextAttributes(ctx)...).Warnw(msg, serializeMap(keysAndValues)...)
+	}
 }
 
 // Error logs a message at level Error on the standard logger.
-func (l logger) Error(args ...interface{}) {
-	l.log.Error(args...)
+func (l clogger) Error(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Error(args...)
 }
 
 // Errorln logs a message at level Error on the standard logger with a line feed. Default in any case.
-func (l logger) Errorln(args ...interface{}) {
-	l.log.Error(args...)
+func (l clogger) Errorln(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Error(args...)
 }
 
 // Errorf logs a message at level Error on the standard logger.
-func (l logger) Errorf(format string, args ...interface{}) {
-	l.log.Errorf(format, args...)
+func (l clogger) Errorf(ctx context.Context, format string, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Errorf(format, args...)
 }
 
 // Errorw logs a message with some additional context. The variadic key-value
 // pairs are treated as they are in With.
-func (l logger) Errorw(msg string, keysAndValues Fields) {
-	l.log.Errorw(msg, serializeMap(keysAndValues)...)
+func (l clogger) Errorw(ctx context.Context, msg string, keysAndValues Fields) {
+	if l.V(ErrorLevel) {
+		l.log.With(ExtractContextAttributes(ctx)...).Errorw(msg, serializeMap(keysAndValues)...)
+	}
 }
 
 // Fatal logs a message at level Fatal on the standard logger.
-func (l logger) Fatal(args ...interface{}) {
-	l.log.Fatal(args...)
+func (l clogger) Fatal(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Fatal(args...)
 }
 
 // Fatalln logs a message at level Fatal on the standard logger with a line feed. Default in any case.
-func (l logger) Fatalln(args ...interface{}) {
-	l.log.Fatal(args...)
+func (l clogger) Fatalln(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Fatal(args...)
 }
 
 // Fatalf logs a message at level Fatal on the standard logger.
-func (l logger) Fatalf(format string, args ...interface{}) {
-	l.log.Fatalf(format, args...)
+func (l clogger) Fatalf(ctx context.Context, format string, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Fatalf(format, args...)
 }
 
 // Fatalw logs a message with some additional context. The variadic key-value
 // pairs are treated as they are in With.
-func (l logger) Fatalw(msg string, keysAndValues Fields) {
-	l.log.Fatalw(msg, serializeMap(keysAndValues)...)
+func (l clogger) Fatalw(ctx context.Context, msg string, keysAndValues Fields) {
+	if l.V(FatalLevel) {
+		l.log.With(ExtractContextAttributes(ctx)...).Fatalw(msg, serializeMap(keysAndValues)...)
+	}
 }
 
 // Warning logs a message at level Warn on the standard logger.
-func (l logger) Warning(args ...interface{}) {
-	l.log.Warn(args...)
+func (l clogger) Warning(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Warn(args...)
 }
 
 // Warningln logs a message at level Warn on the standard logger with a line feed. Default in any case.
-func (l logger) Warningln(args ...interface{}) {
-	l.log.Warn(args...)
+func (l clogger) Warningln(ctx context.Context, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Warn(args...)
 }
 
 // Warningf logs a message at level Warn on the standard logger.
-func (l logger) Warningf(format string, args ...interface{}) {
-	l.log.Warnf(format, args...)
+func (l clogger) Warningf(ctx context.Context, format string, args ...interface{}) {
+	l.log.With(ExtractContextAttributes(ctx)...).Warnf(format, args...)
 }
 
 // V reports whether verbosity level l is at least the requested verbose level.
-func (l logger) V(level LogLevel) bool {
+func (l clogger) V(level LogLevel) bool {
 	return l.parent.Core().Enabled(logLevelToLevel(level))
 }
 
 // GetLogLevel returns the current level of the logger
-func (l logger) GetLogLevel() LogLevel {
+func (l clogger) GetLogLevel() LogLevel {
 	return levelToLogLevel(cfgs[l.packageName].Level.Level())
 }
-
-// With returns a logger initialized with the key-value pairs
-func With(keysAndValues Fields) Logger {
-	return logger{log: getPackageLevelSugaredLogger().With(serializeMap(keysAndValues)...), parent: defaultLogger.parent}
-}
-
-// Debug logs a message at level Debug on the standard logger.
-func Debug(args ...interface{}) {
-	getPackageLevelSugaredLogger().Debug(args...)
-}
-
-// Debugln logs a message at level Debug on the standard logger.
-func Debugln(args ...interface{}) {
-	getPackageLevelSugaredLogger().Debug(args...)
-}
-
-// Debugf logs a message at level Debug on the standard logger.
-func Debugf(format string, args ...interface{}) {
-	getPackageLevelSugaredLogger().Debugf(format, args...)
-}
-
-// Debugw logs a message with some additional context. The variadic key-value
-// pairs are treated as they are in With.
-func Debugw(msg string, keysAndValues Fields) {
-	getPackageLevelSugaredLogger().Debugw(msg, serializeMap(keysAndValues)...)
-}
-
-// Info logs a message at level Info on the standard logger.
-func Info(args ...interface{}) {
-	getPackageLevelSugaredLogger().Info(args...)
-}
-
-// Infoln logs a message at level Info on the standard logger.
-func Infoln(args ...interface{}) {
-	getPackageLevelSugaredLogger().Info(args...)
-}
-
-// Infof logs a message at level Info on the standard logger.
-func Infof(format string, args ...interface{}) {
-	getPackageLevelSugaredLogger().Infof(format, args...)
-}
-
-//Infow logs a message with some additional context. The variadic key-value
-//pairs are treated as they are in With.
-func Infow(msg string, keysAndValues Fields) {
-	getPackageLevelSugaredLogger().Infow(msg, serializeMap(keysAndValues)...)
-}
-
-// Warn logs a message at level Warn on the standard logger.
-func Warn(args ...interface{}) {
-	getPackageLevelSugaredLogger().Warn(args...)
-}
-
-// Warnln logs a message at level Warn on the standard logger.
-func Warnln(args ...interface{}) {
-	getPackageLevelSugaredLogger().Warn(args...)
-}
-
-// Warnf logs a message at level Warn on the standard logger.
-func Warnf(format string, args ...interface{}) {
-	getPackageLevelSugaredLogger().Warnf(format, args...)
-}
-
-// Warnw logs a message with some additional context. The variadic key-value
-// pairs are treated as they are in With.
-func Warnw(msg string, keysAndValues Fields) {
-	getPackageLevelSugaredLogger().Warnw(msg, serializeMap(keysAndValues)...)
-}
-
-// Error logs a message at level Error on the standard logger.
-func Error(args ...interface{}) {
-	getPackageLevelSugaredLogger().Error(args...)
-}
-
-// Errorln logs a message at level Error on the standard logger.
-func Errorln(args ...interface{}) {
-	getPackageLevelSugaredLogger().Error(args...)
-}
-
-// Errorf logs a message at level Error on the standard logger.
-func Errorf(format string, args ...interface{}) {
-	getPackageLevelSugaredLogger().Errorf(format, args...)
-}
-
-// Errorw logs a message with some additional context. The variadic key-value
-// pairs are treated as they are in With.
-func Errorw(msg string, keysAndValues Fields) {
-	getPackageLevelSugaredLogger().Errorw(msg, serializeMap(keysAndValues)...)
-}
-
-// Fatal logs a message at level Fatal on the standard logger.
-func Fatal(args ...interface{}) {
-	getPackageLevelSugaredLogger().Fatal(args...)
-}
-
-// Fatalln logs a message at level Fatal on the standard logger.
-func Fatalln(args ...interface{}) {
-	getPackageLevelSugaredLogger().Fatal(args...)
-}
-
-// Fatalf logs a message at level Fatal on the standard logger.
-func Fatalf(format string, args ...interface{}) {
-	getPackageLevelSugaredLogger().Fatalf(format, args...)
-}
-
-// Fatalw logs a message with some additional context. The variadic key-value
-// pairs are treated as they are in With.
-func Fatalw(msg string, keysAndValues Fields) {
-	getPackageLevelSugaredLogger().Fatalw(msg, serializeMap(keysAndValues)...)
-}
-
-// Warning logs a message at level Warn on the standard logger.
-func Warning(args ...interface{}) {
-	getPackageLevelSugaredLogger().Warn(args...)
-}
-
-// Warningln logs a message at level Warn on the standard logger.
-func Warningln(args ...interface{}) {
-	getPackageLevelSugaredLogger().Warn(args...)
-}
-
-// Warningf logs a message at level Warn on the standard logger.
-func Warningf(format string, args ...interface{}) {
-	getPackageLevelSugaredLogger().Warnf(format, args...)
-}
-
-// V reports whether verbosity level l is at least the requested verbose level.
-func V(level LogLevel) bool {
-	return getPackageLevelLogger().V(level)
-}
-
-//GetLogLevel returns the log level of the invoking package
-func GetLogLevel() LogLevel {
-	return getPackageLevelLogger().GetLogLevel()
-}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/log/log_classic.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/log/log_classic.go
new file mode 100644
index 0000000..b47b562
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/log/log_classic.go
@@ -0,0 +1,386 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Older Version of Logger interface without support of Context Injection
+// This is Depreciated and should not be used anymore. Instead use CLogger
+// defined in log.go file.
+// This file will be deleted once all code files of voltha compopnents have been
+// changed to use new CLogger interface methods supporting context injection
+package log
+
+import (
+	zp "go.uber.org/zap"
+)
+
+// Logger represents an abstract logging interface.  Any logging implementation used
+// will need to abide by this interface
+type Logger interface {
+	Debug(...interface{})
+	Debugln(...interface{})
+	Debugf(string, ...interface{})
+	Debugw(string, Fields)
+
+	Info(...interface{})
+	Infoln(...interface{})
+	Infof(string, ...interface{})
+	Infow(string, Fields)
+
+	Warn(...interface{})
+	Warnln(...interface{})
+	Warnf(string, ...interface{})
+	Warnw(string, Fields)
+
+	Error(...interface{})
+	Errorln(...interface{})
+	Errorf(string, ...interface{})
+	Errorw(string, Fields)
+
+	Fatal(...interface{})
+	Fatalln(...interface{})
+	Fatalf(string, ...interface{})
+	Fatalw(string, Fields)
+
+	With(Fields) Logger
+
+	// The following are added to be able to use this logger as a gRPC LoggerV2 if needed
+	//
+	Warning(...interface{})
+	Warningln(...interface{})
+	Warningf(string, ...interface{})
+
+	// V reports whether verbosity level l is at least the requested verbose level.
+	V(l LogLevel) bool
+
+	//Returns the log level of this specific logger
+	GetLogLevel() LogLevel
+}
+
+// logger has been refactored to be a thin wrapper on clogger implementation to support
+// all existing log statements during transition to new clogger
+type logger struct {
+	cl *clogger
+}
+
+func AddPackage(outputType string, level LogLevel, defaultFields Fields, pkgNames ...string) (Logger, error) {
+	// Get package name of caller method and pass further on; else this method is considered caller
+	pkgName, _, _, _ := getCallerInfo()
+
+	pkgNames = append(pkgNames, pkgName)
+	clg, err := RegisterPackage(outputType, level, defaultFields, pkgNames...)
+	if err != nil {
+		return nil, err
+	}
+
+	return logger{cl: clg.(*clogger)}, nil
+}
+
+func getPackageLevelSugaredLogger() *zp.SugaredLogger {
+	pkgName, _, _, _ := getCallerInfo()
+	if _, exist := loggers[pkgName]; exist {
+		return loggers[pkgName].log
+	}
+	return defaultLogger.log
+}
+
+func getPackageLevelLogger() CLogger {
+	pkgName, _, _, _ := getCallerInfo()
+	if _, exist := loggers[pkgName]; exist {
+		return loggers[pkgName]
+	}
+	return defaultLogger
+}
+
+// With returns a logger initialized with the key-value pairs
+func (l logger) With(keysAndValues Fields) Logger {
+	return logger{cl: &clogger{log: l.cl.log.With(serializeMap(keysAndValues)...), parent: l.cl.parent}}
+}
+
+// Debug logs a message at level Debug on the standard logger.
+func (l logger) Debug(args ...interface{}) {
+	l.cl.log.Debug(args...)
+}
+
+// Debugln logs a message at level Debug on the standard logger with a line feed. Default in any case.
+func (l logger) Debugln(args ...interface{}) {
+	l.cl.log.Debug(args...)
+}
+
+// Debugw logs a message at level Debug on the standard logger.
+func (l logger) Debugf(format string, args ...interface{}) {
+	l.cl.log.Debugf(format, args...)
+}
+
+// Debugw logs a message with some additional context. The variadic key-value
+// pairs are treated as they are in With.
+func (l logger) Debugw(msg string, keysAndValues Fields) {
+	if l.V(DebugLevel) {
+		l.cl.log.Debugw(msg, serializeMap(keysAndValues)...)
+	}
+}
+
+// Info logs a message at level Info on the standard logger.
+func (l logger) Info(args ...interface{}) {
+	l.cl.log.Info(args...)
+}
+
+// Infoln logs a message at level Info on the standard logger with a line feed. Default in any case.
+func (l logger) Infoln(args ...interface{}) {
+	l.cl.log.Info(args...)
+	//msg := fmt.Sprintln(args...)
+	//l.sourced().Info(msg[:len(msg)-1])
+}
+
+// Infof logs a message at level Info on the standard logger.
+func (l logger) Infof(format string, args ...interface{}) {
+	l.cl.log.Infof(format, args...)
+}
+
+// Infow logs a message with some additional context. The variadic key-value
+// pairs are treated as they are in With.
+func (l logger) Infow(msg string, keysAndValues Fields) {
+	if l.V(InfoLevel) {
+		l.cl.log.Infow(msg, serializeMap(keysAndValues)...)
+	}
+}
+
+// Warn logs a message at level Warn on the standard logger.
+func (l logger) Warn(args ...interface{}) {
+	l.cl.log.Warn(args...)
+}
+
+// Warnln logs a message at level Warn on the standard logger with a line feed. Default in any case.
+func (l logger) Warnln(args ...interface{}) {
+	l.cl.log.Warn(args...)
+}
+
+// Warnf logs a message at level Warn on the standard logger.
+func (l logger) Warnf(format string, args ...interface{}) {
+	l.cl.log.Warnf(format, args...)
+}
+
+// Warnw logs a message with some additional context. The variadic key-value
+// pairs are treated as they are in With.
+func (l logger) Warnw(msg string, keysAndValues Fields) {
+	if l.V(WarnLevel) {
+		l.cl.log.Warnw(msg, serializeMap(keysAndValues)...)
+	}
+}
+
+// Error logs a message at level Error on the standard logger.
+func (l logger) Error(args ...interface{}) {
+	l.cl.log.Error(args...)
+}
+
+// Errorln logs a message at level Error on the standard logger with a line feed. Default in any case.
+func (l logger) Errorln(args ...interface{}) {
+	l.cl.log.Error(args...)
+}
+
+// Errorf logs a message at level Error on the standard logger.
+func (l logger) Errorf(format string, args ...interface{}) {
+	l.cl.log.Errorf(format, args...)
+}
+
+// Errorw logs a message with some additional context. The variadic key-value
+// pairs are treated as they are in With.
+func (l logger) Errorw(msg string, keysAndValues Fields) {
+	if l.V(ErrorLevel) {
+		l.cl.log.Errorw(msg, serializeMap(keysAndValues)...)
+	}
+}
+
+// Fatal logs a message at level Fatal on the standard logger.
+func (l logger) Fatal(args ...interface{}) {
+	l.cl.log.Fatal(args...)
+}
+
+// Fatalln logs a message at level Fatal on the standard logger with a line feed. Default in any case.
+func (l logger) Fatalln(args ...interface{}) {
+	l.cl.log.Fatal(args...)
+}
+
+// Fatalf logs a message at level Fatal on the standard logger.
+func (l logger) Fatalf(format string, args ...interface{}) {
+	l.cl.log.Fatalf(format, args...)
+}
+
+// Fatalw logs a message with some additional context. The variadic key-value
+// pairs are treated as they are in With.
+func (l logger) Fatalw(msg string, keysAndValues Fields) {
+	if l.V(FatalLevel) {
+		l.cl.log.Fatalw(msg, serializeMap(keysAndValues)...)
+	}
+}
+
+// Warning logs a message at level Warn on the standard logger.
+func (l logger) Warning(args ...interface{}) {
+	l.cl.log.Warn(args...)
+}
+
+// Warningln logs a message at level Warn on the standard logger with a line feed. Default in any case.
+func (l logger) Warningln(args ...interface{}) {
+	l.cl.log.Warn(args...)
+}
+
+// Warningf logs a message at level Warn on the standard logger.
+func (l logger) Warningf(format string, args ...interface{}) {
+	l.cl.log.Warnf(format, args...)
+}
+
+// V reports whether verbosity level l is at least the requested verbose level.
+func (l logger) V(level LogLevel) bool {
+	return l.cl.parent.Core().Enabled(logLevelToLevel(level))
+}
+
+// GetLogLevel returns the current level of the logger
+func (l logger) GetLogLevel() LogLevel {
+	return levelToLogLevel(cfgs[l.cl.packageName].Level.Level())
+}
+
+// With returns a logger initialized with the key-value pairs
+func With(keysAndValues Fields) Logger {
+	return logger{cl: &clogger{log: getPackageLevelSugaredLogger().With(serializeMap(keysAndValues)...), parent: defaultLogger.parent}}
+}
+
+// Debug logs a message at level Debug on the standard logger.
+func Debug(args ...interface{}) {
+	getPackageLevelSugaredLogger().Debug(args...)
+}
+
+// Debugln logs a message at level Debug on the standard logger.
+func Debugln(args ...interface{}) {
+	getPackageLevelSugaredLogger().Debug(args...)
+}
+
+// Debugf logs a message at level Debug on the standard logger.
+func Debugf(format string, args ...interface{}) {
+	getPackageLevelSugaredLogger().Debugf(format, args...)
+}
+
+// Debugw logs a message with some additional context. The variadic key-value
+// pairs are treated as they are in With.
+func Debugw(msg string, keysAndValues Fields) {
+	getPackageLevelSugaredLogger().Debugw(msg, serializeMap(keysAndValues)...)
+}
+
+// Info logs a message at level Info on the standard logger.
+func Info(args ...interface{}) {
+	getPackageLevelSugaredLogger().Info(args...)
+}
+
+// Infoln logs a message at level Info on the standard logger.
+func Infoln(args ...interface{}) {
+	getPackageLevelSugaredLogger().Info(args...)
+}
+
+// Infof logs a message at level Info on the standard logger.
+func Infof(format string, args ...interface{}) {
+	getPackageLevelSugaredLogger().Infof(format, args...)
+}
+
+//Infow logs a message with some additional context. The variadic key-value
+//pairs are treated as they are in With.
+func Infow(msg string, keysAndValues Fields) {
+	getPackageLevelSugaredLogger().Infow(msg, serializeMap(keysAndValues)...)
+}
+
+// Warn logs a message at level Warn on the standard logger.
+func Warn(args ...interface{}) {
+	getPackageLevelSugaredLogger().Warn(args...)
+}
+
+// Warnln logs a message at level Warn on the standard logger.
+func Warnln(args ...interface{}) {
+	getPackageLevelSugaredLogger().Warn(args...)
+}
+
+// Warnf logs a message at level Warn on the standard logger.
+func Warnf(format string, args ...interface{}) {
+	getPackageLevelSugaredLogger().Warnf(format, args...)
+}
+
+// Warnw logs a message with some additional context. The variadic key-value
+// pairs are treated as they are in With.
+func Warnw(msg string, keysAndValues Fields) {
+	getPackageLevelSugaredLogger().Warnw(msg, serializeMap(keysAndValues)...)
+}
+
+// Error logs a message at level Error on the standard logger.
+func Error(args ...interface{}) {
+	getPackageLevelSugaredLogger().Error(args...)
+}
+
+// Errorln logs a message at level Error on the standard logger.
+func Errorln(args ...interface{}) {
+	getPackageLevelSugaredLogger().Error(args...)
+}
+
+// Errorf logs a message at level Error on the standard logger.
+func Errorf(format string, args ...interface{}) {
+	getPackageLevelSugaredLogger().Errorf(format, args...)
+}
+
+// Errorw logs a message with some additional context. The variadic key-value
+// pairs are treated as they are in With.
+func Errorw(msg string, keysAndValues Fields) {
+	getPackageLevelSugaredLogger().Errorw(msg, serializeMap(keysAndValues)...)
+}
+
+// Fatal logs a message at level Fatal on the standard logger.
+func Fatal(args ...interface{}) {
+	getPackageLevelSugaredLogger().Fatal(args...)
+}
+
+// Fatalln logs a message at level Fatal on the standard logger.
+func Fatalln(args ...interface{}) {
+	getPackageLevelSugaredLogger().Fatal(args...)
+}
+
+// Fatalf logs a message at level Fatal on the standard logger.
+func Fatalf(format string, args ...interface{}) {
+	getPackageLevelSugaredLogger().Fatalf(format, args...)
+}
+
+// Fatalw logs a message with some additional context. The variadic key-value
+// pairs are treated as they are in With.
+func Fatalw(msg string, keysAndValues Fields) {
+	getPackageLevelSugaredLogger().Fatalw(msg, serializeMap(keysAndValues)...)
+}
+
+// Warning logs a message at level Warn on the standard logger.
+func Warning(args ...interface{}) {
+	getPackageLevelSugaredLogger().Warn(args...)
+}
+
+// Warningln logs a message at level Warn on the standard logger.
+func Warningln(args ...interface{}) {
+	getPackageLevelSugaredLogger().Warn(args...)
+}
+
+// Warningf logs a message at level Warn on the standard logger.
+func Warningf(format string, args ...interface{}) {
+	getPackageLevelSugaredLogger().Warnf(format, args...)
+}
+
+// V reports whether verbosity level l is at least the requested verbose level.
+func V(level LogLevel) bool {
+	return getPackageLevelLogger().V(level)
+}
+
+//GetLogLevel returns the log level of the invoking package
+func GetLogLevel() LogLevel {
+	return getPackageLevelLogger().GetLogLevel()
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/log/utils.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/log/utils.go
new file mode 100644
index 0000000..1869b1a
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/log/utils.go
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// File contains utility functions to support Open Tracing in conjunction with
+// Enhanced Logging based on context propagation
+
+package log
+
+import (
+	"context"
+	"errors"
+	"github.com/opentracing/opentracing-go"
+	jtracing "github.com/uber/jaeger-client-go"
+	jcfg "github.com/uber/jaeger-client-go/config"
+	jmetrics "github.com/uber/jaeger-lib/metrics"
+	"io"
+	"os"
+)
+
+// This method will start the Tracing for a component using Component name injected from the Chart
+// The close() method on returned Closer instance should be called in defer mode to gracefully
+// terminate tracing on component shutdown
+func StartTracing() (io.Closer, error) {
+	componentName := os.Getenv("COMPONENT_NAME")
+	if componentName == "" {
+		return nil, errors.New("Unable to retrieve PoD Component Name from Runtime env")
+	}
+
+	// Use basic configuration to start with; will extend later to support dynamic config updates
+	cfg := jcfg.Configuration{}
+
+	jLoggerCfgOption := jcfg.Logger(jtracing.StdLogger)
+	jMetricsFactoryCfgOption := jcfg.Metrics(jmetrics.NullFactory)
+
+	return cfg.InitGlobalTracer(componentName, jLoggerCfgOption, jMetricsFactoryCfgOption)
+}
+
+// Extracts details of Execution Context as log fields from the Tracing Span injected into the
+// context instance. Following log fields are extracted:
+// 1. Operation Name : key as 'op-name' and value as Span operation name
+// 2. Operation Id : key as 'op-id' and value as 64 bit Span Id in hex digits string
+//
+// Additionally, any tags present in Span are also extracted to use as log fields e.g. device-id.
+//
+// If no Span is found associated with context, blank slice is returned without any log fields
+func ExtractContextAttributes(ctx context.Context) []interface{} {
+	attrMap := make(map[string]interface{})
+
+	if ctx != nil {
+		if span := opentracing.SpanFromContext(ctx); span != nil {
+			if jspan, ok := span.(*jtracing.Span); ok {
+				opname := jspan.OperationName()
+				spanid := jspan.SpanContext().SpanID().String()
+
+				attrMap["op-id"] = spanid
+				attrMap["op-name"] = opname
+
+				for k, v := range jspan.Tags() {
+					attrMap[k] = v
+				}
+			}
+		}
+	}
+
+	return serializeMap(attrMap)
+}
+
+// Utility method to convert log Fields into array of interfaces expected by zap logger methods
+func serializeMap(fields Fields) []interface{} {
+	data := make([]interface{}, len(fields)*2)
+	i := 0
+	for k, v := range fields {
+		data[i] = k
+		data[i+1] = v
+		i = i + 2
+	}
+	return data
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/4QueueHybridProfileMap1.json b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/4QueueHybridProfileMap1.json
new file mode 100644
index 0000000..d11f8e4
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/4QueueHybridProfileMap1.json
@@ -0,0 +1,141 @@
+ {
+  "name": "4QueueHybridProfileMap1",
+  "profile_type": "XPON",
+  "version": 1,
+  "num_gem_ports": 4,
+  "instance_control": {
+    "onu": "multi-instance",
+    "uni": "single-instance",
+    "max_gem_payload_size": "auto"
+  },
+  "us_scheduler": {
+    "additional_bw": "AdditionalBW_Auto",
+    "direction": "UPSTREAM",
+    "priority": 0,
+    "weight": 0,
+    "q_sched_policy": "Hybrid"
+  },
+  "ds_scheduler": {
+    "additional_bw": "AdditionalBW_Auto",
+    "direction": "DOWNSTREAM",
+    "priority": 0,
+    "weight": 0,
+    "q_sched_policy": "Hybrid"
+  },
+  "upstream_gem_port_attribute_list": [
+    {
+      "pbit_map": "0b00000101",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 4,
+      "weight": 25,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "max_threshold": 0,
+        "min_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00011010",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 3,
+      "weight": 75,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00100000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 2,
+      "weight": 0,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b11000000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 1,
+      "weight": 25,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    }
+  ],
+  "downstream_gem_port_attribute_list": [
+    {
+      "pbit_map": "0b00000101",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 4,
+      "weight": 10,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00011010",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 3,
+      "weight": 90,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00100000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 2,
+      "weight": 0,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b11000000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 1,
+      "weight": 25,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    }
+  ]
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/README.md b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/README.md
new file mode 100644
index 0000000..88d6564
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/README.md
@@ -0,0 +1,344 @@
+Technology Profile Management
+Overview
+Technology profiles that are utilized by VOLTHA are stored in a prescribed structure in VOLTHA's key/value store, which is currently etcd. The key structure used to access technology profiles is /voltha/technology_profiles//; where TID is the numeric ID of the technology profile and TECHNOLOGY specifies the technology being utilized by the adapter, e.g. xgspon. While the TID key is a directory, the TECHNOLOGY key should be set to the JSON data that represents the technology profile values.
+
+NOTE: The content of a technology profile represents a contract between the technology profile definition and all adapters that consume that technology profile. The structure and content of the profiles are outside the scope of Technology Profile Management. Technology profile management only specifies the key/value structure in which profiles are stored.
+
+Example JSON :
+
+{
+  "name": "4QueueHybridProfileMap1",
+  "profile_type": "XPON",
+  "version": 1,
+  "num_gem_ports": 4,
+  "instance_control": {
+    "onu": "multi-instance",
+    "uni": "single-instance",
+    "max_gem_payload_size": "auto"
+  },
+  "us_scheduler": {
+    "additional_bw": "auto",
+    "direction": "UPSTREAM",
+    "priority": 0,
+    "weight": 0,
+    "q_sched_policy": "hybrid"
+  },
+  "ds_scheduler": {
+    "additional_bw": "auto",
+    "direction": "DOWNSTREAM",
+    "priority": 0,
+    "weight": 0,
+    "q_sched_policy": "hybrid"
+  },
+  "upstream_gem_port_attribute_list": [
+    {
+      "pbit_map": "0b00000101",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 4,
+      "weight": 25,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "max_threshold": 0,
+        "min_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00011010",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 3,
+      "weight": 75,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00100000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 2,
+      "weight": 0,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b11000000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 1,
+      "weight": 25,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    }
+  ],
+  "downstream_gem_port_attribute_list": [
+    {
+      "pbit_map": "0b00000101",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 4,
+      "weight": 10,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00011010",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 3,
+      "weight": 90,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00100000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 2,
+      "weight": 0,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b11000000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 1,
+      "weight": 25,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    }
+  ]
+}
+
+Creating Technology Profiles
+Technology profiles are a simple JSON object. This JSON object can be created using a variety of tools such as Vim, Emacs, or various IDEs. JQ can be a useful tool for validating a JSON object. Once a file is created with the JSON object it can be stored in VOLTHA key/value store using the standard etcd command line tool etcdctl or using an HTTP POST operation using Curl.
+
+Assuming you are in a standard VOLTHA deployment within a Kubernetes cluster you can access the etcd key/value store using kubectl via the PODs named etcd-cluster-0000, etcd-cluster-0001, or etcd-cluster-0002. For the examples in this document etcd-cluster-0000 will be used, but it really shouldn't matter which is used.
+
+ETCD version 3 is being used in techprofile module : Export this variable before using curl operation , export ETCDCTL_API=3 
+
+Assuming the Technology template is stored in a local file 4QueueHybridProfileMap1.json the following commands could be used to store or update the technical template into the proper location in the etcd key/value store:
+
+# Store a Technology template using etcdctl
+jq -c . 4QueueHybridProfileMap1.json | kubectl exec -i etcd-cluster-0000 -- etcdctl set service/voltha/technology_profiles/XGS-PON/64
+
+jq -c . 4QueueHybridProfileMap1.json |  etcdctl --endpoints=<ETCDIP>:2379 put service/voltha/technology_profiles/XGS-PON/64
+
+
+# Store a Technology template using curl
+curl -sSL -XPUT http://10.233.53.161:2379/v2/keys/service/voltha/technology_profiles/XGS-PON/64 -d value="$(jq -c . 4QueueHybridProfileMap1.json)"
+In the examples above, the command jq is used. This command can be installed using standard package management tools on most Linux systems. In the examples the "-c" option is used to compress the JSON. Using this tool is not necessary, and if you choose not to use the tool, you can replace "jq -c ," in the above examples with the "cat" command. More on jq can be found at https://stedolan.github.io/jq/.
+
+Listing Technical Profiles for a given Technology
+While both curl and etcdctl (via kubectl) can be used to list or view the available Technology profiles, etcdctl is easier, and thus will be used in the examples. For listing Technology profiles etcdctl ls is used. In can be used in conjunction with the -r option to recursively list profiles.
+
+
+#List Tech profile 
+etcdctl --endpoints=<EtcdIPAddres>:2379 get  service/voltha/technology_profiles/XGS-PON/64
+
+
+# Example output
+A specified Technology profile can be viewed with the etcdctl get command. (Again, jq is used for presentation purposes, and is not required)
+
+# Display a specified Technology profile, using jq to pretty print
+kubectl exec -i etcd-cluster-0000 -- etcdctl get service/voltha/technology_profiles/XGS-PON/64 | jq .
+
+etcdctl --endpoints=<ETCDIP>:2379 get  service/voltha/technology_profiles/XGS-PON/64
+# Example outpout
+service/voltha/technology_profiles/XGS-PON/64/uni-1
+{
+  "name": "4QueueHybridProfileMap1",
+  "profile_type": "XPON",
+  "version": 1,
+  "num_gem_ports": 4,
+  "instance_control": {
+    "onu": "multi-instance",
+    "uni": "single-instance",
+    "max_gem_payload_size": "auto"
+  },
+  "us_scheduler": {
+    "additional_bw": "auto",
+    "direction": "UPSTREAM",
+    "priority": 0,
+    "weight": 0,
+    "q_sched_policy": "hybrid"
+  },
+  "ds_scheduler": {
+    "additional_bw": "auto",
+    "direction": "DOWNSTREAM",
+    "priority": 0,
+    "weight": 0,
+    "q_sched_policy": "hybrid"
+  },
+  "upstream_gem_port_attribute_list": [
+    {
+      "pbit_map": "0b00000101",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 4,
+      "weight": 25,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "max_threshold": 0,
+        "min_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00011010",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 3,
+      "weight": 75,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00100000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 2,
+      "weight": 0,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b11000000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 1,
+      "weight": 25,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    }
+  ],
+  "downstream_gem_port_attribute_list": [
+    {
+      "pbit_map": "0b00000101",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 4,
+      "weight": 10,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00011010",
+      "aes_encryption": "True",
+      "scheduling_policy": "WRR",
+      "priority_q": 3,
+      "weight": 90,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b00100000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 2,
+      "weight": 0,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    },
+    {
+      "pbit_map": "0b11000000",
+      "aes_encryption": "True",
+      "scheduling_policy": "StrictPriority",
+      "priority_q": 1,
+      "weight": 25,
+      "discard_policy": "TailDrop",
+      "max_q_size": "auto",
+      "discard_config": {
+        "min_threshold": 0,
+        "max_threshold": 0,
+        "max_probability": 0
+      }
+    }
+  ]
+}
+
+# Display a specified Technology profile instance, using jq to pretty print
+kubectl exec -i etcd-cluster-0000 -- etcdctl get service/voltha/technology_profiles/XGS-PON/64/pon-{0}/onu-{1}/uni-{0} | jq .
+
+etcdctl --endpoints=<ETCDIP>:2379 get  service/voltha/technology_profiles/XGS-PON/64/pon-{0}/onu-{1}/uni-{0}
+# Example outpout
+service/voltha/technology_profiles/XGS-PON/64/pon-{0}/onu-{1}/uni-{0}
+{"name":"Default_1tcont_1gem_Profile","subscriber_identifier":"pon-{0}/onu-{1}/uni-{0}","profile_type":"XGS-PON","version":1,"num_gem_ports":1,"instance_control":{"ONU":"multi-instance","uni":"single-instance","max_gem_payload_size":"auto"},"us_scheduler":{"alloc_id":1024,"direction":"UPSTREAM","additional_bw":"AdditionalBW_BestEffort","priority":0,"weight":0,"q_sched_policy":"Hybrid"},"ds_scheduler":{"alloc_id":1024,"direction":"DOWNSTREAM","additional_bw":"AdditionalBW_BestEffort","priority":0,"weight":0,"q_sched_policy":"Hybrid"},"upstream_gem_port_attribute_list":[{"gemport_id":1024,"max_q_size":"auto","pbit_map":"0b11111111","aes_encryption":"True","scheduling_policy":"WRR","priority_q":0,"weight":0,"discard_policy":"TailDrop","discard_config":{"min_threshold":0,"max_threshold":0,"max_probability":0},"is_multicast":"","dynamic_access_control_list":"","static_access_control_list":"","multicast_gem_id":0}],"downstream_gem_port_attribute_list":[{"gemport_id":1024,"max_q_size":"auto","pbit_map":"0b11111111","aes_encryption":"True","scheduling_policy":"WRR","priority_q":0,"weight":0,"discard_policy":"TailDrop","discard_config":{"min_threshold":0,"max_threshold":0,"max_probability":0},"is_multicast":"","dynamic_access_control_list":"","static_access_control_list":"","multicast_gem_id":0}]}
+
+# Deleting Technology Profiles
+A technology profile or a technology profile tree can be removed using etcdctl rm.
+
+# Remove a specific technology profile
+kubectl exec -i etcd-cluster-0000 -- etcdctl rm /XGS-PON/64
+
+# Remove all technology profiles associated with Technology xgspon and ID 64(including the profile ID key)
+kubectl exec -i etcd-cluster-0000 -- etcdctl rm --dir -r /XGS-PON/64
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/SingleQueueEponProfile.json b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/SingleQueueEponProfile.json
new file mode 100644
index 0000000..00476a2
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/SingleQueueEponProfile.json
@@ -0,0 +1,61 @@
+{

+    "name": "SingleQueueEponProfile",

+    "profile_type": "EPON",

+    "version": 1,

+    "num_gem_ports": 1,

+    "instance_control": {

+      "onu": "multi-instance",

+      "uni": "single-instance",

+      "max_gem_payload_size": "auto"

+    },

+    "epon_attribute": {

+        "package_type": "B"

+    },

+    "upstream_queue_attribute_list": [

+      {

+        "pbit_map": "0b11111111",

+        "aes_encryption": "False",

+        "traffic_type": "BE",

+        "unsolicited_grant_size": 0,

+        "nominal_interval": 0,

+        "tolerated_poll_jitter": 0,

+        "request_transmission_policy": 0,

+        "num_q_sets": 2,

+        "q_thresholds": {

+          "q_threshold1":5500,

+          "q_threshold2":0,

+          "q_threshold3":0,

+          "q_threshold4":0,

+          "q_threshold5":0,

+          "q_threshold6":0,

+          "q_threshold7":0

+        },

+        "scheduling_policy": "StrictPriority",

+        "priority_q": 4,

+        "weight": 0,

+        "discard_policy": "TailDrop",

+        "max_q_size": "auto",

+        "discard_config": {

+          "min_threshold": 0,

+          "max_threshold": 0,

+          "max_probability": 0

+        }

+      }

+    ],

+    "downstream_queue_attribute_list": [

+      {

+        "pbit_map": "0b11111111",

+        "aes_encryption": "True",

+        "scheduling_policy": "StrictPriority",

+        "priority_q": 4,

+        "weight": 0,

+        "discard_policy": "TailDrop",

+        "max_q_size": "auto",

+        "discard_config": {

+          "min_threshold": 0,

+          "max_threshold": 0,

+          "max_probability": 0

+        }

+      }

+    ]

+}
\ No newline at end of file
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/common.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/common.go
new file mode 100644
index 0000000..42818f1
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/common.go
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2020-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package techprofile
+
+import (
+	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+)
+
+var logger log.Logger
+
+func init() {
+	// Setup this package so that it's log level can be modified at run time
+	var err error
+	logger, err = log.AddPackage(log.JSON, log.ErrorLevel, log.Fields{"pkg": "techprofile"})
+	if err != nil {
+		panic(err)
+	}
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/config.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/config.go
new file mode 100644
index 0000000..fa2a6de
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/config.go
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package techprofile
+
+import (
+	"github.com/opencord/voltha-lib-go/v3/pkg/db"
+	"time"
+)
+
+// tech profile default constants
+const (
+	defaultTechProfileName        = "Default_1tcont_1gem_Profile"
+	DEFAULT_TECH_PROFILE_TABLE_ID = 64
+	defaultVersion                = 1.0
+	defaultLogLevel               = 0
+	defaultGemportsCount          = 1
+	defaultPbits                  = "0b11111111"
+
+	defaultKVStoreTimeout = 5 * time.Second //in seconds
+
+	// Tech profile path prefix in kv store
+	defaultKVPathPrefix = "service/voltha/technology_profiles"
+
+	// Tech profile path in kv store
+	defaultTechProfileKVPath = "%s/%d" // <technology>/<tech_profile_tableID>
+
+	// Tech profile instance path in kv store
+	// Format: <technology>/<tech_profile_tableID>/<uni_port_name>
+	defaultTPInstanceKVPath = "%s/%d/%s"
+)
+
+//Tech-Profile JSON String Keys
+// NOTE: Tech profile templeate JSON file should comply with below keys
+const (
+	NAME                               = "name"
+	PROFILE_TYPE                       = "profile_type"
+	VERSION                            = "version"
+	NUM_GEM_PORTS                      = "num_gem_ports"
+	INSTANCE_CONTROL                   = "instance_control"
+	US_SCHEDULER                       = "us_scheduler"
+	DS_SCHEDULER                       = "ds_scheduler"
+	UPSTREAM_GEM_PORT_ATTRIBUTE_LIST   = "upstream_gem_port_attribute_list"
+	DOWNSTREAM_GEM_PORT_ATTRIBUTE_LIST = "downstream_gem_port_attribute_list"
+	ONU                                = "onu"
+	UNI                                = "uni"
+	MAX_GEM_PAYLOAD_SIZE               = "max_gem_payload_size"
+	DIRECTION                          = "direction"
+	ADDITIONAL_BW                      = "additional_bw"
+	PRIORITY                           = "priority"
+	Q_SCHED_POLICY                     = "q_sched_policy"
+	WEIGHT                             = "weight"
+	PBIT_MAP                           = "pbit_map"
+	DISCARD_CONFIG                     = "discard_config"
+	MAX_THRESHOLD                      = "max_threshold"
+	MIN_THRESHOLD                      = "min_threshold"
+	MAX_PROBABILITY                    = "max_probability"
+	DISCARD_POLICY                     = "discard_policy"
+	PRIORITY_Q                         = "priority_q"
+	SCHEDULING_POLICY                  = "scheduling_policy"
+	MAX_Q_SIZE                         = "max_q_size"
+	AES_ENCRYPTION                     = "aes_encryption"
+	// String Keys for EPON
+	EPON_ATTRIBUTE              = "epon_attribute"
+	PACKAGE_TYPE                = "package_type"
+	TRAFFIC_TYPE                = "traffic type"
+	UNSOLICITED_GRANT_SIZE      = "unsolicited_grant_size"
+	NOMINAL_INTERVAL            = "nominal_interval"
+	TOLERATED_POLL_JITTER       = "tolerated_poll_jitter"
+	REQUEST_TRANSMISSION_POLICY = "request_transmission_policy"
+	NUM_Q_SETS                  = "num_q_sets"
+	Q_THRESHOLDS                = "q_thresholds"
+	Q_THRESHOLD1                = "q_threshold1"
+	Q_THRESHOLD2                = "q_threshold2"
+	Q_THRESHOLD3                = "q_threshold3"
+	Q_THRESHOLD4                = "q_threshold4"
+	Q_THRESHOLD5                = "q_threshold5"
+	Q_THRESHOLD6                = "q_threshold6"
+	Q_THRESHOLD7                = "q_threshold7"
+)
+
+// TechprofileFlags represents the set of configurations used
+type TechProfileFlags struct {
+	KVStoreAddress       string
+	KVStoreType          string
+	KVStoreTimeout       time.Duration
+	KVBackend            *db.Backend
+	TPKVPathPrefix       string
+	TPFileKVPath         string
+	TPInstanceKVPath     string
+	DefaultTPName        string
+	TPVersion            int
+	NumGemPorts          uint32
+	DefaultPbits         []string
+	LogLevel             int
+	DefaultTechProfileID uint32
+	DefaultNumGemPorts   uint32
+}
+
+func NewTechProfileFlags(KVStoreType string, KVStoreAddress string) *TechProfileFlags {
+	// initialize with default values
+	var techProfileFlags = TechProfileFlags{
+		KVBackend:            nil,
+		KVStoreAddress:       KVStoreAddress,
+		KVStoreType:          KVStoreType,
+		KVStoreTimeout:       defaultKVStoreTimeout,
+		DefaultTPName:        defaultTechProfileName,
+		TPKVPathPrefix:       defaultKVPathPrefix,
+		TPVersion:            defaultVersion,
+		TPFileKVPath:         defaultTechProfileKVPath,
+		TPInstanceKVPath:     defaultTPInstanceKVPath,
+		DefaultTechProfileID: DEFAULT_TECH_PROFILE_TABLE_ID,
+		DefaultNumGemPorts:   defaultGemportsCount,
+		DefaultPbits:         []string{defaultPbits},
+		LogLevel:             defaultLogLevel,
+	}
+
+	return &techProfileFlags
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/tech_profile.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/tech_profile.go
new file mode 100644
index 0000000..ff37326
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/tech_profile.go
@@ -0,0 +1,1398 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package techprofile
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"regexp"
+	"strconv"
+	"sync"
+	"time"
+
+	"github.com/opencord/voltha-lib-go/v3/pkg/db"
+
+	"github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
+	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	tp_pb "github.com/opencord/voltha-protos/v3/go/tech_profile"
+)
+
+// Interface to pon resource manager APIs
+type iPonResourceMgr interface {
+	GetResourceID(ctx context.Context, IntfID uint32, ResourceType string, NumIDs uint32) ([]uint32, error)
+	GetResourceTypeAllocID() string
+	GetResourceTypeGemPortID() string
+	GetTechnology() string
+}
+
+type Direction int32
+
+const (
+	Direction_UPSTREAM      Direction = 0
+	Direction_DOWNSTREAM    Direction = 1
+	Direction_BIDIRECTIONAL Direction = 2
+)
+
+var Direction_name = map[Direction]string{
+	0: "UPSTREAM",
+	1: "DOWNSTREAM",
+	2: "BIDIRECTIONAL",
+}
+
+type SchedulingPolicy int32
+
+const (
+	SchedulingPolicy_WRR            SchedulingPolicy = 0
+	SchedulingPolicy_StrictPriority SchedulingPolicy = 1
+	SchedulingPolicy_Hybrid         SchedulingPolicy = 2
+)
+
+var SchedulingPolicy_name = map[SchedulingPolicy]string{
+	0: "WRR",
+	1: "StrictPriority",
+	2: "Hybrid",
+}
+
+type AdditionalBW int32
+
+const (
+	AdditionalBW_AdditionalBW_None       AdditionalBW = 0
+	AdditionalBW_AdditionalBW_NA         AdditionalBW = 1
+	AdditionalBW_AdditionalBW_BestEffort AdditionalBW = 2
+	AdditionalBW_AdditionalBW_Auto       AdditionalBW = 3
+)
+
+var AdditionalBW_name = map[AdditionalBW]string{
+	0: "AdditionalBW_None",
+	1: "AdditionalBW_NA",
+	2: "AdditionalBW_BestEffort",
+	3: "AdditionalBW_Auto",
+}
+
+type DiscardPolicy int32
+
+const (
+	DiscardPolicy_TailDrop  DiscardPolicy = 0
+	DiscardPolicy_WTailDrop DiscardPolicy = 1
+	DiscardPolicy_Red       DiscardPolicy = 2
+	DiscardPolicy_WRed      DiscardPolicy = 3
+)
+
+var DiscardPolicy_name = map[DiscardPolicy]string{
+	0: "TailDrop",
+	1: "WTailDrop",
+	2: "Red",
+	3: "WRed",
+}
+
+// Required uniPortName format
+var uniPortNameFormat = regexp.MustCompile(`^olt-{[a-z0-9\-]+}/pon-{[0-9]+}/onu-{[0-9]+}/uni-{[0-9]+}$`)
+
+/*
+  type InferredAdditionBWIndication int32
+
+  const (
+	  InferredAdditionBWIndication_InferredAdditionBWIndication_None       InferredAdditionBWIndication = 0
+	  InferredAdditionBWIndication_InferredAdditionBWIndication_Assured    InferredAdditionBWIndication = 1
+	  InferredAdditionBWIndication_InferredAdditionBWIndication_BestEffort InferredAdditionBWIndication = 2
+  )
+
+  var InferredAdditionBWIndication_name = map[int32]string{
+	  0: "InferredAdditionBWIndication_None",
+	  1: "InferredAdditionBWIndication_Assured",
+	  2: "InferredAdditionBWIndication_BestEffort",
+  }
+*/
+// instance control defaults
+const (
+	defaultOnuInstance    = "multi-instance"
+	defaultUniInstance    = "single-instance"
+	defaultGemPayloadSize = "auto"
+)
+
+const MAX_GEM_PAYLOAD = "max_gem_payload_size"
+
+type InstanceControl struct {
+	Onu               string `json:"ONU"`
+	Uni               string `json:"uni"`
+	MaxGemPayloadSize string `json:"max_gem_payload_size"`
+}
+
+// default discard config constants
+const (
+	defaultMinThreshold   = 0
+	defaultMaxThreshold   = 0
+	defaultMaxProbability = 0
+)
+
+type DiscardConfig struct {
+	MinThreshold   int `json:"min_threshold"`
+	MaxThreshold   int `json:"max_threshold"`
+	MaxProbability int `json:"max_probability"`
+}
+
+// default scheduler contants
+const (
+	defaultAdditionalBw     = AdditionalBW_AdditionalBW_BestEffort
+	defaultPriority         = 0
+	defaultWeight           = 0
+	defaultQueueSchedPolicy = SchedulingPolicy_Hybrid
+)
+
+type Scheduler struct {
+	Direction    string `json:"direction"`
+	AdditionalBw string `json:"additional_bw"`
+	Priority     uint32 `json:"priority"`
+	Weight       uint32 `json:"weight"`
+	QSchedPolicy string `json:"q_sched_policy"`
+}
+
+// default GEM attribute constants
+const (
+	defaultAESEncryption     = "True"
+	defaultPriorityQueue     = 0
+	defaultQueueWeight       = 0
+	defaultMaxQueueSize      = "auto"
+	defaultdropPolicy        = DiscardPolicy_TailDrop
+	defaultSchedulePolicy    = SchedulingPolicy_WRR
+	defaultIsMulticast       = "False"
+	defaultAccessControlList = "224.0.0.0-239.255.255.255"
+	defaultMcastGemID        = 4069
+)
+
+type GemPortAttribute struct {
+	MaxQueueSize     string        `json:"max_q_size"`
+	PbitMap          string        `json:"pbit_map"`
+	AesEncryption    string        `json:"aes_encryption"`
+	SchedulingPolicy string        `json:"scheduling_policy"`
+	PriorityQueue    uint32        `json:"priority_q"`
+	Weight           uint32        `json:"weight"`
+	DiscardPolicy    string        `json:"discard_policy"`
+	DiscardConfig    DiscardConfig `json:"discard_config"`
+	IsMulticast      string        `json:"is_multicast"`
+	DControlList     string        `json:"dynamic_access_control_list"`
+	SControlList     string        `json:"static_access_control_list"`
+	McastGemID       uint32        `json:"multicast_gem_id"`
+}
+
+type iScheduler struct {
+	AllocID      uint32 `json:"alloc_id"`
+	Direction    string `json:"direction"`
+	AdditionalBw string `json:"additional_bw"`
+	Priority     uint32 `json:"priority"`
+	Weight       uint32 `json:"weight"`
+	QSchedPolicy string `json:"q_sched_policy"`
+}
+type iGemPortAttribute struct {
+	GemportID        uint32        `json:"gemport_id"`
+	MaxQueueSize     string        `json:"max_q_size"`
+	PbitMap          string        `json:"pbit_map"`
+	AesEncryption    string        `json:"aes_encryption"`
+	SchedulingPolicy string        `json:"scheduling_policy"`
+	PriorityQueue    uint32        `json:"priority_q"`
+	Weight           uint32        `json:"weight"`
+	DiscardPolicy    string        `json:"discard_policy"`
+	DiscardConfig    DiscardConfig `json:"discard_config"`
+	IsMulticast      string        `json:"is_multicast"`
+	DControlList     string        `json:"dynamic_access_control_list"`
+	SControlList     string        `json:"static_access_control_list"`
+	McastGemID       uint32        `json:"multicast_gem_id"`
+}
+
+type TechProfileMgr struct {
+	config            *TechProfileFlags
+	resourceMgr       iPonResourceMgr
+	GemPortIDMgmtLock sync.RWMutex
+	AllocIDMgmtLock   sync.RWMutex
+}
+type DefaultTechProfile struct {
+	Name                           string             `json:"name"`
+	ProfileType                    string             `json:"profile_type"`
+	Version                        int                `json:"version"`
+	NumGemPorts                    uint32             `json:"num_gem_ports"`
+	InstanceCtrl                   InstanceControl    `json:"instance_control"`
+	UsScheduler                    Scheduler          `json:"us_scheduler"`
+	DsScheduler                    Scheduler          `json:"ds_scheduler"`
+	UpstreamGemPortAttributeList   []GemPortAttribute `json:"upstream_gem_port_attribute_list"`
+	DownstreamGemPortAttributeList []GemPortAttribute `json:"downstream_gem_port_attribute_list"`
+}
+type TechProfile struct {
+	Name                           string              `json:"name"`
+	SubscriberIdentifier           string              `json:"subscriber_identifier"`
+	ProfileType                    string              `json:"profile_type"`
+	Version                        int                 `json:"version"`
+	NumGemPorts                    uint32              `json:"num_gem_ports"`
+	InstanceCtrl                   InstanceControl     `json:"instance_control"`
+	UsScheduler                    iScheduler          `json:"us_scheduler"`
+	DsScheduler                    iScheduler          `json:"ds_scheduler"`
+	UpstreamGemPortAttributeList   []iGemPortAttribute `json:"upstream_gem_port_attribute_list"`
+	DownstreamGemPortAttributeList []iGemPortAttribute `json:"downstream_gem_port_attribute_list"`
+}
+
+// QThresholds struct for EPON
+type QThresholds struct {
+	QThreshold1 uint32 `json:"q_threshold1"`
+	QThreshold2 uint32 `json:"q_threshold2"`
+	QThreshold3 uint32 `json:"q_threshold3"`
+	QThreshold4 uint32 `json:"q_threshold4"`
+	QThreshold5 uint32 `json:"q_threshold5"`
+	QThreshold6 uint32 `json:"q_threshold6"`
+	QThreshold7 uint32 `json:"q_threshold7"`
+}
+
+// UpstreamQueueAttribute struct for EPON
+type UpstreamQueueAttribute struct {
+	MaxQueueSize              string        `json:"max_q_size"`
+	PbitMap                   string        `json:"pbit_map"`
+	AesEncryption             string        `json:"aes_encryption"`
+	TrafficType               string        `json:"traffic_type"`
+	UnsolicitedGrantSize      uint32        `json:"unsolicited_grant_size"`
+	NominalInterval           uint32        `json:"nominal_interval"`
+	ToleratedPollJitter       uint32        `json:"tolerated_poll_jitter"`
+	RequestTransmissionPolicy uint32        `json:"request_transmission_policy"`
+	NumQueueSet               uint32        `json:"num_q_sets"`
+	QThresholds               QThresholds   `json:"q_thresholds"`
+	SchedulingPolicy          string        `json:"scheduling_policy"`
+	PriorityQueue             uint32        `json:"priority_q"`
+	Weight                    uint32        `json:"weight"`
+	DiscardPolicy             string        `json:"discard_policy"`
+	DiscardConfig             DiscardConfig `json:"discard_config"`
+}
+
+// Default EPON constants
+const (
+	defaultPakageType = "B"
+)
+const (
+	defaultTrafficType               = "BE"
+	defaultUnsolicitedGrantSize      = 0
+	defaultNominalInterval           = 0
+	defaultToleratedPollJitter       = 0
+	defaultRequestTransmissionPolicy = 0
+	defaultNumQueueSet               = 2
+)
+const (
+	defaultQThreshold1 = 5500
+	defaultQThreshold2 = 0
+	defaultQThreshold3 = 0
+	defaultQThreshold4 = 0
+	defaultQThreshold5 = 0
+	defaultQThreshold6 = 0
+	defaultQThreshold7 = 0
+)
+
+// DownstreamQueueAttribute struct for EPON
+type DownstreamQueueAttribute struct {
+	MaxQueueSize     string        `json:"max_q_size"`
+	PbitMap          string        `json:"pbit_map"`
+	AesEncryption    string        `json:"aes_encryption"`
+	SchedulingPolicy string        `json:"scheduling_policy"`
+	PriorityQueue    uint32        `json:"priority_q"`
+	Weight           uint32        `json:"weight"`
+	DiscardPolicy    string        `json:"discard_policy"`
+	DiscardConfig    DiscardConfig `json:"discard_config"`
+}
+
+// iUpstreamQueueAttribute struct for EPON
+type iUpstreamQueueAttribute struct {
+	GemportID                 uint32        `json:"q_id"`
+	MaxQueueSize              string        `json:"max_q_size"`
+	PbitMap                   string        `json:"pbit_map"`
+	AesEncryption             string        `json:"aes_encryption"`
+	TrafficType               string        `json:"traffic_type"`
+	UnsolicitedGrantSize      uint32        `json:"unsolicited_grant_size"`
+	NominalInterval           uint32        `json:"nominal_interval"`
+	ToleratedPollJitter       uint32        `json:"tolerated_poll_jitter"`
+	RequestTransmissionPolicy uint32        `json:"request_transmission_policy"`
+	NumQueueSet               uint32        `json:"num_q_sets"`
+	QThresholds               QThresholds   `json:"q_thresholds"`
+	SchedulingPolicy          string        `json:"scheduling_policy"`
+	PriorityQueue             uint32        `json:"priority_q"`
+	Weight                    uint32        `json:"weight"`
+	DiscardPolicy             string        `json:"discard_policy"`
+	DiscardConfig             DiscardConfig `json:"discard_config"`
+}
+
+// iDownstreamQueueAttribute struct for EPON
+type iDownstreamQueueAttribute struct {
+	GemportID        uint32        `json:"q_id"`
+	MaxQueueSize     string        `json:"max_q_size"`
+	PbitMap          string        `json:"pbit_map"`
+	AesEncryption    string        `json:"aes_encryption"`
+	SchedulingPolicy string        `json:"scheduling_policy"`
+	PriorityQueue    uint32        `json:"priority_q"`
+	Weight           uint32        `json:"weight"`
+	DiscardPolicy    string        `json:"discard_policy"`
+	DiscardConfig    DiscardConfig `json:"discard_config"`
+}
+
+// EponAttribute struct for EPON
+type EponAttribute struct {
+	PackageType string `json:"pakage_type"`
+}
+
+// DefaultTechProfile struct for EPON
+type DefaultEponProfile struct {
+	Name                         string                     `json:"name"`
+	ProfileType                  string                     `json:"profile_type"`
+	Version                      int                        `json:"version"`
+	NumGemPorts                  uint32                     `json:"num_gem_ports"`
+	InstanceCtrl                 InstanceControl            `json:"instance_control"`
+	EponAttribute                EponAttribute              `json:"epon_attribute"`
+	UpstreamQueueAttributeList   []UpstreamQueueAttribute   `json:"upstream_queue_attribute_list"`
+	DownstreamQueueAttributeList []DownstreamQueueAttribute `json:"downstream_queue_attribute_list"`
+}
+
+// TechProfile struct for EPON
+type EponProfile struct {
+	Name                         string                      `json:"name"`
+	SubscriberIdentifier         string                      `json:"subscriber_identifier"`
+	ProfileType                  string                      `json:"profile_type"`
+	Version                      int                         `json:"version"`
+	NumGemPorts                  uint32                      `json:"num_gem_ports"`
+	InstanceCtrl                 InstanceControl             `json:"instance_control"`
+	EponAttribute                EponAttribute               `json:"epon_attribute"`
+	AllocID                      uint32                      `json:"llid"`
+	UpstreamQueueAttributeList   []iUpstreamQueueAttribute   `json:"upstream_queue_attribute_list"`
+	DownstreamQueueAttributeList []iDownstreamQueueAttribute `json:"downstream_queue_attribute_list"`
+}
+
+const (
+	xgspon = "XGS-PON"
+	gpon   = "GPON"
+	epon   = "EPON"
+)
+
+func (t *TechProfileMgr) SetKVClient() *db.Backend {
+	kvClient, err := newKVClient(t.config.KVStoreType, t.config.KVStoreAddress, t.config.KVStoreTimeout)
+	if err != nil {
+		logger.Errorw("failed-to-create-kv-client",
+			log.Fields{
+				"type": t.config.KVStoreType, "address": t.config.KVStoreAddress,
+				"timeout": t.config.KVStoreTimeout, "prefix": t.config.TPKVPathPrefix,
+				"error": err.Error(),
+			})
+		return nil
+	}
+	return &db.Backend{
+		Client:     kvClient,
+		StoreType:  t.config.KVStoreType,
+		Address:    t.config.KVStoreAddress,
+		Timeout:    t.config.KVStoreTimeout,
+		PathPrefix: t.config.TPKVPathPrefix}
+
+	/* TODO : Make sure direct call to NewBackend is working fine with backend , currently there is some
+		  issue between kv store and backend , core is not calling NewBackend directly
+	 kv := model.NewBackend(t.config.KVStoreType, t.config.KVStoreHost, t.config.KVStorePort,
+								  t.config.KVStoreTimeout,  kvStoreTechProfilePathPrefix)
+	*/
+}
+
+func newKVClient(storeType string, address string, timeout time.Duration) (kvstore.Client, error) {
+
+	logger.Infow("kv-store", log.Fields{"storeType": storeType, "address": address})
+	switch storeType {
+	case "consul":
+		return kvstore.NewConsulClient(address, timeout)
+	case "etcd":
+		return kvstore.NewEtcdClient(address, timeout, log.WarnLevel)
+	}
+	return nil, errors.New("unsupported-kv-store")
+}
+
+func NewTechProfile(resourceMgr iPonResourceMgr, KVStoreType string, KVStoreAddress string) (*TechProfileMgr, error) {
+	var techprofileObj TechProfileMgr
+	logger.Debug("Initializing techprofile Manager")
+	techprofileObj.config = NewTechProfileFlags(KVStoreType, KVStoreAddress)
+	techprofileObj.config.KVBackend = techprofileObj.SetKVClient()
+	if techprofileObj.config.KVBackend == nil {
+		logger.Error("Failed to initialize KV backend\n")
+		return nil, errors.New("KV backend init failed")
+	}
+	techprofileObj.resourceMgr = resourceMgr
+	logger.Debug("Initializing techprofile object instance success")
+	return &techprofileObj, nil
+}
+
+func (t *TechProfileMgr) GetTechProfileInstanceKVPath(techProfiletblID uint32, uniPortName string) string {
+	logger.Debugw("get-tp-instance-kv-path", log.Fields{
+		"uniPortName": uniPortName,
+		"tpId":        techProfiletblID,
+	})
+	return fmt.Sprintf(t.config.TPInstanceKVPath, t.resourceMgr.GetTechnology(), techProfiletblID, uniPortName)
+}
+
+func (t *TechProfileMgr) GetTPInstanceFromKVStore(ctx context.Context, techProfiletblID uint32, path string) (interface{}, error) {
+	var err error
+	var kvResult *kvstore.KVPair
+	var KvTpIns TechProfile
+	var KvEponIns EponProfile
+	var resPtr interface{}
+	// For example:
+	// tpInstPath like "XGS-PON/64/uni_port_name"
+	// is broken into ["XGS-PON" "64" ...]
+	pathSlice := regexp.MustCompile(`/`).Split(path, -1)
+	switch pathSlice[0] {
+	case xgspon, gpon:
+		resPtr = &KvTpIns
+	case epon:
+		resPtr = &KvEponIns
+	default:
+		log.Errorw("unknown-tech", log.Fields{"tech": pathSlice[0]})
+		return nil, fmt.Errorf("unknown-tech-%s", pathSlice[0])
+	}
+
+	kvResult, _ = t.config.KVBackend.Get(ctx, path)
+	if kvResult == nil {
+		log.Infow("tp-instance-not-found-on-kv", log.Fields{"key": path})
+		return nil, nil
+	} else {
+		if value, err := kvstore.ToByte(kvResult.Value); err == nil {
+			if err = json.Unmarshal(value, resPtr); err != nil {
+				log.Errorw("error-unmarshal-kv-result", log.Fields{"key": path, "value": value})
+				return nil, errors.New("error-unmarshal-kv-result")
+			} else {
+				return resPtr, nil
+			}
+		}
+	}
+	return nil, err
+}
+
+func (t *TechProfileMgr) addTechProfInstanceToKVStore(ctx context.Context, techProfiletblID uint32, uniPortName string, tpInstance *TechProfile) error {
+	path := t.GetTechProfileInstanceKVPath(techProfiletblID, uniPortName)
+	logger.Debugw("Adding techprof instance to kvstore", log.Fields{"key": path, "tpinstance": tpInstance})
+	tpInstanceJson, err := json.Marshal(*tpInstance)
+	if err == nil {
+		// Backend will convert JSON byte array into string format
+		logger.Debugw("Storing tech profile instance to KV Store", log.Fields{"key": path, "val": tpInstanceJson})
+		err = t.config.KVBackend.Put(ctx, path, tpInstanceJson)
+	} else {
+		logger.Errorw("Error in marshaling into Json format", log.Fields{"key": path, "tpinstance": tpInstance})
+	}
+	return err
+}
+
+func (t *TechProfileMgr) addEponProfInstanceToKVStore(ctx context.Context, techProfiletblID uint32, uniPortName string, tpInstance *EponProfile) error {
+	path := t.GetTechProfileInstanceKVPath(techProfiletblID, uniPortName)
+	logger.Debugw("Adding techprof instance to kvstore", log.Fields{"key": path, "tpinstance": tpInstance})
+	tpInstanceJson, err := json.Marshal(*tpInstance)
+	if err == nil {
+		// Backend will convert JSON byte array into string format
+		logger.Debugw("Storing tech profile instance to KV Store", log.Fields{"key": path, "val": tpInstanceJson})
+		err = t.config.KVBackend.Put(ctx, path, tpInstanceJson)
+	} else {
+		logger.Errorw("Error in marshaling into Json format", log.Fields{"key": path, "tpinstance": tpInstance})
+	}
+	return err
+}
+
+func (t *TechProfileMgr) getTPFromKVStore(ctx context.Context, techProfiletblID uint32) *DefaultTechProfile {
+	var kvtechprofile DefaultTechProfile
+	key := fmt.Sprintf(t.config.TPFileKVPath, t.resourceMgr.GetTechnology(), techProfiletblID)
+	logger.Debugw("Getting techprofile from KV store", log.Fields{"techProfiletblID": techProfiletblID, "Key": key})
+	kvresult, err := t.config.KVBackend.Get(ctx, key)
+	if err != nil {
+		logger.Errorw("Error while fetching value from KV store", log.Fields{"key": key})
+		return nil
+	}
+	if kvresult != nil {
+		/* Backend will return Value in string format,needs to be converted to []byte before unmarshal*/
+		if value, err := kvstore.ToByte(kvresult.Value); err == nil {
+			if err = json.Unmarshal(value, &kvtechprofile); err != nil {
+				logger.Errorw("Error unmarshaling techprofile fetched from KV store", log.Fields{"techProfiletblID": techProfiletblID, "error": err, "techprofile_json": value})
+				return nil
+			}
+
+			logger.Debugw("Success fetched techprofile from KV store", log.Fields{"techProfiletblID": techProfiletblID, "value": kvtechprofile})
+			return &kvtechprofile
+		}
+	}
+	return nil
+}
+
+func (t *TechProfileMgr) getEponTPFromKVStore(ctx context.Context, techProfiletblID uint32) *DefaultEponProfile {
+	var kvtechprofile DefaultEponProfile
+	key := fmt.Sprintf(t.config.TPFileKVPath, t.resourceMgr.GetTechnology(), techProfiletblID)
+	logger.Debugw("Getting techprofile from KV store", log.Fields{"techProfiletblID": techProfiletblID, "Key": key})
+	kvresult, err := t.config.KVBackend.Get(ctx, key)
+	if err != nil {
+		logger.Errorw("Error while fetching value from KV store", log.Fields{"key": key})
+		return nil
+	}
+	if kvresult != nil {
+		/* Backend will return Value in string format,needs to be converted to []byte before unmarshal*/
+		if value, err := kvstore.ToByte(kvresult.Value); err == nil {
+			if err = json.Unmarshal(value, &kvtechprofile); err != nil {
+				logger.Errorw("Error unmarshaling techprofile fetched from KV store", log.Fields{"techProfiletblID": techProfiletblID, "error": err, "techprofile_json": value})
+				return nil
+			}
+
+			logger.Debugw("Success fetched techprofile from KV store", log.Fields{"techProfiletblID": techProfiletblID, "value": kvtechprofile})
+			return &kvtechprofile
+		}
+	}
+	return nil
+}
+
+func (t *TechProfileMgr) CreateTechProfInstance(ctx context.Context, techProfiletblID uint32, uniPortName string, intfId uint32) (interface{}, error) {
+	var tpInstance *TechProfile
+	var tpEponInstance *EponProfile
+
+	logger.Infow("creating-tp-instance", log.Fields{"tableid": techProfiletblID, "uni": uniPortName, "intId": intfId})
+
+	// Make sure the uniPortName is as per format pon-{[0-9]+}/onu-{[0-9]+}/uni-{[0-9]+}
+	if !uniPortNameFormat.Match([]byte(uniPortName)) {
+		logger.Errorw("uni-port-name-not-confirming-to-format", log.Fields{"uniPortName": uniPortName})
+		return nil, errors.New("uni-port-name-not-confirming-to-format")
+	}
+	tpInstancePath := t.GetTechProfileInstanceKVPath(techProfiletblID, uniPortName)
+	// For example:
+	// tpInstPath like "XGS-PON/64/uni_port_name"
+	// is broken into ["XGS-PON" "64" ...]
+	pathSlice := regexp.MustCompile(`/`).Split(tpInstancePath, -1)
+	if pathSlice[0] == epon {
+		tp := t.getEponTPFromKVStore(ctx, techProfiletblID)
+		if tp != nil {
+			if err := t.validateInstanceControlAttr(tp.InstanceCtrl); err != nil {
+				logger.Error("invalid-instance-ctrl-attr--using-default-tp")
+				tp = t.getDefaultEponProfile()
+			} else {
+				logger.Infow("using-specified-tp-from-kv-store", log.Fields{"tpid": techProfiletblID})
+			}
+		} else {
+			logger.Info("tp-not-found-on-kv--creating-default-tp")
+			tp = t.getDefaultEponProfile()
+		}
+
+		if tpEponInstance = t.allocateEponTPInstance(ctx, uniPortName, tp, intfId, tpInstancePath); tpEponInstance == nil {
+			logger.Error("tp-intance-allocation-failed")
+			return nil, errors.New("tp-intance-allocation-failed")
+		}
+		if err := t.addEponProfInstanceToKVStore(ctx, techProfiletblID, uniPortName, tpEponInstance); err != nil {
+			logger.Errorw("error-adding-tp-to-kv-store", log.Fields{"tableid": techProfiletblID, "uni": uniPortName})
+			return nil, errors.New("error-adding-tp-to-kv-store")
+		}
+		logger.Infow("tp-added-to-kv-store-successfully",
+			log.Fields{"tpid": techProfiletblID, "uni": uniPortName, "intfId": intfId})
+		return tpEponInstance, nil
+	} else {
+		tp := t.getTPFromKVStore(ctx, techProfiletblID)
+		if tp != nil {
+			if err := t.validateInstanceControlAttr(tp.InstanceCtrl); err != nil {
+				logger.Error("invalid-instance-ctrl-attr--using-default-tp")
+				tp = t.getDefaultTechProfile()
+			} else {
+				logger.Infow("using-specified-tp-from-kv-store", log.Fields{"tpid": techProfiletblID})
+			}
+		} else {
+			logger.Info("tp-not-found-on-kv--creating-default-tp")
+			tp = t.getDefaultTechProfile()
+		}
+
+		if tpInstance = t.allocateTPInstance(ctx, uniPortName, tp, intfId, tpInstancePath); tpInstance == nil {
+			logger.Error("tp-intance-allocation-failed")
+			return nil, errors.New("tp-intance-allocation-failed")
+		}
+		if err := t.addTechProfInstanceToKVStore(ctx, techProfiletblID, uniPortName, tpInstance); err != nil {
+			logger.Errorw("error-adding-tp-to-kv-store", log.Fields{"tableid": techProfiletblID, "uni": uniPortName})
+			return nil, errors.New("error-adding-tp-to-kv-store")
+		}
+		logger.Infow("tp-added-to-kv-store-successfully",
+			log.Fields{"tpid": techProfiletblID, "uni": uniPortName, "intfId": intfId})
+		return tpInstance, nil
+	}
+}
+
+func (t *TechProfileMgr) DeleteTechProfileInstance(ctx context.Context, techProfiletblID uint32, uniPortName string) error {
+	path := t.GetTechProfileInstanceKVPath(techProfiletblID, uniPortName)
+	return t.config.KVBackend.Delete(ctx, path)
+}
+
+func (t *TechProfileMgr) validateInstanceControlAttr(instCtl InstanceControl) error {
+	if instCtl.Onu != "single-instance" && instCtl.Onu != "multi-instance" {
+		logger.Errorw("invalid-onu-instance-control-attribute", log.Fields{"onu-inst": instCtl.Onu})
+		return errors.New("invalid-onu-instance-ctl-attr")
+	}
+
+	if instCtl.Uni != "single-instance" && instCtl.Uni != "multi-instance" {
+		logger.Errorw("invalid-uni-instance-control-attribute", log.Fields{"uni-inst": instCtl.Uni})
+		return errors.New("invalid-uni-instance-ctl-attr")
+	}
+
+	if instCtl.Uni == "multi-instance" {
+		logger.Error("uni-multi-instance-tp-not-supported")
+		return errors.New("uni-multi-instance-tp-not-supported")
+	}
+
+	return nil
+}
+
+func (t *TechProfileMgr) allocateTPInstance(ctx context.Context, uniPortName string, tp *DefaultTechProfile, intfId uint32, tpInstPath string) *TechProfile {
+
+	var usGemPortAttributeList []iGemPortAttribute
+	var dsGemPortAttributeList []iGemPortAttribute
+	var dsMulticastGemAttributeList []iGemPortAttribute
+	var dsUnicastGemAttributeList []iGemPortAttribute
+	var tcontIDs []uint32
+	var gemPorts []uint32
+	var err error
+
+	logger.Infow("Allocating TechProfileMgr instance from techprofile template", log.Fields{"uniPortName": uniPortName, "intfId": intfId, "numGem": tp.NumGemPorts})
+
+	if tp.InstanceCtrl.Onu == "multi-instance" {
+		t.AllocIDMgmtLock.Lock()
+		tcontIDs, err = t.resourceMgr.GetResourceID(ctx, intfId, t.resourceMgr.GetResourceTypeAllocID(), 1)
+		t.AllocIDMgmtLock.Unlock()
+		if err != nil {
+			logger.Errorw("Error getting alloc id from rsrcrMgr", log.Fields{"intfId": intfId})
+			return nil
+		}
+	} else { // "single-instance"
+		if tpInst, err := t.getSingleInstanceTp(ctx, tpInstPath); err != nil {
+			logger.Errorw("Error getting alloc id from rsrcrMgr", log.Fields{"intfId": intfId})
+			return nil
+		} else if tpInst == nil {
+			// No "single-instance" tp found on one any uni port for the given TP ID
+			// Allocate a new TcontID or AllocID
+			t.AllocIDMgmtLock.Lock()
+			tcontIDs, err = t.resourceMgr.GetResourceID(ctx, intfId, t.resourceMgr.GetResourceTypeAllocID(), 1)
+			t.AllocIDMgmtLock.Unlock()
+			if err != nil {
+				logger.Errorw("Error getting alloc id from rsrcrMgr", log.Fields{"intfId": intfId})
+				return nil
+			}
+		} else {
+			// Use the alloc-id from the existing TpInstance
+			tcontIDs = append(tcontIDs, tpInst.UsScheduler.AllocID)
+		}
+	}
+	logger.Debugw("Num GEM ports in TP:", log.Fields{"NumGemPorts": tp.NumGemPorts})
+	t.GemPortIDMgmtLock.Lock()
+	gemPorts, err = t.resourceMgr.GetResourceID(ctx, intfId, t.resourceMgr.GetResourceTypeGemPortID(), tp.NumGemPorts)
+	t.GemPortIDMgmtLock.Unlock()
+	if err != nil {
+		logger.Errorw("Error getting gemport ids from rsrcrMgr", log.Fields{"intfId": intfId, "numGemports": tp.NumGemPorts})
+		return nil
+	}
+	logger.Infow("Allocated tconts and GEM ports successfully", log.Fields{"tconts": tcontIDs, "gemports": gemPorts})
+	for index := 0; index < int(tp.NumGemPorts); index++ {
+		usGemPortAttributeList = append(usGemPortAttributeList,
+			iGemPortAttribute{GemportID: gemPorts[index],
+				MaxQueueSize:     tp.UpstreamGemPortAttributeList[index].MaxQueueSize,
+				PbitMap:          tp.UpstreamGemPortAttributeList[index].PbitMap,
+				AesEncryption:    tp.UpstreamGemPortAttributeList[index].AesEncryption,
+				SchedulingPolicy: tp.UpstreamGemPortAttributeList[index].SchedulingPolicy,
+				PriorityQueue:    tp.UpstreamGemPortAttributeList[index].PriorityQueue,
+				Weight:           tp.UpstreamGemPortAttributeList[index].Weight,
+				DiscardPolicy:    tp.UpstreamGemPortAttributeList[index].DiscardPolicy,
+				DiscardConfig:    tp.UpstreamGemPortAttributeList[index].DiscardConfig})
+	}
+
+	logger.Info("length of DownstreamGemPortAttributeList", len(tp.DownstreamGemPortAttributeList))
+	//put multicast and unicast downstream GEM port attributes in different lists first
+	for index := 0; index < int(len(tp.DownstreamGemPortAttributeList)); index++ {
+		if isMulticastGem(tp.DownstreamGemPortAttributeList[index].IsMulticast) {
+			dsMulticastGemAttributeList = append(dsMulticastGemAttributeList,
+				iGemPortAttribute{
+					McastGemID:       tp.DownstreamGemPortAttributeList[index].McastGemID,
+					MaxQueueSize:     tp.DownstreamGemPortAttributeList[index].MaxQueueSize,
+					PbitMap:          tp.DownstreamGemPortAttributeList[index].PbitMap,
+					AesEncryption:    tp.DownstreamGemPortAttributeList[index].AesEncryption,
+					SchedulingPolicy: tp.DownstreamGemPortAttributeList[index].SchedulingPolicy,
+					PriorityQueue:    tp.DownstreamGemPortAttributeList[index].PriorityQueue,
+					Weight:           tp.DownstreamGemPortAttributeList[index].Weight,
+					DiscardPolicy:    tp.DownstreamGemPortAttributeList[index].DiscardPolicy,
+					DiscardConfig:    tp.DownstreamGemPortAttributeList[index].DiscardConfig,
+					IsMulticast:      tp.DownstreamGemPortAttributeList[index].IsMulticast,
+					DControlList:     tp.DownstreamGemPortAttributeList[index].DControlList,
+					SControlList:     tp.DownstreamGemPortAttributeList[index].SControlList})
+		} else {
+			dsUnicastGemAttributeList = append(dsUnicastGemAttributeList,
+				iGemPortAttribute{
+					MaxQueueSize:     tp.DownstreamGemPortAttributeList[index].MaxQueueSize,
+					PbitMap:          tp.DownstreamGemPortAttributeList[index].PbitMap,
+					AesEncryption:    tp.DownstreamGemPortAttributeList[index].AesEncryption,
+					SchedulingPolicy: tp.DownstreamGemPortAttributeList[index].SchedulingPolicy,
+					PriorityQueue:    tp.DownstreamGemPortAttributeList[index].PriorityQueue,
+					Weight:           tp.DownstreamGemPortAttributeList[index].Weight,
+					DiscardPolicy:    tp.DownstreamGemPortAttributeList[index].DiscardPolicy,
+					DiscardConfig:    tp.DownstreamGemPortAttributeList[index].DiscardConfig})
+		}
+	}
+	//add unicast downstream GEM ports to dsGemPortAttributeList
+	for index := 0; index < int(tp.NumGemPorts); index++ {
+		dsGemPortAttributeList = append(dsGemPortAttributeList,
+			iGemPortAttribute{GemportID: gemPorts[index],
+				MaxQueueSize:     dsUnicastGemAttributeList[index].MaxQueueSize,
+				PbitMap:          dsUnicastGemAttributeList[index].PbitMap,
+				AesEncryption:    dsUnicastGemAttributeList[index].AesEncryption,
+				SchedulingPolicy: dsUnicastGemAttributeList[index].SchedulingPolicy,
+				PriorityQueue:    dsUnicastGemAttributeList[index].PriorityQueue,
+				Weight:           dsUnicastGemAttributeList[index].Weight,
+				DiscardPolicy:    dsUnicastGemAttributeList[index].DiscardPolicy,
+				DiscardConfig:    dsUnicastGemAttributeList[index].DiscardConfig})
+	}
+	//add multicast GEM ports to dsGemPortAttributeList afterwards
+	for k := range dsMulticastGemAttributeList {
+		dsGemPortAttributeList = append(dsGemPortAttributeList, dsMulticastGemAttributeList[k])
+	}
+
+	return &TechProfile{
+		SubscriberIdentifier: uniPortName,
+		Name:                 tp.Name,
+		ProfileType:          tp.ProfileType,
+		Version:              tp.Version,
+		NumGemPorts:          tp.NumGemPorts,
+		InstanceCtrl:         tp.InstanceCtrl,
+		UsScheduler: iScheduler{
+			AllocID:      tcontIDs[0],
+			Direction:    tp.UsScheduler.Direction,
+			AdditionalBw: tp.UsScheduler.AdditionalBw,
+			Priority:     tp.UsScheduler.Priority,
+			Weight:       tp.UsScheduler.Weight,
+			QSchedPolicy: tp.UsScheduler.QSchedPolicy},
+		DsScheduler: iScheduler{
+			AllocID:      tcontIDs[0],
+			Direction:    tp.DsScheduler.Direction,
+			AdditionalBw: tp.DsScheduler.AdditionalBw,
+			Priority:     tp.DsScheduler.Priority,
+			Weight:       tp.DsScheduler.Weight,
+			QSchedPolicy: tp.DsScheduler.QSchedPolicy},
+		UpstreamGemPortAttributeList:   usGemPortAttributeList,
+		DownstreamGemPortAttributeList: dsGemPortAttributeList}
+}
+
+// allocateTPInstance function for EPON
+func (t *TechProfileMgr) allocateEponTPInstance(ctx context.Context, uniPortName string, tp *DefaultEponProfile, intfId uint32, tpInstPath string) *EponProfile {
+
+	var usQueueAttributeList []iUpstreamQueueAttribute
+	var dsQueueAttributeList []iDownstreamQueueAttribute
+	var tcontIDs []uint32
+	var gemPorts []uint32
+	var err error
+
+	log.Infow("Allocating TechProfileMgr instance from techprofile template", log.Fields{"uniPortName": uniPortName, "intfId": intfId, "numGem": tp.NumGemPorts})
+
+	if tp.InstanceCtrl.Onu == "multi-instance" {
+		if tcontIDs, err = t.resourceMgr.GetResourceID(ctx, intfId, t.resourceMgr.GetResourceTypeAllocID(), 1); err != nil {
+			log.Errorw("Error getting alloc id from rsrcrMgr", log.Fields{"intfId": intfId})
+			return nil
+		}
+	} else { // "single-instance"
+		if tpInst, err := t.getSingleInstanceEponTp(ctx, tpInstPath); err != nil {
+			log.Errorw("Error getting alloc id from rsrcrMgr", log.Fields{"intfId": intfId})
+			return nil
+		} else if tpInst == nil {
+			// No "single-instance" tp found on one any uni port for the given TP ID
+			// Allocate a new TcontID or AllocID
+			if tcontIDs, err = t.resourceMgr.GetResourceID(ctx, intfId, t.resourceMgr.GetResourceTypeAllocID(), 1); err != nil {
+				log.Errorw("Error getting alloc id from rsrcrMgr", log.Fields{"intfId": intfId})
+				return nil
+			}
+		} else {
+			// Use the alloc-id from the existing TpInstance
+			tcontIDs = append(tcontIDs, tpInst.AllocID)
+		}
+	}
+	log.Debugw("Num GEM ports in TP:", log.Fields{"NumGemPorts": tp.NumGemPorts})
+	if gemPorts, err = t.resourceMgr.GetResourceID(ctx, intfId, t.resourceMgr.GetResourceTypeGemPortID(), tp.NumGemPorts); err != nil {
+		log.Errorw("Error getting gemport ids from rsrcrMgr", log.Fields{"intfId": intfId, "numGemports": tp.NumGemPorts})
+		return nil
+	}
+	log.Infow("Allocated tconts and GEM ports successfully", log.Fields{"tconts": tcontIDs, "gemports": gemPorts})
+	for index := 0; index < int(tp.NumGemPorts); index++ {
+		usQueueAttributeList = append(usQueueAttributeList,
+			iUpstreamQueueAttribute{GemportID: gemPorts[index],
+				MaxQueueSize:              tp.UpstreamQueueAttributeList[index].MaxQueueSize,
+				PbitMap:                   tp.UpstreamQueueAttributeList[index].PbitMap,
+				AesEncryption:             tp.UpstreamQueueAttributeList[index].AesEncryption,
+				TrafficType:               tp.UpstreamQueueAttributeList[index].TrafficType,
+				UnsolicitedGrantSize:      tp.UpstreamQueueAttributeList[index].UnsolicitedGrantSize,
+				NominalInterval:           tp.UpstreamQueueAttributeList[index].NominalInterval,
+				ToleratedPollJitter:       tp.UpstreamQueueAttributeList[index].ToleratedPollJitter,
+				RequestTransmissionPolicy: tp.UpstreamQueueAttributeList[index].RequestTransmissionPolicy,
+				NumQueueSet:               tp.UpstreamQueueAttributeList[index].NumQueueSet,
+				QThresholds:               tp.UpstreamQueueAttributeList[index].QThresholds,
+				SchedulingPolicy:          tp.UpstreamQueueAttributeList[index].SchedulingPolicy,
+				PriorityQueue:             tp.UpstreamQueueAttributeList[index].PriorityQueue,
+				Weight:                    tp.UpstreamQueueAttributeList[index].Weight,
+				DiscardPolicy:             tp.UpstreamQueueAttributeList[index].DiscardPolicy,
+				DiscardConfig:             tp.UpstreamQueueAttributeList[index].DiscardConfig})
+	}
+
+	log.Info("length of DownstreamGemPortAttributeList", len(tp.DownstreamQueueAttributeList))
+	for index := 0; index < int(tp.NumGemPorts); index++ {
+		dsQueueAttributeList = append(dsQueueAttributeList,
+			iDownstreamQueueAttribute{GemportID: gemPorts[index],
+				MaxQueueSize:     tp.DownstreamQueueAttributeList[index].MaxQueueSize,
+				PbitMap:          tp.DownstreamQueueAttributeList[index].PbitMap,
+				AesEncryption:    tp.DownstreamQueueAttributeList[index].AesEncryption,
+				SchedulingPolicy: tp.DownstreamQueueAttributeList[index].SchedulingPolicy,
+				PriorityQueue:    tp.DownstreamQueueAttributeList[index].PriorityQueue,
+				Weight:           tp.DownstreamQueueAttributeList[index].Weight,
+				DiscardPolicy:    tp.DownstreamQueueAttributeList[index].DiscardPolicy,
+				DiscardConfig:    tp.DownstreamQueueAttributeList[index].DiscardConfig})
+	}
+
+	return &EponProfile{
+		SubscriberIdentifier:         uniPortName,
+		Name:                         tp.Name,
+		ProfileType:                  tp.ProfileType,
+		Version:                      tp.Version,
+		NumGemPorts:                  tp.NumGemPorts,
+		InstanceCtrl:                 tp.InstanceCtrl,
+		EponAttribute:                tp.EponAttribute,
+		AllocID:                      tcontIDs[0],
+		UpstreamQueueAttributeList:   usQueueAttributeList,
+		DownstreamQueueAttributeList: dsQueueAttributeList}
+}
+
+// getSingleInstanceTp returns another TpInstance for an ONU on a different
+// uni port for the same TP ID, if it finds one, else nil.
+func (t *TechProfileMgr) getSingleInstanceTp(ctx context.Context, tpPath string) (*TechProfile, error) {
+	var tpInst TechProfile
+
+	// For example:
+	// tpPath like "service/voltha/technology_profiles/xgspon/64/pon-{0}/onu-{1}/uni-{1}"
+	// is broken into ["service/voltha/technology_profiles/xgspon/64/pon-{0}/onu-{1}" ""]
+	uniPathSlice := regexp.MustCompile(`/uni-{[0-9]+}$`).Split(tpPath, 2)
+	kvPairs, _ := t.config.KVBackend.List(ctx, uniPathSlice[0])
+
+	// Find a valid TP Instance among all the UNIs of that ONU for the given TP ID
+	for keyPath, kvPair := range kvPairs {
+		if value, err := kvstore.ToByte(kvPair.Value); err == nil {
+			if err = json.Unmarshal(value, &tpInst); err != nil {
+				logger.Errorw("error-unmarshal-kv-pair", log.Fields{"keyPath": keyPath, "value": value})
+				return nil, errors.New("error-unmarshal-kv-pair")
+			} else {
+				logger.Debugw("found-valid-tp-instance-on-another-uni", log.Fields{"keyPath": keyPath})
+				return &tpInst, nil
+			}
+		}
+	}
+	return nil, nil
+}
+
+func (t *TechProfileMgr) getSingleInstanceEponTp(ctx context.Context, tpPath string) (*EponProfile, error) {
+	var tpInst EponProfile
+
+	// For example:
+	// tpPath like "service/voltha/technology_profiles/xgspon/64/pon-{0}/onu-{1}/uni-{1}"
+	// is broken into ["service/voltha/technology_profiles/xgspon/64/pon-{0}/onu-{1}" ""]
+	uniPathSlice := regexp.MustCompile(`/uni-{[0-9]+}$`).Split(tpPath, 2)
+	kvPairs, _ := t.config.KVBackend.List(ctx, uniPathSlice[0])
+
+	// Find a valid TP Instance among all the UNIs of that ONU for the given TP ID
+	for keyPath, kvPair := range kvPairs {
+		if value, err := kvstore.ToByte(kvPair.Value); err == nil {
+			if err = json.Unmarshal(value, &tpInst); err != nil {
+				logger.Errorw("error-unmarshal-kv-pair", log.Fields{"keyPath": keyPath, "value": value})
+				return nil, errors.New("error-unmarshal-kv-pair")
+			} else {
+				logger.Debugw("found-valid-tp-instance-on-another-uni", log.Fields{"keyPath": keyPath})
+				return &tpInst, nil
+			}
+		}
+	}
+	return nil, nil
+}
+
+func (t *TechProfileMgr) getDefaultTechProfile() *DefaultTechProfile {
+
+	var usGemPortAttributeList []GemPortAttribute
+	var dsGemPortAttributeList []GemPortAttribute
+
+	for _, pbit := range t.config.DefaultPbits {
+		logger.Debugw("Creating GEM port", log.Fields{"pbit": pbit})
+		usGemPortAttributeList = append(usGemPortAttributeList,
+			GemPortAttribute{
+				MaxQueueSize:     defaultMaxQueueSize,
+				PbitMap:          pbit,
+				AesEncryption:    defaultAESEncryption,
+				SchedulingPolicy: SchedulingPolicy_name[defaultSchedulePolicy],
+				PriorityQueue:    defaultPriorityQueue,
+				Weight:           defaultQueueWeight,
+				DiscardPolicy:    DiscardPolicy_name[defaultdropPolicy],
+				DiscardConfig: DiscardConfig{
+					MinThreshold:   defaultMinThreshold,
+					MaxThreshold:   defaultMaxThreshold,
+					MaxProbability: defaultMaxProbability}})
+		dsGemPortAttributeList = append(dsGemPortAttributeList,
+			GemPortAttribute{
+				MaxQueueSize:     defaultMaxQueueSize,
+				PbitMap:          pbit,
+				AesEncryption:    defaultAESEncryption,
+				SchedulingPolicy: SchedulingPolicy_name[defaultSchedulePolicy],
+				PriorityQueue:    defaultPriorityQueue,
+				Weight:           defaultQueueWeight,
+				DiscardPolicy:    DiscardPolicy_name[defaultdropPolicy],
+				DiscardConfig: DiscardConfig{
+					MinThreshold:   defaultMinThreshold,
+					MaxThreshold:   defaultMaxThreshold,
+					MaxProbability: defaultMaxProbability},
+				IsMulticast:  defaultIsMulticast,
+				DControlList: defaultAccessControlList,
+				SControlList: defaultAccessControlList,
+				McastGemID:   defaultMcastGemID})
+	}
+	return &DefaultTechProfile{
+		Name:        t.config.DefaultTPName,
+		ProfileType: t.resourceMgr.GetTechnology(),
+		Version:     t.config.TPVersion,
+		NumGemPorts: uint32(len(usGemPortAttributeList)),
+		InstanceCtrl: InstanceControl{
+			Onu:               defaultOnuInstance,
+			Uni:               defaultUniInstance,
+			MaxGemPayloadSize: defaultGemPayloadSize},
+		UsScheduler: Scheduler{
+			Direction:    Direction_name[Direction_UPSTREAM],
+			AdditionalBw: AdditionalBW_name[defaultAdditionalBw],
+			Priority:     defaultPriority,
+			Weight:       defaultWeight,
+			QSchedPolicy: SchedulingPolicy_name[defaultQueueSchedPolicy]},
+		DsScheduler: Scheduler{
+			Direction:    Direction_name[Direction_DOWNSTREAM],
+			AdditionalBw: AdditionalBW_name[defaultAdditionalBw],
+			Priority:     defaultPriority,
+			Weight:       defaultWeight,
+			QSchedPolicy: SchedulingPolicy_name[defaultQueueSchedPolicy]},
+		UpstreamGemPortAttributeList:   usGemPortAttributeList,
+		DownstreamGemPortAttributeList: dsGemPortAttributeList}
+}
+
+// getDefaultTechProfile function for EPON
+func (t *TechProfileMgr) getDefaultEponProfile() *DefaultEponProfile {
+
+	var usQueueAttributeList []UpstreamQueueAttribute
+	var dsQueueAttributeList []DownstreamQueueAttribute
+
+	for _, pbit := range t.config.DefaultPbits {
+		log.Debugw("Creating Queue", log.Fields{"pbit": pbit})
+		usQueueAttributeList = append(usQueueAttributeList,
+			UpstreamQueueAttribute{
+				MaxQueueSize:              defaultMaxQueueSize,
+				PbitMap:                   pbit,
+				AesEncryption:             defaultAESEncryption,
+				TrafficType:               defaultTrafficType,
+				UnsolicitedGrantSize:      defaultUnsolicitedGrantSize,
+				NominalInterval:           defaultNominalInterval,
+				ToleratedPollJitter:       defaultToleratedPollJitter,
+				RequestTransmissionPolicy: defaultRequestTransmissionPolicy,
+				NumQueueSet:               defaultNumQueueSet,
+				QThresholds: QThresholds{
+					QThreshold1: defaultQThreshold1,
+					QThreshold2: defaultQThreshold2,
+					QThreshold3: defaultQThreshold3,
+					QThreshold4: defaultQThreshold4,
+					QThreshold5: defaultQThreshold5,
+					QThreshold6: defaultQThreshold6,
+					QThreshold7: defaultQThreshold7},
+				SchedulingPolicy: SchedulingPolicy_name[defaultSchedulePolicy],
+				PriorityQueue:    defaultPriorityQueue,
+				Weight:           defaultQueueWeight,
+				DiscardPolicy:    DiscardPolicy_name[defaultdropPolicy],
+				DiscardConfig: DiscardConfig{
+					MinThreshold:   defaultMinThreshold,
+					MaxThreshold:   defaultMaxThreshold,
+					MaxProbability: defaultMaxProbability}})
+		dsQueueAttributeList = append(dsQueueAttributeList,
+			DownstreamQueueAttribute{
+				MaxQueueSize:     defaultMaxQueueSize,
+				PbitMap:          pbit,
+				AesEncryption:    defaultAESEncryption,
+				SchedulingPolicy: SchedulingPolicy_name[defaultSchedulePolicy],
+				PriorityQueue:    defaultPriorityQueue,
+				Weight:           defaultQueueWeight,
+				DiscardPolicy:    DiscardPolicy_name[defaultdropPolicy],
+				DiscardConfig: DiscardConfig{
+					MinThreshold:   defaultMinThreshold,
+					MaxThreshold:   defaultMaxThreshold,
+					MaxProbability: defaultMaxProbability}})
+	}
+	return &DefaultEponProfile{
+		Name:        t.config.DefaultTPName,
+		ProfileType: t.resourceMgr.GetTechnology(),
+		Version:     t.config.TPVersion,
+		NumGemPorts: uint32(len(usQueueAttributeList)),
+		InstanceCtrl: InstanceControl{
+			Onu:               defaultOnuInstance,
+			Uni:               defaultUniInstance,
+			MaxGemPayloadSize: defaultGemPayloadSize},
+		EponAttribute: EponAttribute{
+			PackageType: defaultPakageType},
+		UpstreamQueueAttributeList:   usQueueAttributeList,
+		DownstreamQueueAttributeList: dsQueueAttributeList}
+}
+
+func (t *TechProfileMgr) GetprotoBufParamValue(paramType string, paramKey string) int32 {
+	var result int32 = -1
+
+	if paramType == "direction" {
+		for key, val := range tp_pb.Direction_value {
+			if key == paramKey {
+				result = val
+			}
+		}
+	} else if paramType == "discard_policy" {
+		for key, val := range tp_pb.DiscardPolicy_value {
+			if key == paramKey {
+				result = val
+			}
+		}
+	} else if paramType == "sched_policy" {
+		for key, val := range tp_pb.SchedulingPolicy_value {
+			if key == paramKey {
+				logger.Debugw("Got value in proto", log.Fields{"key": key, "value": val})
+				result = val
+			}
+		}
+	} else if paramType == "additional_bw" {
+		for key, val := range tp_pb.AdditionalBW_value {
+			if key == paramKey {
+				result = val
+			}
+		}
+	} else {
+		logger.Error("Could not find proto parameter", log.Fields{"paramType": paramType, "key": paramKey})
+		return -1
+	}
+	logger.Debugw("Got value in proto", log.Fields{"key": paramKey, "value": result})
+	return result
+}
+
+func (t *TechProfileMgr) GetUsScheduler(tpInstance *TechProfile) (*tp_pb.SchedulerConfig, error) {
+	dir := tp_pb.Direction(t.GetprotoBufParamValue("direction", tpInstance.UsScheduler.Direction))
+	if dir == -1 {
+		logger.Errorf("Error in getting proto id for direction %s for upstream scheduler", tpInstance.UsScheduler.Direction)
+		return nil, fmt.Errorf("unable to get proto id for direction %s for upstream scheduler", tpInstance.UsScheduler.Direction)
+	}
+
+	bw := tp_pb.AdditionalBW(t.GetprotoBufParamValue("additional_bw", tpInstance.UsScheduler.AdditionalBw))
+	if bw == -1 {
+		logger.Errorf("Error in getting proto id for bandwidth %s for upstream scheduler", tpInstance.UsScheduler.AdditionalBw)
+		return nil, fmt.Errorf("unable to get proto id for bandwidth %s for upstream scheduler", tpInstance.UsScheduler.AdditionalBw)
+	}
+
+	policy := tp_pb.SchedulingPolicy(t.GetprotoBufParamValue("sched_policy", tpInstance.UsScheduler.QSchedPolicy))
+	if policy == -1 {
+		logger.Errorf("Error in getting proto id for scheduling policy %s for upstream scheduler", tpInstance.UsScheduler.QSchedPolicy)
+		return nil, fmt.Errorf("unable to get proto id for scheduling policy %s for upstream scheduler", tpInstance.UsScheduler.QSchedPolicy)
+	}
+
+	return &tp_pb.SchedulerConfig{
+		Direction:    dir,
+		AdditionalBw: bw,
+		Priority:     tpInstance.UsScheduler.Priority,
+		Weight:       tpInstance.UsScheduler.Weight,
+		SchedPolicy:  policy}, nil
+}
+
+func (t *TechProfileMgr) GetDsScheduler(tpInstance *TechProfile) (*tp_pb.SchedulerConfig, error) {
+
+	dir := tp_pb.Direction(t.GetprotoBufParamValue("direction", tpInstance.DsScheduler.Direction))
+	if dir == -1 {
+		logger.Errorf("Error in getting proto id for direction %s for downstream scheduler", tpInstance.DsScheduler.Direction)
+		return nil, fmt.Errorf("unable to get proto id for direction %s for downstream scheduler", tpInstance.DsScheduler.Direction)
+	}
+
+	bw := tp_pb.AdditionalBW(t.GetprotoBufParamValue("additional_bw", tpInstance.DsScheduler.AdditionalBw))
+	if bw == -1 {
+		logger.Errorf("Error in getting proto id for bandwidth %s for downstream scheduler", tpInstance.DsScheduler.AdditionalBw)
+		return nil, fmt.Errorf("unable to get proto id for bandwidth %s for downstream scheduler", tpInstance.DsScheduler.AdditionalBw)
+	}
+
+	policy := tp_pb.SchedulingPolicy(t.GetprotoBufParamValue("sched_policy", tpInstance.DsScheduler.QSchedPolicy))
+	if policy == -1 {
+		logger.Errorf("Error in getting proto id for scheduling policy %s for downstream scheduler", tpInstance.DsScheduler.QSchedPolicy)
+		return nil, fmt.Errorf("unable to get proto id for scheduling policy %s for downstream scheduler", tpInstance.DsScheduler.QSchedPolicy)
+	}
+
+	return &tp_pb.SchedulerConfig{
+		Direction:    dir,
+		AdditionalBw: bw,
+		Priority:     tpInstance.DsScheduler.Priority,
+		Weight:       tpInstance.DsScheduler.Weight,
+		SchedPolicy:  policy}, nil
+}
+
+func (t *TechProfileMgr) GetTrafficScheduler(tpInstance *TechProfile, SchedCfg *tp_pb.SchedulerConfig,
+	ShapingCfg *tp_pb.TrafficShapingInfo) *tp_pb.TrafficScheduler {
+
+	tSched := &tp_pb.TrafficScheduler{
+		Direction:          SchedCfg.Direction,
+		AllocId:            tpInstance.UsScheduler.AllocID,
+		TrafficShapingInfo: ShapingCfg,
+		Scheduler:          SchedCfg}
+
+	return tSched
+}
+
+func (tpm *TechProfileMgr) GetTrafficQueues(tp *TechProfile, Dir tp_pb.Direction) ([]*tp_pb.TrafficQueue, error) {
+
+	var encryp bool
+	if Dir == tp_pb.Direction_UPSTREAM {
+		// upstream GEM ports
+		NumGemPorts := len(tp.UpstreamGemPortAttributeList)
+		GemPorts := make([]*tp_pb.TrafficQueue, 0)
+		for Count := 0; Count < NumGemPorts; Count++ {
+			if tp.UpstreamGemPortAttributeList[Count].AesEncryption == "True" {
+				encryp = true
+			} else {
+				encryp = false
+			}
+
+			schedPolicy := tpm.GetprotoBufParamValue("sched_policy", tp.UpstreamGemPortAttributeList[Count].SchedulingPolicy)
+			if schedPolicy == -1 {
+				logger.Errorf("Error in getting Proto Id for scheduling policy %s for Upstream Gem Port %d", tp.UpstreamGemPortAttributeList[Count].SchedulingPolicy, Count)
+				return nil, fmt.Errorf("upstream gem port traffic queue creation failed due to unrecognized scheduling policy %s", tp.UpstreamGemPortAttributeList[Count].SchedulingPolicy)
+			}
+
+			discardPolicy := tpm.GetprotoBufParamValue("discard_policy", tp.UpstreamGemPortAttributeList[Count].DiscardPolicy)
+			if discardPolicy == -1 {
+				logger.Errorf("Error in getting Proto Id for discard policy %s for Upstream Gem Port %d", tp.UpstreamGemPortAttributeList[Count].DiscardPolicy, Count)
+				return nil, fmt.Errorf("upstream gem port traffic queue creation failed due to unrecognized discard policy %s", tp.UpstreamGemPortAttributeList[Count].DiscardPolicy)
+			}
+
+			GemPorts = append(GemPorts, &tp_pb.TrafficQueue{
+				Direction:     tp_pb.Direction(tpm.GetprotoBufParamValue("direction", tp.UsScheduler.Direction)),
+				GemportId:     tp.UpstreamGemPortAttributeList[Count].GemportID,
+				PbitMap:       tp.UpstreamGemPortAttributeList[Count].PbitMap,
+				AesEncryption: encryp,
+				SchedPolicy:   tp_pb.SchedulingPolicy(schedPolicy),
+				Priority:      tp.UpstreamGemPortAttributeList[Count].PriorityQueue,
+				Weight:        tp.UpstreamGemPortAttributeList[Count].Weight,
+				DiscardPolicy: tp_pb.DiscardPolicy(discardPolicy),
+			})
+		}
+		logger.Debugw("Upstream Traffic queue list ", log.Fields{"queuelist": GemPorts})
+		return GemPorts, nil
+	} else if Dir == tp_pb.Direction_DOWNSTREAM {
+		//downstream GEM ports
+		NumGemPorts := len(tp.DownstreamGemPortAttributeList)
+		GemPorts := make([]*tp_pb.TrafficQueue, 0)
+		for Count := 0; Count < NumGemPorts; Count++ {
+			if isMulticastGem(tp.DownstreamGemPortAttributeList[Count].IsMulticast) {
+				//do not take multicast GEM ports. They are handled separately.
+				continue
+			}
+			if tp.DownstreamGemPortAttributeList[Count].AesEncryption == "True" {
+				encryp = true
+			} else {
+				encryp = false
+			}
+
+			schedPolicy := tpm.GetprotoBufParamValue("sched_policy", tp.DownstreamGemPortAttributeList[Count].SchedulingPolicy)
+			if schedPolicy == -1 {
+				logger.Errorf("Error in getting Proto Id for scheduling policy %s for Downstream Gem Port %d", tp.DownstreamGemPortAttributeList[Count].SchedulingPolicy, Count)
+				return nil, fmt.Errorf("downstream gem port traffic queue creation failed due to unrecognized scheduling policy %s", tp.DownstreamGemPortAttributeList[Count].SchedulingPolicy)
+			}
+
+			discardPolicy := tpm.GetprotoBufParamValue("discard_policy", tp.DownstreamGemPortAttributeList[Count].DiscardPolicy)
+			if discardPolicy == -1 {
+				logger.Errorf("Error in getting Proto Id for discard policy %s for Downstream Gem Port %d", tp.DownstreamGemPortAttributeList[Count].DiscardPolicy, Count)
+				return nil, fmt.Errorf("downstream gem port traffic queue creation failed due to unrecognized discard policy %s", tp.DownstreamGemPortAttributeList[Count].DiscardPolicy)
+			}
+
+			GemPorts = append(GemPorts, &tp_pb.TrafficQueue{
+				Direction:     tp_pb.Direction(tpm.GetprotoBufParamValue("direction", tp.DsScheduler.Direction)),
+				GemportId:     tp.DownstreamGemPortAttributeList[Count].GemportID,
+				PbitMap:       tp.DownstreamGemPortAttributeList[Count].PbitMap,
+				AesEncryption: encryp,
+				SchedPolicy:   tp_pb.SchedulingPolicy(schedPolicy),
+				Priority:      tp.DownstreamGemPortAttributeList[Count].PriorityQueue,
+				Weight:        tp.DownstreamGemPortAttributeList[Count].Weight,
+				DiscardPolicy: tp_pb.DiscardPolicy(discardPolicy),
+			})
+		}
+		logger.Debugw("Downstream Traffic queue list ", log.Fields{"queuelist": GemPorts})
+		return GemPorts, nil
+	}
+
+	logger.Errorf("Unsupported direction %s used for generating Traffic Queue list", Dir)
+	return nil, fmt.Errorf("downstream gem port traffic queue creation failed due to unsupported direction %s", Dir)
+}
+
+//isMulticastGem returns true if isMulticast attribute value of a GEM port is true; false otherwise
+func isMulticastGem(isMulticastAttrValue string) bool {
+	return isMulticastAttrValue != "" &&
+		(isMulticastAttrValue == "True" || isMulticastAttrValue == "true" || isMulticastAttrValue == "TRUE")
+}
+
+func (tpm *TechProfileMgr) GetMulticastTrafficQueues(tp *TechProfile) []*tp_pb.TrafficQueue {
+	var encryp bool
+	NumGemPorts := len(tp.DownstreamGemPortAttributeList)
+	mcastTrafficQueues := make([]*tp_pb.TrafficQueue, 0)
+	for Count := 0; Count < NumGemPorts; Count++ {
+		if !isMulticastGem(tp.DownstreamGemPortAttributeList[Count].IsMulticast) {
+			continue
+		}
+		if tp.DownstreamGemPortAttributeList[Count].AesEncryption == "True" {
+			encryp = true
+		} else {
+			encryp = false
+		}
+		mcastTrafficQueues = append(mcastTrafficQueues, &tp_pb.TrafficQueue{
+			Direction:     tp_pb.Direction(tpm.GetprotoBufParamValue("direction", tp.DsScheduler.Direction)),
+			GemportId:     tp.DownstreamGemPortAttributeList[Count].McastGemID,
+			PbitMap:       tp.DownstreamGemPortAttributeList[Count].PbitMap,
+			AesEncryption: encryp,
+			SchedPolicy:   tp_pb.SchedulingPolicy(tpm.GetprotoBufParamValue("sched_policy", tp.DownstreamGemPortAttributeList[Count].SchedulingPolicy)),
+			Priority:      tp.DownstreamGemPortAttributeList[Count].PriorityQueue,
+			Weight:        tp.DownstreamGemPortAttributeList[Count].Weight,
+			DiscardPolicy: tp_pb.DiscardPolicy(tpm.GetprotoBufParamValue("discard_policy", tp.DownstreamGemPortAttributeList[Count].DiscardPolicy)),
+		})
+	}
+	logger.Debugw("Downstream Multicast Traffic queue list ", log.Fields{"queuelist": mcastTrafficQueues})
+	return mcastTrafficQueues
+}
+
+func (tpm *TechProfileMgr) GetUsTrafficScheduler(tp *TechProfile) *tp_pb.TrafficScheduler {
+	UsScheduler, _ := tpm.GetUsScheduler(tp)
+
+	return &tp_pb.TrafficScheduler{Direction: UsScheduler.Direction,
+		AllocId:   tp.UsScheduler.AllocID,
+		Scheduler: UsScheduler}
+}
+
+func (t *TechProfileMgr) GetGemportIDForPbit(tp interface{}, dir tp_pb.Direction, pbit uint32) uint32 {
+	/*
+	  Function to get the Gemport ID mapped to a pbit.
+	*/
+	switch tp := tp.(type) {
+	case *TechProfile:
+		if dir == tp_pb.Direction_UPSTREAM {
+			// upstream GEM ports
+			numGemPorts := len(tp.UpstreamGemPortAttributeList)
+			for gemCnt := 0; gemCnt < numGemPorts; gemCnt++ {
+				lenOfPbitMap := len(tp.UpstreamGemPortAttributeList[gemCnt].PbitMap)
+				for pbitMapIdx := 2; pbitMapIdx < lenOfPbitMap; pbitMapIdx++ {
+					// Given a sample pbit map string "0b00000001", lenOfPbitMap is 10
+					// "lenOfPbitMap - pbitMapIdx + 1" will give pbit-i th value from LSB position in the pbit map string
+					if p, err := strconv.Atoi(string(tp.UpstreamGemPortAttributeList[gemCnt].PbitMap[lenOfPbitMap-pbitMapIdx+1])); err == nil {
+						if uint32(pbitMapIdx-2) == pbit && p == 1 { // Check this p-bit is set
+							logger.Debugw("Found-US-GEMport-for-Pcp", log.Fields{"pbit": pbit, "GEMport": tp.UpstreamGemPortAttributeList[gemCnt].GemportID})
+							return tp.UpstreamGemPortAttributeList[gemCnt].GemportID
+						}
+					}
+				}
+			}
+		} else if dir == tp_pb.Direction_DOWNSTREAM {
+			//downstream GEM ports
+			numGemPorts := len(tp.DownstreamGemPortAttributeList)
+			for gemCnt := 0; gemCnt < numGemPorts; gemCnt++ {
+				lenOfPbitMap := len(tp.DownstreamGemPortAttributeList[gemCnt].PbitMap)
+				for pbitMapIdx := 2; pbitMapIdx < lenOfPbitMap; pbitMapIdx++ {
+					// Given a sample pbit map string "0b00000001", lenOfPbitMap is 10
+					// "lenOfPbitMap - pbitMapIdx + 1" will give pbit-i th value from LSB position in the pbit map string
+					if p, err := strconv.Atoi(string(tp.DownstreamGemPortAttributeList[gemCnt].PbitMap[lenOfPbitMap-pbitMapIdx+1])); err == nil {
+						if uint32(pbitMapIdx-2) == pbit && p == 1 { // Check this p-bit is set
+							logger.Debugw("Found-DS-GEMport-for-Pcp", log.Fields{"pbit": pbit, "GEMport": tp.DownstreamGemPortAttributeList[gemCnt].GemportID})
+							return tp.DownstreamGemPortAttributeList[gemCnt].GemportID
+						}
+					}
+				}
+			}
+		}
+		logger.Errorw("No-GemportId-Found-For-Pcp", log.Fields{"pcpVlan": pbit})
+	case *EponProfile:
+		if dir == tp_pb.Direction_UPSTREAM {
+			// upstream GEM ports
+			numGemPorts := len(tp.UpstreamQueueAttributeList)
+			for gemCnt := 0; gemCnt < numGemPorts; gemCnt++ {
+				lenOfPbitMap := len(tp.UpstreamQueueAttributeList[gemCnt].PbitMap)
+				for pbitMapIdx := 2; pbitMapIdx < lenOfPbitMap; pbitMapIdx++ {
+					// Given a sample pbit map string "0b00000001", lenOfPbitMap is 10
+					// "lenOfPbitMap - pbitMapIdx + 1" will give pbit-i th value from LSB position in the pbit map string
+					if p, err := strconv.Atoi(string(tp.UpstreamQueueAttributeList[gemCnt].PbitMap[lenOfPbitMap-pbitMapIdx+1])); err == nil {
+						if uint32(pbitMapIdx-2) == pbit && p == 1 { // Check this p-bit is set
+							logger.Debugw("Found-US-Queue-for-Pcp", log.Fields{"pbit": pbit, "Queue": tp.UpstreamQueueAttributeList[gemCnt].GemportID})
+							return tp.UpstreamQueueAttributeList[gemCnt].GemportID
+						}
+					}
+				}
+			}
+		} else if dir == tp_pb.Direction_DOWNSTREAM {
+			//downstream GEM ports
+			numGemPorts := len(tp.DownstreamQueueAttributeList)
+			for gemCnt := 0; gemCnt < numGemPorts; gemCnt++ {
+				lenOfPbitMap := len(tp.DownstreamQueueAttributeList[gemCnt].PbitMap)
+				for pbitMapIdx := 2; pbitMapIdx < lenOfPbitMap; pbitMapIdx++ {
+					// Given a sample pbit map string "0b00000001", lenOfPbitMap is 10
+					// "lenOfPbitMap - pbitMapIdx + 1" will give pbit-i th value from LSB position in the pbit map string
+					if p, err := strconv.Atoi(string(tp.DownstreamQueueAttributeList[gemCnt].PbitMap[lenOfPbitMap-pbitMapIdx+1])); err == nil {
+						if uint32(pbitMapIdx-2) == pbit && p == 1 { // Check this p-bit is set
+							logger.Debugw("Found-DS-Queue-for-Pcp", log.Fields{"pbit": pbit, "Queue": tp.DownstreamQueueAttributeList[gemCnt].GemportID})
+							return tp.DownstreamQueueAttributeList[gemCnt].GemportID
+						}
+					}
+				}
+			}
+		}
+		logger.Errorw("No-QueueId-Found-For-Pcp", log.Fields{"pcpVlan": pbit})
+	default:
+		logger.Errorw("unknown-tech", log.Fields{"tp": tp})
+	}
+	return 0
+}
+
+// FindAllTpInstances returns all TechProfile instances for a given TechProfile table-id, pon interface ID and onu ID.
+func (t *TechProfileMgr) FindAllTpInstances(ctx context.Context, techProfiletblID uint32, ponIntf uint32, onuID uint32) interface{} {
+	var tpTech TechProfile
+	var tpEpon EponProfile
+
+	onuTpInstancePath := fmt.Sprintf("%s/%d/pon-{%d}/onu-{%d}", t.resourceMgr.GetTechnology(), techProfiletblID, ponIntf, onuID)
+
+	if kvPairs, _ := t.config.KVBackend.List(ctx, onuTpInstancePath); kvPairs != nil {
+		tech := t.resourceMgr.GetTechnology()
+		tpInstancesTech := make([]TechProfile, 0, len(kvPairs))
+		tpInstancesEpon := make([]EponProfile, 0, len(kvPairs))
+
+		for kvPath, kvPair := range kvPairs {
+			if value, err := kvstore.ToByte(kvPair.Value); err == nil {
+				if tech == xgspon || tech == gpon {
+					if err = json.Unmarshal(value, &tpTech); err != nil {
+						logger.Errorw("error-unmarshal-kv-pair", log.Fields{"kvPath": kvPath, "value": value})
+						continue
+					} else {
+						tpInstancesTech = append(tpInstancesTech, tpTech)
+					}
+				} else if tech == epon {
+					if err = json.Unmarshal(value, &tpEpon); err != nil {
+						logger.Errorw("error-unmarshal-kv-pair", log.Fields{"kvPath": kvPath, "value": value})
+						continue
+					} else {
+						tpInstancesEpon = append(tpInstancesEpon, tpEpon)
+					}
+				}
+			}
+		}
+
+		switch tech {
+		case xgspon, gpon:
+			return tpInstancesTech
+		case epon:
+			return tpInstancesEpon
+		default:
+			log.Errorw("unknown-technology", log.Fields{"tech": tech})
+			return nil
+		}
+	}
+	return nil
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/tech_profile_if.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/tech_profile_if.go
new file mode 100644
index 0000000..8391a5b
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/techprofile/tech_profile_if.go
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package techprofile
+
+import (
+	"context"
+
+	"github.com/opencord/voltha-lib-go/v3/pkg/db"
+	tp_pb "github.com/opencord/voltha-protos/v3/go/tech_profile"
+)
+
+type TechProfileIf interface {
+	SetKVClient() *db.Backend
+	GetTechProfileInstanceKVPath(techProfiletblID uint32, uniPortName string) string
+	GetTPInstanceFromKVStore(ctx context.Context, techProfiletblID uint32, path string) (interface{}, error)
+	CreateTechProfInstance(ctx context.Context, techProfiletblID uint32, uniPortName string, intfId uint32) (interface{}, error)
+	DeleteTechProfileInstance(ctx context.Context, techProfiletblID uint32, uniPortName string) error
+	GetprotoBufParamValue(paramType string, paramKey string) int32
+	GetUsScheduler(tpInstance *TechProfile) (*tp_pb.SchedulerConfig, error)
+	GetDsScheduler(tpInstance *TechProfile) (*tp_pb.SchedulerConfig, error)
+	GetTrafficScheduler(tpInstance *TechProfile, SchedCfg *tp_pb.SchedulerConfig,
+		ShapingCfg *tp_pb.TrafficShapingInfo) *tp_pb.TrafficScheduler
+	GetTrafficQueues(tp *TechProfile, Dir tp_pb.Direction) ([]*tp_pb.TrafficQueue, error)
+	GetMulticastTrafficQueues(tp *TechProfile) []*tp_pb.TrafficQueue
+	GetGemportIDForPbit(tp interface{}, Dir tp_pb.Direction, pbit uint32) uint32
+	FindAllTpInstances(ctx context.Context, techProfiletblID uint32, ponIntf uint32, onuID uint32) interface{}
+}
diff --git a/vendor/github.com/opencord/voltha-protos/v3/go/inter_container/inter_container.pb.go b/vendor/github.com/opencord/voltha-protos/v3/go/inter_container/inter_container.pb.go
index 91f1c13..5425d79 100644
--- a/vendor/github.com/opencord/voltha-protos/v3/go/inter_container/inter_container.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/v3/go/inter_container/inter_container.pb.go
@@ -313,7 +313,7 @@
 }
 
 func (InterAdapterMessageType_Types) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{14, 0}
+	return fileDescriptor_941f0031a549667f, []int{13, 0}
 }
 
 type StrType struct {
@@ -880,45 +880,6 @@
 	return nil
 }
 
-type PortCapability struct {
-	Port                 *voltha.LogicalPort `protobuf:"bytes,1,opt,name=port,proto3" json:"port,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
-}
-
-func (m *PortCapability) Reset()         { *m = PortCapability{} }
-func (m *PortCapability) String() string { return proto.CompactTextString(m) }
-func (*PortCapability) ProtoMessage()    {}
-func (*PortCapability) Descriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{12}
-}
-
-func (m *PortCapability) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_PortCapability.Unmarshal(m, b)
-}
-func (m *PortCapability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_PortCapability.Marshal(b, m, deterministic)
-}
-func (m *PortCapability) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PortCapability.Merge(m, src)
-}
-func (m *PortCapability) XXX_Size() int {
-	return xxx_messageInfo_PortCapability.Size(m)
-}
-func (m *PortCapability) XXX_DiscardUnknown() {
-	xxx_messageInfo_PortCapability.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_PortCapability proto.InternalMessageInfo
-
-func (m *PortCapability) GetPort() *voltha.LogicalPort {
-	if m != nil {
-		return m.Port
-	}
-	return nil
-}
-
 type DeviceDiscovered struct {
 	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 	ParentId             string   `protobuf:"bytes,2,opt,name=parent_id,json=parentId,proto3" json:"parent_id,omitempty"`
@@ -933,7 +894,7 @@
 func (m *DeviceDiscovered) String() string { return proto.CompactTextString(m) }
 func (*DeviceDiscovered) ProtoMessage()    {}
 func (*DeviceDiscovered) Descriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{13}
+	return fileDescriptor_941f0031a549667f, []int{12}
 }
 
 func (m *DeviceDiscovered) XXX_Unmarshal(b []byte) error {
@@ -992,7 +953,7 @@
 func (m *InterAdapterMessageType) String() string { return proto.CompactTextString(m) }
 func (*InterAdapterMessageType) ProtoMessage()    {}
 func (*InterAdapterMessageType) Descriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{14}
+	return fileDescriptor_941f0031a549667f, []int{13}
 }
 
 func (m *InterAdapterMessageType) XXX_Unmarshal(b []byte) error {
@@ -1030,7 +991,7 @@
 func (m *InterAdapterHeader) String() string { return proto.CompactTextString(m) }
 func (*InterAdapterHeader) ProtoMessage()    {}
 func (*InterAdapterHeader) Descriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{15}
+	return fileDescriptor_941f0031a549667f, []int{14}
 }
 
 func (m *InterAdapterHeader) XXX_Unmarshal(b []byte) error {
@@ -1113,7 +1074,7 @@
 func (m *InterAdapterOmciMessage) String() string { return proto.CompactTextString(m) }
 func (*InterAdapterOmciMessage) ProtoMessage()    {}
 func (*InterAdapterOmciMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{16}
+	return fileDescriptor_941f0031a549667f, []int{15}
 }
 
 func (m *InterAdapterOmciMessage) XXX_Unmarshal(b []byte) error {
@@ -1169,7 +1130,7 @@
 func (m *InterAdapterTechProfileDownloadMessage) String() string { return proto.CompactTextString(m) }
 func (*InterAdapterTechProfileDownloadMessage) ProtoMessage()    {}
 func (*InterAdapterTechProfileDownloadMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{17}
+	return fileDescriptor_941f0031a549667f, []int{16}
 }
 
 func (m *InterAdapterTechProfileDownloadMessage) XXX_Unmarshal(b []byte) error {
@@ -1217,7 +1178,7 @@
 func (m *InterAdapterDeleteGemPortMessage) String() string { return proto.CompactTextString(m) }
 func (*InterAdapterDeleteGemPortMessage) ProtoMessage()    {}
 func (*InterAdapterDeleteGemPortMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{18}
+	return fileDescriptor_941f0031a549667f, []int{17}
 }
 
 func (m *InterAdapterDeleteGemPortMessage) XXX_Unmarshal(b []byte) error {
@@ -1272,7 +1233,7 @@
 func (m *InterAdapterDeleteTcontMessage) String() string { return proto.CompactTextString(m) }
 func (*InterAdapterDeleteTcontMessage) ProtoMessage()    {}
 func (*InterAdapterDeleteTcontMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{19}
+	return fileDescriptor_941f0031a549667f, []int{18}
 }
 
 func (m *InterAdapterDeleteTcontMessage) XXX_Unmarshal(b []byte) error {
@@ -1329,7 +1290,7 @@
 func (m *InterAdapterResponseBody) String() string { return proto.CompactTextString(m) }
 func (*InterAdapterResponseBody) ProtoMessage()    {}
 func (*InterAdapterResponseBody) Descriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{20}
+	return fileDescriptor_941f0031a549667f, []int{19}
 }
 
 func (m *InterAdapterResponseBody) XXX_Unmarshal(b []byte) error {
@@ -1414,7 +1375,7 @@
 func (m *InterAdapterMessage) String() string { return proto.CompactTextString(m) }
 func (*InterAdapterMessage) ProtoMessage()    {}
 func (*InterAdapterMessage) Descriptor() ([]byte, []int) {
-	return fileDescriptor_941f0031a549667f, []int{21}
+	return fileDescriptor_941f0031a549667f, []int{20}
 }
 
 func (m *InterAdapterMessage) XXX_Unmarshal(b []byte) error {
@@ -1465,7 +1426,6 @@
 	proto.RegisterType((*InterContainerRequestBody)(nil), "voltha.InterContainerRequestBody")
 	proto.RegisterType((*InterContainerResponseBody)(nil), "voltha.InterContainerResponseBody")
 	proto.RegisterType((*SwitchCapability)(nil), "voltha.SwitchCapability")
-	proto.RegisterType((*PortCapability)(nil), "voltha.PortCapability")
 	proto.RegisterType((*DeviceDiscovered)(nil), "voltha.DeviceDiscovered")
 	proto.RegisterType((*InterAdapterMessageType)(nil), "voltha.InterAdapterMessageType")
 	proto.RegisterType((*InterAdapterHeader)(nil), "voltha.InterAdapterHeader")
@@ -1482,90 +1442,89 @@
 }
 
 var fileDescriptor_941f0031a549667f = []byte{
-	// 1353 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x5d, 0x6f, 0xdb, 0x36,
-	0x17, 0xae, 0xbf, 0xed, 0xe3, 0xc4, 0x75, 0x99, 0xa6, 0x71, 0x92, 0x7e, 0xe4, 0xd5, 0xdb, 0xb5,
-	0x59, 0xbb, 0x39, 0x98, 0x8b, 0x61, 0xeb, 0xd5, 0xe6, 0xd8, 0x6a, 0x23, 0xc0, 0xb1, 0x3d, 0xd9,
-	0x69, 0x87, 0x61, 0x80, 0xa0, 0x48, 0x8c, 0x2d, 0x44, 0x16, 0x55, 0x8a, 0x4e, 0xa7, 0x9b, 0x01,
-	0xbb, 0xdb, 0x9f, 0x18, 0xb0, 0xab, 0xfd, 0x87, 0xfd, 0x8d, 0xfd, 0xa2, 0x81, 0x1f, 0xb2, 0x65,
-	0xb7, 0x59, 0xb1, 0xee, 0x8e, 0x3c, 0xcf, 0xc3, 0x73, 0xc8, 0x73, 0x78, 0x1e, 0x12, 0xfe, 0x7f,
-	0x45, 0x7c, 0x36, 0xb5, 0xad, 0x90, 0x12, 0x46, 0xa2, 0x23, 0x2f, 0x60, 0x98, 0x5a, 0x0e, 0x09,
-	0x98, 0xed, 0x05, 0x98, 0x36, 0x85, 0x19, 0x15, 0x25, 0x69, 0x6f, 0x6f, 0x95, 0xec, 0x90, 0xd9,
-	0x8c, 0x04, 0x92, 0xb3, 0x8e, 0xc9, 0x99, 0xc2, 0x76, 0x27, 0x84, 0x4c, 0x7c, 0x7c, 0x24, 0x66,
-	0xe7, 0xf3, 0x8b, 0x23, 0x3b, 0x88, 0x15, 0xf4, 0x60, 0x75, 0x19, 0x09, 0x71, 0x70, 0xe1, 0x93,
-	0xb7, 0xd6, 0x17, 0xcf, 0x14, 0x41, 0x5b, 0x25, 0xf8, 0x64, 0xe2, 0x39, 0xb6, 0x6f, 0xb9, 0xf8,
-	0xca, 0x73, 0x70, 0xe2, 0x64, 0xdd, 0x3f, 0xf3, 0x66, 0x38, 0x62, 0xf6, 0x2c, 0x94, 0x04, 0x6d,
-	0x1f, 0x4a, 0x23, 0x46, 0xc7, 0x71, 0x88, 0x51, 0x1d, 0x72, 0x57, 0xb6, 0xdf, 0xc8, 0x1c, 0x64,
-	0x0e, 0x2b, 0x26, 0x1f, 0x72, 0xd0, 0x08, 0xd8, 0x3a, 0x98, 0x93, 0xe0, 0x5d, 0x28, 0x1f, 0x13,
-	0xe2, 0xaf, 0xa3, 0x65, 0x89, 0x6a, 0x50, 0x1c, 0xda, 0xce, 0x25, 0x66, 0xa8, 0x01, 0xa5, 0xd0,
-	0x8e, 0x7d, 0x62, 0xbb, 0x02, 0xdf, 0x30, 0x93, 0xa9, 0xf6, 0x23, 0x54, 0x74, 0x4a, 0x09, 0xed,
-	0x10, 0x17, 0x6b, 0x03, 0x28, 0x38, 0xc4, 0xc5, 0x11, 0xda, 0x81, 0xad, 0xb3, 0xfe, 0xe8, 0x6c,
-	0x38, 0x1c, 0x98, 0x63, 0xbd, 0x6b, 0x99, 0xfa, 0x77, 0x67, 0xfa, 0x68, 0x5c, 0xbf, 0x81, 0xee,
-	0x00, 0x32, 0xfa, 0xaf, 0xda, 0x3d, 0xa3, 0x6b, 0x0d, 0xdb, 0x66, 0xfb, 0x54, 0x1f, 0xeb, 0xe6,
-	0xa8, 0x9e, 0x41, 0xdb, 0x70, 0xab, 0xab, 0xb7, 0xbb, 0x3d, 0xa3, 0xaf, 0x5b, 0xfa, 0xf7, 0x1d,
-	0x5d, 0xef, 0xea, 0xdd, 0x7a, 0x56, 0xeb, 0x41, 0x41, 0x78, 0x47, 0x4f, 0x21, 0xcf, 0x3d, 0x8b,
-	0xe8, 0xb5, 0xd6, 0x4e, 0x53, 0x15, 0x60, 0x11, 0xba, 0x29, 0xe2, 0x9a, 0x82, 0x84, 0xee, 0x40,
-	0x91, 0x62, 0x3b, 0x22, 0x41, 0x23, 0x2b, 0xf2, 0xa0, 0x66, 0xda, 0x5f, 0x19, 0x28, 0x9e, 0x60,
-	0xdb, 0xc5, 0x14, 0xd5, 0x20, 0xeb, 0xb9, 0x2a, 0x4d, 0x59, 0xcf, 0x45, 0x8f, 0x21, 0xcf, 0xe2,
-	0x10, 0x8b, 0x05, 0xb5, 0xd6, 0x56, 0xe2, 0xff, 0x14, 0x47, 0x91, 0x3d, 0xc1, 0x3c, 0x3f, 0xa6,
-	0x20, 0xa0, 0x7b, 0x00, 0x17, 0x94, 0xcc, 0x2c, 0x46, 0x42, 0xcf, 0x69, 0xe4, 0x84, 0x83, 0x0a,
-	0xb7, 0x8c, 0xb9, 0x01, 0xed, 0x42, 0x99, 0x11, 0x05, 0xe6, 0x05, 0x58, 0x62, 0x44, 0x42, 0xfb,
-	0x50, 0xb9, 0xc4, 0xb1, 0xc2, 0x0a, 0x02, 0x2b, 0x5f, 0xe2, 0x58, 0x82, 0x5f, 0x43, 0x65, 0x51,
-	0xd5, 0x46, 0xf1, 0x20, 0x73, 0x58, 0x6d, 0xed, 0x35, 0x65, 0xdd, 0x9b, 0x49, 0xdd, 0x9b, 0xe3,
-	0x84, 0x61, 0x2e, 0xc9, 0xda, 0x09, 0x94, 0xdb, 0x74, 0x32, 0x9f, 0xe1, 0x80, 0xf1, 0x12, 0x5e,
-	0xe2, 0x38, 0xa9, 0xfe, 0x25, 0x8e, 0xd1, 0x13, 0x28, 0x5c, 0xd9, 0xfe, 0x5c, 0x1e, 0xac, 0xda,
-	0xba, 0xfd, 0x8e, 0xcf, 0x76, 0x10, 0x9b, 0x92, 0xa2, 0x79, 0xb0, 0x6d, 0xf0, 0x06, 0xe9, 0x24,
-	0xfd, 0xa1, 0x4e, 0x8f, 0x1e, 0x41, 0x71, 0x2a, 0xd2, 0x26, 0x3c, 0x57, 0x5b, 0xb5, 0x24, 0x3d,
-	0x32, 0x99, 0xa6, 0x42, 0xd1, 0x21, 0xe4, 0xcf, 0x89, 0x1b, 0xff, 0x63, 0x2c, 0xc1, 0xd0, 0xfe,
-	0xc8, 0xc0, 0xee, 0x6a, 0x2c, 0x13, 0xbf, 0x99, 0xe3, 0x88, 0x1d, 0x13, 0x37, 0xe6, 0xc7, 0xa0,
-	0xa1, 0xa3, 0x8a, 0xc7, 0x87, 0xe8, 0x21, 0xe4, 0x6d, 0x3a, 0x89, 0x1a, 0xb9, 0x83, 0xdc, 0x61,
-	0xb5, 0x55, 0x4f, 0xe2, 0x27, 0x07, 0x37, 0x05, 0x8a, 0x9e, 0xc2, 0x2d, 0x8a, 0xa3, 0x90, 0x04,
-	0x11, 0xb6, 0x28, 0x7e, 0x33, 0xf7, 0x28, 0x76, 0x45, 0x15, 0xca, 0x66, 0x3d, 0x01, 0x4c, 0x65,
-	0x47, 0x0f, 0xa1, 0x46, 0x71, 0xe8, 0xf3, 0x82, 0xac, 0xd4, 0x64, 0x43, 0x58, 0xc7, 0xb2, 0x68,
-	0x9a, 0x0b, 0x7b, 0xeb, 0xfb, 0x94, 0x7e, 0xc4, 0x46, 0x1b, 0x50, 0x8a, 0xe6, 0x8e, 0x83, 0xa3,
-	0x48, 0xb5, 0x4d, 0x32, 0x45, 0x9f, 0xf1, 0x2b, 0x18, 0xcd, 0x7d, 0x26, 0xae, 0xc8, 0x75, 0xc9,
-	0x50, 0x1c, 0xed, 0xd7, 0x0c, 0xd4, 0x47, 0x6f, 0x3d, 0xe6, 0x4c, 0x3b, 0x76, 0x68, 0x9f, 0x7b,
-	0xbe, 0xc7, 0x62, 0xf4, 0x29, 0xe4, 0x5d, 0x1c, 0x39, 0x2a, 0xe7, 0xdb, 0xcd, 0xb4, 0x78, 0x90,
-	0x8b, 0xd0, 0xe2, 0xa0, 0x29, 0x28, 0xc8, 0x80, 0x9b, 0x91, 0x58, 0x6e, 0x5d, 0x60, 0x9b, 0xcd,
-	0x29, 0x8e, 0x54, 0x0d, 0x0e, 0xde, 0x59, 0xb5, 0xc6, 0x33, 0x6b, 0xd2, 0xf0, 0x42, 0xcd, 0xb5,
-	0xe7, 0x50, 0x1b, 0x12, 0xca, 0x52, 0xfb, 0x78, 0x0c, 0xf9, 0x90, 0x50, 0xa6, 0xf6, 0xb1, 0x68,
-	0x8d, 0x9e, 0x94, 0x2a, 0x4e, 0x36, 0x05, 0x41, 0xfb, 0x19, 0xea, 0x5d, 0xa1, 0x5b, 0x5d, 0x2f,
-	0x72, 0xc8, 0x15, 0xe6, 0x59, 0x5e, 0xef, 0xb3, 0x7d, 0xa8, 0x84, 0x36, 0xc5, 0x01, 0xb3, 0x3c,
-	0x57, 0x15, 0xb8, 0x2c, 0x0d, 0x86, 0x8b, 0x1e, 0x40, 0x55, 0x0a, 0x9f, 0x25, 0x7a, 0x51, 0x36,
-	0x17, 0x48, 0x93, 0x90, 0xa8, 0xbb, 0x50, 0x09, 0xe7, 0xe7, 0xbe, 0x17, 0x4d, 0x31, 0x55, 0xed,
-	0xb5, 0x34, 0x68, 0xbf, 0x65, 0x61, 0x47, 0x14, 0xab, 0xed, 0xda, 0x21, 0x5b, 0x5c, 0x5f, 0xbe,
-	0x52, 0xfb, 0x25, 0x0b, 0x05, 0x3e, 0x88, 0x50, 0x1d, 0x36, 0x5e, 0xf4, 0x06, 0xaf, 0x53, 0x9a,
-	0x74, 0x0b, 0x36, 0x95, 0x65, 0x34, 0x1c, 0xf4, 0x47, 0x7a, 0x3d, 0xc3, 0x49, 0x83, 0xd3, 0x8e,
-	0xb1, 0x20, 0x65, 0x39, 0x49, 0x59, 0x14, 0x29, 0x87, 0xb6, 0xe0, 0xe6, 0xa9, 0x3e, 0x36, 0x8d,
-	0xce, 0x68, 0xc1, 0xcb, 0xa3, 0xdb, 0x50, 0x5f, 0x1a, 0x15, 0xb5, 0xc0, 0xa9, 0x83, 0xfe, 0x99,
-	0x65, 0xf4, 0x97, 0x5a, 0x58, 0xe4, 0xd4, 0xa5, 0x51, 0x51, 0x4b, 0xe8, 0x7f, 0x70, 0x6f, 0xac,
-	0x77, 0x4e, 0xac, 0xa1, 0x39, 0x78, 0x61, 0xf4, 0x74, 0xab, 0x3b, 0x78, 0xdd, 0xef, 0x0d, 0xda,
-	0xcb, 0x85, 0x65, 0xb4, 0x0f, 0x3b, 0x5d, 0xbd, 0xa7, 0x8f, 0x75, 0xeb, 0xa5, 0x7e, 0x6a, 0x71,
-	0x8d, 0x5d, 0x80, 0x15, 0xd4, 0x80, 0xdb, 0x0a, 0x1c, 0x77, 0x06, 0xfd, 0x25, 0x02, 0x3c, 0x3f,
-	0x28, 0x9d, 0x9f, 0x6b, 0xa4, 0xf0, 0xf9, 0x8a, 0x14, 0x7e, 0x92, 0xd4, 0xfb, 0x9a, 0xcc, 0x36,
-	0x45, 0x56, 0xff, 0xb3, 0x38, 0x1e, 0xc0, 0x06, 0x23, 0xea, 0xd9, 0xe3, 0x57, 0x43, 0xf6, 0x22,
-	0x30, 0x22, 0x6f, 0x94, 0xe1, 0xa2, 0x47, 0x70, 0x33, 0xa4, 0xe4, 0xa7, 0x38, 0x45, 0x2a, 0x0a,
-	0xd2, 0xa6, 0x30, 0x2f, 0x78, 0x2b, 0x4a, 0x5a, 0xfa, 0x37, 0x4a, 0xfa, 0x67, 0x66, 0xf5, 0xfe,
-	0x0c, 0x66, 0x8e, 0x97, 0x48, 0x60, 0x03, 0x4a, 0x33, 0x39, 0x4c, 0x1e, 0x40, 0x35, 0x45, 0xc7,
-	0x50, 0x73, 0x48, 0x10, 0x60, 0x87, 0x59, 0x11, 0xb3, 0xd9, 0x3c, 0x52, 0x89, 0xdb, 0x6f, 0xaa,
-	0x0f, 0x44, 0x47, 0xa2, 0x23, 0x01, 0xaa, 0x74, 0x6d, 0x3a, 0x69, 0x23, 0xfa, 0x16, 0xe4, 0x21,
-	0x2c, 0xdb, 0x75, 0x29, 0x57, 0x13, 0x29, 0x1a, 0xfb, 0x49, 0xee, 0xe5, 0xe1, 0x9a, 0x43, 0xce,
-	0x69, 0x4b, 0x8a, 0xb9, 0x11, 0xa6, 0x66, 0xda, 0x08, 0x1e, 0xa5, 0xb7, 0x3e, 0xc6, 0xce, 0x74,
-	0x48, 0xc9, 0x85, 0xe7, 0xe3, 0x2e, 0x79, 0x1b, 0xf0, 0x97, 0x3a, 0x39, 0xc9, 0x36, 0x14, 0xe7,
-	0x81, 0x67, 0xa9, 0x92, 0x6f, 0x9a, 0x85, 0x79, 0xe0, 0x19, 0x2e, 0x42, 0x90, 0x0f, 0x6d, 0x36,
-	0x55, 0x3d, 0x29, 0xc6, 0x1a, 0x85, 0x83, 0xb4, 0xd3, 0x2e, 0xf6, 0x31, 0xc3, 0x2f, 0xf1, 0x8c,
-	0xf7, 0xfc, 0x07, 0xdc, 0xed, 0x40, 0x89, 0x85, 0x56, 0xca, 0x63, 0x91, 0x85, 0x43, 0x9b, 0x4d,
-	0xd1, 0x7d, 0xa8, 0x4e, 0xf0, 0xcc, 0xe2, 0x82, 0xc1, 0x17, 0xe5, 0xc4, 0xa2, 0xca, 0x44, 0x3a,
-	0x35, 0x5c, 0xed, 0x12, 0xee, 0xbf, 0x1b, 0x73, 0xcc, 0xbf, 0x6c, 0x1f, 0x1b, 0x71, 0x17, 0xca,
-	0xb6, 0xef, 0x13, 0x67, 0x19, 0xae, 0x24, 0xe6, 0x86, 0xab, 0xfd, 0x9e, 0x81, 0x46, 0x3a, 0xda,
-	0x8a, 0xb8, 0xdf, 0x81, 0xa2, 0x2a, 0xa8, 0xd4, 0x76, 0x35, 0x43, 0x4f, 0x3e, 0xfc, 0xca, 0x9d,
-	0xdc, 0x90, 0xef, 0x1c, 0xfa, 0x12, 0xf2, 0x64, 0xe6, 0x78, 0xaa, 0x9e, 0x0f, 0xde, 0xd7, 0x4b,
-	0xa9, 0x5b, 0xc6, 0x97, 0x71, 0xfa, 0x71, 0x65, 0xf1, 0xdd, 0xd2, 0x22, 0xd8, 0x7a, 0x4f, 0xe7,
-	0xa1, 0xd6, 0xda, 0x93, 0xbc, 0xf7, 0x3e, 0xd7, 0x1f, 0xfb, 0x3c, 0x3f, 0xf9, 0x06, 0xaa, 0xa9,
-	0x16, 0x47, 0x55, 0x28, 0x2d, 0xd5, 0x72, 0x03, 0xca, 0x29, 0xa1, 0x14, 0xff, 0xb6, 0x57, 0x46,
-	0x47, 0xb7, 0xba, 0xc6, 0xa8, 0x33, 0x78, 0xa5, 0x9b, 0xfc, 0xdf, 0x76, 0xdc, 0x87, 0x2d, 0x42,
-	0x27, 0xe2, 0xf1, 0x71, 0x08, 0x75, 0xd5, 0xe6, 0x7e, 0xf8, 0x6a, 0xe2, 0xb1, 0xe9, 0xfc, 0x9c,
-	0x77, 0xc6, 0x51, 0x82, 0xa9, 0xbf, 0xf4, 0xe7, 0xc9, 0xcf, 0xfa, 0xd9, 0xd1, 0x84, 0xac, 0x7f,
-	0xd4, 0x87, 0x37, 0x86, 0x99, 0x61, 0xfe, 0xbc, 0x28, 0x38, 0xcf, 0xfe, 0x0e, 0x00, 0x00, 0xff,
-	0xff, 0x2f, 0x48, 0xfa, 0x76, 0xd6, 0x0b, 0x00, 0x00,
+	// 1329 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xdb, 0x6e, 0xdb, 0x46,
+	0x13, 0x8e, 0xac, 0xf3, 0xc8, 0x56, 0x94, 0x75, 0x1c, 0xcb, 0x76, 0x0e, 0xfe, 0xf9, 0xa7, 0xa9,
+	0x9b, 0xb4, 0x32, 0xaa, 0xa0, 0x68, 0x7b, 0xd5, 0xca, 0x12, 0x13, 0x13, 0x90, 0x25, 0x95, 0x92,
+	0x93, 0xa2, 0x28, 0x40, 0xd0, 0xe4, 0x5a, 0x22, 0x4c, 0x71, 0x99, 0xe5, 0xd2, 0x29, 0x6f, 0x0a,
+	0xf4, 0xae, 0x2f, 0x51, 0xa0, 0x57, 0x7d, 0x87, 0xbe, 0x46, 0x9f, 0xa8, 0xd8, 0x03, 0x25, 0x4a,
+	0x49, 0x1a, 0x34, 0xbd, 0xe3, 0xcc, 0xf7, 0xed, 0x0c, 0x77, 0x66, 0xe7, 0xdb, 0x85, 0xff, 0x5f,
+	0x13, 0x9f, 0xcd, 0x6c, 0x2b, 0xa4, 0x84, 0x91, 0xe8, 0xd8, 0x0b, 0x18, 0xa6, 0x96, 0x43, 0x02,
+	0x66, 0x7b, 0x01, 0xa6, 0x2d, 0xe1, 0x46, 0x25, 0x49, 0xda, 0xdf, 0x5f, 0x25, 0x3b, 0x64, 0x3e,
+	0x27, 0x81, 0xe4, 0xac, 0x63, 0xd2, 0x52, 0xd8, 0xde, 0x94, 0x90, 0xa9, 0x8f, 0x8f, 0x85, 0x75,
+	0x11, 0x5f, 0x1e, 0xdb, 0x41, 0xa2, 0xa0, 0x07, 0xab, 0xcb, 0x48, 0x88, 0x83, 0x4b, 0x9f, 0xbc,
+	0xb6, 0x3e, 0x7f, 0xaa, 0x08, 0xda, 0x2a, 0xc1, 0x27, 0x53, 0xcf, 0xb1, 0x7d, 0xcb, 0xc5, 0xd7,
+	0x9e, 0x83, 0xd3, 0x20, 0xeb, 0xf1, 0x99, 0x37, 0xc7, 0x11, 0xb3, 0xe7, 0xa1, 0x24, 0x68, 0x07,
+	0x50, 0x1e, 0x33, 0x3a, 0x49, 0x42, 0x8c, 0x1a, 0x90, 0xbf, 0xb6, 0xfd, 0x66, 0xee, 0x30, 0x77,
+	0x54, 0x35, 0xf9, 0x27, 0x07, 0x8d, 0x80, 0xad, 0x83, 0x79, 0x09, 0xde, 0x85, 0xca, 0x09, 0x21,
+	0xfe, 0x3a, 0x5a, 0x91, 0xa8, 0x06, 0xa5, 0x91, 0xed, 0x5c, 0x61, 0x86, 0x9a, 0x50, 0x0e, 0xed,
+	0xc4, 0x27, 0xb6, 0x2b, 0xf0, 0x4d, 0x33, 0x35, 0xb5, 0x1f, 0xa1, 0xaa, 0x53, 0x4a, 0x68, 0x97,
+	0xb8, 0x58, 0x1b, 0x42, 0xd1, 0x21, 0x2e, 0x8e, 0xd0, 0x2e, 0x6c, 0x9f, 0x0f, 0xc6, 0xe7, 0xa3,
+	0xd1, 0xd0, 0x9c, 0xe8, 0x3d, 0xcb, 0xd4, 0xbf, 0x3b, 0xd7, 0xc7, 0x93, 0xc6, 0x0d, 0x74, 0x07,
+	0x90, 0x31, 0x78, 0xd1, 0xe9, 0x1b, 0x3d, 0x6b, 0xd4, 0x31, 0x3b, 0x67, 0xfa, 0x44, 0x37, 0xc7,
+	0x8d, 0x1c, 0xda, 0x81, 0x5b, 0x3d, 0xbd, 0xd3, 0xeb, 0x1b, 0x03, 0xdd, 0xd2, 0xbf, 0xef, 0xea,
+	0x7a, 0x4f, 0xef, 0x35, 0x36, 0xb4, 0x3e, 0x14, 0x45, 0x74, 0xf4, 0x04, 0x0a, 0x3c, 0xb2, 0xc8,
+	0x5e, 0x6f, 0xef, 0xb6, 0x54, 0x03, 0x16, 0xa9, 0x5b, 0x22, 0xaf, 0x29, 0x48, 0xe8, 0x0e, 0x94,
+	0x28, 0xb6, 0x23, 0x12, 0x34, 0x37, 0x44, 0x1d, 0x94, 0xa5, 0xfd, 0x95, 0x83, 0xd2, 0x29, 0xb6,
+	0x5d, 0x4c, 0x51, 0x1d, 0x36, 0x3c, 0x57, 0x95, 0x69, 0xc3, 0x73, 0xd1, 0xc7, 0x50, 0x60, 0x49,
+	0x88, 0xc5, 0x82, 0x7a, 0x7b, 0x3b, 0x8d, 0x7f, 0x86, 0xa3, 0xc8, 0x9e, 0x62, 0x5e, 0x1f, 0x53,
+	0x10, 0xd0, 0x3d, 0x80, 0x4b, 0x4a, 0xe6, 0x16, 0x23, 0xa1, 0xe7, 0x34, 0xf3, 0x22, 0x40, 0x95,
+	0x7b, 0x26, 0xdc, 0x81, 0xf6, 0xa0, 0xc2, 0x88, 0x02, 0x0b, 0x02, 0x2c, 0x33, 0x22, 0xa1, 0x03,
+	0xa8, 0x5e, 0xe1, 0x44, 0x61, 0x45, 0x81, 0x55, 0xae, 0x70, 0x22, 0xc1, 0xaf, 0xa0, 0xba, 0xe8,
+	0x6a, 0xb3, 0x74, 0x98, 0x3b, 0xaa, 0xb5, 0xf7, 0x5b, 0xb2, 0xef, 0xad, 0xb4, 0xef, 0xad, 0x49,
+	0xca, 0x30, 0x97, 0x64, 0xed, 0x14, 0x2a, 0x1d, 0x3a, 0x8d, 0xe7, 0x38, 0x60, 0xbc, 0x85, 0x57,
+	0x38, 0x49, 0xbb, 0x7f, 0x85, 0x13, 0xf4, 0x18, 0x8a, 0xd7, 0xb6, 0x1f, 0xcb, 0x8d, 0xd5, 0xda,
+	0xb7, 0xdf, 0x88, 0xd9, 0x09, 0x12, 0x53, 0x52, 0x34, 0x0f, 0x76, 0x0c, 0x3e, 0x20, 0xdd, 0x74,
+	0x3e, 0xd4, 0xee, 0xd1, 0x23, 0x28, 0xcd, 0x44, 0xd9, 0x44, 0xe4, 0x5a, 0xbb, 0x9e, 0x96, 0x47,
+	0x16, 0xd3, 0x54, 0x28, 0x3a, 0x82, 0xc2, 0x05, 0x71, 0x93, 0x7f, 0xcc, 0x25, 0x18, 0xda, 0x1f,
+	0x39, 0xd8, 0x5b, 0xcd, 0x65, 0xe2, 0x57, 0x31, 0x8e, 0xd8, 0x09, 0x71, 0x13, 0xbe, 0x0d, 0x1a,
+	0x3a, 0xaa, 0x79, 0xfc, 0x13, 0x3d, 0x84, 0x82, 0x4d, 0xa7, 0x51, 0x33, 0x7f, 0x98, 0x3f, 0xaa,
+	0xb5, 0x1b, 0x69, 0xfe, 0x74, 0xe3, 0xa6, 0x40, 0xd1, 0x13, 0xb8, 0x45, 0x71, 0x14, 0x92, 0x20,
+	0xc2, 0x16, 0xc5, 0xaf, 0x62, 0x8f, 0x62, 0x57, 0x74, 0xa1, 0x62, 0x36, 0x52, 0xc0, 0x54, 0x7e,
+	0xf4, 0x10, 0xea, 0x14, 0x87, 0x3e, 0x6f, 0xc8, 0x4a, 0x4f, 0x36, 0x85, 0x77, 0x22, 0x9b, 0xa6,
+	0xb9, 0xb0, 0xbf, 0xfe, 0x9f, 0x32, 0x8e, 0xf8, 0xd1, 0x26, 0x94, 0xa3, 0xd8, 0x71, 0x70, 0x14,
+	0xa9, 0xb1, 0x49, 0x4d, 0xf4, 0x29, 0x3f, 0x82, 0x51, 0xec, 0x33, 0x71, 0x44, 0xde, 0x55, 0x0c,
+	0xc5, 0xd1, 0x7e, 0xcd, 0x41, 0x63, 0xfc, 0xda, 0x63, 0xce, 0xac, 0x6b, 0x87, 0xf6, 0x85, 0xe7,
+	0x7b, 0x2c, 0x41, 0x9f, 0x40, 0xc1, 0xc5, 0x91, 0xa3, 0x6a, 0xbe, 0xd3, 0xca, 0x8a, 0x07, 0xb9,
+	0x0c, 0x2d, 0x0e, 0x9a, 0x82, 0x82, 0x0c, 0xb8, 0x19, 0x89, 0xe5, 0xd6, 0x25, 0xb6, 0x59, 0x4c,
+	0x71, 0xa4, 0x7a, 0x70, 0xf8, 0xc6, 0xaa, 0x35, 0x9e, 0x59, 0x97, 0x8e, 0x67, 0xca, 0xd6, 0x7e,
+	0x86, 0x46, 0x4f, 0x88, 0x4f, 0xcf, 0x8b, 0x1c, 0x72, 0x8d, 0x79, 0xa9, 0xd6, 0x87, 0xe5, 0x00,
+	0xaa, 0xa1, 0x4d, 0x71, 0xc0, 0x2c, 0xcf, 0x55, 0x5d, 0xaa, 0x48, 0x87, 0xe1, 0xa2, 0x07, 0x50,
+	0x93, 0xea, 0x65, 0x89, 0x81, 0x92, 0x13, 0x02, 0xd2, 0x25, 0x74, 0xe6, 0x2e, 0x54, 0xc3, 0xf8,
+	0xc2, 0xf7, 0xa2, 0x19, 0xa6, 0x6a, 0x46, 0x96, 0x0e, 0xed, 0xb7, 0x0d, 0xd8, 0x15, 0x15, 0xef,
+	0xb8, 0x76, 0xc8, 0x16, 0x67, 0x90, 0xaf, 0xd4, 0x7e, 0xd9, 0x80, 0x22, 0xff, 0x88, 0x50, 0x03,
+	0x36, 0x9f, 0xf5, 0x87, 0x2f, 0x33, 0xc2, 0x72, 0x0b, 0xb6, 0x94, 0x67, 0x3c, 0x1a, 0x0e, 0xc6,
+	0x7a, 0x23, 0xc7, 0x49, 0xc3, 0xb3, 0xae, 0xb1, 0x20, 0x6d, 0x70, 0x92, 0xf2, 0x28, 0x52, 0x1e,
+	0x6d, 0xc3, 0xcd, 0x33, 0x7d, 0x62, 0x1a, 0xdd, 0xf1, 0x82, 0x57, 0x40, 0xb7, 0xa1, 0xb1, 0x74,
+	0x2a, 0x6a, 0x91, 0x53, 0x87, 0x83, 0x73, 0xcb, 0x18, 0x2c, 0x05, 0xad, 0xc4, 0xa9, 0x4b, 0xa7,
+	0xa2, 0x96, 0xd1, 0xff, 0xe0, 0xde, 0x44, 0xef, 0x9e, 0x5a, 0x23, 0x73, 0xf8, 0xcc, 0xe8, 0xeb,
+	0x56, 0x6f, 0xf8, 0x72, 0xd0, 0x1f, 0x76, 0x96, 0x0b, 0x2b, 0xe8, 0x00, 0x76, 0x7b, 0x7a, 0x5f,
+	0x9f, 0xe8, 0xd6, 0x73, 0xfd, 0xcc, 0xe2, 0x42, 0xb9, 0x00, 0xab, 0xa8, 0x09, 0xb7, 0x15, 0x38,
+	0xe9, 0x0e, 0x07, 0x4b, 0x04, 0x78, 0x7d, 0x50, 0xb6, 0x3e, 0xef, 0xd0, 0xb3, 0xaf, 0x57, 0xf4,
+	0xec, 0xa3, 0x74, 0x60, 0xde, 0x51, 0xd9, 0x96, 0xa8, 0xea, 0x7f, 0x56, 0xb8, 0x43, 0xd8, 0x64,
+	0x44, 0xdd, 0x5d, 0xfc, 0x68, 0xc8, 0x81, 0x02, 0x46, 0xe4, 0x89, 0x32, 0x5c, 0xf4, 0x08, 0x6e,
+	0x86, 0x94, 0xfc, 0x94, 0x64, 0x48, 0x25, 0x41, 0xda, 0x12, 0xee, 0x05, 0x6f, 0x45, 0x0e, 0xcb,
+	0xff, 0x46, 0x0e, 0xff, 0xcc, 0xad, 0x9e, 0x9f, 0xe1, 0xdc, 0xf1, 0x52, 0x1d, 0x6b, 0x42, 0x79,
+	0x2e, 0x3f, 0xd3, 0x5b, 0x4c, 0x99, 0xe8, 0x04, 0xea, 0x0e, 0x09, 0x02, 0xec, 0x30, 0x2b, 0x62,
+	0x36, 0x8b, 0x23, 0x55, 0xb8, 0x83, 0x96, 0x7a, 0x05, 0x74, 0x25, 0x3a, 0x16, 0xa0, 0x2a, 0xd7,
+	0x96, 0x93, 0x75, 0xa2, 0x6f, 0x41, 0x6e, 0xc2, 0xb2, 0x5d, 0x97, 0x72, 0x49, 0x90, 0x93, 0x7f,
+	0x90, 0xd6, 0x5e, 0x6e, 0xae, 0x35, 0xe2, 0x9c, 0x8e, 0xa4, 0x98, 0x9b, 0x61, 0xc6, 0xd2, 0xc6,
+	0xf0, 0x28, 0xfb, 0xeb, 0x13, 0xec, 0xcc, 0x46, 0x94, 0x5c, 0x7a, 0x3e, 0xee, 0x91, 0xd7, 0x01,
+	0xbf, 0x6e, 0xd3, 0x9d, 0xec, 0x40, 0x29, 0x0e, 0x3c, 0x4b, 0xb5, 0x7c, 0xcb, 0x2c, 0xc6, 0x81,
+	0x67, 0xb8, 0x08, 0x41, 0x21, 0xb4, 0xd9, 0x4c, 0xcd, 0xa4, 0xf8, 0xd6, 0x28, 0x1c, 0x66, 0x83,
+	0xf6, 0xb0, 0x8f, 0x19, 0x7e, 0x8e, 0xe7, 0x23, 0x42, 0xd9, 0x7b, 0xc2, 0xed, 0x42, 0x99, 0x85,
+	0x56, 0x26, 0x62, 0x89, 0x85, 0x23, 0x9b, 0xcd, 0xd0, 0x7d, 0xa8, 0x4d, 0xf1, 0xdc, 0x0a, 0x09,
+	0x15, 0x12, 0x90, 0x17, 0x8b, 0xaa, 0x53, 0x19, 0xd4, 0x70, 0xb5, 0x2b, 0xb8, 0xff, 0x66, 0xce,
+	0x09, 0x7f, 0x77, 0x7d, 0x68, 0xc6, 0x3d, 0xa8, 0xd8, 0xbe, 0x4f, 0x9c, 0x65, 0xba, 0xb2, 0xb0,
+	0x0d, 0x57, 0xfb, 0x3d, 0x07, 0xcd, 0x6c, 0xb6, 0x15, 0x85, 0xbe, 0x03, 0x25, 0xd5, 0x50, 0x29,
+	0xd0, 0xca, 0x42, 0x8f, 0xdf, 0x7f, 0x55, 0x9d, 0xde, 0x90, 0x97, 0x15, 0xfa, 0x02, 0x0a, 0x64,
+	0xee, 0x78, 0xaa, 0x9f, 0x0f, 0xde, 0x36, 0x4b, 0x99, 0x53, 0xc6, 0x97, 0x71, 0xfa, 0x49, 0x75,
+	0xf1, 0x66, 0xd2, 0x22, 0xd8, 0x7e, 0xcb, 0xe4, 0xa1, 0xf6, 0xda, 0xbd, 0xba, 0xff, 0xb6, 0xd0,
+	0x1f, 0x7a, 0xc7, 0x3e, 0xfe, 0x06, 0x6a, 0x99, 0x11, 0x47, 0x35, 0x28, 0x2f, 0xd5, 0x72, 0x13,
+	0x2a, 0x19, 0xa1, 0x14, 0x8f, 0xaf, 0x17, 0x46, 0x57, 0xb7, 0x7a, 0xc6, 0xb8, 0x3b, 0x7c, 0xa1,
+	0x9b, 0xfc, 0xf1, 0x75, 0x32, 0x80, 0x6d, 0x42, 0xa7, 0xe2, 0x06, 0x71, 0x08, 0x75, 0xd5, 0xcf,
+	0xfd, 0xf0, 0xe5, 0xd4, 0x63, 0xb3, 0xf8, 0x82, 0x4f, 0xc6, 0x71, 0x8a, 0xa9, 0x07, 0xf1, 0x67,
+	0xe9, 0xf3, 0xf8, 0xe9, 0xf1, 0x94, 0xac, 0xbf, 0xb6, 0x47, 0x37, 0x46, 0xb9, 0x51, 0xe1, 0xa2,
+	0x24, 0x38, 0x4f, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xe1, 0x0a, 0x7b, 0xf0, 0x9b, 0x0b, 0x00,
+	0x00,
 }
diff --git a/vendor/github.com/opencord/voltha-protos/v3/go/openolt/openolt.pb.go b/vendor/github.com/opencord/voltha-protos/v3/go/openolt/openolt.pb.go
index a4b7bdb..5f4deed 100644
--- a/vendor/github.com/opencord/voltha-protos/v3/go/openolt/openolt.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/v3/go/openolt/openolt.pb.go
@@ -228,7 +228,7 @@
 }
 
 func (DeviceInfo_DeviceResourceRanges_Pool_PoolType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{15, 0, 0, 0}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{16, 0, 0, 0}
 }
 
 type DeviceInfo_DeviceResourceRanges_Pool_SharingType int32
@@ -256,7 +256,57 @@
 }
 
 func (DeviceInfo_DeviceResourceRanges_Pool_SharingType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{15, 0, 0, 1}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{16, 0, 0, 1}
+}
+
+type OnuItuPonAlarm_AlarmID int32
+
+const (
+	OnuItuPonAlarm_RDI_ERRORS OnuItuPonAlarm_AlarmID = 0
+)
+
+var OnuItuPonAlarm_AlarmID_name = map[int32]string{
+	0: "RDI_ERRORS",
+}
+
+var OnuItuPonAlarm_AlarmID_value = map[string]int32{
+	"RDI_ERRORS": 0,
+}
+
+func (x OnuItuPonAlarm_AlarmID) String() string {
+	return proto.EnumName(OnuItuPonAlarm_AlarmID_name, int32(x))
+}
+
+func (OnuItuPonAlarm_AlarmID) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{21, 0}
+}
+
+type OnuItuPonAlarm_AlarmReportingCondition int32
+
+const (
+	OnuItuPonAlarm_RATE_THRESHOLD  OnuItuPonAlarm_AlarmReportingCondition = 0
+	OnuItuPonAlarm_RATE_RANGE      OnuItuPonAlarm_AlarmReportingCondition = 1
+	OnuItuPonAlarm_VALUE_THRESHOLD OnuItuPonAlarm_AlarmReportingCondition = 2
+)
+
+var OnuItuPonAlarm_AlarmReportingCondition_name = map[int32]string{
+	0: "RATE_THRESHOLD",
+	1: "RATE_RANGE",
+	2: "VALUE_THRESHOLD",
+}
+
+var OnuItuPonAlarm_AlarmReportingCondition_value = map[string]int32{
+	"RATE_THRESHOLD":  0,
+	"RATE_RANGE":      1,
+	"VALUE_THRESHOLD": 2,
+}
+
+func (x OnuItuPonAlarm_AlarmReportingCondition) String() string {
+	return proto.EnumName(OnuItuPonAlarm_AlarmReportingCondition_name, int32(x))
+}
+
+func (OnuItuPonAlarm_AlarmReportingCondition) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{21, 1}
 }
 
 type GroupMember_InterfaceType int32
@@ -284,7 +334,7 @@
 }
 
 func (GroupMember_InterfaceType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{42, 0}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{45, 0}
 }
 
 type Group_GroupMembersCommand int32
@@ -312,7 +362,7 @@
 }
 
 func (Group_GroupMembersCommand) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{43, 0}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{46, 0}
 }
 
 type Indication struct {
@@ -1392,6 +1442,69 @@
 	return 0
 }
 
+type OnuLogicalDistance struct {
+	IntfId                 uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
+	OnuId                  uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
+	LogicalOnuDistanceZero uint32   `protobuf:"fixed32,3,opt,name=logical_onu_distance_zero,json=logicalOnuDistanceZero,proto3" json:"logical_onu_distance_zero,omitempty"`
+	LogicalOnuDistance     uint32   `protobuf:"fixed32,4,opt,name=logical_onu_distance,json=logicalOnuDistance,proto3" json:"logical_onu_distance,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
+	XXX_unrecognized       []byte   `json:"-"`
+	XXX_sizecache          int32    `json:"-"`
+}
+
+func (m *OnuLogicalDistance) Reset()         { *m = OnuLogicalDistance{} }
+func (m *OnuLogicalDistance) String() string { return proto.CompactTextString(m) }
+func (*OnuLogicalDistance) ProtoMessage()    {}
+func (*OnuLogicalDistance) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{12}
+}
+
+func (m *OnuLogicalDistance) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuLogicalDistance.Unmarshal(m, b)
+}
+func (m *OnuLogicalDistance) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuLogicalDistance.Marshal(b, m, deterministic)
+}
+func (m *OnuLogicalDistance) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuLogicalDistance.Merge(m, src)
+}
+func (m *OnuLogicalDistance) XXX_Size() int {
+	return xxx_messageInfo_OnuLogicalDistance.Size(m)
+}
+func (m *OnuLogicalDistance) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuLogicalDistance.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuLogicalDistance proto.InternalMessageInfo
+
+func (m *OnuLogicalDistance) GetIntfId() uint32 {
+	if m != nil {
+		return m.IntfId
+	}
+	return 0
+}
+
+func (m *OnuLogicalDistance) GetOnuId() uint32 {
+	if m != nil {
+		return m.OnuId
+	}
+	return 0
+}
+
+func (m *OnuLogicalDistance) GetLogicalOnuDistanceZero() uint32 {
+	if m != nil {
+		return m.LogicalOnuDistanceZero
+	}
+	return 0
+}
+
+func (m *OnuLogicalDistance) GetLogicalOnuDistance() uint32 {
+	if m != nil {
+		return m.LogicalOnuDistance
+	}
+	return 0
+}
+
 type OmciMsg struct {
 	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
 	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
@@ -1405,7 +1518,7 @@
 func (m *OmciMsg) String() string { return proto.CompactTextString(m) }
 func (*OmciMsg) ProtoMessage()    {}
 func (*OmciMsg) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{12}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{13}
 }
 
 func (m *OmciMsg) XXX_Unmarshal(b []byte) error {
@@ -1462,7 +1575,7 @@
 func (m *OnuPacket) String() string { return proto.CompactTextString(m) }
 func (*OnuPacket) ProtoMessage()    {}
 func (*OnuPacket) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{13}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{14}
 }
 
 func (m *OnuPacket) XXX_Unmarshal(b []byte) error {
@@ -1530,7 +1643,7 @@
 func (m *UplinkPacket) String() string { return proto.CompactTextString(m) }
 func (*UplinkPacket) ProtoMessage()    {}
 func (*UplinkPacket) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{14}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{15}
 }
 
 func (m *UplinkPacket) XXX_Unmarshal(b []byte) error {
@@ -1594,7 +1707,7 @@
 func (m *DeviceInfo) String() string { return proto.CompactTextString(m) }
 func (*DeviceInfo) ProtoMessage()    {}
 func (*DeviceInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{15}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{16}
 }
 
 func (m *DeviceInfo) XXX_Unmarshal(b []byte) error {
@@ -1750,7 +1863,7 @@
 func (m *DeviceInfo_DeviceResourceRanges) String() string { return proto.CompactTextString(m) }
 func (*DeviceInfo_DeviceResourceRanges) ProtoMessage()    {}
 func (*DeviceInfo_DeviceResourceRanges) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{15, 0}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{16, 0}
 }
 
 func (m *DeviceInfo_DeviceResourceRanges) XXX_Unmarshal(b []byte) error {
@@ -1806,7 +1919,7 @@
 func (m *DeviceInfo_DeviceResourceRanges_Pool) String() string { return proto.CompactTextString(m) }
 func (*DeviceInfo_DeviceResourceRanges_Pool) ProtoMessage()    {}
 func (*DeviceInfo_DeviceResourceRanges_Pool) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{15, 0, 0}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{16, 0, 0}
 }
 
 func (m *DeviceInfo_DeviceResourceRanges_Pool) XXX_Unmarshal(b []byte) error {
@@ -1880,7 +1993,7 @@
 func (m *Classifier) String() string { return proto.CompactTextString(m) }
 func (*Classifier) ProtoMessage()    {}
 func (*Classifier) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{16}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{17}
 }
 
 func (m *Classifier) XXX_Unmarshal(b []byte) error {
@@ -2025,7 +2138,7 @@
 func (m *ActionCmd) String() string { return proto.CompactTextString(m) }
 func (*ActionCmd) ProtoMessage()    {}
 func (*ActionCmd) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{17}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{18}
 }
 
 func (m *ActionCmd) XXX_Unmarshal(b []byte) error {
@@ -2126,7 +2239,7 @@
 func (m *Action) String() string { return proto.CompactTextString(m) }
 func (*Action) ProtoMessage()    {}
 func (*Action) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{18}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{19}
 }
 
 func (m *Action) XXX_Unmarshal(b []byte) error {
@@ -2211,6 +2324,7 @@
 	Cookie               uint64      `protobuf:"fixed64,12,opt,name=cookie,proto3" json:"cookie,omitempty"`
 	PortNo               uint32      `protobuf:"fixed32,13,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
 	GroupId              uint32      `protobuf:"fixed32,14,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
+	TechProfileId        uint32      `protobuf:"fixed32,15,opt,name=tech_profile_id,json=techProfileId,proto3" json:"tech_profile_id,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
 	XXX_unrecognized     []byte      `json:"-"`
 	XXX_sizecache        int32       `json:"-"`
@@ -2220,7 +2334,7 @@
 func (m *Flow) String() string { return proto.CompactTextString(m) }
 func (*Flow) ProtoMessage()    {}
 func (*Flow) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{19}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{20}
 }
 
 func (m *Flow) XXX_Unmarshal(b []byte) error {
@@ -2339,6 +2453,344 @@
 	return 0
 }
 
+func (m *Flow) GetTechProfileId() uint32 {
+	if m != nil {
+		return m.TechProfileId
+	}
+	return 0
+}
+
+type OnuItuPonAlarm struct {
+	PonNi                   uint32                                 `protobuf:"fixed32,1,opt,name=pon_ni,json=ponNi,proto3" json:"pon_ni,omitempty"`
+	OnuId                   uint32                                 `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
+	AlarmId                 OnuItuPonAlarm_AlarmID                 `protobuf:"varint,3,opt,name=alarm_id,json=alarmId,proto3,enum=openolt.OnuItuPonAlarm_AlarmID" json:"alarm_id,omitempty"`
+	AlarmReportingCondition OnuItuPonAlarm_AlarmReportingCondition `protobuf:"varint,4,opt,name=alarm_reporting_condition,json=alarmReportingCondition,proto3,enum=openolt.OnuItuPonAlarm_AlarmReportingCondition" json:"alarm_reporting_condition,omitempty"`
+	// Types that are valid to be assigned to Config:
+	//	*OnuItuPonAlarm_RateThresholdConfig_
+	//	*OnuItuPonAlarm_RateRangeConfig_
+	//	*OnuItuPonAlarm_ValueThresholdConfig_
+	Config               isOnuItuPonAlarm_Config `protobuf_oneof:"config"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *OnuItuPonAlarm) Reset()         { *m = OnuItuPonAlarm{} }
+func (m *OnuItuPonAlarm) String() string { return proto.CompactTextString(m) }
+func (*OnuItuPonAlarm) ProtoMessage()    {}
+func (*OnuItuPonAlarm) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{21}
+}
+
+func (m *OnuItuPonAlarm) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuItuPonAlarm.Unmarshal(m, b)
+}
+func (m *OnuItuPonAlarm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuItuPonAlarm.Marshal(b, m, deterministic)
+}
+func (m *OnuItuPonAlarm) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuItuPonAlarm.Merge(m, src)
+}
+func (m *OnuItuPonAlarm) XXX_Size() int {
+	return xxx_messageInfo_OnuItuPonAlarm.Size(m)
+}
+func (m *OnuItuPonAlarm) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuItuPonAlarm.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuItuPonAlarm proto.InternalMessageInfo
+
+func (m *OnuItuPonAlarm) GetPonNi() uint32 {
+	if m != nil {
+		return m.PonNi
+	}
+	return 0
+}
+
+func (m *OnuItuPonAlarm) GetOnuId() uint32 {
+	if m != nil {
+		return m.OnuId
+	}
+	return 0
+}
+
+func (m *OnuItuPonAlarm) GetAlarmId() OnuItuPonAlarm_AlarmID {
+	if m != nil {
+		return m.AlarmId
+	}
+	return OnuItuPonAlarm_RDI_ERRORS
+}
+
+func (m *OnuItuPonAlarm) GetAlarmReportingCondition() OnuItuPonAlarm_AlarmReportingCondition {
+	if m != nil {
+		return m.AlarmReportingCondition
+	}
+	return OnuItuPonAlarm_RATE_THRESHOLD
+}
+
+type isOnuItuPonAlarm_Config interface {
+	isOnuItuPonAlarm_Config()
+}
+
+type OnuItuPonAlarm_RateThresholdConfig_ struct {
+	RateThresholdConfig *OnuItuPonAlarm_RateThresholdConfig `protobuf:"bytes,5,opt,name=rate_threshold_config,json=rateThresholdConfig,proto3,oneof"`
+}
+
+type OnuItuPonAlarm_RateRangeConfig_ struct {
+	RateRangeConfig *OnuItuPonAlarm_RateRangeConfig `protobuf:"bytes,6,opt,name=rate_range_config,json=rateRangeConfig,proto3,oneof"`
+}
+
+type OnuItuPonAlarm_ValueThresholdConfig_ struct {
+	ValueThresholdConfig *OnuItuPonAlarm_ValueThresholdConfig `protobuf:"bytes,7,opt,name=value_threshold_config,json=valueThresholdConfig,proto3,oneof"`
+}
+
+func (*OnuItuPonAlarm_RateThresholdConfig_) isOnuItuPonAlarm_Config() {}
+
+func (*OnuItuPonAlarm_RateRangeConfig_) isOnuItuPonAlarm_Config() {}
+
+func (*OnuItuPonAlarm_ValueThresholdConfig_) isOnuItuPonAlarm_Config() {}
+
+func (m *OnuItuPonAlarm) GetConfig() isOnuItuPonAlarm_Config {
+	if m != nil {
+		return m.Config
+	}
+	return nil
+}
+
+func (m *OnuItuPonAlarm) GetRateThresholdConfig() *OnuItuPonAlarm_RateThresholdConfig {
+	if x, ok := m.GetConfig().(*OnuItuPonAlarm_RateThresholdConfig_); ok {
+		return x.RateThresholdConfig
+	}
+	return nil
+}
+
+func (m *OnuItuPonAlarm) GetRateRangeConfig() *OnuItuPonAlarm_RateRangeConfig {
+	if x, ok := m.GetConfig().(*OnuItuPonAlarm_RateRangeConfig_); ok {
+		return x.RateRangeConfig
+	}
+	return nil
+}
+
+func (m *OnuItuPonAlarm) GetValueThresholdConfig() *OnuItuPonAlarm_ValueThresholdConfig {
+	if x, ok := m.GetConfig().(*OnuItuPonAlarm_ValueThresholdConfig_); ok {
+		return x.ValueThresholdConfig
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*OnuItuPonAlarm) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*OnuItuPonAlarm_RateThresholdConfig_)(nil),
+		(*OnuItuPonAlarm_RateRangeConfig_)(nil),
+		(*OnuItuPonAlarm_ValueThresholdConfig_)(nil),
+	}
+}
+
+type OnuItuPonAlarm_SoakTime struct {
+	ActiveSoakTime       uint32   `protobuf:"fixed32,1,opt,name=active_soak_time,json=activeSoakTime,proto3" json:"active_soak_time,omitempty"`
+	ClearSoakTime        uint32   `protobuf:"fixed32,2,opt,name=clear_soak_time,json=clearSoakTime,proto3" json:"clear_soak_time,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OnuItuPonAlarm_SoakTime) Reset()         { *m = OnuItuPonAlarm_SoakTime{} }
+func (m *OnuItuPonAlarm_SoakTime) String() string { return proto.CompactTextString(m) }
+func (*OnuItuPonAlarm_SoakTime) ProtoMessage()    {}
+func (*OnuItuPonAlarm_SoakTime) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{21, 0}
+}
+
+func (m *OnuItuPonAlarm_SoakTime) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuItuPonAlarm_SoakTime.Unmarshal(m, b)
+}
+func (m *OnuItuPonAlarm_SoakTime) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuItuPonAlarm_SoakTime.Marshal(b, m, deterministic)
+}
+func (m *OnuItuPonAlarm_SoakTime) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuItuPonAlarm_SoakTime.Merge(m, src)
+}
+func (m *OnuItuPonAlarm_SoakTime) XXX_Size() int {
+	return xxx_messageInfo_OnuItuPonAlarm_SoakTime.Size(m)
+}
+func (m *OnuItuPonAlarm_SoakTime) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuItuPonAlarm_SoakTime.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuItuPonAlarm_SoakTime proto.InternalMessageInfo
+
+func (m *OnuItuPonAlarm_SoakTime) GetActiveSoakTime() uint32 {
+	if m != nil {
+		return m.ActiveSoakTime
+	}
+	return 0
+}
+
+func (m *OnuItuPonAlarm_SoakTime) GetClearSoakTime() uint32 {
+	if m != nil {
+		return m.ClearSoakTime
+	}
+	return 0
+}
+
+type OnuItuPonAlarm_RateThresholdConfig struct {
+	RateThresholdRising  uint64                   `protobuf:"fixed64,1,opt,name=rate_threshold_rising,json=rateThresholdRising,proto3" json:"rate_threshold_rising,omitempty"`
+	RateThresholdFalling uint64                   `protobuf:"fixed64,2,opt,name=rate_threshold_falling,json=rateThresholdFalling,proto3" json:"rate_threshold_falling,omitempty"`
+	SoakTime             *OnuItuPonAlarm_SoakTime `protobuf:"bytes,3,opt,name=soak_time,json=soakTime,proto3" json:"soak_time,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *OnuItuPonAlarm_RateThresholdConfig) Reset()         { *m = OnuItuPonAlarm_RateThresholdConfig{} }
+func (m *OnuItuPonAlarm_RateThresholdConfig) String() string { return proto.CompactTextString(m) }
+func (*OnuItuPonAlarm_RateThresholdConfig) ProtoMessage()    {}
+func (*OnuItuPonAlarm_RateThresholdConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{21, 1}
+}
+
+func (m *OnuItuPonAlarm_RateThresholdConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuItuPonAlarm_RateThresholdConfig.Unmarshal(m, b)
+}
+func (m *OnuItuPonAlarm_RateThresholdConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuItuPonAlarm_RateThresholdConfig.Marshal(b, m, deterministic)
+}
+func (m *OnuItuPonAlarm_RateThresholdConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuItuPonAlarm_RateThresholdConfig.Merge(m, src)
+}
+func (m *OnuItuPonAlarm_RateThresholdConfig) XXX_Size() int {
+	return xxx_messageInfo_OnuItuPonAlarm_RateThresholdConfig.Size(m)
+}
+func (m *OnuItuPonAlarm_RateThresholdConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuItuPonAlarm_RateThresholdConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuItuPonAlarm_RateThresholdConfig proto.InternalMessageInfo
+
+func (m *OnuItuPonAlarm_RateThresholdConfig) GetRateThresholdRising() uint64 {
+	if m != nil {
+		return m.RateThresholdRising
+	}
+	return 0
+}
+
+func (m *OnuItuPonAlarm_RateThresholdConfig) GetRateThresholdFalling() uint64 {
+	if m != nil {
+		return m.RateThresholdFalling
+	}
+	return 0
+}
+
+func (m *OnuItuPonAlarm_RateThresholdConfig) GetSoakTime() *OnuItuPonAlarm_SoakTime {
+	if m != nil {
+		return m.SoakTime
+	}
+	return nil
+}
+
+type OnuItuPonAlarm_RateRangeConfig struct {
+	RateRangeLower       uint64                   `protobuf:"fixed64,1,opt,name=rate_range_lower,json=rateRangeLower,proto3" json:"rate_range_lower,omitempty"`
+	RateRangeUpper       uint64                   `protobuf:"fixed64,2,opt,name=rate_range_upper,json=rateRangeUpper,proto3" json:"rate_range_upper,omitempty"`
+	SoakTime             *OnuItuPonAlarm_SoakTime `protobuf:"bytes,3,opt,name=soak_time,json=soakTime,proto3" json:"soak_time,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *OnuItuPonAlarm_RateRangeConfig) Reset()         { *m = OnuItuPonAlarm_RateRangeConfig{} }
+func (m *OnuItuPonAlarm_RateRangeConfig) String() string { return proto.CompactTextString(m) }
+func (*OnuItuPonAlarm_RateRangeConfig) ProtoMessage()    {}
+func (*OnuItuPonAlarm_RateRangeConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{21, 2}
+}
+
+func (m *OnuItuPonAlarm_RateRangeConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuItuPonAlarm_RateRangeConfig.Unmarshal(m, b)
+}
+func (m *OnuItuPonAlarm_RateRangeConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuItuPonAlarm_RateRangeConfig.Marshal(b, m, deterministic)
+}
+func (m *OnuItuPonAlarm_RateRangeConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuItuPonAlarm_RateRangeConfig.Merge(m, src)
+}
+func (m *OnuItuPonAlarm_RateRangeConfig) XXX_Size() int {
+	return xxx_messageInfo_OnuItuPonAlarm_RateRangeConfig.Size(m)
+}
+func (m *OnuItuPonAlarm_RateRangeConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuItuPonAlarm_RateRangeConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuItuPonAlarm_RateRangeConfig proto.InternalMessageInfo
+
+func (m *OnuItuPonAlarm_RateRangeConfig) GetRateRangeLower() uint64 {
+	if m != nil {
+		return m.RateRangeLower
+	}
+	return 0
+}
+
+func (m *OnuItuPonAlarm_RateRangeConfig) GetRateRangeUpper() uint64 {
+	if m != nil {
+		return m.RateRangeUpper
+	}
+	return 0
+}
+
+func (m *OnuItuPonAlarm_RateRangeConfig) GetSoakTime() *OnuItuPonAlarm_SoakTime {
+	if m != nil {
+		return m.SoakTime
+	}
+	return nil
+}
+
+type OnuItuPonAlarm_ValueThresholdConfig struct {
+	ThresholdLimit       uint64                   `protobuf:"fixed64,1,opt,name=threshold_limit,json=thresholdLimit,proto3" json:"threshold_limit,omitempty"`
+	SoakTime             *OnuItuPonAlarm_SoakTime `protobuf:"bytes,2,opt,name=soak_time,json=soakTime,proto3" json:"soak_time,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *OnuItuPonAlarm_ValueThresholdConfig) Reset()         { *m = OnuItuPonAlarm_ValueThresholdConfig{} }
+func (m *OnuItuPonAlarm_ValueThresholdConfig) String() string { return proto.CompactTextString(m) }
+func (*OnuItuPonAlarm_ValueThresholdConfig) ProtoMessage()    {}
+func (*OnuItuPonAlarm_ValueThresholdConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{21, 3}
+}
+
+func (m *OnuItuPonAlarm_ValueThresholdConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuItuPonAlarm_ValueThresholdConfig.Unmarshal(m, b)
+}
+func (m *OnuItuPonAlarm_ValueThresholdConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuItuPonAlarm_ValueThresholdConfig.Marshal(b, m, deterministic)
+}
+func (m *OnuItuPonAlarm_ValueThresholdConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuItuPonAlarm_ValueThresholdConfig.Merge(m, src)
+}
+func (m *OnuItuPonAlarm_ValueThresholdConfig) XXX_Size() int {
+	return xxx_messageInfo_OnuItuPonAlarm_ValueThresholdConfig.Size(m)
+}
+func (m *OnuItuPonAlarm_ValueThresholdConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuItuPonAlarm_ValueThresholdConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuItuPonAlarm_ValueThresholdConfig proto.InternalMessageInfo
+
+func (m *OnuItuPonAlarm_ValueThresholdConfig) GetThresholdLimit() uint64 {
+	if m != nil {
+		return m.ThresholdLimit
+	}
+	return 0
+}
+
+func (m *OnuItuPonAlarm_ValueThresholdConfig) GetSoakTime() *OnuItuPonAlarm_SoakTime {
+	if m != nil {
+		return m.SoakTime
+	}
+	return nil
+}
+
 type SerialNumber struct {
 	VendorId             []byte   `protobuf:"bytes,1,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
 	VendorSpecific       []byte   `protobuf:"bytes,2,opt,name=vendor_specific,json=vendorSpecific,proto3" json:"vendor_specific,omitempty"`
@@ -2351,7 +2803,7 @@
 func (m *SerialNumber) String() string { return proto.CompactTextString(m) }
 func (*SerialNumber) ProtoMessage()    {}
 func (*SerialNumber) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{20}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{22}
 }
 
 func (m *SerialNumber) XXX_Unmarshal(b []byte) error {
@@ -2412,7 +2864,7 @@
 func (m *PortStatistics) String() string { return proto.CompactTextString(m) }
 func (*PortStatistics) ProtoMessage()    {}
 func (*PortStatistics) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{21}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{23}
 }
 
 func (m *PortStatistics) XXX_Unmarshal(b []byte) error {
@@ -2561,7 +3013,7 @@
 func (m *FlowStatistics) String() string { return proto.CompactTextString(m) }
 func (*FlowStatistics) ProtoMessage()    {}
 func (*FlowStatistics) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{22}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{24}
 }
 
 func (m *FlowStatistics) XXX_Unmarshal(b []byte) error {
@@ -2636,7 +3088,7 @@
 func (m *LosIndication) String() string { return proto.CompactTextString(m) }
 func (*LosIndication) ProtoMessage()    {}
 func (*LosIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{23}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{25}
 }
 
 func (m *LosIndication) XXX_Unmarshal(b []byte) error {
@@ -2684,7 +3136,7 @@
 func (m *DyingGaspIndication) String() string { return proto.CompactTextString(m) }
 func (*DyingGaspIndication) ProtoMessage()    {}
 func (*DyingGaspIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{24}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{26}
 }
 
 func (m *DyingGaspIndication) XXX_Unmarshal(b []byte) error {
@@ -2744,7 +3196,7 @@
 func (m *OnuAlarmIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuAlarmIndication) ProtoMessage()    {}
 func (*OnuAlarmIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{25}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{27}
 }
 
 func (m *OnuAlarmIndication) XXX_Unmarshal(b []byte) error {
@@ -2834,7 +3286,7 @@
 func (m *OnuStartupFailureIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuStartupFailureIndication) ProtoMessage()    {}
 func (*OnuStartupFailureIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{26}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{28}
 }
 
 func (m *OnuStartupFailureIndication) XXX_Unmarshal(b []byte) error {
@@ -2890,7 +3342,7 @@
 func (m *OnuSignalDegradeIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuSignalDegradeIndication) ProtoMessage()    {}
 func (*OnuSignalDegradeIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{27}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{29}
 }
 
 func (m *OnuSignalDegradeIndication) XXX_Unmarshal(b []byte) error {
@@ -2954,7 +3406,7 @@
 func (m *OnuDriftOfWindowIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuDriftOfWindowIndication) ProtoMessage()    {}
 func (*OnuDriftOfWindowIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{28}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{30}
 }
 
 func (m *OnuDriftOfWindowIndication) XXX_Unmarshal(b []byte) error {
@@ -3023,7 +3475,7 @@
 func (m *OnuLossOfOmciChannelIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuLossOfOmciChannelIndication) ProtoMessage()    {}
 func (*OnuLossOfOmciChannelIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{29}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{31}
 }
 
 func (m *OnuLossOfOmciChannelIndication) XXX_Unmarshal(b []byte) error {
@@ -3079,7 +3531,7 @@
 func (m *OnuSignalsFailureIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuSignalsFailureIndication) ProtoMessage()    {}
 func (*OnuSignalsFailureIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{30}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{32}
 }
 
 func (m *OnuSignalsFailureIndication) XXX_Unmarshal(b []byte) error {
@@ -3142,7 +3594,7 @@
 func (m *OnuTransmissionInterferenceWarning) String() string { return proto.CompactTextString(m) }
 func (*OnuTransmissionInterferenceWarning) ProtoMessage()    {}
 func (*OnuTransmissionInterferenceWarning) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{31}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{33}
 }
 
 func (m *OnuTransmissionInterferenceWarning) XXX_Unmarshal(b []byte) error {
@@ -3204,7 +3656,7 @@
 func (m *OnuActivationFailureIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuActivationFailureIndication) ProtoMessage()    {}
 func (*OnuActivationFailureIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{32}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{34}
 }
 
 func (m *OnuActivationFailureIndication) XXX_Unmarshal(b []byte) error {
@@ -3259,7 +3711,7 @@
 func (m *OnuLossOfKeySyncFailureIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuLossOfKeySyncFailureIndication) ProtoMessage()    {}
 func (*OnuLossOfKeySyncFailureIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{33}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{35}
 }
 
 func (m *OnuLossOfKeySyncFailureIndication) XXX_Unmarshal(b []byte) error {
@@ -3301,20 +3753,69 @@
 	return ""
 }
 
-type OnuItuPonStatsIndication struct {
-	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
-	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
-	RdiErrors            uint32   `protobuf:"fixed32,3,opt,name=rdi_errors,json=rdiErrors,proto3" json:"rdi_errors,omitempty"`
+type RdiErrorIndication struct {
+	RdiErrorCount        uint64   `protobuf:"fixed64,1,opt,name=rdi_error_count,json=rdiErrorCount,proto3" json:"rdi_error_count,omitempty"`
+	Status               string   `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
 }
 
+func (m *RdiErrorIndication) Reset()         { *m = RdiErrorIndication{} }
+func (m *RdiErrorIndication) String() string { return proto.CompactTextString(m) }
+func (*RdiErrorIndication) ProtoMessage()    {}
+func (*RdiErrorIndication) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{36}
+}
+
+func (m *RdiErrorIndication) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RdiErrorIndication.Unmarshal(m, b)
+}
+func (m *RdiErrorIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RdiErrorIndication.Marshal(b, m, deterministic)
+}
+func (m *RdiErrorIndication) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RdiErrorIndication.Merge(m, src)
+}
+func (m *RdiErrorIndication) XXX_Size() int {
+	return xxx_messageInfo_RdiErrorIndication.Size(m)
+}
+func (m *RdiErrorIndication) XXX_DiscardUnknown() {
+	xxx_messageInfo_RdiErrorIndication.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RdiErrorIndication proto.InternalMessageInfo
+
+func (m *RdiErrorIndication) GetRdiErrorCount() uint64 {
+	if m != nil {
+		return m.RdiErrorCount
+	}
+	return 0
+}
+
+func (m *RdiErrorIndication) GetStatus() string {
+	if m != nil {
+		return m.Status
+	}
+	return ""
+}
+
+type OnuItuPonStatsIndication struct {
+	IntfId uint32 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
+	OnuId  uint32 `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
+	// Types that are valid to be assigned to Stats:
+	//	*OnuItuPonStatsIndication_RdiErrorInd
+	Stats                isOnuItuPonStatsIndication_Stats `protobuf_oneof:"stats"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
 func (m *OnuItuPonStatsIndication) Reset()         { *m = OnuItuPonStatsIndication{} }
 func (m *OnuItuPonStatsIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuItuPonStatsIndication) ProtoMessage()    {}
 func (*OnuItuPonStatsIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{34}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{37}
 }
 
 func (m *OnuItuPonStatsIndication) XXX_Unmarshal(b []byte) error {
@@ -3349,11 +3850,35 @@
 	return 0
 }
 
-func (m *OnuItuPonStatsIndication) GetRdiErrors() uint32 {
+type isOnuItuPonStatsIndication_Stats interface {
+	isOnuItuPonStatsIndication_Stats()
+}
+
+type OnuItuPonStatsIndication_RdiErrorInd struct {
+	RdiErrorInd *RdiErrorIndication `protobuf:"bytes,3,opt,name=rdi_error_ind,json=rdiErrorInd,proto3,oneof"`
+}
+
+func (*OnuItuPonStatsIndication_RdiErrorInd) isOnuItuPonStatsIndication_Stats() {}
+
+func (m *OnuItuPonStatsIndication) GetStats() isOnuItuPonStatsIndication_Stats {
 	if m != nil {
-		return m.RdiErrors
+		return m.Stats
 	}
-	return 0
+	return nil
+}
+
+func (m *OnuItuPonStatsIndication) GetRdiErrorInd() *RdiErrorIndication {
+	if x, ok := m.GetStats().(*OnuItuPonStatsIndication_RdiErrorInd); ok {
+		return x.RdiErrorInd
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*OnuItuPonStatsIndication) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*OnuItuPonStatsIndication_RdiErrorInd)(nil),
+	}
 }
 
 type OnuProcessingErrorIndication struct {
@@ -3368,7 +3893,7 @@
 func (m *OnuProcessingErrorIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuProcessingErrorIndication) ProtoMessage()    {}
 func (*OnuProcessingErrorIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{35}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{38}
 }
 
 func (m *OnuProcessingErrorIndication) XXX_Unmarshal(b []byte) error {
@@ -3406,7 +3931,7 @@
 type OnuDeactivationFailureIndication struct {
 	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
 	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
-	FailReason           uint32   `protobuf:"fixed32,3,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"`
+	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -3416,7 +3941,7 @@
 func (m *OnuDeactivationFailureIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuDeactivationFailureIndication) ProtoMessage()    {}
 func (*OnuDeactivationFailureIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{36}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{39}
 }
 
 func (m *OnuDeactivationFailureIndication) XXX_Unmarshal(b []byte) error {
@@ -3451,17 +3976,17 @@
 	return 0
 }
 
-func (m *OnuDeactivationFailureIndication) GetFailReason() uint32 {
+func (m *OnuDeactivationFailureIndication) GetStatus() string {
 	if m != nil {
-		return m.FailReason
+		return m.Status
 	}
-	return 0
+	return ""
 }
 
 type OnuRemoteDefectIndication struct {
 	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
 	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
-	RdiErrors            uint32   `protobuf:"fixed32,3,opt,name=rdi_errors,json=rdiErrors,proto3" json:"rdi_errors,omitempty"`
+	RdiErrors            uint64   `protobuf:"fixed64,3,opt,name=rdi_errors,json=rdiErrors,proto3" json:"rdi_errors,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -3471,7 +3996,7 @@
 func (m *OnuRemoteDefectIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuRemoteDefectIndication) ProtoMessage()    {}
 func (*OnuRemoteDefectIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{37}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{40}
 }
 
 func (m *OnuRemoteDefectIndication) XXX_Unmarshal(b []byte) error {
@@ -3506,7 +4031,7 @@
 	return 0
 }
 
-func (m *OnuRemoteDefectIndication) GetRdiErrors() uint32 {
+func (m *OnuRemoteDefectIndication) GetRdiErrors() uint64 {
 	if m != nil {
 		return m.RdiErrors
 	}
@@ -3529,7 +4054,7 @@
 func (m *OnuLossOfGEMChannelDelineationIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuLossOfGEMChannelDelineationIndication) ProtoMessage()    {}
 func (*OnuLossOfGEMChannelDelineationIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{38}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{41}
 }
 
 func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Unmarshal(b []byte) error {
@@ -3591,7 +4116,7 @@
 func (m *OnuPhysicalEquipmentErrorIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuPhysicalEquipmentErrorIndication) ProtoMessage()    {}
 func (*OnuPhysicalEquipmentErrorIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{39}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{42}
 }
 
 func (m *OnuPhysicalEquipmentErrorIndication) XXX_Unmarshal(b []byte) error {
@@ -3646,7 +4171,7 @@
 func (m *OnuLossOfAcknowledgementIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuLossOfAcknowledgementIndication) ProtoMessage()    {}
 func (*OnuLossOfAcknowledgementIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{40}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{43}
 }
 
 func (m *OnuLossOfAcknowledgementIndication) XXX_Unmarshal(b []byte) error {
@@ -3704,7 +4229,7 @@
 func (m *OnuDifferentialReachExceededIndication) String() string { return proto.CompactTextString(m) }
 func (*OnuDifferentialReachExceededIndication) ProtoMessage()    {}
 func (*OnuDifferentialReachExceededIndication) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{41}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{44}
 }
 
 func (m *OnuDifferentialReachExceededIndication) XXX_Unmarshal(b []byte) error {
@@ -3767,7 +4292,7 @@
 func (m *GroupMember) String() string { return proto.CompactTextString(m) }
 func (*GroupMember) ProtoMessage()    {}
 func (*GroupMember) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{42}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{45}
 }
 
 func (m *GroupMember) XXX_Unmarshal(b []byte) error {
@@ -3830,7 +4355,7 @@
 func (m *Group) String() string { return proto.CompactTextString(m) }
 func (*Group) ProtoMessage()    {}
 func (*Group) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{43}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{46}
 }
 
 func (m *Group) XXX_Unmarshal(b []byte) error {
@@ -3891,7 +4416,7 @@
 func (m *ValueParam) String() string { return proto.CompactTextString(m) }
 func (*ValueParam) ProtoMessage()    {}
 func (*ValueParam) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{44}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{47}
 }
 
 func (m *ValueParam) XXX_Unmarshal(b []byte) error {
@@ -3936,7 +4461,7 @@
 func (m *Empty) String() string { return proto.CompactTextString(m) }
 func (*Empty) ProtoMessage()    {}
 func (*Empty) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{45}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{48}
 }
 
 func (m *Empty) XXX_Unmarshal(b []byte) error {
@@ -3960,6 +4485,8 @@
 func init() {
 	proto.RegisterEnum("openolt.DeviceInfo_DeviceResourceRanges_Pool_PoolType", DeviceInfo_DeviceResourceRanges_Pool_PoolType_name, DeviceInfo_DeviceResourceRanges_Pool_PoolType_value)
 	proto.RegisterEnum("openolt.DeviceInfo_DeviceResourceRanges_Pool_SharingType", DeviceInfo_DeviceResourceRanges_Pool_SharingType_name, DeviceInfo_DeviceResourceRanges_Pool_SharingType_value)
+	proto.RegisterEnum("openolt.OnuItuPonAlarm_AlarmID", OnuItuPonAlarm_AlarmID_name, OnuItuPonAlarm_AlarmID_value)
+	proto.RegisterEnum("openolt.OnuItuPonAlarm_AlarmReportingCondition", OnuItuPonAlarm_AlarmReportingCondition_name, OnuItuPonAlarm_AlarmReportingCondition_value)
 	proto.RegisterEnum("openolt.GroupMember_InterfaceType", GroupMember_InterfaceType_name, GroupMember_InterfaceType_value)
 	proto.RegisterEnum("openolt.Group_GroupMembersCommand", Group_GroupMembersCommand_name, Group_GroupMembersCommand_value)
 	proto.RegisterType((*Indication)(nil), "openolt.Indication")
@@ -3974,6 +4501,7 @@
 	proto.RegisterType((*Interface)(nil), "openolt.Interface")
 	proto.RegisterType((*Heartbeat)(nil), "openolt.Heartbeat")
 	proto.RegisterType((*Onu)(nil), "openolt.Onu")
+	proto.RegisterType((*OnuLogicalDistance)(nil), "openolt.OnuLogicalDistance")
 	proto.RegisterType((*OmciMsg)(nil), "openolt.OmciMsg")
 	proto.RegisterType((*OnuPacket)(nil), "openolt.OnuPacket")
 	proto.RegisterType((*UplinkPacket)(nil), "openolt.UplinkPacket")
@@ -3984,6 +4512,11 @@
 	proto.RegisterType((*ActionCmd)(nil), "openolt.ActionCmd")
 	proto.RegisterType((*Action)(nil), "openolt.Action")
 	proto.RegisterType((*Flow)(nil), "openolt.Flow")
+	proto.RegisterType((*OnuItuPonAlarm)(nil), "openolt.OnuItuPonAlarm")
+	proto.RegisterType((*OnuItuPonAlarm_SoakTime)(nil), "openolt.OnuItuPonAlarm.SoakTime")
+	proto.RegisterType((*OnuItuPonAlarm_RateThresholdConfig)(nil), "openolt.OnuItuPonAlarm.RateThresholdConfig")
+	proto.RegisterType((*OnuItuPonAlarm_RateRangeConfig)(nil), "openolt.OnuItuPonAlarm.RateRangeConfig")
+	proto.RegisterType((*OnuItuPonAlarm_ValueThresholdConfig)(nil), "openolt.OnuItuPonAlarm.ValueThresholdConfig")
 	proto.RegisterType((*SerialNumber)(nil), "openolt.SerialNumber")
 	proto.RegisterType((*PortStatistics)(nil), "openolt.PortStatistics")
 	proto.RegisterType((*FlowStatistics)(nil), "openolt.FlowStatistics")
@@ -3998,6 +4531,7 @@
 	proto.RegisterType((*OnuTransmissionInterferenceWarning)(nil), "openolt.OnuTransmissionInterferenceWarning")
 	proto.RegisterType((*OnuActivationFailureIndication)(nil), "openolt.OnuActivationFailureIndication")
 	proto.RegisterType((*OnuLossOfKeySyncFailureIndication)(nil), "openolt.OnuLossOfKeySyncFailureIndication")
+	proto.RegisterType((*RdiErrorIndication)(nil), "openolt.RdiErrorIndication")
 	proto.RegisterType((*OnuItuPonStatsIndication)(nil), "openolt.OnuItuPonStatsIndication")
 	proto.RegisterType((*OnuProcessingErrorIndication)(nil), "openolt.OnuProcessingErrorIndication")
 	proto.RegisterType((*OnuDeactivationFailureIndication)(nil), "openolt.OnuDeactivationFailureIndication")
@@ -4015,249 +4549,287 @@
 func init() { proto.RegisterFile("voltha_protos/openolt.proto", fileDescriptor_c072e7aa0dfd74d5) }
 
 var fileDescriptor_c072e7aa0dfd74d5 = []byte{
-	// 3869 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xcd, 0x73, 0x1b, 0x39,
-	0x76, 0x37, 0x25, 0x8a, 0x4d, 0x3e, 0x7e, 0x88, 0x82, 0x2c, 0x5b, 0x1f, 0x5e, 0x8f, 0xa6, 0xd7,
-	0x99, 0xf1, 0x4e, 0x66, 0xa4, 0xb1, 0x67, 0x2b, 0xc9, 0x4e, 0x36, 0xc9, 0xc8, 0x12, 0x6d, 0x33,
-	0x63, 0x99, 0x4c, 0x8b, 0xb6, 0x93, 0xd9, 0x9a, 0xea, 0x6d, 0x75, 0x83, 0x14, 0xa2, 0x66, 0xa3,
-	0xa7, 0x1b, 0xd4, 0xc7, 0x75, 0x93, 0xcd, 0x29, 0xa7, 0x6c, 0xe5, 0x90, 0xdc, 0x52, 0xf9, 0x27,
-	0xb6, 0x6a, 0x8f, 0xb9, 0xa6, 0x72, 0xc9, 0xbf, 0x90, 0x5b, 0xee, 0xa9, 0x1c, 0x72, 0x48, 0xe1,
-	0x01, 0xfd, 0x45, 0x52, 0xb2, 0x3d, 0x51, 0x6a, 0x2f, 0x2a, 0xe1, 0xbd, 0xdf, 0xfb, 0x3d, 0x3c,
-	0xe0, 0x01, 0x78, 0x68, 0x10, 0xb6, 0xce, 0xb8, 0x2f, 0x4e, 0x1c, 0x3b, 0x8c, 0xb8, 0xe0, 0xf1,
-	0x2e, 0x0f, 0x69, 0xc0, 0x7d, 0xb1, 0x83, 0x4d, 0x62, 0xe8, 0xe6, 0xe6, 0xbd, 0x11, 0xe7, 0x23,
-	0x9f, 0xee, 0x3a, 0x21, 0xdb, 0x75, 0x82, 0x80, 0x0b, 0x47, 0x30, 0x1e, 0xc4, 0x0a, 0xb6, 0xb9,
-	0x5d, 0xe4, 0x10, 0xd4, 0x3d, 0x91, 0xff, 0x0f, 0x99, 0x4f, 0x35, 0x62, 0xb3, 0x88, 0x70, 0xf9,
-	0x78, 0xcc, 0x03, 0xa5, 0x33, 0xff, 0xb5, 0x0c, 0xd0, 0x0d, 0x3c, 0xe6, 0x22, 0x27, 0x79, 0x04,
-	0x06, 0xf7, 0x85, 0xcd, 0x02, 0x6f, 0xbd, 0xb4, 0x5d, 0x7a, 0x58, 0x7f, 0x7c, 0x67, 0x27, 0xe9,
-	0x54, 0xcf, 0x17, 0x19, 0xf0, 0xf9, 0x2d, 0xab, 0xc2, 0x51, 0x40, 0x7e, 0x0c, 0x55, 0x16, 0x88,
-	0x21, 0xda, 0x2c, 0xa0, 0xcd, 0xdd, 0xd4, 0xa6, 0x1b, 0x88, 0x61, 0xc1, 0xc8, 0x60, 0x4a, 0x42,
-	0xf6, 0xa0, 0x89, 0x56, 0x3c, 0xa4, 0x11, 0x9a, 0x2e, 0xa2, 0xe9, 0x56, 0xc1, 0xb4, 0x17, 0xd2,
-	0xa8, 0x60, 0x5e, 0x67, 0x99, 0x94, 0xfc, 0x31, 0x34, 0x78, 0x30, 0xb1, 0x3d, 0x16, 0xbb, 0xc8,
-	0x50, 0x46, 0x86, 0xcd, 0xac, 0xc3, 0xc1, 0xe4, 0x80, 0xc5, 0x6e, 0x81, 0x00, 0x78, 0x2a, 0xc4,
-	0x58, 0x83, 0x09, 0x9a, 0x2e, 0x4d, 0xc7, 0x1a, 0x4c, 0xa6, 0x62, 0x45, 0x81, 0x8c, 0x95, 0x8f,
-	0x5d, 0x86, 0x36, 0x95, 0xa9, 0x58, 0x7b, 0x63, 0x97, 0x15, 0x63, 0xe5, 0x4a, 0x42, 0x7e, 0x0c,
-	0x46, 0x78, 0xaa, 0x06, 0xd5, 0x40, 0xa3, 0x8d, 0xd4, 0xa8, 0xef, 0xb8, 0xa7, 0x74, 0x6a, 0x5c,
-	0xc3, 0x53, 0x1c, 0xd7, 0x3f, 0x00, 0x08, 0x79, 0x24, 0xec, 0x58, 0x38, 0x22, 0x5e, 0xaf, 0x4e,
-	0x79, 0xeb, 0xf3, 0x48, 0x1c, 0xc9, 0x44, 0x88, 0x05, 0x73, 0xe3, 0xe7, 0xb7, 0xac, 0x5a, 0xa8,
-	0x25, 0xb1, 0xb4, 0x1c, 0xfa, 0xfc, 0x5c, 0x5b, 0xd6, 0xa6, 0x2c, 0x9f, 0xfa, 0xfc, 0xbc, 0x68,
-	0x39, 0xd4, 0x92, 0x98, 0xfc, 0x3e, 0xd4, 0x1c, 0xdf, 0x89, 0xc6, 0xd8, 0x57, 0x40, 0xc3, 0xf5,
-	0xd4, 0x70, 0x4f, 0x6a, 0x0a, 0x5d, 0xad, 0x3a, 0x5a, 0xf4, 0xa4, 0x02, 0x65, 0xcf, 0x11, 0x8e,
-	0xf9, 0x9f, 0x4d, 0x58, 0x9e, 0xc2, 0xc9, 0x71, 0xf6, 0x79, 0x3c, 0x37, 0xa7, 0x5e, 0xf0, 0xb8,
-	0x18, 0xbb, 0x8f, 0x02, 0x72, 0x00, 0x2d, 0xef, 0x92, 0x05, 0x23, 0x7b, 0xe4, 0xc4, 0x61, 0x2e,
-	0xb3, 0xee, 0xa5, 0x96, 0x07, 0x52, 0xfd, 0xcc, 0x89, 0xc3, 0x82, 0x7d, 0xc3, 0xcb, 0x89, 0x65,
-	0x8e, 0xc9, 0x09, 0xce, 0x22, 0x9a, 0xce, 0xb1, 0x5e, 0x30, 0x99, 0x0d, 0xaa, 0xce, 0x33, 0x29,
-	0x79, 0x03, 0xb7, 0x25, 0x45, 0x2c, 0x9c, 0x48, 0x4c, 0x42, 0x7b, 0xe8, 0x30, 0x3f, 0x97, 0x6b,
-	0x0f, 0xf2, 0x4c, 0x47, 0x0a, 0xf3, 0xd4, 0x61, 0xfe, 0x24, 0xa2, 0x05, 0xca, 0x15, 0x5e, 0x50,
-	0x4b, 0xe2, 0x6f, 0xe0, 0x0e, 0x12, 0xb3, 0x51, 0xe0, 0xf8, 0xb6, 0x47, 0x47, 0x91, 0xe3, 0xd1,
-	0x5c, 0x2e, 0xfe, 0xb0, 0x40, 0x8d, 0xa8, 0x03, 0x05, 0x2a, 0x30, 0xaf, 0xf2, 0x59, 0x2d, 0xf9,
-	0x19, 0xdc, 0xc5, 0x85, 0x11, 0xb1, 0xa1, 0xb0, 0xf9, 0xd0, 0x3e, 0x67, 0x81, 0xc7, 0xcf, 0x73,
-	0x49, 0x5b, 0x20, 0x3f, 0x90, 0xb0, 0xde, 0xf0, 0x0d, 0x82, 0x66, 0xc8, 0xa7, 0xb5, 0x64, 0x00,
-	0x32, 0x1a, 0xdb, 0xe7, 0x71, 0x6c, 0xa7, 0x6b, 0x41, 0xa5, 0xf5, 0xc7, 0x79, 0xda, 0x17, 0x3c,
-	0x8e, 0x7b, 0x43, 0xb9, 0x28, 0xf6, 0x4f, 0x9c, 0x20, 0xa0, 0x7e, 0x81, 0xba, 0xc5, 0x35, 0x42,
-	0x2f, 0x91, 0x64, 0x9c, 0x31, 0x94, 0x38, 0x1b, 0xe7, 0xea, 0x9c, 0x71, 0x56, 0x98, 0x2b, 0xc7,
-	0x39, 0x53, 0x4b, 0xe2, 0x9e, 0xda, 0x24, 0x04, 0x3b, 0x57, 0x3d, 0x55, 0xab, 0xe1, 0x77, 0xf3,
-	0x84, 0x83, 0xc8, 0x09, 0xe2, 0x31, 0x8b, 0x63, 0xc6, 0x83, 0x6e, 0x20, 0x68, 0x34, 0xa4, 0x11,
-	0x0d, 0x5c, 0xfa, 0xc6, 0x89, 0x02, 0x16, 0x8c, 0xf4, 0xae, 0x31, 0x60, 0xe7, 0xd8, 0xd3, 0x9f,
-	0xab, 0xc1, 0x75, 0x5c, 0xc1, 0xce, 0xd0, 0x6f, 0xd6, 0x59, 0x98, 0x1d, 0x85, 0xbd, 0x14, 0x36,
-	0xaf, 0xbf, 0x32, 0xe6, 0x22, 0x42, 0x79, 0x58, 0x97, 0x1e, 0xc2, 0x88, 0xbb, 0x34, 0x8e, 0xe5,
-	0x2a, 0xa0, 0x51, 0xc4, 0xd5, 0x2e, 0x59, 0x47, 0x17, 0xbf, 0x93, 0x77, 0xd1, 0x4f, 0x71, 0x1d,
-	0x09, 0x2b, 0x38, 0x58, 0xe3, 0xf3, 0xf4, 0x84, 0xc2, 0x46, 0x36, 0x87, 0x43, 0x3b, 0xbe, 0x0c,
-	0xdc, 0x2c, 0x8a, 0x06, 0xba, 0xf8, 0x64, 0x76, 0x2e, 0xbf, 0xa6, 0x97, 0x47, 0x97, 0x81, 0x7b,
-	0x55, 0x20, 0x0a, 0x94, 0x20, 0xa4, 0x9b, 0x57, 0xb0, 0x86, 0x1b, 0xac, 0x98, 0xd8, 0x21, 0x0f,
-	0xd4, 0x76, 0x84, 0x2e, 0x9a, 0xe8, 0xe2, 0xc3, 0xc2, 0x76, 0x2b, 0x26, 0x7d, 0x1e, 0xe0, 0x2e,
-	0x34, 0x33, 0xa5, 0x45, 0x1d, 0xf1, 0xe1, 0x1e, 0xa6, 0x37, 0x9d, 0x9a, 0x83, 0x49, 0xa4, 0x16,
-	0x50, 0x0b, 0xd9, 0x7f, 0x54, 0xc8, 0xf1, 0x1c, 0x76, 0x5e, 0xff, 0xe5, 0x70, 0xcc, 0xc7, 0x90,
-	0x37, 0x2a, 0x88, 0x88, 0x8e, 0xb9, 0xa0, 0xb6, 0x47, 0x87, 0xd4, 0x55, 0x5b, 0xf9, 0x32, 0xba,
-	0x31, 0xf3, 0x6e, 0x2c, 0x04, 0x1d, 0x20, 0xa6, 0xc0, 0x4f, 0xf8, 0x8c, 0x92, 0xc4, 0x2a, 0x0c,
-	0x9c, 0x84, 0x11, 0x1d, 0xdb, 0x1e, 0xf5, 0x59, 0x40, 0x55, 0x38, 0x92, 0xbf, 0x8d, 0xfc, 0x8f,
-	0x66, 0xe7, 0xe1, 0x59, 0xe7, 0x50, 0x2f, 0xa9, 0x83, 0xcc, 0xa4, 0xe0, 0x6e, 0x5d, 0x4f, 0xc7,
-	0x33, 0x3a, 0x2e, 0x42, 0xc8, 0x19, 0x6c, 0x63, 0x6e, 0x9d, 0x5c, 0xc6, 0xcc, 0x75, 0x7c, 0x9b,
-	0x7e, 0x37, 0x61, 0xe1, 0x98, 0x06, 0x22, 0x97, 0x63, 0x2b, 0xe8, 0xf8, 0xd3, 0x42, 0x8e, 0x69,
-	0x7c, 0x27, 0x81, 0xcf, 0xa6, 0x9a, 0x0c, 0xe6, 0x4a, 0x18, 0xf9, 0x19, 0xac, 0xe6, 0x33, 0xce,
-	0x71, 0x4f, 0xd1, 0x15, 0x99, 0x5d, 0x8d, 0x2a, 0xc6, 0x3d, 0xf7, 0x34, 0xe0, 0xe7, 0x3e, 0xf5,
-	0x46, 0x54, 0xf2, 0x14, 0x3c, 0x2d, 0xf3, 0x1c, 0x4a, 0x92, 0x73, 0xd8, 0x52, 0x85, 0xc0, 0x70,
-	0x68, 0x47, 0xd4, 0x71, 0x4f, 0x6c, 0x7a, 0xe1, 0x52, 0xea, 0x51, 0x0f, 0x9d, 0xac, 0xa2, 0x93,
-	0xdd, 0x62, 0x5d, 0x30, 0xc4, 0x45, 0x2e, 0x98, 0xe3, 0x5b, 0xd2, 0xa2, 0xa3, 0x0d, 0x0a, 0x8e,
-	0xee, 0x72, 0x85, 0x9c, 0x46, 0xa4, 0xa7, 0xdd, 0x0e, 0x34, 0x0b, 0x55, 0x11, 0xf9, 0x01, 0x00,
-	0x16, 0x34, 0x32, 0xd5, 0x29, 0x9e, 0x76, 0x35, 0xab, 0x26, 0x25, 0x32, 0x79, 0xa9, 0xf9, 0x1c,
-	0x5a, 0xc5, 0x8a, 0x88, 0xdc, 0x05, 0x43, 0x15, 0x4f, 0xea, 0x6c, 0x34, 0xac, 0x0a, 0x16, 0x48,
-	0xde, 0x14, 0xd3, 0xc2, 0x34, 0xd3, 0x09, 0xac, 0xcc, 0x94, 0x37, 0x57, 0x93, 0x7d, 0x09, 0xcd,
-	0x98, 0x46, 0xcc, 0xf1, 0xed, 0x60, 0x32, 0x3e, 0xa6, 0x91, 0x3e, 0x4d, 0xd7, 0xd2, 0x21, 0x39,
-	0x42, 0xed, 0x4b, 0x54, 0x5a, 0x8d, 0x38, 0xd7, 0x32, 0x7f, 0x53, 0x82, 0x66, 0xa1, 0x1c, 0xba,
-	0xda, 0xcd, 0x1a, 0x54, 0x70, 0xbd, 0xab, 0xd3, 0xda, 0xb0, 0x96, 0xe4, 0xda, 0x9d, 0x0e, 0x65,
-	0x71, 0x2a, 0x14, 0xf2, 0x01, 0xd4, 0x1d, 0x6f, 0xcc, 0x02, 0xad, 0x5f, 0x42, 0x3d, 0xa0, 0x48,
-	0x01, 0x66, 0x7a, 0x5f, 0x7e, 0xf7, 0xde, 0xff, 0x1c, 0xc8, 0x6c, 0x21, 0x49, 0x08, 0x94, 0xc5,
-	0x65, 0x98, 0x4c, 0x10, 0xfe, 0x9f, 0x8f, 0x6a, 0xe1, 0x9a, 0x99, 0x98, 0xee, 0xbe, 0x69, 0x41,
-	0xab, 0x58, 0xf9, 0xbd, 0xf7, 0xf8, 0xb4, 0x61, 0x31, 0x3c, 0x15, 0xc8, 0xdc, 0xb0, 0xe4, 0xbf,
-	0xe6, 0xbf, 0x94, 0xa0, 0x3d, 0x5d, 0x19, 0x92, 0x2d, 0xa8, 0x21, 0x2d, 0xf6, 0x5c, 0x8d, 0x12,
-	0x16, 0xde, 0x83, 0xa9, 0xde, 0xcf, 0xe4, 0xd1, 0x88, 0x8e, 0xb1, 0x90, 0x4c, 0xfd, 0xd6, 0xb4,
-	0xa4, 0xeb, 0x49, 0x3b, 0x2c, 0x15, 0x99, 0x2a, 0x8e, 0x0c, 0xab, 0x22, 0x9b, 0x4a, 0x81, 0x46,
-	0x01, 0xc7, 0x9a, 0xc1, 0xb0, 0x2a, 0xb2, 0xf9, 0x92, 0x93, 0x3b, 0x50, 0x71, 0x39, 0x3f, 0x65,
-	0x14, 0x0f, 0xfd, 0x8a, 0xa5, 0x5b, 0x49, 0x14, 0xe5, 0x2c, 0x8a, 0x07, 0x50, 0x53, 0xc7, 0xa9,
-	0xe3, 0x5e, 0xdd, 0x41, 0xf3, 0xa7, 0x50, 0x7b, 0x4e, 0x9d, 0x48, 0x1c, 0x53, 0x47, 0x90, 0x5d,
-	0x58, 0x3d, 0x49, 0x1a, 0xaa, 0x18, 0x10, 0x93, 0x88, 0x6a, 0x0b, 0x92, 0xaa, 0x8e, 0x12, 0x8d,
-	0xf9, 0x57, 0x25, 0x58, 0xec, 0x05, 0x93, 0xf7, 0x1e, 0xf3, 0x99, 0x9c, 0x5a, 0x7c, 0xe7, 0x9c,
-	0xc2, 0x48, 0x99, 0xca, 0x42, 0xc3, 0x92, 0xff, 0x9a, 0x5f, 0x83, 0x21, 0x73, 0xe0, 0x30, 0x1e,
-	0xdd, 0xc0, 0xe4, 0xff, 0xb2, 0x04, 0x35, 0xb9, 0xe5, 0xe2, 0xfc, 0xbf, 0x37, 0x5f, 0x6e, 0xde,
-	0xca, 0x85, 0x79, 0x2b, 0x26, 0xc2, 0xd2, 0x74, 0x22, 0xcc, 0xf6, 0xe3, 0x27, 0xd0, 0x78, 0x15,
-	0xfa, 0x2c, 0x38, 0x7d, 0x5b, 0x4f, 0xb4, 0xe9, 0x42, 0x66, 0xfa, 0x77, 0x35, 0x80, 0x03, 0x7a,
-	0xc6, 0x5c, 0xda, 0x0d, 0x86, 0x98, 0x32, 0x67, 0x34, 0xf0, 0x78, 0xa4, 0x17, 0x9c, 0x6e, 0x91,
-	0xdb, 0xb0, 0x34, 0xe6, 0x1e, 0xf5, 0xf5, 0xf6, 0xa6, 0x1a, 0xe4, 0x47, 0xd0, 0x3e, 0x71, 0x22,
-	0xef, 0xdc, 0x89, 0xa8, 0x7d, 0x46, 0x23, 0x59, 0x95, 0xe9, 0x55, 0xb7, 0x9c, 0xc8, 0x5f, 0x2b,
-	0xb1, 0x84, 0x0e, 0x59, 0x34, 0x2e, 0x40, 0xcb, 0x0a, 0x9a, 0xc8, 0x13, 0xe8, 0x16, 0xd4, 0x3c,
-	0xec, 0x91, 0xec, 0x7f, 0x5b, 0xad, 0x1e, 0x25, 0xe8, 0x7a, 0xe4, 0x73, 0xb8, 0xad, 0x95, 0xc5,
-	0xa4, 0x58, 0x41, 0x1c, 0x51, 0xba, 0x7c, 0x46, 0x48, 0x3a, 0x59, 0xd2, 0xc8, 0xc1, 0x8b, 0xb1,
-	0x62, 0x32, 0xac, 0x6a, 0xc8, 0x03, 0x79, 0x2b, 0x8b, 0xc9, 0x7d, 0x00, 0x79, 0x0b, 0x0f, 0xb8,
-	0xcf, 0x47, 0x97, 0xc9, 0x86, 0x96, 0x49, 0xc8, 0xb6, 0xaa, 0x49, 0x99, 0xa7, 0xee, 0x15, 0x7a,
-	0x81, 0x01, 0x4e, 0x20, 0x5e, 0x13, 0xc8, 0x3d, 0x00, 0x8d, 0xa0, 0xba, 0xba, 0x36, 0xac, 0x2a,
-	0xea, 0x3b, 0x81, 0x47, 0x1e, 0x40, 0xcb, 0xf1, 0x7d, 0xee, 0x66, 0x0c, 0x55, 0x44, 0x34, 0x50,
-	0x9a, 0x70, 0x6c, 0x43, 0x23, 0x45, 0x51, 0x5d, 0xf9, 0x1a, 0x16, 0x68, 0x8c, 0xe4, 0x79, 0x08,
-	0xed, 0x2c, 0x25, 0x34, 0x13, 0x20, 0xaa, 0x95, 0x26, 0x86, 0xe2, 0x7a, 0x00, 0xad, 0x1c, 0x92,
-	0xea, 0x42, 0xd4, 0xb0, 0x1a, 0x29, 0x4e, 0xf2, 0x99, 0xd0, 0xd4, 0x9b, 0x89, 0x26, 0x6b, 0x22,
-	0xa8, 0xae, 0xb6, 0x14, 0xc5, 0x74, 0x1f, 0xea, 0x09, 0x86, 0xea, 0x5a, 0xcd, 0x50, 0x37, 0x50,
-	0xc5, 0xf1, 0x15, 0x54, 0x22, 0x27, 0x18, 0xd1, 0x78, 0x7d, 0x79, 0x7b, 0xf1, 0x61, 0xfd, 0xf1,
-	0xc3, 0xec, 0xc6, 0x97, 0x26, 0x94, 0xfe, 0xd7, 0xa2, 0x31, 0x9f, 0x44, 0x2e, 0xb5, 0x10, 0x6f,
-	0x69, 0xbb, 0xcd, 0xbf, 0x2f, 0xc3, 0xed, 0x79, 0x00, 0xb2, 0x91, 0x7c, 0xa8, 0xf0, 0xe2, 0xf5,
-	0xd2, 0xf6, 0xe2, 0x43, 0x43, 0x7f, 0x8d, 0xf0, 0xa6, 0x67, 0x6c, 0x61, 0x66, 0xc6, 0xf6, 0x61,
-	0x29, 0xe4, 0xdc, 0x8f, 0xd7, 0x17, 0xb1, 0x53, 0x9f, 0xbd, 0x6b, 0xa7, 0x76, 0xfa, 0x9c, 0xfb,
-	0x96, 0xb2, 0xdd, 0xfc, 0x9f, 0x05, 0x28, 0xcb, 0x36, 0xf9, 0xd3, 0xdc, 0xf1, 0xd3, 0x7a, 0xfc,
-	0x7b, 0xef, 0x45, 0x86, 0x7f, 0xe4, 0x96, 0xaf, 0x8f, 0xad, 0x23, 0x30, 0xe2, 0x13, 0x27, 0x62,
-	0xc1, 0x08, 0xbb, 0xdd, 0x7a, 0xfc, 0x93, 0xf7, 0xa3, 0x3b, 0x52, 0xc6, 0xc8, 0x98, 0x30, 0xc9,
-	0x85, 0xa9, 0x26, 0x50, 0x9d, 0x09, 0xaa, 0x21, 0xd7, 0x39, 0xd5, 0x57, 0x5f, 0xc3, 0x92, 0xff,
-	0x9a, 0x7b, 0x50, 0x4d, 0xba, 0x43, 0x00, 0x2a, 0xbd, 0x97, 0xaf, 0xec, 0xee, 0x41, 0xfb, 0x16,
-	0x69, 0x40, 0x75, 0xef, 0xc5, 0x8b, 0xde, 0xbe, 0x6c, 0x95, 0x48, 0x0b, 0xe0, 0x59, 0xe7, 0xb0,
-	0xdf, 0xb3, 0x06, 0xb2, 0xbd, 0x40, 0xea, 0x60, 0x3c, 0x7d, 0xd1, 0x7b, 0x23, 0x1b, 0x8b, 0xe6,
-	0x09, 0xd4, 0x73, 0x5d, 0x20, 0x77, 0x80, 0x1c, 0x74, 0x0e, 0xba, 0xfb, 0x7b, 0x83, 0xce, 0x81,
-	0xdd, 0xef, 0x58, 0x76, 0xf7, 0xe5, 0xe0, 0x69, 0xfb, 0x16, 0xf9, 0x00, 0xb6, 0x8e, 0x9e, 0xef,
-	0x59, 0x9d, 0x03, 0xfb, 0xc9, 0x5f, 0xd8, 0x7b, 0x2f, 0x5e, 0xa0, 0x1c, 0xff, 0x19, 0x74, 0xf6,
-	0x9f, 0xb7, 0x4b, 0x64, 0x1b, 0xee, 0xcd, 0x01, 0x1c, 0xed, 0x1d, 0x76, 0x14, 0x62, 0xc1, 0xfc,
-	0xeb, 0x45, 0x80, 0x7d, 0xdf, 0x89, 0x63, 0x36, 0x64, 0x34, 0xc2, 0xfd, 0xd3, 0x16, 0x61, 0xba,
-	0x9b, 0x2d, 0xf1, 0x41, 0xc8, 0x3c, 0xb2, 0x0a, 0x4b, 0xdc, 0x3e, 0x4b, 0x77, 0xd5, 0x32, 0x7f,
-	0xcd, 0x70, 0xaf, 0x65, 0x0a, 0xab, 0x07, 0x84, 0x25, 0x58, 0x86, 0x58, 0x35, 0x24, 0x65, 0x26,
-	0xb1, 0x77, 0xc1, 0xe0, 0x76, 0x78, 0xcc, 0x44, 0xac, 0x37, 0xd9, 0x0a, 0xef, 0xcb, 0x16, 0xee,
-	0x9f, 0x5a, 0xa1, 0x4f, 0x54, 0xa6, 0x14, 0x1b, 0x50, 0xa5, 0xe2, 0x44, 0x9d, 0xeb, 0x6a, 0xa9,
-	0x1b, 0x54, 0x9c, 0x24, 0xc7, 0xba, 0x17, 0x0b, 0x7b, 0xec, 0xb8, 0xb8, 0xc4, 0x1b, 0x56, 0xc5,
-	0x8b, 0xc5, 0xa1, 0xe3, 0x4a, 0x45, 0x1c, 0xb9, 0xa8, 0xa8, 0x29, 0x45, 0x1c, 0xb9, 0x52, 0x21,
-	0x93, 0x3c, 0x54, 0x5f, 0xfa, 0xf4, 0x5a, 0x36, 0x58, 0xd8, 0xc7, 0xef, 0x89, 0x6b, 0x20, 0xad,
-	0x6d, 0x16, 0xea, 0xc5, 0xbb, 0xe4, 0xc5, 0xa2, 0x1b, 0x4a, 0xb1, 0xa4, 0x62, 0xa1, 0xde, 0xc7,
-	0x96, 0xe2, 0xc8, 0xed, 0x86, 0x92, 0x48, 0x8a, 0xe5, 0xea, 0xd6, 0xeb, 0x58, 0x7a, 0x94, 0x1b,
-	0x9c, 0x54, 0x49, 0x22, 0x54, 0xa9, 0x05, 0x2c, 0x7b, 0x89, 0xaa, 0x6d, 0x68, 0x84, 0xa7, 0xc2,
-	0x16, 0xce, 0x48, 0xc5, 0xb3, 0xac, 0x96, 0x52, 0x78, 0x2a, 0x06, 0x0e, 0xce, 0xb0, 0xf9, 0xcb,
-	0x45, 0xa8, 0xc9, 0x3b, 0x2f, 0x0f, 0xf6, 0xc7, 0xb8, 0x65, 0x38, 0x9e, 0x67, 0xf3, 0x89, 0xa0,
-	0x91, 0xb4, 0xc2, 0xc9, 0xa8, 0x5a, 0x75, 0xc7, 0xf3, 0x7a, 0x52, 0x36, 0x70, 0x46, 0x72, 0x9b,
-	0x92, 0xb7, 0xaf, 0x33, 0x9a, 0x83, 0x2d, 0x20, 0xac, 0xa5, 0xe4, 0x29, 0x72, 0x1b, 0x1a, 0x22,
-	0x72, 0x42, 0x5b, 0x70, 0xfb, 0x84, 0xc7, 0x2a, 0x7d, 0xab, 0x16, 0x48, 0xd9, 0x80, 0x3f, 0xe7,
-	0xb1, 0x20, 0x9f, 0x02, 0x89, 0xe8, 0xd8, 0x89, 0x4e, 0x35, 0x97, 0x9a, 0x8f, 0x32, 0xe2, 0xda,
-	0x4a, 0x83, 0x6c, 0x6a, 0x66, 0x32, 0x34, 0x0b, 0x82, 0x14, 0xbd, 0x94, 0x47, 0x77, 0xa5, 0x42,
-	0xa1, 0x75, 0x2c, 0x0a, 0x2a, 0x3b, 0x59, 0x49, 0x63, 0x41, 0x54, 0x31, 0x96, 0x0c, 0x66, 0xe4,
-	0x63, 0x49, 0x91, 0x3b, 0xb0, 0x2a, 0x22, 0x27, 0x88, 0x7d, 0x47, 0xe4, 0xc1, 0x55, 0x04, 0xaf,
-	0xa4, 0xaa, 0xf9, 0xf8, 0x6c, 0xa0, 0x6a, 0x53, 0xf8, 0x64, 0xac, 0xcc, 0x5f, 0x97, 0xa0, 0xa2,
-	0xe6, 0x81, 0x3c, 0x80, 0x45, 0x77, 0x9c, 0x7c, 0x9c, 0x23, 0xd9, 0xf7, 0xbe, 0x64, 0x96, 0x2c,
-	0xa9, 0x9e, 0xbf, 0x32, 0x72, 0xd9, 0xbe, 0x58, 0xc8, 0xf6, 0x6c, 0x79, 0x95, 0xa7, 0x96, 0x97,
-	0x5a, 0x32, 0x4b, 0xc5, 0x25, 0x33, 0x7f, 0x65, 0x64, 0xeb, 0xce, 0xc8, 0xad, 0x3b, 0xf3, 0xd7,
-	0x8b, 0x50, 0x7e, 0xea, 0xf3, 0x73, 0x3c, 0x08, 0x5d, 0x97, 0xc6, 0xb1, 0x9d, 0xaf, 0x4c, 0x96,
-	0xad, 0x86, 0x92, 0x76, 0xe7, 0x55, 0x4a, 0xcb, 0x49, 0xa5, 0xb4, 0x06, 0x95, 0x49, 0xc0, 0xa4,
-	0xb8, 0xae, 0xc4, 0x93, 0x80, 0x5d, 0x57, 0x11, 0x6f, 0x01, 0x1e, 0x53, 0x2a, 0xaf, 0x55, 0x95,
-	0x51, 0x95, 0x02, 0x5c, 0xa8, 0x1b, 0x50, 0x4d, 0x0e, 0x5b, 0x5c, 0x76, 0xcb, 0x96, 0xa1, 0x0f,
-	0x5a, 0xf2, 0x11, 0x2c, 0x07, 0x54, 0x9c, 0x73, 0xcc, 0x22, 0xd5, 0xcb, 0x25, 0x44, 0x34, 0xb5,
-	0xb8, 0x3b, 0xaf, 0x52, 0xaf, 0x20, 0x24, 0x57, 0xa0, 0x7d, 0x01, 0xe0, 0xa6, 0xbb, 0x97, 0xfe,
-	0xe0, 0xb6, 0x9a, 0xce, 0x55, 0xb6, 0xb1, 0x59, 0x39, 0x18, 0xf9, 0x18, 0x2a, 0x0e, 0xce, 0xa2,
-	0xfe, 0x90, 0xb6, 0x3c, 0x35, 0xb9, 0x96, 0x56, 0x93, 0x4d, 0xa8, 0x86, 0x11, 0xe3, 0x11, 0x13,
-	0x97, 0x98, 0x32, 0xcb, 0x56, 0xda, 0xce, 0x55, 0xfc, 0x8d, 0x42, 0xc5, 0x9f, 0x2b, 0x35, 0x9b,
-	0x85, 0x52, 0x73, 0x03, 0xaa, 0xa3, 0x88, 0x4f, 0x42, 0x19, 0x87, 0xde, 0x1f, 0xb0, 0xdd, 0xf5,
-	0xcc, 0x01, 0x34, 0xa6, 0xeb, 0x28, 0x55, 0x0c, 0x26, 0x93, 0xd7, 0xb0, 0xaa, 0x4a, 0xd0, 0xf5,
-	0xc8, 0xc7, 0xb0, 0xac, 0x95, 0x71, 0x48, 0x5d, 0x36, 0x64, 0xae, 0x2e, 0x32, 0x5b, 0x4a, 0x7c,
-	0xa4, 0xa5, 0xe6, 0xbf, 0x95, 0xa1, 0x55, 0xfc, 0x20, 0x7e, 0x75, 0xb5, 0xba, 0x01, 0xd5, 0xe8,
-	0xc2, 0x3e, 0xbe, 0x14, 0x34, 0x46, 0xb6, 0x8a, 0x65, 0x44, 0x17, 0x4f, 0x64, 0x53, 0xce, 0x40,
-	0x74, 0x61, 0x87, 0x58, 0xee, 0xaa, 0x7c, 0xae, 0x58, 0xb5, 0xe8, 0x42, 0xd5, 0xbf, 0x31, 0xae,
-	0xdd, 0x0b, 0x7b, 0xe2, 0x3a, 0x72, 0xef, 0xd3, 0xa0, 0x32, 0x82, 0x5a, 0xd1, 0xc5, 0x2b, 0x29,
-	0x2e, 0x22, 0xc7, 0x05, 0xe4, 0x52, 0x82, 0x3c, 0x9c, 0x45, 0x1e, 0x17, 0x90, 0x95, 0x04, 0xf9,
-	0x64, 0x16, 0xa9, 0xbe, 0xd2, 0x24, 0x48, 0x23, 0x41, 0xe2, 0x77, 0x96, 0x04, 0xb9, 0x01, 0x55,
-	0x91, 0x44, 0x58, 0x55, 0x11, 0x8a, 0x2c, 0x42, 0x91, 0x45, 0x58, 0x53, 0x11, 0x8a, 0x7c, 0x84,
-	0x62, 0x3a, 0x42, 0x50, 0x3e, 0xc4, 0x4c, 0x84, 0x62, 0x3a, 0xc2, 0x7a, 0x82, 0x3c, 0x9c, 0x45,
-	0x16, 0x23, 0x6c, 0x24, 0xc8, 0x27, 0xb3, 0xc8, 0x62, 0x84, 0xcd, 0x04, 0x59, 0x88, 0xd0, 0x84,
-	0x66, 0x74, 0x61, 0xbb, 0x91, 0xab, 0xd0, 0x31, 0x66, 0x59, 0xc5, 0xaa, 0x47, 0x17, 0xfb, 0x91,
-	0x8b, 0x48, 0x0c, 0xf5, 0x98, 0x85, 0x09, 0x60, 0x59, 0x85, 0x7a, 0xcc, 0x42, 0xad, 0xbe, 0x07,
-	0x35, 0xc1, 0xc6, 0x34, 0x16, 0xce, 0x38, 0xc4, 0xfb, 0x80, 0x61, 0x65, 0x02, 0xf3, 0x37, 0x25,
-	0x68, 0x15, 0xdf, 0x49, 0xf2, 0xfb, 0x42, 0xa9, 0xb0, 0x2f, 0x7c, 0xff, 0x84, 0xfa, 0xfe, 0x13,
-	0x75, 0x7d, 0xef, 0xbf, 0x82, 0x66, 0xe1, 0x61, 0xe5, 0xea, 0xc5, 0x70, 0x07, 0x2a, 0xb1, 0x70,
-	0xc4, 0x24, 0xd6, 0x35, 0xaf, 0x6e, 0x99, 0xdf, 0xc2, 0xea, 0x9c, 0x07, 0x96, 0xf7, 0xbe, 0x8c,
-	0x66, 0xf4, 0x8b, 0x05, 0xfa, 0x7f, 0x5e, 0x00, 0x32, 0xfb, 0xf6, 0xf2, 0x7d, 0x3e, 0x2c, 0xf9,
-	0x3c, 0xb6, 0x0b, 0x2e, 0x6a, 0x3e, 0x8f, 0x8f, 0x50, 0xa0, 0xd4, 0xc7, 0x89, 0xba, 0x9c, 0xa8,
-	0x8f, 0xb5, 0xfa, 0x21, 0xb4, 0x7d, 0x1e, 0xba, 0xf6, 0x98, 0xc5, 0x29, 0x87, 0xba, 0xab, 0xb5,
-	0xa4, 0xfc, 0x90, 0xc5, 0x09, 0xd1, 0x23, 0x58, 0xd3, 0x48, 0x9d, 0x70, 0x09, 0xbc, 0xa2, 0xee,
-	0x87, 0x0a, 0xae, 0x12, 0x4f, 0x9b, 0x7c, 0x00, 0x75, 0x9f, 0x0f, 0x59, 0x02, 0x34, 0x54, 0x19,
-	0x24, 0x45, 0x1a, 0xf0, 0x21, 0x34, 0x7c, 0xee, 0x8c, 0x53, 0x44, 0x15, 0x11, 0x75, 0x94, 0x29,
-	0x88, 0x49, 0x61, 0xeb, 0x9a, 0x67, 0xa5, 0x1b, 0x9b, 0x8c, 0x7f, 0x28, 0xc1, 0xe6, 0xd5, 0x6f,
-	0x4c, 0x37, 0xe5, 0x86, 0x7c, 0x01, 0x77, 0x58, 0x20, 0x2f, 0xe9, 0xd4, 0x3e, 0x66, 0xc9, 0xe7,
-	0xe6, 0xc8, 0x11, 0x54, 0x17, 0x08, 0xab, 0x5a, 0xfb, 0x84, 0xa9, 0xaf, 0xc6, 0x96, 0x23, 0xa8,
-	0xf9, 0x2b, 0xd5, 0xb7, 0x2b, 0x9e, 0xa8, 0x6e, 0xac, 0x6f, 0xb7, 0x61, 0x09, 0x1f, 0xcb, 0x92,
-	0x5a, 0x05, 0x1b, 0x92, 0x3d, 0xa0, 0xe7, 0x36, 0xfd, 0x2e, 0xa9, 0x56, 0x2a, 0x01, 0x3d, 0xef,
-	0x7c, 0xe7, 0x99, 0x27, 0x70, 0xff, 0xfa, 0x07, 0xae, 0x1b, 0x9b, 0x9b, 0x7f, 0x2c, 0xa9, 0x1c,
-	0xb8, 0xe2, 0xc9, 0xeb, 0xb7, 0x3b, 0x39, 0xbf, 0x28, 0x81, 0xf9, 0xf6, 0xe7, 0xb3, 0xff, 0xdf,
-	0x49, 0x32, 0xbf, 0xc3, 0xb9, 0xb8, 0xe6, 0x99, 0xed, 0xbd, 0xfd, 0x7f, 0x00, 0x75, 0x7c, 0x0b,
-	0x8b, 0xa8, 0x13, 0xeb, 0x4f, 0x4f, 0x86, 0x05, 0x52, 0x64, 0xa1, 0xc4, 0x3c, 0x85, 0x0f, 0xdf,
-	0xfa, 0x26, 0x76, 0x63, 0x19, 0xc0, 0x60, 0xfd, 0xaa, 0xd7, 0xb1, 0xef, 0xb3, 0x5f, 0x46, 0x1e,
-	0x4b, 0x8e, 0x44, 0x15, 0x58, 0x2d, 0xf2, 0x98, 0x3a, 0x12, 0xcd, 0x97, 0x70, 0xef, 0xba, 0xe7,
-	0xc4, 0xf7, 0x75, 0x67, 0xc6, 0xb0, 0xfd, 0xb6, 0xa7, 0xb7, 0x9b, 0x9f, 0x9c, 0xbf, 0x84, 0x8d,
-	0x2b, 0x1f, 0xe2, 0x6e, 0x7a, 0xc0, 0xfe, 0xa9, 0x04, 0x0f, 0xdf, 0xf5, 0x55, 0xee, 0xc6, 0x96,
-	0xc1, 0x67, 0x40, 0xf2, 0x2f, 0x85, 0xba, 0x6f, 0x6a, 0x4d, 0xac, 0xe4, 0x34, 0xba, 0x8f, 0x63,
-	0xf8, 0xe1, 0x3b, 0xbc, 0xdf, 0xdd, 0x58, 0xba, 0xfa, 0xb8, 0x25, 0xbc, 0xe5, 0x0d, 0xef, 0xc6,
-	0xbc, 0xfd, 0x6d, 0x09, 0x3e, 0x7a, 0xb7, 0xd7, 0xbc, 0x1b, 0x1b, 0xfe, 0x4d, 0xa8, 0x7a, 0x2c,
-	0x16, 0x4e, 0xe0, 0x26, 0x7b, 0x63, 0xda, 0x36, 0xff, 0xab, 0x04, 0xf5, 0x67, 0xf2, 0xa2, 0x73,
-	0x48, 0xf1, 0x72, 0xf3, 0x21, 0x34, 0x58, 0xf2, 0x00, 0x92, 0x38, 0x6e, 0xe2, 0x6f, 0x98, 0x94,
-	0xac, 0xeb, 0x91, 0x2e, 0xb4, 0x32, 0x08, 0xde, 0x2c, 0xd5, 0x57, 0xbc, 0xec, 0x59, 0x39, 0x47,
-	0xb8, 0x93, 0x3e, 0xa7, 0xe0, 0xe7, 0xba, 0x26, 0xcb, 0x37, 0xc9, 0x7d, 0xa8, 0x8f, 0xe8, 0xd8,
-	0x4e, 0x2e, 0x90, 0x8b, 0xe8, 0x4c, 0x5e, 0x20, 0xfb, 0xea, 0x02, 0x99, 0xbf, 0xe2, 0x95, 0x51,
-	0x99, 0xb6, 0xcd, 0x3f, 0x82, 0x66, 0x81, 0x9b, 0x18, 0xb0, 0xd8, 0xef, 0xbd, 0x6c, 0xdf, 0x22,
-	0x6d, 0x68, 0x74, 0xfa, 0xbd, 0x97, 0xf6, 0xa3, 0x67, 0x76, 0x7f, 0x6f, 0xf0, 0xbc, 0x5d, 0x22,
-	0x2b, 0xd0, 0x54, 0x92, 0xcf, 0xb5, 0x68, 0xc1, 0xfc, 0x9b, 0x05, 0x58, 0xc2, 0x7e, 0x16, 0xae,
-	0x7e, 0x2a, 0xdc, 0xe4, 0xea, 0x47, 0x7e, 0x0a, 0x86, 0xcb, 0xc7, 0x63, 0x47, 0xff, 0x98, 0x67,
-	0x26, 0xc6, 0x7c, 0xa4, 0xf1, 0xbe, 0x42, 0x5a, 0x89, 0x09, 0xd9, 0x01, 0x63, 0xac, 0x54, 0xfa,
-	0x1b, 0xec, 0xed, 0x79, 0x23, 0x64, 0x25, 0xa0, 0xdc, 0xcd, 0xb7, 0x7c, 0xed, 0xcd, 0xd7, 0xfc,
-	0x1a, 0x56, 0xe7, 0x38, 0x26, 0xcb, 0x50, 0xdf, 0x3b, 0x38, 0xb0, 0x0f, 0x3b, 0x87, 0x4f, 0x3a,
-	0xd6, 0x51, 0xfb, 0x16, 0x21, 0xd0, 0xb2, 0x3a, 0x87, 0xbd, 0xd7, 0x9d, 0x54, 0x56, 0x92, 0xa0,
-	0xa3, 0xce, 0x20, 0x15, 0x2c, 0x98, 0xdf, 0x00, 0xbc, 0x76, 0xfc, 0x09, 0xed, 0x3b, 0x91, 0x33,
-	0x26, 0xf7, 0x61, 0x91, 0x07, 0x13, 0xfd, 0x5d, 0xa5, 0x51, 0xf8, 0xa1, 0x80, 0x54, 0x90, 0x4f,
-	0x61, 0xe9, 0x4c, 0xa2, 0xf5, 0x78, 0xdc, 0xd9, 0xd1, 0xbf, 0xcc, 0x43, 0x0a, 0x39, 0x0d, 0x3b,
-	0x38, 0xcf, 0x0a, 0x64, 0x1a, 0xb0, 0xd4, 0x19, 0x87, 0xe2, 0xf2, 0xf1, 0x7f, 0xb7, 0xc0, 0xe8,
-	0x29, 0x2e, 0x72, 0x00, 0x70, 0xc0, 0x62, 0xe7, 0xd8, 0xa7, 0x3d, 0x5f, 0x90, 0x56, 0xea, 0x03,
-	0x91, 0x9b, 0x53, 0x6d, 0xf3, 0xce, 0x2f, 0xfe, 0xfd, 0x3f, 0x7e, 0xb5, 0xd0, 0x36, 0xeb, 0xbb,
-	0x67, 0x8f, 0x76, 0xb5, 0xdd, 0x97, 0xa5, 0x4f, 0xc8, 0x53, 0xa8, 0x5b, 0x94, 0x06, 0xef, 0x4a,
-	0x73, 0x17, 0x69, 0x56, 0xcc, 0x86, 0xa4, 0x49, 0x0c, 0x25, 0x4f, 0x07, 0xea, 0xfa, 0x24, 0xa6,
-	0xbd, 0x60, 0x42, 0x0a, 0x21, 0xcf, 0xb0, 0xac, 0x23, 0x0b, 0x31, 0x9b, 0x92, 0xa5, 0xa3, 0x9c,
-	0x07, 0x13, 0x49, 0xf3, 0x1c, 0x9a, 0xe9, 0xa9, 0xf1, 0x0e, 0x44, 0x1b, 0x48, 0xb4, 0x6a, 0xb6,
-	0x72, 0x51, 0x69, 0xa6, 0x7d, 0xa8, 0x1d, 0x50, 0x9f, 0xbe, 0x77, 0x77, 0x52, 0x23, 0x49, 0xd2,
-	0x05, 0xd0, 0xaf, 0x7b, 0xbd, 0x89, 0x20, 0xed, 0xc2, 0x0f, 0xfe, 0x0e, 0xe3, 0xd1, 0xf5, 0xfd,
-	0xc9, 0x2c, 0x25, 0x55, 0x0f, 0x1a, 0xe9, 0xd3, 0x9e, 0x24, 0x23, 0x85, 0x1f, 0x59, 0xa0, 0x78,
-	0x86, 0x6e, 0x0b, 0xe9, 0xd6, 0xcc, 0x36, 0xd2, 0xe5, 0xac, 0x25, 0xe1, 0x9f, 0xc3, 0x72, 0xfe,
-	0x91, 0x4e, 0x72, 0x66, 0x6f, 0x98, 0x79, 0xcd, 0x0c, 0xed, 0x7d, 0xa4, 0x5d, 0x37, 0x57, 0x25,
-	0xed, 0x14, 0x87, 0x64, 0xfe, 0x0a, 0x0c, 0x79, 0x03, 0xde, 0xf3, 0x3c, 0xd2, 0x2c, 0xfc, 0x76,
-	0xf0, 0xfa, 0xac, 0xd2, 0x36, 0x2a, 0xab, 0x40, 0xb6, 0x2c, 0xfc, 0xae, 0xf9, 0x36, 0x92, 0xc2,
-	0xa0, 0x65, 0x66, 0x92, 0xe7, 0x08, 0x5a, 0xe9, 0x0b, 0xf1, 0xfe, 0x09, 0x75, 0x4f, 0x67, 0x12,
-	0x34, 0x1b, 0xc6, 0x14, 0x68, 0xfe, 0x00, 0x09, 0xef, 0x9a, 0x44, 0x12, 0x16, 0xed, 0x25, 0xe9,
-	0x21, 0xd4, 0x55, 0xce, 0xf5, 0x79, 0xd0, 0x1d, 0xe6, 0x26, 0x22, 0xdd, 0x07, 0x67, 0xba, 0xb8,
-	0x89, 0x8c, 0xb7, 0xcd, 0xe5, 0x2c, 0x61, 0xd1, 0x58, 0x4f, 0xac, 0xce, 0xbc, 0x77, 0xe7, 0x2b,
-	0x4c, 0x6c, 0xde, 0x5a, 0x12, 0x5a, 0xd0, 0x7c, 0x46, 0x45, 0xee, 0x11, 0x75, 0x3a, 0xe6, 0xd5,
-	0x39, 0xef, 0x3c, 0xe6, 0x3d, 0xa4, 0xbc, 0x63, 0xae, 0x48, 0xca, 0x82, 0xbd, 0xe4, 0xfc, 0x13,
-	0xa8, 0x58, 0xf4, 0x98, 0xf3, 0xb7, 0xaf, 0xf0, 0x35, 0xe4, 0x59, 0x36, 0x41, 0xad, 0x70, 0x69,
-	0x23, 0x09, 0x5e, 0xc1, 0xca, 0x3e, 0xf7, 0x7d, 0xea, 0xe6, 0xbf, 0xb4, 0xbd, 0x8d, 0x6b, 0x1b,
-	0xb9, 0x36, 0xcd, 0x35, 0xc9, 0x35, 0x63, 0x2e, 0x69, 0x23, 0xb8, 0xbb, 0x1f, 0x51, 0x47, 0xd0,
-	0x41, 0xe4, 0x0c, 0x87, 0xcc, 0x3d, 0x72, 0x4f, 0xa8, 0x37, 0xf1, 0xe5, 0x36, 0xfe, 0xc1, 0x4e,
-	0xe1, 0xf7, 0xcc, 0x33, 0x80, 0x19, 0x6f, 0x1f, 0xa1, 0xb7, 0x6d, 0x73, 0x0b, 0xbd, 0xcd, 0x67,
-	0xd5, 0x3e, 0x55, 0x86, 0xdd, 0xb4, 0xcf, 0x2b, 0x58, 0xa5, 0xcf, 0x21, 0xac, 0x16, 0x7a, 0xf4,
-	0x67, 0x13, 0x3a, 0xa1, 0x31, 0xd9, 0x9a, 0xeb, 0x4f, 0x29, 0x67, 0x7c, 0x99, 0xe8, 0xeb, 0x9e,
-	0x79, 0x77, 0x26, 0x3e, 0x65, 0xa0, 0xfd, 0x14, 0x7a, 0xf1, 0x7f, 0xf6, 0x33, 0x87, 0x4d, 0xfa,
-	0xf9, 0x43, 0x68, 0xab, 0x65, 0x90, 0xab, 0xb3, 0xae, 0x4e, 0xd3, 0x0c, 0x64, 0xde, 0xfa, 0xbc,
-	0x44, 0xbe, 0x85, 0xb5, 0x3e, 0x8d, 0x86, 0x3c, 0x1a, 0xe3, 0xf1, 0xdb, 0x0b, 0x69, 0x34, 0xcd,
-	0x80, 0x8a, 0x99, 0x9e, 0x3d, 0xc0, 0x9e, 0xdd, 0x37, 0x37, 0x64, 0xcf, 0xe6, 0x52, 0xc8, 0xbe,
-	0x0d, 0xa0, 0xfe, 0x8c, 0x8a, 0xce, 0x85, 0xc0, 0xc3, 0x94, 0x64, 0xdd, 0xc8, 0xce, 0xe7, 0xcd,
-	0xdb, 0xc9, 0x81, 0x6b, 0x51, 0x31, 0x89, 0x02, 0xd4, 0xc4, 0xc5, 0x65, 0x9e, 0xe3, 0xf8, 0xb2,
-	0xf4, 0xc9, 0x93, 0x6f, 0x61, 0x8b, 0x47, 0x23, 0xe4, 0x72, 0x79, 0xe4, 0xed, 0xa8, 0x1f, 0xd6,
-	0x27, 0xdc, 0x4f, 0x9a, 0xaf, 0xb1, 0x2d, 0x0f, 0xe7, 0xde, 0x8b, 0xc1, 0x37, 0xbb, 0x23, 0x26,
-	0x4e, 0x26, 0xc7, 0xd2, 0xcb, 0x6e, 0x62, 0xb2, 0xab, 0x4c, 0x3e, 0xd3, 0xbf, 0xc5, 0x3f, 0xfb,
-	0x62, 0x77, 0xc4, 0x93, 0xdf, 0xfd, 0xf7, 0x4b, 0xfd, 0x85, 0xe3, 0x0a, 0x6a, 0xbe, 0xf8, 0xdf,
-	0x00, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x26, 0xed, 0x28, 0x1b, 0x30, 0x00, 0x00,
+	// 4469 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5b, 0xcd, 0x73, 0x24, 0x47,
+	0x56, 0x9f, 0xd6, 0x47, 0x7f, 0xbc, 0xfe, 0x92, 0x52, 0xdf, 0xd2, 0xec, 0x8c, 0x5c, 0x3b, 0xd8,
+	0xb3, 0x5e, 0x5b, 0xb2, 0xc7, 0x0e, 0xc0, 0x66, 0x17, 0xac, 0x8f, 0x9e, 0x51, 0x63, 0x69, 0x5a,
+	0x94, 0x7a, 0x66, 0xc0, 0x8b, 0xa9, 0x2d, 0x55, 0x65, 0x77, 0xe7, 0xaa, 0xba, 0xb2, 0x5c, 0x55,
+	0x2d, 0x8d, 0x38, 0x70, 0x58, 0x58, 0x4e, 0x9c, 0xd8, 0x80, 0x08, 0xb8, 0x11, 0xf0, 0x0f, 0x70,
+	0x23, 0x62, 0x23, 0xb8, 0x10, 0xc1, 0x89, 0xe0, 0xc2, 0x3f, 0xc0, 0x81, 0x1b, 0x77, 0x4e, 0x44,
+	0x40, 0xe4, 0xcb, 0xac, 0xaf, 0xae, 0x6e, 0xcd, 0xc8, 0x2b, 0x82, 0x8b, 0xa2, 0xf3, 0xbd, 0xdf,
+	0xfb, 0x65, 0xbe, 0xcc, 0x97, 0x99, 0x2f, 0xb3, 0x52, 0xb0, 0x75, 0xc9, 0x9d, 0x70, 0x60, 0x1a,
+	0x9e, 0xcf, 0x43, 0x1e, 0xec, 0x72, 0x8f, 0xba, 0xdc, 0x09, 0x77, 0xb0, 0x48, 0x4a, 0xaa, 0xb8,
+	0x79, 0xbf, 0xcf, 0x79, 0xdf, 0xa1, 0xbb, 0xa6, 0xc7, 0x76, 0x4d, 0xd7, 0xe5, 0xa1, 0x19, 0x32,
+	0xee, 0x06, 0x12, 0xb6, 0xb9, 0x9d, 0xe5, 0x08, 0xa9, 0x35, 0x10, 0xbf, 0x7b, 0xcc, 0xa1, 0x0a,
+	0xb1, 0x99, 0x45, 0x58, 0x7c, 0x38, 0xe4, 0xae, 0xd4, 0x69, 0xff, 0x32, 0x07, 0xd0, 0x76, 0x6d,
+	0x66, 0x21, 0x27, 0xf9, 0x18, 0x4a, 0xdc, 0x09, 0x0d, 0xe6, 0xda, 0xeb, 0x85, 0xed, 0xc2, 0xe3,
+	0xea, 0x93, 0xd5, 0x9d, 0xa8, 0x51, 0x1d, 0x27, 0x4c, 0x80, 0x47, 0xf7, 0xf4, 0x22, 0x47, 0x01,
+	0xf9, 0x14, 0xca, 0xcc, 0x0d, 0x7b, 0x68, 0x33, 0x83, 0x36, 0x6b, 0xb1, 0x4d, 0xdb, 0x0d, 0x7b,
+	0x19, 0xa3, 0x12, 0x93, 0x12, 0xb2, 0x07, 0x75, 0xb4, 0xe2, 0x1e, 0xf5, 0xd1, 0x74, 0x16, 0x4d,
+	0xb7, 0x32, 0xa6, 0x1d, 0x8f, 0xfa, 0x19, 0xf3, 0x2a, 0x4b, 0xa4, 0xe4, 0x37, 0xa1, 0xc6, 0xdd,
+	0x91, 0x61, 0xb3, 0xc0, 0x42, 0x86, 0x39, 0x64, 0xd8, 0x4c, 0x1a, 0xec, 0x8e, 0x0e, 0x59, 0x60,
+	0x65, 0x08, 0x80, 0xc7, 0x42, 0xf4, 0xd5, 0x1d, 0xa1, 0xe9, 0xfc, 0xb8, 0xaf, 0xee, 0x68, 0xcc,
+	0x57, 0x14, 0x08, 0x5f, 0xf9, 0xd0, 0x62, 0x68, 0x53, 0x1c, 0xf3, 0xb5, 0x33, 0xb4, 0x58, 0xd6,
+	0x57, 0x2e, 0x25, 0xe4, 0x53, 0x28, 0x79, 0x17, 0xb2, 0x53, 0x4b, 0x68, 0xb4, 0x11, 0x1b, 0x9d,
+	0x9a, 0xd6, 0x05, 0x1d, 0xeb, 0x57, 0xef, 0x02, 0xfb, 0xf5, 0xd7, 0x01, 0x3c, 0xee, 0x87, 0x46,
+	0x10, 0x9a, 0x61, 0xb0, 0x5e, 0x1e, 0xab, 0xed, 0x94, 0xfb, 0xe1, 0x99, 0x08, 0x84, 0x20, 0x64,
+	0x56, 0x70, 0x74, 0x4f, 0xaf, 0x78, 0x4a, 0x12, 0x08, 0xcb, 0x9e, 0xc3, 0xaf, 0x94, 0x65, 0x65,
+	0xcc, 0xf2, 0xa9, 0xc3, 0xaf, 0xb2, 0x96, 0x3d, 0x25, 0x09, 0xc8, 0xaf, 0x41, 0xc5, 0x74, 0x4c,
+	0x7f, 0x88, 0x6d, 0x05, 0x34, 0x5c, 0x8f, 0x0d, 0xf7, 0x84, 0x26, 0xd3, 0xd4, 0xb2, 0xa9, 0x44,
+	0xfb, 0x45, 0x98, 0xb3, 0xcd, 0xd0, 0xd4, 0xfe, 0xb3, 0x0e, 0xcd, 0x31, 0x9c, 0xe8, 0x67, 0x87,
+	0x07, 0x13, 0x63, 0xea, 0x98, 0x07, 0x59, 0xdf, 0x1d, 0x14, 0x90, 0x43, 0x68, 0xd8, 0xd7, 0xcc,
+	0xed, 0x1b, 0x7d, 0x33, 0xf0, 0x52, 0x91, 0x75, 0x3f, 0xb6, 0x3c, 0x14, 0xea, 0x67, 0x66, 0xe0,
+	0x65, 0xec, 0x6b, 0x76, 0x4a, 0x2c, 0x62, 0x4c, 0x0c, 0x70, 0xe2, 0xd1, 0x78, 0x8c, 0x75, 0xdc,
+	0x51, 0xde, 0xa9, 0x2a, 0x4f, 0xa4, 0xe4, 0x15, 0x2c, 0x0b, 0x8a, 0x20, 0x34, 0xfd, 0x70, 0xe4,
+	0x19, 0x3d, 0x93, 0x39, 0xa9, 0x58, 0x7b, 0x94, 0x66, 0x3a, 0x93, 0x98, 0xa7, 0x26, 0x73, 0x46,
+	0x3e, 0xcd, 0x50, 0x2e, 0xf2, 0x8c, 0x5a, 0x10, 0x7f, 0x05, 0xab, 0x48, 0xcc, 0xfa, 0xae, 0xe9,
+	0x18, 0x36, 0xed, 0xfb, 0xa6, 0x4d, 0x53, 0xb1, 0xf8, 0xdd, 0x0c, 0x35, 0xa2, 0x0e, 0x25, 0x28,
+	0xc3, 0xbc, 0xc4, 0xf3, 0x5a, 0xf2, 0x23, 0x58, 0xc3, 0x89, 0xe1, 0xb3, 0x5e, 0x68, 0xf0, 0x9e,
+	0x71, 0xc5, 0x5c, 0x9b, 0x5f, 0xa5, 0x82, 0x36, 0x43, 0x7e, 0x28, 0x60, 0x9d, 0xde, 0x2b, 0x04,
+	0xe5, 0xc8, 0xc7, 0xb5, 0xa4, 0x0b, 0xc2, 0x1b, 0xc3, 0xe1, 0x41, 0x60, 0xc4, 0x73, 0x41, 0x86,
+	0xf5, 0x7b, 0x69, 0xda, 0x63, 0x1e, 0x04, 0x9d, 0x9e, 0x98, 0x14, 0x07, 0x03, 0xd3, 0x75, 0xa9,
+	0x93, 0xa1, 0x6e, 0x70, 0x85, 0x50, 0x53, 0x24, 0xea, 0x67, 0x74, 0x25, 0x48, 0xfa, 0xb9, 0x3c,
+	0xa1, 0x9f, 0x25, 0x66, 0x6a, 0x3f, 0x27, 0x6a, 0x41, 0xdc, 0x91, 0x8b, 0x44, 0xc8, 0xae, 0x64,
+	0x4b, 0xe5, 0x6c, 0xf8, 0x7e, 0x9a, 0xb0, 0xeb, 0x9b, 0x6e, 0x30, 0x64, 0x41, 0xc0, 0xb8, 0xdb,
+	0x76, 0x43, 0xea, 0xf7, 0xa8, 0x4f, 0x5d, 0x8b, 0xbe, 0x32, 0x7d, 0x97, 0xb9, 0x7d, 0xb5, 0x6a,
+	0x74, 0xd9, 0x15, 0xb6, 0xf4, 0xc7, 0xb2, 0x73, 0x4d, 0x2b, 0x64, 0x97, 0x58, 0x6f, 0xd2, 0x58,
+	0xc8, 0xf7, 0xc2, 0x5e, 0x0c, 0x9b, 0xd4, 0x5e, 0xe1, 0x73, 0x16, 0x21, 0x6b, 0x58, 0x17, 0x35,
+	0x78, 0x3e, 0xb7, 0x68, 0x10, 0x88, 0x59, 0x40, 0x7d, 0x9f, 0xcb, 0x55, 0xb2, 0x8a, 0x55, 0xfc,
+	0x4a, 0xba, 0x8a, 0xd3, 0x18, 0xd7, 0x12, 0xb0, 0x4c, 0x05, 0x2b, 0x7c, 0x92, 0x9e, 0x50, 0xd8,
+	0x48, 0xc6, 0xb0, 0x67, 0x04, 0xd7, 0xae, 0x95, 0x78, 0x51, 0xc3, 0x2a, 0xde, 0xcf, 0x8f, 0xe5,
+	0x97, 0xf4, 0xfa, 0xec, 0xda, 0xb5, 0xa6, 0x39, 0x22, 0x41, 0x11, 0x42, 0x54, 0xf3, 0x02, 0x56,
+	0x70, 0x81, 0x0d, 0x47, 0x86, 0xc7, 0x5d, 0xb9, 0x1c, 0x61, 0x15, 0x75, 0xac, 0xe2, 0x9d, 0xcc,
+	0x72, 0x1b, 0x8e, 0x4e, 0xb9, 0x8b, 0xab, 0x50, 0x6e, 0x48, 0xb3, 0x3a, 0xe2, 0xc0, 0x7d, 0x0c,
+	0x6f, 0x3a, 0x36, 0x06, 0x23, 0x5f, 0x4e, 0xa0, 0x06, 0xb2, 0x7f, 0x2f, 0x13, 0xe3, 0x29, 0xec,
+	0xa4, 0xf6, 0x8b, 0xee, 0x98, 0x8c, 0x21, 0xaf, 0xa4, 0x13, 0x3e, 0x1d, 0xf2, 0x90, 0x1a, 0x36,
+	0xed, 0x51, 0x4b, 0x2e, 0xe5, 0x4d, 0xac, 0x46, 0x4b, 0x57, 0xa3, 0x23, 0xe8, 0x10, 0x31, 0x19,
+	0x7e, 0xc2, 0x73, 0x4a, 0x12, 0x48, 0x37, 0x70, 0x10, 0xfa, 0x74, 0x68, 0xd8, 0xd4, 0x61, 0x2e,
+	0x95, 0xee, 0x08, 0xfe, 0x05, 0xe4, 0xff, 0x38, 0x3f, 0x0e, 0xcf, 0x5a, 0x27, 0x6a, 0x4a, 0x1d,
+	0x26, 0x26, 0x99, 0xea, 0xd6, 0xd5, 0x70, 0x3c, 0xa3, 0xc3, 0x2c, 0x84, 0x5c, 0xc2, 0x36, 0xc6,
+	0xd6, 0xe0, 0x3a, 0x60, 0x96, 0xe9, 0x18, 0xf4, 0x9b, 0x11, 0xf3, 0x86, 0xd4, 0x0d, 0x53, 0x31,
+	0xb6, 0x88, 0x15, 0x7f, 0x90, 0x89, 0x31, 0x85, 0x6f, 0x45, 0xf0, 0x7c, 0xa8, 0x09, 0x67, 0xa6,
+	0xc2, 0xc8, 0x8f, 0x60, 0x29, 0x1d, 0x71, 0xa6, 0x75, 0x81, 0x55, 0x91, 0xfc, 0x6c, 0x94, 0x3e,
+	0xee, 0x59, 0x17, 0x2e, 0xbf, 0x72, 0xa8, 0xdd, 0xa7, 0x82, 0x27, 0x53, 0x53, 0x93, 0xa7, 0x50,
+	0x82, 0x9c, 0xc3, 0x96, 0x4c, 0x04, 0x7a, 0x3d, 0xc3, 0xa7, 0xa6, 0x35, 0x30, 0xe8, 0x6b, 0x8b,
+	0x52, 0x9b, 0xda, 0x58, 0xc9, 0x12, 0x56, 0xb2, 0x9b, 0xcd, 0x0b, 0x7a, 0x38, 0xc9, 0x43, 0x66,
+	0x3a, 0xba, 0xb0, 0x68, 0x29, 0x83, 0x4c, 0x45, 0x6b, 0x5c, 0x22, 0xc7, 0x11, 0xf1, 0x6e, 0xb7,
+	0x03, 0xf5, 0x4c, 0x56, 0x44, 0xbe, 0x03, 0x80, 0x09, 0x8d, 0x08, 0x75, 0x8a, 0xbb, 0x5d, 0x45,
+	0xaf, 0x08, 0x89, 0x08, 0x5e, 0xaa, 0x1d, 0x41, 0x23, 0x9b, 0x11, 0x91, 0x35, 0x28, 0xc9, 0xe4,
+	0x49, 0xee, 0x8d, 0x25, 0xbd, 0x88, 0x09, 0x92, 0x3d, 0xc6, 0x34, 0x33, 0xce, 0x34, 0x80, 0xc5,
+	0x5c, 0x7a, 0x33, 0x9d, 0xec, 0x73, 0xa8, 0x07, 0xd4, 0x67, 0xa6, 0x63, 0xb8, 0xa3, 0xe1, 0x39,
+	0xf5, 0xd5, 0x6e, 0xba, 0x12, 0x77, 0xc9, 0x19, 0x6a, 0x9f, 0xa3, 0x52, 0xaf, 0x05, 0xa9, 0x92,
+	0xf6, 0x8b, 0x02, 0xd4, 0x33, 0xe9, 0xd0, 0xf4, 0x6a, 0x56, 0xa0, 0x88, 0xf3, 0x5d, 0xee, 0xd6,
+	0x25, 0x7d, 0x5e, 0xcc, 0xdd, 0x71, 0x57, 0x66, 0xc7, 0x5c, 0x21, 0x0f, 0xa1, 0x6a, 0xda, 0x43,
+	0xe6, 0x2a, 0xfd, 0x3c, 0xea, 0x01, 0x45, 0x12, 0x90, 0x6b, 0xfd, 0xdc, 0xdb, 0xb7, 0xfe, 0xc7,
+	0x40, 0xf2, 0x89, 0x24, 0x21, 0x30, 0x17, 0x5e, 0x7b, 0xd1, 0x00, 0xe1, 0xef, 0xb4, 0x57, 0x33,
+	0x37, 0x8c, 0xc4, 0x78, 0xf3, 0x35, 0x1d, 0x1a, 0xd9, 0xcc, 0xef, 0xd6, 0xfd, 0xb3, 0x00, 0xb3,
+	0xde, 0x45, 0x88, 0xcc, 0x35, 0x5d, 0xfc, 0xd4, 0xfe, 0xa9, 0x00, 0x0b, 0xe3, 0x99, 0x21, 0xd9,
+	0x82, 0x0a, 0xd2, 0x62, 0xcb, 0x65, 0x2f, 0x61, 0xe2, 0xdd, 0x1d, 0x6b, 0x7d, 0x2e, 0x8e, 0xfa,
+	0x74, 0x88, 0x89, 0x64, 0x5c, 0x6f, 0x45, 0x49, 0xda, 0xb6, 0xb0, 0xc3, 0x54, 0x91, 0xc9, 0xe4,
+	0xa8, 0xa4, 0x17, 0x45, 0x51, 0x2a, 0xd0, 0xc8, 0xe5, 0x98, 0x33, 0x94, 0xf4, 0xa2, 0x28, 0x3e,
+	0xe7, 0x64, 0x15, 0x8a, 0x16, 0xe7, 0x17, 0x8c, 0xe2, 0xa6, 0x5f, 0xd4, 0x55, 0x29, 0xf2, 0x62,
+	0x2e, 0xf1, 0xe2, 0x11, 0x54, 0xe4, 0x76, 0x6a, 0x5a, 0xd3, 0x1b, 0xa8, 0xfd, 0x00, 0x2a, 0x47,
+	0xd4, 0xf4, 0xc3, 0x73, 0x6a, 0x86, 0x64, 0x17, 0x96, 0x06, 0x51, 0x41, 0x26, 0x03, 0xe1, 0xc8,
+	0xa7, 0xca, 0x82, 0xc4, 0xaa, 0xb3, 0x48, 0xa3, 0xfd, 0x71, 0x01, 0x66, 0x3b, 0xee, 0xe8, 0xd6,
+	0x7d, 0x9e, 0x8b, 0xa9, 0xd9, 0xb7, 0x8e, 0x29, 0xf4, 0x94, 0xc9, 0x28, 0x2c, 0xe9, 0xe2, 0xa7,
+	0xf6, 0xf7, 0x05, 0x20, 0xb8, 0x74, 0xf5, 0xc5, 0xea, 0x77, 0xc8, 0x82, 0xd0, 0x74, 0x6f, 0xf0,
+	0x79, 0x5a, 0xa3, 0x3e, 0x83, 0x0d, 0x47, 0x52, 0x18, 0xea, 0x60, 0x83, 0x3c, 0xc6, 0x1f, 0x52,
+	0x9f, 0xab, 0xe1, 0x59, 0x55, 0x00, 0x39, 0xf9, 0x51, 0xfd, 0x15, 0xf5, 0x39, 0xf9, 0x08, 0x96,
+	0x27, 0x99, 0xaa, 0x46, 0x92, 0xbc, 0x95, 0xf6, 0x25, 0x94, 0x44, 0xdc, 0x9e, 0x04, 0xfd, 0x3b,
+	0x08, 0xd8, 0x9f, 0x15, 0xa0, 0x22, 0xb6, 0x09, 0x8c, 0xd9, 0x5b, 0xf3, 0xa5, 0x62, 0x6d, 0x2e,
+	0x13, 0x6b, 0xd9, 0xe0, 0x9d, 0x1f, 0x0f, 0xde, 0x7c, 0x3b, 0x3e, 0x83, 0xda, 0x0b, 0xcf, 0x61,
+	0xee, 0xc5, 0x9b, 0x5a, 0xa2, 0x4c, 0x67, 0x12, 0xd3, 0x3f, 0xaf, 0x00, 0x1c, 0xd2, 0x4b, 0x66,
+	0xd1, 0xb6, 0xdb, 0xc3, 0x30, 0xbf, 0xa4, 0xae, 0xcd, 0x7d, 0xb5, 0x48, 0xa8, 0x12, 0x59, 0x86,
+	0xf9, 0x21, 0xb7, 0xa9, 0xa3, 0x96, 0x64, 0x59, 0x20, 0xdf, 0x83, 0x85, 0x81, 0xe9, 0xdb, 0x57,
+	0xa6, 0x4f, 0x8d, 0x4b, 0xea, 0x8b, 0x4c, 0x52, 0xad, 0x14, 0xcd, 0x48, 0xfe, 0x52, 0x8a, 0x05,
+	0xb4, 0xc7, 0xfc, 0x61, 0x06, 0x3a, 0x27, 0xa1, 0x91, 0x3c, 0x82, 0x6e, 0x41, 0xc5, 0xc6, 0x16,
+	0x89, 0xf6, 0x2f, 0xc8, 0x19, 0x2f, 0x05, 0x6d, 0x5b, 0x8c, 0xb8, 0x52, 0x66, 0x03, 0x79, 0x11,
+	0x71, 0x44, 0xea, 0xd2, 0x51, 0x2c, 0xe8, 0x44, 0x1a, 0x26, 0x3a, 0x2f, 0xc0, 0x2c, 0xaf, 0xa4,
+	0x97, 0x3d, 0xee, 0x8a, 0x93, 0x64, 0x40, 0x1e, 0x00, 0x84, 0xd4, 0x1a, 0xb8, 0xdc, 0xe1, 0xfd,
+	0xeb, 0x68, 0x11, 0x4e, 0x24, 0x64, 0x5b, 0xe6, 0xd1, 0xcc, 0x96, 0x67, 0x21, 0xb5, 0x28, 0x00,
+	0x0e, 0x20, 0x1e, 0x6d, 0xc8, 0x7d, 0x00, 0x85, 0xa0, 0xea, 0x44, 0x50, 0xd2, 0xcb, 0xa8, 0x6f,
+	0xb9, 0x36, 0x79, 0x04, 0x0d, 0xd3, 0x71, 0xb8, 0x95, 0x30, 0x94, 0x11, 0x51, 0x43, 0x69, 0xc4,
+	0xb1, 0x0d, 0xb5, 0x18, 0x45, 0x55, 0xb6, 0x5e, 0xd2, 0x41, 0x61, 0x04, 0xcf, 0x63, 0x58, 0x48,
+	0x42, 0x42, 0x31, 0x01, 0xa2, 0x1a, 0x71, 0x60, 0x48, 0xae, 0x47, 0xd0, 0x48, 0x21, 0xa9, 0x4a,
+	0x9e, 0x4b, 0x7a, 0x2d, 0xc6, 0x09, 0x3e, 0x0d, 0xea, 0x6a, 0x01, 0x54, 0x64, 0x75, 0x04, 0x55,
+	0xe5, 0x32, 0x28, 0x99, 0x1e, 0x40, 0x35, 0xc2, 0x50, 0x95, 0x5f, 0x96, 0xe4, 0xa9, 0x59, 0x72,
+	0x7c, 0x01, 0x45, 0xdf, 0x74, 0xfb, 0x34, 0x58, 0x6f, 0x6e, 0xcf, 0x3e, 0xae, 0x3e, 0x79, 0x9c,
+	0x9c, 0x52, 0xe3, 0x80, 0x52, 0x3f, 0x75, 0x1a, 0xf0, 0x91, 0x6f, 0x51, 0x1d, 0xf1, 0xba, 0xb2,
+	0xdb, 0xfc, 0x8b, 0x39, 0x58, 0x9e, 0x04, 0x20, 0x1b, 0xd1, 0xe5, 0x8a, 0x1d, 0xac, 0x17, 0xb6,
+	0x67, 0x1f, 0x97, 0xd4, 0x0d, 0x8a, 0x3d, 0x3e, 0x62, 0x33, 0xb9, 0x11, 0x3b, 0x80, 0x79, 0x8f,
+	0x73, 0x27, 0x58, 0x9f, 0xc5, 0x46, 0x7d, 0xf8, 0xb6, 0x8d, 0xda, 0x39, 0xe5, 0xdc, 0xd1, 0xa5,
+	0xed, 0xe6, 0x7f, 0xcf, 0xc0, 0x9c, 0x28, 0x93, 0xdf, 0x4e, 0x6d, 0x99, 0x8d, 0x27, 0xbf, 0x7a,
+	0x2b, 0x32, 0xfc, 0x23, 0xb6, 0x29, 0xb5, 0xd5, 0x9e, 0x41, 0x29, 0x18, 0x98, 0x3e, 0x73, 0xfb,
+	0xd8, 0xec, 0xc6, 0x93, 0xcf, 0x6e, 0x47, 0x77, 0x26, 0x8d, 0x91, 0x31, 0x62, 0x12, 0x13, 0x53,
+	0x0e, 0xa0, 0x5c, 0x28, 0x65, 0x41, 0xcc, 0x73, 0xaa, 0x8e, 0xeb, 0x25, 0x5d, 0xfc, 0xd4, 0xf6,
+	0xa0, 0x1c, 0x35, 0x87, 0x00, 0x14, 0x3b, 0xcf, 0x5f, 0x18, 0xed, 0xc3, 0x85, 0x7b, 0xa4, 0x06,
+	0xe5, 0xbd, 0xe3, 0xe3, 0xce, 0x81, 0x28, 0x15, 0x48, 0x03, 0xe0, 0x59, 0xeb, 0xe4, 0xb4, 0xa3,
+	0x77, 0x45, 0x79, 0x86, 0x54, 0xa1, 0xf4, 0xf4, 0xb8, 0xf3, 0x4a, 0x14, 0x66, 0xb5, 0x01, 0x54,
+	0x53, 0x4d, 0x20, 0xab, 0x40, 0x0e, 0x5b, 0x87, 0xed, 0x83, 0xbd, 0x6e, 0xeb, 0xd0, 0x38, 0x6d,
+	0xe9, 0x46, 0xfb, 0x79, 0xf7, 0xe9, 0xc2, 0x3d, 0xf2, 0x10, 0xb6, 0xce, 0x8e, 0xf6, 0xf4, 0xd6,
+	0xa1, 0xb1, 0xff, 0x7b, 0xc6, 0xde, 0xf1, 0x31, 0xca, 0xf1, 0x47, 0xb7, 0x75, 0x70, 0xb4, 0x50,
+	0x20, 0xdb, 0x70, 0x7f, 0x02, 0xe0, 0x6c, 0xef, 0xa4, 0x25, 0x11, 0x33, 0xda, 0x9f, 0xcc, 0x02,
+	0x1c, 0x38, 0x66, 0x10, 0xb0, 0x1e, 0xa3, 0x3e, 0xae, 0x9f, 0x46, 0xe8, 0xc5, 0xab, 0xd9, 0x3c,
+	0xef, 0x7a, 0xcc, 0x26, 0x4b, 0x30, 0xcf, 0x8d, 0xcb, 0x78, 0x55, 0x9d, 0xe3, 0x2f, 0x19, 0xae,
+	0xb5, 0x4c, 0x62, 0x55, 0x87, 0xb0, 0x08, 0xcb, 0x10, 0x2b, 0xbb, 0x64, 0x8e, 0x09, 0xec, 0x1a,
+	0x94, 0xb8, 0xe1, 0x9d, 0xb3, 0x30, 0x50, 0x8b, 0x6c, 0x91, 0x9f, 0x8a, 0x12, 0xae, 0x9f, 0x4a,
+	0xa1, 0xb2, 0x00, 0x26, 0x15, 0x1b, 0x50, 0xa6, 0xe1, 0x40, 0xe6, 0x22, 0x72, 0xaa, 0x97, 0x68,
+	0x38, 0x88, 0x52, 0x11, 0x3b, 0x08, 0x8d, 0xa1, 0x69, 0xe1, 0x14, 0xaf, 0xe9, 0x45, 0x3b, 0x08,
+	0x4f, 0x4c, 0x4b, 0x28, 0x02, 0xdf, 0x42, 0x45, 0x45, 0x2a, 0x02, 0xdf, 0x12, 0x0a, 0x11, 0xe4,
+	0x9e, 0xbc, 0x9d, 0x54, 0x73, 0xb9, 0xc4, 0xbc, 0x53, 0xbc, 0x03, 0x5d, 0x01, 0x61, 0x6d, 0x30,
+	0x4f, 0x4d, 0xde, 0x79, 0x3b, 0x08, 0xdb, 0x9e, 0x10, 0x0b, 0x2a, 0xe6, 0xa9, 0x75, 0x6c, 0x3e,
+	0xf0, 0xad, 0xb6, 0x27, 0x88, 0x84, 0x58, 0xcc, 0x6e, 0x35, 0x8f, 0x45, 0x8d, 0x62, 0x81, 0x13,
+	0x2a, 0x41, 0x84, 0x2a, 0x39, 0x81, 0x45, 0x2b, 0x51, 0xb5, 0x0d, 0x35, 0xef, 0x22, 0x34, 0x42,
+	0xb3, 0x2f, 0xfd, 0x69, 0xca, 0xa9, 0xe4, 0x5d, 0x84, 0x5d, 0x13, 0x47, 0x58, 0xfb, 0xd9, 0x2c,
+	0x54, 0xc4, 0x39, 0x9d, 0xbb, 0x07, 0x43, 0x5c, 0x32, 0x4c, 0xdb, 0x36, 0xf8, 0x28, 0xa4, 0xbe,
+	0xb0, 0xc2, 0xc1, 0x28, 0xeb, 0x55, 0xd3, 0xb6, 0x3b, 0x42, 0xd6, 0x35, 0xfb, 0x62, 0x99, 0x12,
+	0x27, 0xc6, 0x4b, 0x9a, 0x82, 0xcd, 0x20, 0xac, 0x21, 0xe5, 0x31, 0x72, 0x1b, 0x6a, 0xa1, 0x6f,
+	0x7a, 0x46, 0xc8, 0x8d, 0x01, 0x0f, 0x64, 0xf8, 0x96, 0x75, 0x10, 0xb2, 0x2e, 0x3f, 0xe2, 0x41,
+	0x48, 0x3e, 0x00, 0xe2, 0xd3, 0xa1, 0xe9, 0x5f, 0x28, 0x2e, 0x39, 0x1e, 0x73, 0x88, 0x5b, 0x90,
+	0x1a, 0x64, 0x93, 0x23, 0x93, 0xa0, 0x99, 0xeb, 0xc6, 0xe8, 0xf9, 0x34, 0xba, 0x2d, 0x14, 0x12,
+	0xad, 0x7c, 0x91, 0x50, 0xd1, 0xc8, 0x62, 0xec, 0x0b, 0xa2, 0xb2, 0xbe, 0x24, 0xb0, 0x52, 0xda,
+	0x97, 0x18, 0xb9, 0x03, 0x4b, 0xa1, 0x6f, 0xba, 0x81, 0x63, 0x86, 0x69, 0x70, 0x19, 0xc1, 0x8b,
+	0xb1, 0x6a, 0x32, 0x3e, 0xe9, 0xa8, 0xca, 0x18, 0x3e, 0xea, 0x2b, 0xed, 0x1f, 0x0a, 0x50, 0x94,
+	0xe3, 0x40, 0x1e, 0xc1, 0xac, 0x35, 0x8c, 0x2e, 0x14, 0x49, 0x72, 0x47, 0x19, 0x8d, 0x92, 0x2e,
+	0xd4, 0x93, 0x67, 0x46, 0x2a, 0xda, 0x67, 0x33, 0xd1, 0x9e, 0x4c, 0xaf, 0xb9, 0xb1, 0xe9, 0x25,
+	0xa7, 0xcc, 0x7c, 0x76, 0xca, 0x4c, 0x9e, 0x19, 0xc9, 0xbc, 0x2b, 0xa5, 0xe6, 0x9d, 0xf6, 0xef,
+	0xb3, 0x30, 0xf7, 0xd4, 0xe1, 0x57, 0xb8, 0x11, 0x5a, 0x16, 0x0d, 0x02, 0x23, 0x9d, 0x99, 0x34,
+	0xf5, 0x9a, 0x94, 0xb6, 0x27, 0x65, 0x4a, 0xcd, 0x28, 0x53, 0x5a, 0x81, 0xe2, 0xc8, 0x65, 0x42,
+	0x5c, 0x95, 0xe2, 0x91, 0xcb, 0x6e, 0xca, 0xe2, 0xb7, 0x00, 0xb7, 0x29, 0x19, 0xd7, 0x32, 0xcb,
+	0x28, 0x0b, 0x01, 0x4e, 0xd4, 0x0d, 0x28, 0x47, 0x9b, 0x2d, 0x4e, 0xbb, 0xa6, 0x5e, 0x52, 0x1b,
+	0x2d, 0x79, 0x17, 0x9a, 0x2e, 0x0d, 0xaf, 0x38, 0x46, 0x91, 0x6c, 0xe5, 0x3c, 0x22, 0xea, 0x4a,
+	0xdc, 0x9e, 0x74, 0xba, 0x28, 0x22, 0x24, 0x95, 0xa0, 0x7d, 0x02, 0x60, 0xc5, 0xab, 0x97, 0xba,
+	0x24, 0x5c, 0x8a, 0xc7, 0x2a, 0x59, 0xd8, 0xf4, 0x14, 0x8c, 0xbc, 0x07, 0x45, 0x13, 0x47, 0x51,
+	0x5d, 0xfe, 0x35, 0xc7, 0x06, 0x57, 0x57, 0x6a, 0xb2, 0x09, 0x65, 0xcf, 0x67, 0xdc, 0x67, 0xe1,
+	0x35, 0x86, 0x4c, 0x53, 0x8f, 0xcb, 0xa9, 0x53, 0x4a, 0x2d, 0x73, 0x4a, 0x49, 0xa5, 0x9a, 0xf5,
+	0x4c, 0xaa, 0xb9, 0x01, 0xe5, 0xbe, 0xcf, 0x47, 0x9e, 0xf0, 0x43, 0xad, 0x0f, 0x58, 0x96, 0x9d,
+	0x91, 0xfe, 0xa8, 0x22, 0x10, 0x4d, 0x44, 0xd4, 0x85, 0xf8, 0x54, 0x4a, 0xdb, 0xb6, 0xf6, 0xcf,
+	0x15, 0x68, 0xc4, 0x37, 0x59, 0x78, 0x83, 0x2c, 0xc6, 0x4b, 0xa4, 0x5c, 0x2e, 0x8b, 0x16, 0x6c,
+	0x8f, 0xbb, 0xcf, 0xd9, 0xf4, 0x43, 0x49, 0x59, 0xdd, 0x55, 0xcb, 0x71, 0x6c, 0x3c, 0x79, 0x98,
+	0xbf, 0x22, 0x43, 0x62, 0x75, 0x17, 0x7f, 0x28, 0x46, 0x4c, 0xfc, 0xb0, 0xc9, 0x05, 0x6c, 0x48,
+	0x5b, 0x9f, 0x0a, 0x8f, 0x98, 0xdb, 0x37, 0x2c, 0xee, 0xda, 0x2c, 0x8c, 0xf2, 0xcb, 0x46, 0xf6,
+	0x06, 0x24, 0x47, 0xa6, 0x47, 0x76, 0x07, 0x91, 0x99, 0xbe, 0x66, 0x4e, 0x56, 0x10, 0x13, 0x56,
+	0x7c, 0x31, 0x65, 0xc3, 0x81, 0x4f, 0x83, 0x01, 0x77, 0x6c, 0x51, 0x57, 0x8f, 0xf5, 0xd5, 0xdd,
+	0xf5, 0xf7, 0xa7, 0x55, 0xa4, 0x9b, 0x21, 0xed, 0x46, 0x36, 0x07, 0x68, 0x72, 0x74, 0x4f, 0x5f,
+	0xf2, 0xf3, 0x62, 0xf2, 0x02, 0x16, 0xb1, 0x0a, 0x4c, 0x90, 0x22, 0xfa, 0x62, 0xfe, 0x82, 0x75,
+	0x9c, 0x1e, 0xf3, 0x84, 0x98, 0xba, 0xe9, 0x67, 0x45, 0xc4, 0x86, 0xd5, 0x4b, 0xd3, 0x19, 0x4d,
+	0x68, 0x7a, 0x29, 0x7f, 0xeb, 0x95, 0xe6, 0x7e, 0x29, 0xac, 0xf2, 0x6d, 0x5f, 0xbe, 0x9c, 0x20,
+	0xdf, 0xfc, 0x7d, 0x28, 0x9f, 0x71, 0xf3, 0xa2, 0xcb, 0x86, 0x54, 0xac, 0x9e, 0x78, 0xaf, 0x48,
+	0x8d, 0x80, 0x9b, 0x17, 0x46, 0xc8, 0x86, 0xd1, 0x79, 0xb6, 0x21, 0xe5, 0x31, 0xf2, 0x5d, 0x68,
+	0x5a, 0x0e, 0x35, 0xfd, 0x14, 0x50, 0x86, 0x47, 0x1d, 0xc5, 0x11, 0x6e, 0xf3, 0x1f, 0x0b, 0xb0,
+	0x34, 0xa1, 0x27, 0xc9, 0x93, 0xdc, 0xa8, 0xf8, 0x2c, 0x10, 0x49, 0x56, 0x01, 0xa7, 0x40, 0xb6,
+	0x9b, 0x75, 0x54, 0x91, 0x4f, 0x61, 0x75, 0xcc, 0xa6, 0x67, 0x3a, 0x4e, 0x94, 0x99, 0x15, 0xf5,
+	0xe5, 0x8c, 0xd1, 0x53, 0xa9, 0x23, 0x3f, 0x84, 0x4a, 0xd2, 0x46, 0x79, 0x72, 0xde, 0x9e, 0xd6,
+	0x71, 0x51, 0xb3, 0xf5, 0x72, 0x10, 0x39, 0xf0, 0x77, 0x05, 0x68, 0x8e, 0x8d, 0x15, 0x6e, 0x32,
+	0xc9, 0x78, 0x3b, 0xfc, 0x8a, 0xfa, 0xaa, 0xdd, 0x8d, 0x78, 0x0c, 0x8f, 0x85, 0x74, 0x0c, 0x39,
+	0xf2, 0x3c, 0x75, 0x9f, 0x95, 0x46, 0xbe, 0x10, 0xd2, 0x5f, 0xb6, 0x99, 0x7f, 0x04, 0xcb, 0x93,
+	0x46, 0x9d, 0xbc, 0x07, 0xcd, 0xa4, 0xbb, 0x1c, 0x36, 0x64, 0x61, 0xd4, 0xd2, 0x58, 0x7c, 0x2c,
+	0xa4, 0xd9, 0xfa, 0x67, 0x6e, 0x5b, 0xbf, 0xb6, 0x01, 0x25, 0x35, 0xcd, 0x45, 0x3a, 0xaa, 0x1f,
+	0xb6, 0x8d, 0x96, 0xae, 0x77, 0xf4, 0xb3, 0x85, 0x7b, 0x9a, 0x0e, 0x6b, 0x53, 0x26, 0x2d, 0x21,
+	0xd0, 0xd0, 0xf7, 0xba, 0x2d, 0xa3, 0x7b, 0xa4, 0xb7, 0xce, 0x8e, 0x3a, 0xc7, 0x22, 0xb7, 0x15,
+	0xe6, 0x42, 0xa6, 0xef, 0x3d, 0x7f, 0xd6, 0x5a, 0x28, 0x90, 0x25, 0x68, 0xbe, 0xdc, 0x3b, 0x7e,
+	0x91, 0x06, 0xcd, 0xec, 0x97, 0xc5, 0x92, 0x29, 0x1c, 0xd4, 0xba, 0x50, 0x1b, 0x3f, 0x38, 0xca,
+	0xd3, 0x6f, 0xb4, 0x5b, 0xd5, 0xf4, 0xb2, 0x14, 0xb4, 0x6d, 0xd1, 0x1b, 0x4a, 0x19, 0x78, 0xd4,
+	0x62, 0x3d, 0x66, 0xa9, 0x53, 0x75, 0x43, 0x8a, 0xcf, 0x94, 0x54, 0xfb, 0xd7, 0x39, 0x68, 0x64,
+	0xbf, 0x5a, 0x4e, 0x3f, 0x9e, 0x6f, 0x40, 0xd9, 0x7f, 0x6d, 0x9c, 0x5f, 0x87, 0x34, 0x50, 0x63,
+	0x5b, 0xf2, 0x5f, 0xef, 0x8b, 0xa2, 0xd8, 0x72, 0xfc, 0xd7, 0x86, 0x87, 0xe7, 0x7b, 0xb9, 0x81,
+	0x17, 0xf5, 0x8a, 0xff, 0x5a, 0x1e, 0xf8, 0x03, 0x8c, 0x8e, 0xd7, 0xc6, 0xc8, 0x32, 0x45, 0xb2,
+	0xa7, 0x40, 0x73, 0x2a, 0x3a, 0x5e, 0xbf, 0x10, 0xe2, 0x2c, 0x72, 0x98, 0x41, 0xce, 0x47, 0xc8,
+	0x93, 0x3c, 0xf2, 0x3c, 0x83, 0x2c, 0x46, 0xc8, 0xfd, 0x3c, 0x52, 0x5e, 0xa5, 0x47, 0xc8, 0x52,
+	0x84, 0xc4, 0xcb, 0xf0, 0x08, 0xb9, 0x01, 0xe5, 0x30, 0xf2, 0xb0, 0x2c, 0x3d, 0x0c, 0x13, 0x0f,
+	0xc3, 0xc4, 0xc3, 0x8a, 0xf4, 0x30, 0x4c, 0x7b, 0x18, 0x8e, 0x7b, 0x08, 0x2a, 0xfe, 0x72, 0x1e,
+	0x86, 0xe3, 0x1e, 0x56, 0x23, 0xe4, 0x49, 0x1e, 0x99, 0xf5, 0xb0, 0x16, 0x21, 0xf7, 0xf3, 0xc8,
+	0xac, 0x87, 0xf5, 0x08, 0x99, 0xf1, 0x50, 0x83, 0xba, 0xff, 0xda, 0xb0, 0x7c, 0x4b, 0xa2, 0x03,
+	0xdc, 0x56, 0x8b, 0x7a, 0xd5, 0x7f, 0x7d, 0xe0, 0x5b, 0x88, 0x44, 0x57, 0xcf, 0x99, 0x17, 0x01,
+	0x9a, 0xd2, 0xd5, 0x73, 0xe6, 0x29, 0xf5, 0x7d, 0xa8, 0x88, 0xb9, 0x13, 0x84, 0xe6, 0xd0, 0xc3,
+	0x0b, 0x90, 0x92, 0x9e, 0x08, 0xb4, 0x5f, 0x14, 0xa0, 0x91, 0xfd, 0x98, 0x9d, 0x4e, 0x84, 0x0a,
+	0x99, 0x44, 0xe8, 0xdb, 0x07, 0xd4, 0xb7, 0x1f, 0xa8, 0x9b, 0x5b, 0xff, 0x05, 0xd4, 0x33, 0x5f,
+	0xbf, 0xa7, 0x4f, 0x86, 0x55, 0x28, 0x06, 0xa1, 0x19, 0x8e, 0x02, 0x75, 0xc8, 0x57, 0x25, 0xed,
+	0x6b, 0x58, 0x9a, 0xf0, 0x15, 0xfc, 0xd6, 0xb7, 0x6f, 0x09, 0xfd, 0x6c, 0x86, 0xfe, 0x6f, 0x67,
+	0xf0, 0x52, 0x73, 0xfc, 0x6b, 0xfe, 0xb7, 0xb8, 0xfd, 0x77, 0x78, 0x60, 0x64, 0xaa, 0xa8, 0x38,
+	0x3c, 0x38, 0x43, 0x81, 0x54, 0x9f, 0x47, 0xea, 0xb9, 0x48, 0x7d, 0xae, 0xd4, 0x8f, 0x61, 0xc1,
+	0xe1, 0x9e, 0x65, 0x0c, 0x59, 0x10, 0x73, 0xc8, 0xcb, 0xa9, 0x86, 0x90, 0x9f, 0xb0, 0x20, 0x22,
+	0xfa, 0x18, 0x56, 0x14, 0x52, 0x05, 0x5c, 0x04, 0x2f, 0xca, 0x0b, 0x31, 0x09, 0x97, 0x81, 0xa7,
+	0x4c, 0x1e, 0x42, 0xd5, 0xe1, 0x3d, 0x16, 0x01, 0x4b, 0xf2, 0xdc, 0x27, 0x44, 0x0a, 0xf0, 0x0e,
+	0xd4, 0x1c, 0x6e, 0x0e, 0x63, 0x44, 0x19, 0x11, 0x55, 0x94, 0x49, 0x88, 0x46, 0x61, 0xeb, 0x86,
+	0x6f, 0xff, 0x77, 0x36, 0x18, 0x7f, 0x55, 0x80, 0xcd, 0xe9, 0x0f, 0x01, 0xee, 0xaa, 0x1a, 0xf2,
+	0x09, 0xac, 0x32, 0xf7, 0x92, 0xfa, 0x01, 0x35, 0xce, 0x59, 0xf4, 0x4d, 0x50, 0xec, 0xaa, 0xea,
+	0x44, 0xb4, 0xa4, 0xb4, 0xfb, 0x4c, 0x7e, 0xda, 0x13, 0xbb, 0xb8, 0xf6, 0x73, 0xd9, 0xb6, 0x29,
+	0xef, 0x08, 0xee, 0xac, 0x6d, 0xcb, 0x30, 0x8f, 0x2f, 0x1a, 0xa2, 0xc3, 0x19, 0x16, 0x04, 0xbb,
+	0x4b, 0xaf, 0x0c, 0xfa, 0x4d, 0x74, 0x3c, 0x2b, 0xba, 0xf4, 0xaa, 0xf5, 0x8d, 0xad, 0x0d, 0xe0,
+	0xc1, 0xcd, 0xaf, 0x10, 0xee, 0x6c, 0x6c, 0xfe, 0xba, 0x20, 0x63, 0x60, 0xca, 0xbb, 0x84, 0xff,
+	0xdf, 0xc1, 0xf9, 0x69, 0x01, 0xb4, 0x37, 0xbf, 0x71, 0xf8, 0xbf, 0x1d, 0x24, 0xed, 0x1b, 0x1c,
+	0x8b, 0x1b, 0xde, 0x42, 0xdc, 0xba, 0xfe, 0x87, 0x50, 0xc5, 0x07, 0x0b, 0x3e, 0x35, 0x03, 0x75,
+	0xd7, 0x5e, 0xd2, 0x41, 0x88, 0x74, 0x94, 0x68, 0x17, 0xf0, 0xce, 0x1b, 0x1f, 0x2e, 0xdc, 0x59,
+	0x04, 0x74, 0x81, 0xe8, 0x36, 0x1b, 0xfb, 0x26, 0x2e, 0xf2, 0x79, 0xdf, 0x66, 0x6a, 0x9c, 0x2c,
+	0x3e, 0x72, 0xa3, 0x3c, 0xb1, 0xee, 0x2b, 0xf0, 0x81, 0x10, 0x4e, 0x5d, 0xdf, 0xff, 0xb2, 0x00,
+	0xeb, 0xd3, 0x5e, 0x46, 0xdc, 0xba, 0xe9, 0x7b, 0x50, 0x4f, 0x1a, 0x33, 0xe9, 0x2d, 0x54, 0xde,
+	0x81, 0xa3, 0x7b, 0x7a, 0xd5, 0x4f, 0xa4, 0xfb, 0x25, 0xbc, 0x61, 0x0d, 0x03, 0xed, 0x39, 0xdc,
+	0xbf, 0xe9, 0xdd, 0xc9, 0x6d, 0xdb, 0xa6, 0xfd, 0x04, 0xb6, 0xdf, 0xf4, 0x46, 0xe3, 0xce, 0x86,
+	0xea, 0x27, 0xb0, 0x31, 0xf5, 0xa1, 0xc6, 0xb7, 0xd9, 0xdb, 0xe2, 0x4e, 0x4d, 0x52, 0x07, 0xd5,
+	0x65, 0x81, 0xf6, 0x37, 0x05, 0x78, 0xfc, 0xb6, 0xaf, 0x36, 0xee, 0x6c, 0x06, 0x7e, 0x08, 0x24,
+	0xfd, 0x92, 0x44, 0xb5, 0x4d, 0x4e, 0xc7, 0xc5, 0x94, 0x46, 0xb5, 0x71, 0x08, 0xdf, 0x7d, 0x8b,
+	0xf7, 0x1d, 0x77, 0xd6, 0xfd, 0x0e, 0xae, 0x46, 0x6f, 0x78, 0xe3, 0x71, 0x67, 0xb5, 0xfd, 0x59,
+	0x01, 0xde, 0x7d, 0xbb, 0xd7, 0x1e, 0x77, 0xd6, 0xfd, 0x9b, 0x50, 0x1e, 0xfb, 0xf8, 0x1a, 0x97,
+	0xb5, 0xff, 0x2a, 0x40, 0xf5, 0x99, 0xcf, 0x47, 0xde, 0x09, 0xc5, 0x73, 0xd5, 0x3b, 0x50, 0x63,
+	0xd1, 0x07, 0xf2, 0xa8, 0xe2, 0x3a, 0xbe, 0x71, 0x95, 0xb2, 0xb6, 0x4d, 0xda, 0xd0, 0x48, 0x20,
+	0x78, 0x8b, 0x27, 0xbf, 0x98, 0x24, 0xcf, 0x8e, 0x52, 0x84, 0x3b, 0xf1, 0xe7, 0x76, 0xfc, 0x34,
+	0x52, 0x67, 0xe9, 0x22, 0x79, 0x00, 0xd5, 0x3e, 0x1d, 0x1a, 0xd1, 0x65, 0xdd, 0x2c, 0x56, 0x56,
+	0xe9, 0xd3, 0xe1, 0xa9, 0xbc, 0xac, 0x4b, 0x5f, 0xa7, 0xcd, 0xa1, 0x32, 0x2e, 0x6b, 0x3f, 0x84,
+	0x7a, 0x86, 0x9b, 0x94, 0x60, 0xf6, 0xb4, 0xf3, 0x7c, 0xe1, 0x1e, 0x59, 0x80, 0x5a, 0xeb, 0xb4,
+	0xf3, 0xdc, 0xf8, 0xf8, 0x99, 0x71, 0xba, 0xd7, 0x3d, 0x5a, 0x28, 0x90, 0x45, 0xa8, 0x4b, 0xc9,
+	0x47, 0x4a, 0x34, 0xa3, 0xfd, 0xe9, 0x0c, 0xcc, 0x63, 0x3b, 0x33, 0xd7, 0x6c, 0xd2, 0xdd, 0xf8,
+	0x9a, 0xed, 0x07, 0x50, 0xb2, 0xf8, 0x70, 0x68, 0xaa, 0xc7, 0x9e, 0x39, 0x1f, 0xd3, 0x9e, 0x06,
+	0x07, 0x12, 0xa9, 0x47, 0x26, 0x64, 0x07, 0x4a, 0x43, 0xa9, 0x52, 0xdf, 0xbb, 0x96, 0x27, 0xf5,
+	0x90, 0x1e, 0x81, 0x52, 0xb7, 0x8c, 0x73, 0x37, 0xde, 0x32, 0x6a, 0x5f, 0xc2, 0xd2, 0x84, 0x8a,
+	0x49, 0x13, 0xaa, 0x7b, 0x87, 0x87, 0xc6, 0x49, 0xeb, 0x64, 0xbf, 0x25, 0x8e, 0xe4, 0x78, 0xee,
+	0x6e, 0x9d, 0x74, 0x5e, 0xb6, 0x62, 0x59, 0x41, 0x80, 0xce, 0x5a, 0xdd, 0x58, 0x30, 0xa3, 0x7d,
+	0x05, 0x80, 0x57, 0x0a, 0xa7, 0xa6, 0x6f, 0x0e, 0xc9, 0x03, 0x98, 0xe5, 0xee, 0x48, 0xdd, 0x61,
+	0xd7, 0x32, 0x0f, 0xc9, 0x84, 0x82, 0x7c, 0x00, 0xf3, 0x78, 0xbd, 0xa4, 0xfa, 0x63, 0x75, 0x47,
+	0xbd, 0xdc, 0x96, 0xb7, 0x12, 0xd7, 0x1e, 0xdd, 0xc1, 0x71, 0x96, 0x20, 0xad, 0x04, 0xf3, 0xad,
+	0xa1, 0x17, 0x5e, 0x3f, 0xf9, 0x9f, 0x45, 0x28, 0x75, 0x24, 0x17, 0x39, 0x04, 0x38, 0x64, 0x81,
+	0x79, 0xee, 0xd0, 0x8e, 0x13, 0x92, 0x46, 0x5c, 0x07, 0x22, 0x37, 0xc7, 0xca, 0xda, 0xea, 0x4f,
+	0xff, 0xed, 0x3f, 0x7e, 0x3e, 0xb3, 0xa0, 0x55, 0x77, 0x2f, 0x3f, 0xde, 0x55, 0x76, 0x9f, 0x17,
+	0xde, 0x27, 0x4f, 0xa1, 0xaa, 0x53, 0xea, 0xbe, 0x2d, 0xcd, 0x1a, 0xd2, 0x2c, 0x6a, 0x35, 0x41,
+	0x13, 0x19, 0x0a, 0x9e, 0x16, 0x54, 0x55, 0x12, 0x40, 0x3b, 0xee, 0x88, 0x64, 0x5c, 0xce, 0xb1,
+	0xac, 0x23, 0x0b, 0xd1, 0xea, 0x82, 0xa5, 0x25, 0x2b, 0x77, 0x47, 0x82, 0xe6, 0x08, 0xea, 0xf1,
+	0x66, 0xf1, 0x16, 0x44, 0x1b, 0x48, 0xb4, 0xa4, 0x35, 0x52, 0x5e, 0x29, 0xa6, 0x03, 0xa8, 0x1c,
+	0x52, 0x87, 0xde, 0xba, 0x39, 0xb1, 0x91, 0x20, 0x69, 0x03, 0xa8, 0x97, 0x14, 0x9d, 0x51, 0x48,
+	0x16, 0x32, 0x0f, 0xc2, 0x4f, 0x82, 0xfe, 0xcd, 0xed, 0x49, 0x2c, 0x05, 0x55, 0x07, 0x6a, 0xf1,
+	0x33, 0x0a, 0x41, 0x46, 0x32, 0x8f, 0xf0, 0x50, 0x9c, 0xa3, 0xdb, 0x42, 0xba, 0x15, 0x6d, 0x01,
+	0xe9, 0x52, 0xd6, 0x82, 0xf0, 0x77, 0xa1, 0x99, 0x7e, 0x10, 0x21, 0x38, 0x93, 0x37, 0x2e, 0x69,
+	0x4d, 0x8e, 0xf6, 0x01, 0xd2, 0xae, 0x6b, 0x4b, 0x82, 0x76, 0x8c, 0x43, 0x30, 0x7f, 0x01, 0x25,
+	0x71, 0xf8, 0xde, 0xb3, 0x6d, 0x52, 0xcf, 0xbc, 0x2d, 0xbf, 0x39, 0xaa, 0x94, 0x8d, 0x8c, 0x2a,
+	0x10, 0x25, 0x1d, 0xbf, 0x21, 0xbd, 0x89, 0x24, 0xd3, 0x69, 0x89, 0x99, 0xe0, 0x39, 0x83, 0x46,
+	0xfc, 0x82, 0xe8, 0x60, 0x40, 0xad, 0x8b, 0x5c, 0x80, 0x26, 0xdd, 0x18, 0x03, 0xb5, 0xef, 0x20,
+	0xe1, 0x9a, 0x46, 0x04, 0x61, 0xd6, 0x5e, 0x90, 0x9e, 0x40, 0x55, 0xc6, 0xdc, 0x29, 0x77, 0xdb,
+	0xbd, 0xd4, 0x40, 0xc4, 0xeb, 0x60, 0xae, 0x89, 0x9b, 0xc8, 0xb8, 0xac, 0x35, 0x93, 0x80, 0x45,
+	0x63, 0x35, 0xb0, 0x2a, 0xf2, 0xde, 0x9e, 0x2f, 0x33, 0xb0, 0x69, 0x6b, 0x41, 0xa8, 0x43, 0xfd,
+	0x19, 0x0d, 0x53, 0x0f, 0x56, 0xc6, 0x7d, 0x5e, 0x9a, 0xf0, 0x4d, 0x5d, 0xbb, 0x8f, 0x94, 0xab,
+	0xda, 0xa2, 0xa0, 0xcc, 0xd8, 0x0b, 0xce, 0xdf, 0x82, 0xa2, 0x4e, 0xcf, 0x39, 0x7f, 0xf3, 0x0c,
+	0x5f, 0x41, 0x9e, 0xa6, 0x06, 0x72, 0x86, 0x0b, 0x1b, 0x41, 0xf0, 0x02, 0x16, 0x0f, 0xb8, 0xe3,
+	0x50, 0x2b, 0x7d, 0xc9, 0xf7, 0x26, 0xae, 0x6d, 0xe4, 0xda, 0xd4, 0x56, 0x04, 0x57, 0xce, 0x5c,
+	0xd0, 0xfa, 0xb0, 0x76, 0xe0, 0x53, 0x33, 0xa4, 0x5d, 0xdf, 0xec, 0xf5, 0x98, 0x75, 0x66, 0x0d,
+	0xa8, 0x3d, 0x72, 0xc4, 0x32, 0xfe, 0x70, 0x27, 0xf3, 0xff, 0x2e, 0x39, 0x40, 0xae, 0xb6, 0x77,
+	0xb1, 0xb6, 0x6d, 0x6d, 0x0b, 0x6b, 0x9b, 0xcc, 0xaa, 0xea, 0x94, 0x11, 0x76, 0xd7, 0x75, 0x4e,
+	0x61, 0x15, 0x75, 0xf6, 0x60, 0x29, 0xd3, 0xa2, 0xdf, 0x19, 0xd1, 0x11, 0x0d, 0xc8, 0xd6, 0xc4,
+	0xfa, 0xa4, 0x32, 0x57, 0x97, 0x86, 0x75, 0xdd, 0xd7, 0xd6, 0x72, 0xfe, 0x49, 0x03, 0x55, 0x4f,
+	0xa6, 0x15, 0xbf, 0x74, 0x3d, 0x13, 0xd8, 0x44, 0x3d, 0xbf, 0x01, 0x0b, 0x72, 0x1a, 0xa4, 0xf2,
+	0xac, 0xe9, 0x61, 0x9a, 0x80, 0xb4, 0x7b, 0x1f, 0x15, 0xc8, 0xd7, 0xb0, 0x72, 0x4a, 0xfd, 0x1e,
+	0xf7, 0x87, 0xb8, 0xfd, 0x76, 0x3c, 0xea, 0x8f, 0x33, 0xa0, 0x22, 0xd7, 0xb2, 0x47, 0xd8, 0xb2,
+	0x07, 0xda, 0x86, 0x68, 0xd9, 0x44, 0x0a, 0xb9, 0x68, 0x57, 0xe5, 0x22, 0x2e, 0xf3, 0x92, 0x37,
+	0x91, 0x66, 0xe6, 0x76, 0xca, 0x50, 0x50, 0x75, 0xa1, 0xfa, 0x8c, 0x86, 0xad, 0xd7, 0x21, 0xee,
+	0xcb, 0x24, 0xf1, 0x28, 0xd9, 0xea, 0x37, 0x97, 0xa3, 0xbd, 0x5b, 0xa7, 0xe1, 0xc8, 0x77, 0x51,
+	0x13, 0x64, 0x59, 0x53, 0x1c, 0x82, 0xf5, 0x0f, 0xf0, 0x85, 0x6f, 0xea, 0x13, 0xc1, 0x19, 0x0d,
+	0xc9, 0xda, 0x94, 0xcf, 0x07, 0x37, 0x4f, 0xaa, 0x1c, 0x8f, 0xe0, 0xf7, 0x60, 0xe3, 0x19, 0x0d,
+	0x8f, 0x27, 0x3f, 0x27, 0xcc, 0x6e, 0x85, 0x5b, 0xd9, 0xf7, 0xd9, 0x99, 0x47, 0x8e, 0xda, 0x63,
+	0xac, 0x49, 0xd3, 0xbe, 0xa3, 0x7c, 0x98, 0xcc, 0x28, 0x6a, 0x1c, 0xc0, 0xca, 0x44, 0xfd, 0x6d,
+	0x6a, 0xcb, 0x0c, 0xee, 0x44, 0xb6, 0xcf, 0x0b, 0xef, 0xef, 0x7f, 0x0d, 0x5b, 0xdc, 0xef, 0x23,
+	0x8f, 0xc5, 0x7d, 0x7b, 0x47, 0xfe, 0xff, 0x5b, 0xc4, 0xbb, 0x5f, 0x7f, 0x89, 0x65, 0x91, 0x23,
+	0x75, 0x8e, 0xbb, 0x5f, 0xed, 0xf6, 0x59, 0x38, 0x18, 0x9d, 0x8b, 0x11, 0xda, 0x8d, 0x4c, 0x76,
+	0xa5, 0xc9, 0x87, 0xea, 0x5f, 0xe6, 0x2e, 0x3f, 0xd9, 0xed, 0xf3, 0xe8, 0xdf, 0xf3, 0x4e, 0x0b,
+	0xa7, 0x33, 0xe7, 0x45, 0xd4, 0x7c, 0xf2, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x03, 0x7d,
+	0xac, 0xc2, 0x37, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -4294,7 +4866,11 @@
 	RemoveTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error)
 	EnableIndication(ctx context.Context, in *Empty, opts ...grpc.CallOption) (Openolt_EnableIndicationClient, error)
 	PerformGroupOperation(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error)
+	DeleteGroup(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error)
 	GetExtValue(ctx context.Context, in *ValueParam, opts ...grpc.CallOption) (*common.ReturnValues, error)
+	OnuItuPonAlarmSet(ctx context.Context, in *OnuItuPonAlarm, opts ...grpc.CallOption) (*Empty, error)
+	GetLogicalOnuDistanceZero(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error)
+	GetLogicalOnuDistance(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error)
 }
 
 type openoltClient struct {
@@ -4526,6 +5102,15 @@
 	return out, nil
 }
 
+func (c *openoltClient) DeleteGroup(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error) {
+	out := new(Empty)
+	err := c.cc.Invoke(ctx, "/openolt.Openolt/DeleteGroup", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 func (c *openoltClient) GetExtValue(ctx context.Context, in *ValueParam, opts ...grpc.CallOption) (*common.ReturnValues, error) {
 	out := new(common.ReturnValues)
 	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetExtValue", in, out, opts...)
@@ -4535,6 +5120,33 @@
 	return out, nil
 }
 
+func (c *openoltClient) OnuItuPonAlarmSet(ctx context.Context, in *OnuItuPonAlarm, opts ...grpc.CallOption) (*Empty, error) {
+	out := new(Empty)
+	err := c.cc.Invoke(ctx, "/openolt.Openolt/OnuItuPonAlarmSet", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *openoltClient) GetLogicalOnuDistanceZero(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error) {
+	out := new(OnuLogicalDistance)
+	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetLogicalOnuDistanceZero", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *openoltClient) GetLogicalOnuDistance(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error) {
+	out := new(OnuLogicalDistance)
+	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetLogicalOnuDistance", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // OpenoltServer is the server API for Openolt service.
 type OpenoltServer interface {
 	DisableOlt(context.Context, *Empty) (*Empty, error)
@@ -4559,7 +5171,11 @@
 	RemoveTrafficQueues(context.Context, *tech_profile.TrafficQueues) (*Empty, error)
 	EnableIndication(*Empty, Openolt_EnableIndicationServer) error
 	PerformGroupOperation(context.Context, *Group) (*Empty, error)
+	DeleteGroup(context.Context, *Group) (*Empty, error)
 	GetExtValue(context.Context, *ValueParam) (*common.ReturnValues, error)
+	OnuItuPonAlarmSet(context.Context, *OnuItuPonAlarm) (*Empty, error)
+	GetLogicalOnuDistanceZero(context.Context, *Onu) (*OnuLogicalDistance, error)
+	GetLogicalOnuDistance(context.Context, *Onu) (*OnuLogicalDistance, error)
 }
 
 func RegisterOpenoltServer(s *grpc.Server, srv OpenoltServer) {
@@ -4965,6 +5581,24 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Openolt_DeleteGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(Group)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OpenoltServer).DeleteGroup(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/openolt.Openolt/DeleteGroup",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OpenoltServer).DeleteGroup(ctx, req.(*Group))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 func _Openolt_GetExtValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(ValueParam)
 	if err := dec(in); err != nil {
@@ -4983,6 +5617,60 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Openolt_OnuItuPonAlarmSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(OnuItuPonAlarm)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OpenoltServer).OnuItuPonAlarmSet(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/openolt.Openolt/OnuItuPonAlarmSet",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OpenoltServer).OnuItuPonAlarmSet(ctx, req.(*OnuItuPonAlarm))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Openolt_GetLogicalOnuDistanceZero_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(Onu)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OpenoltServer).GetLogicalOnuDistanceZero(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/openolt.Openolt/GetLogicalOnuDistanceZero",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OpenoltServer).GetLogicalOnuDistanceZero(ctx, req.(*Onu))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Openolt_GetLogicalOnuDistance_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(Onu)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OpenoltServer).GetLogicalOnuDistance(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/openolt.Openolt/GetLogicalOnuDistance",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OpenoltServer).GetLogicalOnuDistance(ctx, req.(*Onu))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 var _Openolt_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "openolt.Openolt",
 	HandlerType: (*OpenoltServer)(nil),
@@ -5072,9 +5760,25 @@
 			Handler:    _Openolt_PerformGroupOperation_Handler,
 		},
 		{
+			MethodName: "DeleteGroup",
+			Handler:    _Openolt_DeleteGroup_Handler,
+		},
+		{
 			MethodName: "GetExtValue",
 			Handler:    _Openolt_GetExtValue_Handler,
 		},
+		{
+			MethodName: "OnuItuPonAlarmSet",
+			Handler:    _Openolt_OnuItuPonAlarmSet_Handler,
+		},
+		{
+			MethodName: "GetLogicalOnuDistanceZero",
+			Handler:    _Openolt_GetLogicalOnuDistanceZero_Handler,
+		},
+		{
+			MethodName: "GetLogicalOnuDistance",
+			Handler:    _Openolt_GetLogicalOnuDistance_Handler,
+		},
 	},
 	Streams: []grpc.StreamDesc{
 		{
diff --git a/vendor/github.com/opencord/voltha-protos/v3/go/tech_profile/tech_profile.pb.go b/vendor/github.com/opencord/voltha-protos/v3/go/tech_profile/tech_profile.pb.go
index f74a616..7d7c2ba 100644
--- a/vendor/github.com/opencord/voltha-protos/v3/go/tech_profile/tech_profile.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/v3/go/tech_profile/tech_profile.pb.go
@@ -322,6 +322,7 @@
 	AllocId              uint32              `protobuf:"fixed32,2,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
 	Scheduler            *SchedulerConfig    `protobuf:"bytes,3,opt,name=scheduler,proto3" json:"scheduler,omitempty"`
 	TrafficShapingInfo   *TrafficShapingInfo `protobuf:"bytes,4,opt,name=traffic_shaping_info,json=trafficShapingInfo,proto3" json:"traffic_shaping_info,omitempty"`
+	TechProfileId        uint32              `protobuf:"fixed32,5,opt,name=tech_profile_id,json=techProfileId,proto3" json:"tech_profile_id,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
 	XXX_unrecognized     []byte              `json:"-"`
 	XXX_sizecache        int32               `json:"-"`
@@ -380,6 +381,13 @@
 	return nil
 }
 
+func (m *TrafficScheduler) GetTechProfileId() uint32 {
+	if m != nil {
+		return m.TechProfileId
+	}
+	return 0
+}
+
 type TrafficSchedulers struct {
 	IntfId               uint32              `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
 	OnuId                uint32              `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
@@ -812,6 +820,7 @@
 	UniId                uint32          `protobuf:"fixed32,4,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
 	PortNo               uint32          `protobuf:"fixed32,5,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
 	TrafficQueues        []*TrafficQueue `protobuf:"bytes,6,rep,name=traffic_queues,json=trafficQueues,proto3" json:"traffic_queues,omitempty"`
+	TechProfileId        uint32          `protobuf:"fixed32,7,opt,name=tech_profile_id,json=techProfileId,proto3" json:"tech_profile_id,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
 	XXX_unrecognized     []byte          `json:"-"`
 	XXX_sizecache        int32           `json:"-"`
@@ -877,6 +886,13 @@
 	return nil
 }
 
+func (m *TrafficQueues) GetTechProfileId() uint32 {
+	if m != nil {
+		return m.TechProfileId
+	}
+	return 0
+}
+
 func init() {
 	proto.RegisterEnum("tech_profile.Direction", Direction_name, Direction_value)
 	proto.RegisterEnum("tech_profile.SchedulingPolicy", SchedulingPolicy_name, SchedulingPolicy_value)
@@ -898,75 +914,77 @@
 func init() { proto.RegisterFile("voltha_protos/tech_profile.proto", fileDescriptor_d019a68bffe14cae) }
 
 var fileDescriptor_d019a68bffe14cae = []byte{
-	// 1118 bytes of a gzipped FileDescriptorProto
+	// 1139 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xdd, 0x6e, 0x1b, 0x45,
-	0x14, 0xf6, 0xda, 0x8d, 0x7f, 0x4e, 0x6c, 0x77, 0x33, 0x25, 0xd4, 0xa4, 0x2d, 0x18, 0x97, 0xaa,
-	0x91, 0x11, 0x31, 0x4a, 0x4b, 0x6f, 0x8a, 0x54, 0xd9, 0x4d, 0xa4, 0x58, 0xa2, 0x69, 0xba, 0x09,
-	0x32, 0xe2, 0x82, 0xd5, 0x78, 0x67, 0xbc, 0x1e, 0x69, 0x3d, 0xb3, 0xcc, 0x8e, 0xeb, 0xa4, 0x57,
-	0xdc, 0xf0, 0x16, 0xdc, 0xf2, 0x02, 0x70, 0x83, 0x78, 0x22, 0x5e, 0x80, 0x7b, 0x34, 0xb3, 0xbb,
-	0xb6, 0xd7, 0x36, 0x29, 0x54, 0x70, 0x37, 0xe7, 0xdb, 0x6f, 0xce, 0x9c, 0x6f, 0xce, 0xcf, 0x0e,
-	0x34, 0x5f, 0x8b, 0x40, 0x8d, 0xb1, 0x1b, 0x4a, 0xa1, 0x44, 0xd4, 0x51, 0xd4, 0x1b, 0xeb, 0xf5,
-	0x88, 0x05, 0xf4, 0xc0, 0x60, 0xa8, 0xba, 0x8c, 0xed, 0xdd, 0xf5, 0x85, 0xf0, 0x03, 0xda, 0xc1,
-	0x21, 0xeb, 0x60, 0xce, 0x85, 0xc2, 0x8a, 0x09, 0x1e, 0xc5, 0xdc, 0xd6, 0x0f, 0x79, 0xb8, 0x79,
-	0xee, 0x8d, 0x29, 0x99, 0x06, 0x54, 0x3e, 0x17, 0x7c, 0xc4, 0x7c, 0xf4, 0x05, 0x54, 0x08, 0x93,
-	0xd4, 0xd3, 0xbc, 0x86, 0xd5, 0xb4, 0xf6, 0xeb, 0x87, 0xb7, 0x0f, 0x32, 0xe7, 0x1c, 0xa5, 0x9f,
-	0x9d, 0x05, 0x13, 0x3d, 0x83, 0x1a, 0x26, 0x84, 0xe9, 0x35, 0x0e, 0xdc, 0xe1, 0xac, 0x91, 0x37,
-	0x5b, 0xf7, 0xb2, 0x5b, 0xbb, 0x73, 0x4a, 0x6f, 0xe0, 0x54, 0x17, 0x1b, 0x7a, 0x33, 0xb4, 0x07,
-	0xe5, 0x50, 0x32, 0x21, 0x99, 0xba, 0x6a, 0x14, 0x9a, 0xd6, 0x7e, 0xc9, 0x99, 0xdb, 0xe8, 0x7d,
-	0x28, 0xce, 0x28, 0xf3, 0xc7, 0xaa, 0x71, 0xc3, 0x7c, 0x49, 0x2c, 0xd4, 0x85, 0x6a, 0xa4, 0xc3,
-	0x77, 0x43, 0x11, 0x30, 0xef, 0xaa, 0xb1, 0x65, 0xce, 0xfc, 0x30, 0x7b, 0x66, 0x22, 0x90, 0x71,
-	0xff, 0xcc, 0xb0, 0x9c, 0x6d, 0xb3, 0x27, 0x36, 0x5a, 0xbf, 0x59, 0x80, 0x2e, 0x24, 0x1e, 0x8d,
-	0x98, 0x77, 0x3e, 0xc6, 0x21, 0xe3, 0x7e, 0x9f, 0x8f, 0x04, 0xb2, 0xa1, 0xe0, 0x31, 0x69, 0xf4,
-	0x97, 0x1c, 0xbd, 0x34, 0xc8, 0x30, 0x32, 0xb2, 0x34, 0x32, 0x8c, 0x34, 0x12, 0x32, 0x99, 0x04,
-	0xab, 0x97, 0x06, 0x19, 0x46, 0x49, 0x90, 0x7a, 0xa9, 0x11, 0x9f, 0x49, 0x13, 0x58, 0xc9, 0xd1,
-	0x4b, 0x74, 0x02, 0x80, 0x09, 0x71, 0x87, 0x33, 0x97, 0x71, 0xd2, 0x28, 0x9a, 0x88, 0xdb, 0xd9,
-	0x88, 0xfb, 0x7c, 0x44, 0xa5, 0xa4, 0x24, 0xbd, 0xad, 0xde, 0xa0, 0xcf, 0x09, 0xf3, 0x4c, 0xea,
-	0x9c, 0x32, 0x26, 0xa4, 0x37, 0xeb, 0x73, 0xd2, 0xfa, 0xd3, 0x02, 0x3b, 0x0d, 0x3d, 0x4d, 0xe2,
-	0xbb, 0xa6, 0xef, 0x03, 0x28, 0xe3, 0x20, 0x10, 0x9e, 0xcb, 0x48, 0x22, 0xb1, 0x64, 0xec, 0x3e,
-	0x41, 0x4f, 0xa1, 0x12, 0xa5, 0xee, 0x8d, 0xd8, 0xed, 0xc3, 0x7b, 0x1b, 0x6f, 0x38, 0x2d, 0x21,
-	0x67, 0xc1, 0x47, 0x0e, 0xbc, 0xa7, 0xe2, 0x10, 0xdd, 0x28, 0xbe, 0x5e, 0x97, 0xf1, 0x91, 0x30,
-	0x57, 0xb4, 0x7d, 0xd8, 0xcc, 0xfa, 0x59, 0xcf, 0x83, 0x83, 0xd4, 0x1a, 0xd6, 0xfa, 0xdd, 0x82,
-	0x9d, 0x55, 0xdd, 0x11, 0xba, 0x0d, 0x25, 0xc6, 0xd5, 0x48, 0x0b, 0x88, 0xb3, 0x56, 0xd4, 0x66,
-	0x9f, 0xa0, 0x5d, 0x28, 0x0a, 0x3e, 0x5d, 0x08, 0xdb, 0x12, 0x7c, 0x1a, 0xc3, 0x53, 0xce, 0x34,
-	0x1c, 0xa7, 0x6b, 0x6b, 0xca, 0x59, 0x9f, 0x68, 0x37, 0xa1, 0x90, 0xca, 0xe5, 0x22, 0x49, 0x5a,
-	0x51, 0x9b, 0xa7, 0x02, 0x1d, 0x43, 0x7d, 0xae, 0x44, 0x9f, 0x1a, 0x35, 0x0a, 0xcd, 0xc2, 0xfe,
-	0xf6, 0x6a, 0xb5, 0xad, 0x06, 0xe6, 0xd4, 0xd4, 0x12, 0x12, 0xb5, 0x9e, 0xc0, 0xee, 0x05, 0x66,
-	0xc1, 0x91, 0x14, 0xe1, 0x11, 0x8b, 0x3c, 0x2c, 0x49, 0xd2, 0x77, 0xf7, 0x00, 0xbe, 0x9f, 0xd2,
-	0x29, 0x75, 0x23, 0xf6, 0x86, 0x26, 0x12, 0x2a, 0x06, 0x39, 0x67, 0x6f, 0x68, 0xeb, 0x47, 0x0b,
-	0x6c, 0x87, 0x92, 0xec, 0x9e, 0xfb, 0x50, 0x9b, 0x30, 0xee, 0xaa, 0xb1, 0xa4, 0xd1, 0x58, 0x04,
-	0xa9, 0xf2, 0xea, 0x84, 0xf1, 0x8b, 0x14, 0x33, 0x24, 0x7c, 0xb9, 0x44, 0xca, 0x27, 0x24, 0x7c,
-	0xb9, 0x20, 0x3d, 0x84, 0x9b, 0x9a, 0x14, 0x4a, 0x31, 0xc4, 0x43, 0x16, 0x2c, 0x9a, 0xb0, 0x3e,
-	0xc1, 0x97, 0x67, 0x0b, 0xb4, 0xf5, 0xab, 0x05, 0x3b, 0x83, 0xb5, 0x40, 0x1e, 0xc3, 0x96, 0x2f,
-	0x29, 0x8d, 0x2b, 0x6e, 0xed, 0x4e, 0x56, 0xe9, 0x4e, 0x4c, 0x46, 0x4f, 0xa0, 0x78, 0x45, 0x83,
-	0x40, 0xc4, 0xc3, 0xe2, 0xed, 0xdb, 0x12, 0x36, 0xfa, 0x1c, 0x0a, 0x92, 0x92, 0xa4, 0x16, 0xdf,
-	0xb6, 0x49, 0x53, 0x5b, 0x7f, 0xe4, 0xa1, 0x96, 0x8d, 0xb8, 0x07, 0x75, 0x12, 0x03, 0xe9, 0xf0,
-	0x88, 0x9b, 0xe5, 0xce, 0x6a, 0xb3, 0x18, 0x4e, 0x32, 0x39, 0x6a, 0x64, 0xd9, 0x44, 0xdf, 0x41,
-	0x43, 0x61, 0x16, 0xb8, 0x44, 0x8a, 0xd0, 0x4d, 0xbd, 0x79, 0xc6, 0x7f, 0xa2, 0xe8, 0xfe, 0x4a,
-	0x71, 0x6c, 0xca, 0xfc, 0x49, 0xce, 0xd9, 0x55, 0x1b, 0x4b, 0xe2, 0x14, 0x90, 0xa4, 0x64, 0xd5,
-	0xf3, 0x3f, 0x92, 0x7d, 0x92, 0x73, 0x6c, 0xb9, 0x9a, 0xa5, 0x57, 0x70, 0x6b, 0xb6, 0xc1, 0x61,
-	0xdc, 0x8b, 0x1f, 0x65, 0x1d, 0x0e, 0x36, 0x78, 0xdc, 0x99, 0xad, 0xba, 0xec, 0xd9, 0x8b, 0x6b,
-	0x8c, 0xbd, 0xb5, 0x7e, 0x2e, 0x40, 0x35, 0x69, 0x82, 0x57, 0xba, 0x7a, 0xdf, 0x75, 0x22, 0xdd,
-	0x03, 0xf0, 0xe9, 0xc4, 0xf4, 0xe2, 0xbc, 0x75, 0x2b, 0x09, 0xd2, 0x27, 0x7a, 0x60, 0x85, 0x43,
-	0xa6, 0xdc, 0x09, 0x0e, 0xcd, 0x8d, 0x54, 0x9c, 0x92, 0xb6, 0x5f, 0xe0, 0x10, 0x3d, 0x80, 0x3a,
-	0xa6, 0x91, 0x4b, 0xb9, 0x27, 0xaf, 0x42, 0x73, 0xaa, 0x56, 0x58, 0x76, 0x6a, 0x98, 0x46, 0xc7,
-	0x73, 0xf0, 0x3f, 0xf8, 0x79, 0x64, 0xfe, 0x59, 0xc5, 0xbf, 0xfd, 0x67, 0x95, 0x32, 0xff, 0xac,
-	0xf5, 0xc2, 0x2b, 0xff, 0xeb, 0xc2, 0xeb, 0xad, 0xde, 0x7a, 0xa3, 0x62, 0x72, 0xb8, 0xd9, 0x47,
-	0xd2, 0x08, 0xa9, 0x8f, 0xd8, 0x6c, 0xfd, 0x62, 0x41, 0x6d, 0x39, 0x4f, 0xff, 0xff, 0x04, 0xed,
-	0x2e, 0x26, 0xa8, 0x99, 0x6b, 0x51, 0xa3, 0x68, 0x26, 0xe8, 0xde, 0xc6, 0x09, 0x6a, 0x82, 0x9a,
-	0x4f, 0xcf, 0x38, 0xc4, 0xf6, 0x97, 0x50, 0x99, 0x17, 0x0b, 0xaa, 0x42, 0xf9, 0xeb, 0xb3, 0xf3,
-	0x0b, 0xe7, 0xb8, 0xfb, 0xc2, 0xce, 0xa1, 0x3a, 0xc0, 0xd1, 0xcb, 0xc1, 0x69, 0x62, 0x5b, 0x68,
-	0x07, 0x6a, 0xbd, 0xfe, 0x51, 0xdf, 0x39, 0x7e, 0x7e, 0xd1, 0x7f, 0x79, 0xda, 0xfd, 0xca, 0xce,
-	0xb7, 0x9f, 0x82, 0xbd, 0x9a, 0x4f, 0x54, 0x82, 0xc2, 0xc0, 0x71, 0xec, 0x1c, 0x42, 0x50, 0x3f,
-	0x57, 0x92, 0x79, 0xea, 0x2c, 0xc9, 0xa0, 0x6d, 0x21, 0x80, 0xe2, 0xc9, 0xd5, 0x50, 0x32, 0x62,
-	0xe7, 0xdb, 0x1c, 0xaa, 0xcb, 0xaf, 0x17, 0xb4, 0x0b, 0x3b, 0xcb, 0xb6, 0x7b, 0x2a, 0x38, 0xb5,
-	0x73, 0xe8, 0x16, 0xdc, 0xcc, 0xc2, 0x5d, 0xdb, 0x42, 0x77, 0xe0, 0x76, 0x06, 0xec, 0xd1, 0x48,
-	0x1d, 0x8f, 0x46, 0x42, 0x2a, 0x3b, 0xbf, 0xe6, 0xa8, 0x3b, 0x55, 0xc2, 0x2e, 0xb4, 0x9f, 0xcd,
-	0x27, 0x56, 0x12, 0x69, 0x15, 0xca, 0xe9, 0xfc, 0xb0, 0x73, 0xa8, 0x06, 0x95, 0xc1, 0xdc, 0xb4,
-	0xb4, 0x0c, 0x87, 0x12, 0x3b, 0x8f, 0xca, 0x70, 0x43, 0xb7, 0xae, 0x5d, 0x68, 0xff, 0x64, 0xc1,
-	0xdd, 0xeb, 0x5e, 0x12, 0xe8, 0x01, 0x7c, 0x7c, 0xdd, 0xf7, 0x54, 0xd1, 0x3e, 0x7c, 0x72, 0x2d,
-	0xad, 0x1b, 0x45, 0x53, 0x49, 0x89, 0x6d, 0xa1, 0x4f, 0xe1, 0xe1, 0xb5, 0xcc, 0x65, 0xd9, 0xbd,
-	0x6f, 0xa0, 0x29, 0xa4, 0x7f, 0x20, 0x42, 0xca, 0x3d, 0x21, 0xc9, 0x41, 0xfc, 0xb0, 0xcd, 0x94,
-	0xc2, 0xb7, 0x8f, 0x7d, 0xa6, 0xc6, 0xd3, 0xe1, 0x81, 0x27, 0x26, 0x9d, 0x94, 0xd8, 0x89, 0x89,
-	0x9f, 0x25, 0x2f, 0xe0, 0xd7, 0x8f, 0x3a, 0xbe, 0xc8, 0xbc, 0x83, 0x87, 0x45, 0xf3, 0xe9, 0xd1,
-	0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x31, 0x2e, 0x0c, 0xef, 0x2c, 0x0b, 0x00, 0x00,
+	0x14, 0xf6, 0xda, 0x8d, 0x7f, 0x4e, 0x6c, 0x67, 0x33, 0x25, 0xc4, 0xa4, 0x0d, 0x18, 0x97, 0xd2,
+	0xc8, 0x88, 0x18, 0xa5, 0xa5, 0x37, 0x45, 0xaa, 0xec, 0x26, 0x52, 0x56, 0xa2, 0x69, 0xba, 0x09,
+	0x32, 0xe2, 0x82, 0xd5, 0x7a, 0x67, 0xbc, 0x1e, 0x69, 0x3d, 0xb3, 0xcc, 0x8e, 0xeb, 0xa4, 0x57,
+	0xdc, 0xf0, 0x16, 0x70, 0xc9, 0x13, 0x70, 0x83, 0x78, 0x14, 0x9e, 0x80, 0xc7, 0x40, 0x33, 0xbb,
+	0x6b, 0x7b, 0x6d, 0x93, 0x42, 0x45, 0xef, 0xe6, 0x7c, 0xfb, 0x9d, 0x33, 0xe7, 0x7f, 0x16, 0x9a,
+	0xaf, 0x78, 0x20, 0x47, 0xae, 0x13, 0x0a, 0x2e, 0x79, 0xd4, 0x91, 0xc4, 0x1b, 0xa9, 0xf3, 0x90,
+	0x06, 0xe4, 0x50, 0x63, 0xa8, 0xba, 0x88, 0xed, 0xdd, 0xf5, 0x39, 0xf7, 0x03, 0xd2, 0x71, 0x43,
+	0xda, 0x71, 0x19, 0xe3, 0xd2, 0x95, 0x94, 0xb3, 0x28, 0xe6, 0xb6, 0x7e, 0xcc, 0xc3, 0xd6, 0x85,
+	0x37, 0x22, 0x78, 0x12, 0x10, 0xf1, 0x8c, 0xb3, 0x21, 0xf5, 0xd1, 0x97, 0x50, 0xc1, 0x54, 0x10,
+	0x4f, 0xf1, 0x1a, 0x46, 0xd3, 0x38, 0xa8, 0x1f, 0xed, 0x1e, 0x66, 0xee, 0x39, 0x4e, 0x3f, 0xdb,
+	0x73, 0x26, 0x7a, 0x0a, 0x35, 0x17, 0x63, 0xaa, 0xce, 0x6e, 0xe0, 0x0c, 0xa6, 0x8d, 0xbc, 0x56,
+	0xdd, 0xcb, 0xaa, 0x76, 0x67, 0x94, 0x5e, 0xdf, 0xae, 0xce, 0x15, 0x7a, 0x53, 0xb4, 0x07, 0xe5,
+	0x50, 0x50, 0x2e, 0xa8, 0xbc, 0x6e, 0x14, 0x9a, 0xc6, 0x41, 0xc9, 0x9e, 0xc9, 0xe8, 0x7d, 0x28,
+	0x4e, 0x09, 0xf5, 0x47, 0xb2, 0x71, 0x4b, 0x7f, 0x49, 0x24, 0xd4, 0x85, 0x6a, 0xa4, 0xdc, 0x77,
+	0x42, 0x1e, 0x50, 0xef, 0xba, 0xb1, 0xa1, 0xef, 0xfc, 0x30, 0x7b, 0x67, 0x12, 0x20, 0x65, 0xfe,
+	0xb9, 0x66, 0xd9, 0x9b, 0x5a, 0x27, 0x16, 0x5a, 0xbf, 0x1b, 0x80, 0x2e, 0x85, 0x3b, 0x1c, 0x52,
+	0xef, 0x62, 0xe4, 0x86, 0x94, 0xf9, 0x16, 0x1b, 0x72, 0x64, 0x42, 0xc1, 0xa3, 0x42, 0xc7, 0x5f,
+	0xb2, 0xd5, 0x51, 0x23, 0x83, 0x48, 0x87, 0xa5, 0x90, 0x41, 0xa4, 0x90, 0x90, 0x8a, 0xc4, 0x59,
+	0x75, 0xd4, 0xc8, 0x20, 0x4a, 0x9c, 0x54, 0x47, 0x85, 0xf8, 0x54, 0x68, 0xc7, 0x4a, 0xb6, 0x3a,
+	0xa2, 0x53, 0x00, 0x17, 0x63, 0x67, 0x30, 0x75, 0x28, 0xc3, 0x8d, 0xa2, 0xf6, 0xb8, 0x9d, 0xf5,
+	0xd8, 0x62, 0x43, 0x22, 0x04, 0xc1, 0x69, 0xb6, 0x7a, 0x7d, 0x8b, 0x61, 0xea, 0xe9, 0xd2, 0xd9,
+	0x65, 0x17, 0xe3, 0xde, 0xd4, 0x62, 0xb8, 0xf5, 0x4b, 0x1e, 0xcc, 0xd4, 0xf5, 0xb4, 0x88, 0x6f,
+	0x5b, 0xbe, 0x0f, 0xa0, 0xec, 0x06, 0x01, 0xf7, 0x1c, 0x8a, 0x93, 0x10, 0x4b, 0x5a, 0xb6, 0x30,
+	0x7a, 0x02, 0x95, 0x28, 0x35, 0xaf, 0x83, 0xdd, 0x3c, 0xda, 0x5f, 0x9b, 0xe1, 0xb4, 0x85, 0xec,
+	0x39, 0x1f, 0xd9, 0xf0, 0x9e, 0x8c, 0x5d, 0x74, 0xa2, 0x38, 0xbd, 0x0e, 0x65, 0x43, 0xae, 0x53,
+	0xb4, 0x79, 0xd4, 0xcc, 0xda, 0x59, 0xad, 0x83, 0x8d, 0xe4, 0x6a, 0x6d, 0x3e, 0x85, 0xad, 0x45,
+	0x35, 0xe5, 0x72, 0x9c, 0xdf, 0x9a, 0x82, 0xcf, 0x63, 0xd4, 0xc2, 0xad, 0x3f, 0x0c, 0xd8, 0x5e,
+	0xce, 0x4f, 0x84, 0x76, 0xa1, 0x44, 0x99, 0x1c, 0x2a, 0xad, 0xb8, 0xba, 0x45, 0x25, 0x5a, 0x18,
+	0xed, 0x40, 0x91, 0xb3, 0xc9, 0x3c, 0x01, 0x1b, 0x9c, 0x4d, 0x62, 0x78, 0xc2, 0xa8, 0x82, 0xe3,
+	0xb2, 0x6e, 0x4c, 0x18, 0xb5, 0xb0, 0x32, 0x13, 0x72, 0x21, 0x1d, 0xc6, 0x93, 0xcb, 0x8b, 0x4a,
+	0x3c, 0xe3, 0xe8, 0x04, 0xea, 0xb3, 0x88, 0xd5, 0xad, 0x51, 0xa3, 0xd0, 0x2c, 0x1c, 0x6c, 0x2e,
+	0x77, 0xe5, 0xb2, 0x63, 0x76, 0x4d, 0x2e, 0x20, 0x51, 0xeb, 0x31, 0xec, 0x5c, 0xba, 0x34, 0x38,
+	0x16, 0x3c, 0x3c, 0xa6, 0x91, 0xe7, 0x0a, 0x9c, 0xcc, 0xe7, 0x3e, 0xc0, 0x0f, 0x13, 0x32, 0x21,
+	0x4e, 0x44, 0x5f, 0x93, 0x24, 0x84, 0x8a, 0x46, 0x2e, 0xe8, 0x6b, 0xd2, 0xfa, 0xc9, 0x00, 0xd3,
+	0x26, 0x38, 0xab, 0x73, 0x0f, 0x6a, 0x63, 0xca, 0x1c, 0x39, 0x12, 0x24, 0x1a, 0xf1, 0x20, 0x8d,
+	0xbc, 0x3a, 0xa6, 0xec, 0x32, 0xc5, 0x34, 0xc9, 0xbd, 0x5a, 0x20, 0xe5, 0x13, 0x92, 0x7b, 0x35,
+	0x27, 0x3d, 0x80, 0x2d, 0x45, 0x0a, 0x05, 0x1f, 0xb8, 0x03, 0x1a, 0xcc, 0x87, 0xb5, 0x3e, 0x76,
+	0xaf, 0xce, 0xe7, 0x68, 0xeb, 0x37, 0x03, 0xb6, 0xfb, 0x2b, 0x8e, 0x3c, 0x82, 0x0d, 0x5f, 0x10,
+	0x12, 0x77, 0xe6, 0x4a, 0x4e, 0x96, 0xe9, 0x76, 0x4c, 0x46, 0x8f, 0xa1, 0x78, 0x4d, 0x82, 0x80,
+	0xc7, 0x4b, 0xe5, 0xcd, 0x6a, 0x09, 0x1b, 0x7d, 0x01, 0x05, 0x41, 0x70, 0xd2, 0xb3, 0x6f, 0x52,
+	0x52, 0xd4, 0xd6, 0x5f, 0x79, 0xa8, 0x65, 0x3d, 0xee, 0x41, 0x1d, 0xc7, 0x40, 0xba, 0x64, 0xe2,
+	0xa1, 0xba, 0xb3, 0x3c, 0x54, 0x9a, 0x93, 0x6c, 0x98, 0x1a, 0x5e, 0x14, 0xd1, 0xf7, 0xd0, 0x90,
+	0x2e, 0x0d, 0x1c, 0x2c, 0x78, 0xe8, 0xa4, 0xd6, 0x3c, 0x6d, 0x3f, 0x89, 0xe8, 0xde, 0x52, 0x73,
+	0xac, 0xab, 0xfc, 0x69, 0xce, 0xde, 0x91, 0x6b, 0x5b, 0xe2, 0x0c, 0x90, 0x20, 0x78, 0xd9, 0xf2,
+	0xbf, 0x0a, 0xfb, 0x34, 0x67, 0x9b, 0x62, 0xb9, 0x4a, 0x2f, 0xe1, 0xf6, 0x74, 0x8d, 0xc1, 0x78,
+	0x66, 0x3f, 0xca, 0x1a, 0xec, 0xaf, 0xb1, 0xb8, 0x3d, 0x5d, 0x36, 0xd9, 0x33, 0xe7, 0x69, 0x8c,
+	0xad, 0xb5, 0x7e, 0x2d, 0x40, 0x35, 0x19, 0x82, 0x97, 0xaa, 0x7b, 0xdf, 0x76, 0x73, 0xed, 0x03,
+	0xf8, 0x64, 0xac, 0x67, 0x71, 0x36, 0xba, 0x95, 0x04, 0xb1, 0xb0, 0x5a, 0x6c, 0xe1, 0x80, 0x4a,
+	0x67, 0xec, 0x86, 0x3a, 0x23, 0x15, 0xbb, 0xa4, 0xe4, 0xe7, 0x6e, 0x88, 0xee, 0x43, 0xdd, 0x25,
+	0x91, 0x43, 0x98, 0x27, 0xae, 0x43, 0x7d, 0xab, 0x8a, 0xb0, 0x6c, 0xd7, 0x5c, 0x12, 0x9d, 0xcc,
+	0xc0, 0xff, 0xe1, 0x91, 0xc9, 0xbc, 0x6d, 0xc5, 0x7f, 0x7c, 0xdb, 0x4a, 0x99, 0xb7, 0x6d, 0xb5,
+	0xf1, 0xca, 0xff, 0xb9, 0xf1, 0x7a, 0xcb, 0x59, 0x6f, 0x54, 0x74, 0x0d, 0xd7, 0xdb, 0x48, 0x06,
+	0x21, 0xb5, 0x11, 0x8b, 0xad, 0x3f, 0x0d, 0xa8, 0x2d, 0xd6, 0xe9, 0xdd, 0x6f, 0xd0, 0xee, 0x7c,
+	0x83, 0xea, 0xbd, 0x16, 0x35, 0x8a, 0x7a, 0x83, 0xee, 0xad, 0xdd, 0xa0, 0xda, 0xa9, 0xd9, 0xf6,
+	0x4c, 0x5c, 0x5c, 0xf3, 0x44, 0x94, 0xd6, 0x3c, 0x11, 0xed, 0xaf, 0xa0, 0x32, 0x6b, 0x2a, 0x54,
+	0x85, 0xf2, 0x37, 0xe7, 0x17, 0x97, 0xf6, 0x49, 0xf7, 0xb9, 0x99, 0x43, 0x75, 0x80, 0xe3, 0x17,
+	0xfd, 0xb3, 0x44, 0x36, 0xd0, 0x36, 0xd4, 0x7a, 0xd6, 0xb1, 0x65, 0x9f, 0x3c, 0xbb, 0xb4, 0x5e,
+	0x9c, 0x75, 0xbf, 0x36, 0xf3, 0xed, 0x27, 0x60, 0x2e, 0xd7, 0x1d, 0x95, 0xa0, 0xd0, 0xb7, 0x6d,
+	0x33, 0x87, 0x10, 0xd4, 0x2f, 0xa4, 0xa0, 0x9e, 0x3c, 0x4f, 0x2a, 0x6d, 0x1a, 0x08, 0xa0, 0x78,
+	0x7a, 0x3d, 0x10, 0x14, 0x9b, 0xf9, 0x36, 0x83, 0xea, 0xe2, 0xdf, 0x10, 0xda, 0x81, 0xed, 0x45,
+	0xd9, 0x39, 0xe3, 0x8c, 0x98, 0x39, 0x74, 0x1b, 0xb6, 0xb2, 0x70, 0xd7, 0x34, 0xd0, 0x1d, 0xd8,
+	0xcd, 0x80, 0x3d, 0x12, 0xc9, 0x93, 0xe1, 0x90, 0x0b, 0x69, 0xe6, 0x57, 0x0c, 0x75, 0x27, 0x92,
+	0x9b, 0x85, 0xf6, 0xd3, 0xd9, 0x66, 0x4b, 0x3c, 0xad, 0x42, 0x39, 0xdd, 0x33, 0x66, 0x0e, 0xd5,
+	0xa0, 0xd2, 0x9f, 0x89, 0x86, 0x0a, 0xc3, 0x26, 0xd8, 0xcc, 0xa3, 0x32, 0xdc, 0x52, 0x23, 0x6e,
+	0x16, 0xda, 0x3f, 0x1b, 0x70, 0xf7, 0xa6, 0x3f, 0x13, 0x74, 0x1f, 0x3e, 0xbe, 0xe9, 0x7b, 0x1a,
+	0xd1, 0x01, 0x7c, 0x72, 0x23, 0xad, 0x1b, 0x45, 0x13, 0x41, 0xb0, 0x69, 0xa0, 0xcf, 0xe0, 0xc1,
+	0x8d, 0xcc, 0xc5, 0xb0, 0x7b, 0xdf, 0x42, 0x93, 0x0b, 0xff, 0x90, 0x87, 0x84, 0x79, 0x5c, 0xe0,
+	0xc3, 0xf8, 0x47, 0x39, 0xd3, 0x32, 0xdf, 0x3d, 0xf2, 0xa9, 0x1c, 0x4d, 0x06, 0x87, 0x1e, 0x1f,
+	0x77, 0x52, 0x62, 0x27, 0x26, 0x7e, 0x9e, 0xfc, 0x51, 0xbf, 0x7a, 0xd8, 0xf1, 0x79, 0xe6, 0xbf,
+	0x7a, 0x50, 0xd4, 0x9f, 0x1e, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x75, 0x37, 0xf5, 0x7c,
+	0x0b, 0x00, 0x00,
 }
diff --git a/vendor/github.com/opencord/voltha-protos/v3/go/voltha/device.pb.go b/vendor/github.com/opencord/voltha-protos/v3/go/voltha/device.pb.go
index e713544..ebbd8dc 100644
--- a/vendor/github.com/opencord/voltha-protos/v3/go/voltha/device.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/v3/go/voltha/device.pb.go
@@ -901,22 +901,26 @@
 }
 
 type Port struct {
-	PortNo               uint32                  `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
-	Label                string                  `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
-	Type                 Port_PortType           `protobuf:"varint,3,opt,name=type,proto3,enum=voltha.Port_PortType" json:"type,omitempty"`
-	AdminState           common.AdminState_Types `protobuf:"varint,5,opt,name=admin_state,json=adminState,proto3,enum=common.AdminState_Types" json:"admin_state,omitempty"`
-	OperStatus           common.OperStatus_Types `protobuf:"varint,6,opt,name=oper_status,json=operStatus,proto3,enum=common.OperStatus_Types" json:"oper_status,omitempty"`
-	DeviceId             string                  `protobuf:"bytes,7,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
-	Peers                []*Port_PeerPort        `protobuf:"bytes,8,rep,name=peers,proto3" json:"peers,omitempty"`
-	RxPackets            uint64                  `protobuf:"fixed64,9,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
-	RxBytes              uint64                  `protobuf:"fixed64,10,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
-	RxErrors             uint64                  `protobuf:"fixed64,11,opt,name=rx_errors,json=rxErrors,proto3" json:"rx_errors,omitempty"`
-	TxPackets            uint64                  `protobuf:"fixed64,12,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
-	TxBytes              uint64                  `protobuf:"fixed64,13,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
-	TxErrors             uint64                  `protobuf:"fixed64,14,opt,name=tx_errors,json=txErrors,proto3" json:"tx_errors,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
-	XXX_unrecognized     []byte                  `json:"-"`
-	XXX_sizecache        int32                   `json:"-"`
+	PortNo     uint32                  `protobuf:"varint,1,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
+	Label      string                  `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
+	Type       Port_PortType           `protobuf:"varint,3,opt,name=type,proto3,enum=voltha.Port_PortType" json:"type,omitempty"`
+	AdminState common.AdminState_Types `protobuf:"varint,5,opt,name=admin_state,json=adminState,proto3,enum=common.AdminState_Types" json:"admin_state,omitempty"`
+	OperStatus common.OperStatus_Types `protobuf:"varint,6,opt,name=oper_status,json=operStatus,proto3,enum=common.OperStatus_Types" json:"oper_status,omitempty"`
+	DeviceId   string                  `protobuf:"bytes,7,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
+	Peers      []*Port_PeerPort        `protobuf:"bytes,8,rep,name=peers,proto3" json:"peers,omitempty"`
+	RxPackets  uint64                  `protobuf:"fixed64,9,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
+	RxBytes    uint64                  `protobuf:"fixed64,10,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
+	RxErrors   uint64                  `protobuf:"fixed64,11,opt,name=rx_errors,json=rxErrors,proto3" json:"rx_errors,omitempty"`
+	TxPackets  uint64                  `protobuf:"fixed64,12,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
+	TxBytes    uint64                  `protobuf:"fixed64,13,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
+	TxErrors   uint64                  `protobuf:"fixed64,14,opt,name=tx_errors,json=txErrors,proto3" json:"tx_errors,omitempty"`
+	// ofp_port represents the characteristics of a port, e.g. hardware
+	// address and supported features.  This field is relevant only for
+	// UNI and NNI ports.   For PON ports, it can be left empty.
+	OfpPort              *openflow_13.OfpPort `protobuf:"bytes,15,opt,name=ofp_port,json=ofpPort,proto3" json:"ofp_port,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
 }
 
 func (m *Port) Reset()         { *m = Port{} }
@@ -1035,6 +1039,13 @@
 	return 0
 }
 
+func (m *Port) GetOfpPort() *openflow_13.OfpPort {
+	if m != nil {
+		return m.OfpPort
+	}
+	return nil
+}
+
 type Port_PeerPort struct {
 	DeviceId             string   `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
 	PortNo               uint32   `protobuf:"varint,2,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
@@ -1713,153 +1724,154 @@
 func init() { proto.RegisterFile("voltha_protos/device.proto", fileDescriptor_200940f73d155856) }
 
 var fileDescriptor_200940f73d155856 = []byte{
-	// 2359 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x58, 0x4d, 0x73, 0xdb, 0xc6,
-	0xf9, 0x37, 0x29, 0x01, 0x24, 0x1e, 0xbe, 0x08, 0x5e, 0xcb, 0x31, 0x6c, 0xfd, 0x35, 0xf6, 0x9f,
-	0x4e, 0xa7, 0x4a, 0x52, 0x4b, 0x6e, 0xdc, 0x49, 0xd2, 0x43, 0x67, 0x4c, 0x91, 0xb0, 0x8d, 0xa9,
-	0x4a, 0xa9, 0x4b, 0x52, 0x69, 0x7b, 0xc1, 0x40, 0xc4, 0x4a, 0xc2, 0x04, 0x2f, 0xf4, 0x02, 0xa4,
-	0xe5, 0x9c, 0xda, 0x66, 0xd2, 0x53, 0x6f, 0xfd, 0x12, 0xfd, 0x06, 0x3d, 0xb6, 0x33, 0x3d, 0x67,
-	0xfa, 0x1d, 0xda, 0x99, 0x4e, 0x3f, 0x41, 0xce, 0x9d, 0x7d, 0x76, 0x97, 0x04, 0x64, 0xd7, 0x69,
-	0x2f, 0x12, 0xf6, 0xf7, 0xbc, 0xec, 0xee, 0x6f, 0x77, 0x9f, 0x17, 0xc2, 0xbd, 0x65, 0x16, 0x17,
-	0x97, 0x81, 0x3f, 0xe7, 0x59, 0x91, 0xe5, 0x07, 0x21, 0x5b, 0x46, 0x33, 0xb6, 0x8f, 0x23, 0x62,
-	0x4a, 0xd9, 0xbd, 0xbb, 0x17, 0x59, 0x76, 0x11, 0xb3, 0x03, 0x44, 0xcf, 0x16, 0xe7, 0x07, 0x41,
-	0xfa, 0x5a, 0xaa, 0xdc, 0xbb, 0x66, 0x3e, 0xcb, 0x92, 0x24, 0x4b, 0x95, 0xcc, 0xa9, 0xca, 0x12,
-	0x56, 0x04, 0x4a, 0x72, 0xbf, 0x2a, 0xc9, 0xe6, 0x2c, 0x3d, 0x8f, 0xb3, 0x57, 0xfe, 0x0f, 0x9f,
-	0x48, 0x85, 0xde, 0x9f, 0xeb, 0x00, 0x43, 0x5c, 0xca, 0xe4, 0xf5, 0x9c, 0x91, 0x2e, 0xd4, 0xa3,
-	0xd0, 0xa9, 0x3d, 0xa8, 0xed, 0x59, 0xb4, 0x1e, 0x85, 0x64, 0x07, 0xac, 0x25, 0x4b, 0xc3, 0x8c,
-	0xfb, 0x51, 0xe8, 0x18, 0x08, 0x37, 0x25, 0xe0, 0x85, 0x64, 0x17, 0x60, 0x25, 0xcc, 0x1d, 0xf3,
-	0xc1, 0xc6, 0x9e, 0x45, 0x2d, 0x2d, 0xcd, 0x89, 0x03, 0x8d, 0x20, 0x0c, 0xe6, 0x05, 0xe3, 0x4e,
-	0x1d, 0x2d, 0xf5, 0x90, 0x7c, 0x0a, 0x4e, 0x30, 0x9b, 0xb1, 0x79, 0x91, 0xfb, 0x67, 0x8b, 0xf8,
-	0x0b, 0x1f, 0x97, 0xb4, 0x98, 0x87, 0x41, 0xc1, 0x9c, 0x8d, 0x07, 0xb5, 0xbd, 0x26, 0xbd, 0xad,
-	0xe4, 0x87, 0x8b, 0xf8, 0x8b, 0x67, 0x71, 0xf6, 0x6a, 0x8a, 0x42, 0x32, 0x84, 0xfb, 0xda, 0x30,
-	0x08, 0x43, 0x9f, 0xb3, 0x24, 0x5b, 0xb2, 0xb2, 0x79, 0xee, 0x6c, 0xa2, 0xfd, 0x8e, 0x52, 0xeb,
-	0x87, 0x21, 0x45, 0xa5, 0xb5, 0x93, 0x9c, 0x1c, 0xc1, 0x43, 0xed, 0x25, 0x8c, 0x38, 0x9b, 0x15,
-	0x7e, 0x9c, 0x5d, 0x44, 0xb3, 0x20, 0x46, 0x4f, 0xb9, 0x5e, 0x49, 0x03, 0x3d, 0xe9, 0x09, 0x87,
-	0xa8, 0x79, 0x24, 0x15, 0x85, 0xb7, 0x5c, 0xba, 0xeb, 0x7d, 0x0a, 0xad, 0x35, 0x81, 0x39, 0xd9,
-	0x03, 0x23, 0x2a, 0x58, 0x92, 0x3b, 0xb5, 0x07, 0x1b, 0x7b, 0xad, 0x8f, 0xc9, 0xbe, 0x3c, 0x81,
-	0xfd, 0xb5, 0x0e, 0x95, 0x0a, 0xbd, 0xbf, 0xd4, 0xa0, 0x79, 0x92, 0x0c, 0xb2, 0xf4, 0x3c, 0xba,
-	0x20, 0x04, 0x36, 0xd3, 0x20, 0x61, 0x8a, 0x7a, 0xfc, 0x26, 0x1f, 0xc1, 0x66, 0xf1, 0x7a, 0xce,
-	0x90, 0xbd, 0xee, 0xc7, 0x77, 0xb4, 0x27, 0x6d, 0xb3, 0x7f, 0x92, 0xa0, 0x3b, 0x54, 0x12, 0x6c,
-	0xb3, 0x34, 0x38, 0x8b, 0x59, 0xa8, 0x28, 0xd4, 0x43, 0x72, 0x1f, 0x5a, 0x79, 0x90, 0xcc, 0x63,
-	0xe6, 0x9f, 0x73, 0xf6, 0x12, 0x09, 0xea, 0x50, 0x90, 0xd0, 0x33, 0xce, 0x5e, 0xf6, 0x3e, 0x03,
-	0x53, 0xba, 0x22, 0x2d, 0x68, 0x0c, 0x8e, 0xa7, 0xa3, 0x89, 0x4b, 0xed, 0x1b, 0xc4, 0x02, 0xe3,
-	0x79, 0x7f, 0xfa, 0xdc, 0xb5, 0x6b, 0xe2, 0x73, 0x3c, 0xe9, 0x4f, 0x5c, 0xbb, 0x2e, 0x55, 0x46,
-	0x13, 0xf7, 0x17, 0x13, 0x7b, 0xa3, 0xf7, 0x87, 0x1a, 0x74, 0x4e, 0x92, 0xe7, 0x3c, 0x5b, 0xcc,
-	0xd5, 0x3e, 0x76, 0x01, 0x2e, 0xc4, 0xd0, 0x2f, 0xed, 0xc6, 0x42, 0x64, 0x24, 0xb6, 0xb4, 0x12,
-	0xe3, 0x52, 0xea, 0xb8, 0x14, 0x29, 0x16, 0x2b, 0x79, 0xc7, 0x26, 0x3e, 0x84, 0x46, 0xc2, 0x0a,
-	0x1e, 0xcd, 0xc4, 0x09, 0x0b, 0x62, 0xed, 0xeb, 0x74, 0x50, 0xad, 0xd0, 0xfb, 0x67, 0x0d, 0x2c,
-	0x8d, 0xe6, 0x6f, 0x5c, 0xe9, 0xff, 0x87, 0x76, 0xc8, 0xce, 0x83, 0x45, 0x5c, 0x94, 0x17, 0xd1,
-	0x52, 0x18, 0x2e, 0xe3, 0x3e, 0x34, 0x70, 0x4d, 0x7a, 0x19, 0x87, 0xc6, 0xbf, 0xbe, 0xfd, 0x66,
-	0xb7, 0x46, 0x35, 0x4a, 0x3e, 0x84, 0x8e, 0xb0, 0xf5, 0xb3, 0x25, 0xe3, 0x3c, 0x0a, 0x99, 0xbc,
-	0x75, 0x5a, 0xad, 0x2d, 0x64, 0xc7, 0x4a, 0x44, 0x1e, 0x81, 0x89, 0x66, 0xb9, 0x63, 0xe0, 0xc2,
-	0x6f, 0xaf, 0x17, 0x5e, 0x22, 0x8e, 0x2a, 0xa5, 0xf2, 0x46, 0xcd, 0xef, 0xda, 0xe8, 0xdf, 0x6a,
-	0x60, 0x78, 0x49, 0x70, 0xc1, 0xde, 0x7a, 0x7d, 0x1c, 0x68, 0x2c, 0x19, 0xcf, 0xa3, 0x2c, 0xd5,
-	0xef, 0x4f, 0x0d, 0x85, 0xf6, 0x65, 0x90, 0x5f, 0xe2, 0xe6, 0x2c, 0x8a, 0xdf, 0xe4, 0x03, 0xb0,
-	0xa3, 0x34, 0x2f, 0x82, 0x38, 0xf6, 0xc5, 0xb5, 0x2e, 0xa2, 0x44, 0xee, 0xca, 0xa2, 0x5b, 0x0a,
-	0x1f, 0x2a, 0x58, 0x04, 0x85, 0x28, 0xf7, 0x83, 0x59, 0x11, 0x2d, 0x19, 0x06, 0x85, 0x26, 0x6d,
-	0x46, 0x79, 0x1f, 0xc7, 0x82, 0xde, 0x28, 0xf7, 0x45, 0x78, 0x8a, 0x8a, 0x82, 0x85, 0x8e, 0x89,
-	0xf2, 0x56, 0x94, 0x0f, 0x34, 0x44, 0xee, 0x42, 0x33, 0xca, 0xfd, 0x65, 0x10, 0x47, 0xa1, 0x7a,
-	0x64, 0x8d, 0x28, 0x3f, 0x15, 0xc3, 0xde, 0x23, 0x30, 0x71, 0x43, 0x39, 0x79, 0x08, 0x46, 0x24,
-	0xbe, 0xd4, 0x3b, 0xea, 0x68, 0x16, 0x50, 0x4c, 0xa5, 0xac, 0xf7, 0x8f, 0x06, 0x74, 0x10, 0x18,
-	0x66, 0xaf, 0xd2, 0x38, 0x0b, 0xc2, 0x37, 0x4e, 0x5b, 0x13, 0x53, 0x2f, 0x11, 0x63, 0xc3, 0xc6,
-	0x82, 0xc7, 0x6a, 0xf7, 0xe2, 0x53, 0x20, 0x33, 0x3e, 0x53, 0x4f, 0x43, 0x7c, 0x92, 0x63, 0xe8,
-	0x86, 0xca, 0xa7, 0x9f, 0x17, 0x22, 0x1c, 0x18, 0xf8, 0x0a, 0xf7, 0x2a, 0xeb, 0xd0, 0xd3, 0x56,
-	0x47, 0x63, 0xa1, 0x4f, 0x3b, 0x61, 0x79, 0x48, 0x1e, 0x42, 0x07, 0xd7, 0xec, 0xeb, 0x33, 0x31,
-	0x71, 0xfa, 0x36, 0x82, 0xa7, 0xea, 0x60, 0x3e, 0x00, 0x5b, 0x5b, 0xb1, 0xd0, 0x3f, 0x7b, 0x2d,
-	0x02, 0x5a, 0x03, 0x17, 0xb5, 0xb5, 0xc6, 0x0f, 0x05, 0x4c, 0x5e, 0x80, 0xc9, 0x59, 0x90, 0x67,
-	0xa9, 0xd3, 0xc4, 0x85, 0x3d, 0xfe, 0x2f, 0x16, 0xf6, 0x2c, 0x88, 0xe2, 0x05, 0x67, 0x14, 0xed,
-	0xa8, 0xb2, 0x27, 0xdf, 0x87, 0xad, 0x20, 0x0c, 0xa3, 0x22, 0xca, 0xd2, 0x20, 0xf6, 0xa3, 0xf4,
-	0x3c, 0x73, 0x2c, 0x5c, 0x5b, 0x77, 0x0d, 0x7b, 0xe9, 0x79, 0x26, 0x03, 0xc9, 0x92, 0xf9, 0x33,
-	0xbc, 0x86, 0x0e, 0xe0, 0xd1, 0x81, 0x80, 0xd4, 0xe3, 0xdf, 0x01, 0x2b, 0xce, 0x44, 0x1c, 0x0d,
-	0x23, 0xee, 0xb4, 0x64, 0xb6, 0x40, 0x60, 0x18, 0x71, 0xe2, 0x41, 0x4b, 0x12, 0x20, 0xe9, 0x6c,
-	0x7f, 0x27, 0x9d, 0x78, 0xa1, 0x82, 0x82, 0x49, 0x3a, 0x01, 0x8d, 0x25, 0x97, 0x3b, 0x60, 0x9d,
-	0x47, 0x31, 0xf3, 0xf3, 0xe8, 0x4b, 0xe6, 0x74, 0x90, 0x9f, 0xa6, 0x00, 0xc6, 0xd1, 0x97, 0xac,
-	0xf7, 0xa7, 0x1a, 0x90, 0x37, 0x8f, 0x83, 0x6c, 0x83, 0x3d, 0x3c, 0xfe, 0x7c, 0x74, 0x74, 0xdc,
-	0x1f, 0xfa, 0xd3, 0xd1, 0x4f, 0x47, 0xc7, 0x9f, 0x8f, 0xec, 0x1b, 0xe4, 0x3d, 0x20, 0x2b, 0x74,
-	0x3c, 0x1d, 0x0c, 0x5c, 0x77, 0xe8, 0x0e, 0xed, 0x5a, 0x05, 0xa7, 0xee, 0xcf, 0xa7, 0xee, 0x78,
-	0xe2, 0x0e, 0xed, 0x7a, 0xc5, 0xcb, 0x78, 0xd2, 0xa7, 0x02, 0xdd, 0x20, 0xb7, 0x60, 0x6b, 0x85,
-	0x3e, 0xeb, 0x7b, 0x47, 0xee, 0xd0, 0xde, 0x24, 0x0e, 0x6c, 0x97, 0x26, 0x1c, 0x4f, 0x4f, 0x4e,
-	0x8e, 0x51, 0xdd, 0xa8, 0x38, 0x1f, 0xf4, 0x47, 0x03, 0xf7, 0x48, 0x58, 0x98, 0xbd, 0xdf, 0xd5,
-	0xe0, 0xde, 0x7f, 0x3e, 0x2f, 0xd2, 0x86, 0xe6, 0xe8, 0xd8, 0x77, 0x29, 0x3d, 0x16, 0xd1, 0x79,
-	0x0b, 0x5a, 0xde, 0xe8, 0xb4, 0x7f, 0xe4, 0x0d, 0xfd, 0x29, 0x3d, 0xb2, 0x6b, 0x02, 0x18, 0xba,
-	0xa7, 0xde, 0xc0, 0xf5, 0x0f, 0xa7, 0xe3, 0x5f, 0xda, 0x75, 0x31, 0x8d, 0x37, 0x1a, 0x4f, 0x9f,
-	0x3d, 0xf3, 0x06, 0x9e, 0x3b, 0x9a, 0xf8, 0xe3, 0x93, 0xfe, 0xc0, 0xb5, 0x37, 0xc8, 0x4d, 0xe8,
-	0x28, 0x02, 0x94, 0xb3, 0x4d, 0xd2, 0x01, 0x6b, 0xbd, 0x10, 0xa3, 0xf7, 0x7b, 0x4d, 0x61, 0xe5,
-	0x08, 0x84, 0xa1, 0xf7, 0xb3, 0xfe, 0x73, 0xb7, 0xc4, 0x1f, 0x81, 0xae, 0x84, 0xbc, 0x51, 0x7f,
-	0x30, 0xf1, 0x4e, 0x45, 0xb2, 0xd8, 0x06, 0x5b, 0x62, 0x88, 0xf4, 0x27, 0xde, 0xe8, 0xb9, 0x5d,
-	0x27, 0x36, 0xb4, 0x4b, 0xa8, 0x2b, 0x59, 0x93, 0x08, 0x75, 0x4f, 0x5d, 0x8a, 0x6a, 0x9b, 0x6b,
-	0x87, 0x12, 0xc4, 0xe5, 0xfc, 0x04, 0xba, 0x15, 0x5a, 0x72, 0xf2, 0x91, 0x4e, 0xb2, 0xf5, 0x6a,
-	0x48, 0xad, 0xa8, 0xe9, 0x3c, 0xfb, 0xb5, 0x01, 0x9b, 0x27, 0x19, 0x2f, 0xc8, 0x1d, 0x68, 0xcc,
-	0x33, 0x5e, 0xf8, 0x69, 0x86, 0x01, 0xa2, 0x43, 0x4d, 0x31, 0x1c, 0x65, 0x64, 0x1b, 0x8c, 0x38,
-	0x38, 0x63, 0xb1, 0x8a, 0x12, 0x72, 0x40, 0x3e, 0x50, 0xe9, 0x77, 0x03, 0x6f, 0xea, 0x3a, 0x6c,
-	0x67, 0xbc, 0xc0, 0x3f, 0xa5, 0xe4, 0xfb, 0x63, 0x68, 0x05, 0x61, 0x12, 0xa5, 0x95, 0x50, 0xe1,
-	0xec, 0xab, 0x22, 0xad, 0x2f, 0x44, 0x48, 0xe1, 0x3e, 0xd6, 0x08, 0x14, 0x82, 0x15, 0x22, 0x4c,
-	0xb3, 0x39, 0xe3, 0x68, 0xb9, 0xc8, 0x31, 0x2a, 0x94, 0x4c, 0x8f, 0xe7, 0x8c, 0x8f, 0x51, 0xa2,
-	0x4d, 0xb3, 0x15, 0x22, 0x9e, 0x81, 0xac, 0x22, 0x7d, 0x15, 0x48, 0x2d, 0xda, 0x94, 0x80, 0x17,
-	0x0a, 0x8a, 0xe6, 0x8c, 0xf1, 0xdc, 0x69, 0x5e, 0xcb, 0x3a, 0xb8, 0x7c, 0xc6, 0xb8, 0xf8, 0xa0,
-	0x52, 0x47, 0xa4, 0x65, 0x7e, 0xe5, 0xcf, 0x83, 0xd9, 0x17, 0xac, 0xc8, 0xf1, 0xf5, 0x9b, 0xd4,
-	0xe2, 0x57, 0x27, 0x12, 0x10, 0x01, 0x9b, 0x5f, 0xa9, 0x70, 0x04, 0x28, 0x6c, 0xf0, 0x2b, 0x19,
-	0x86, 0x76, 0xc0, 0xe2, 0x57, 0x3e, 0xe3, 0x3c, 0xe3, 0x39, 0x3e, 0x79, 0x93, 0x36, 0xf9, 0x95,
-	0x8b, 0x63, 0xe1, 0xb6, 0x58, 0xbb, 0x6d, 0x4b, 0xb7, 0x45, 0xd9, 0x6d, 0xa1, 0xdd, 0x76, 0xa4,
-	0xdb, 0x62, 0xed, 0xb6, 0x58, 0xb9, 0xed, 0x4a, 0xb7, 0x85, 0x72, 0x7b, 0xef, 0x29, 0x34, 0xf5,
-	0x06, 0xaa, 0x1c, 0xd4, 0xae, 0x71, 0x50, 0x3a, 0xf0, 0x7a, 0xf9, 0xc0, 0x7b, 0x39, 0x34, 0xf5,
-	0x09, 0x8a, 0x82, 0x66, 0x7d, 0x9f, 0x6d, 0x68, 0xbb, 0x93, 0x17, 0x2e, 0x1d, 0xb9, 0x13, 0x7f,
-	0x34, 0xf2, 0xec, 0x5a, 0x05, 0x99, 0x8e, 0x3c, 0x59, 0x01, 0x9d, 0x1c, 0x8f, 0xfc, 0xe3, 0xa3,
-	0x89, 0xbd, 0xb1, 0x1a, 0x8c, 0xa6, 0xf2, 0x19, 0x9d, 0xba, 0x42, 0x51, 0xc8, 0x8c, 0xd2, 0x70,
-	0x34, 0xb5, 0xcd, 0xde, 0x47, 0x60, 0x88, 0x49, 0x73, 0xd2, 0xab, 0x96, 0x88, 0xed, 0xf2, 0xd1,
-	0xe8, 0x4b, 0xfb, 0xd7, 0x36, 0x98, 0xb2, 0x64, 0x24, 0xb7, 0xd7, 0x29, 0x4d, 0x57, 0x18, 0x22,
-	0xb3, 0xdd, 0x2d, 0x55, 0x87, 0x2b, 0x81, 0xbc, 0x8e, 0x77, 0x61, 0x93, 0x67, 0x59, 0x51, 0x2d,
-	0x5e, 0x10, 0x22, 0x3d, 0xb0, 0xe6, 0x01, 0x67, 0x69, 0x21, 0xf8, 0xda, 0x2c, 0x9b, 0x36, 0x25,
-	0x8e, 0x57, 0xa7, 0xab, 0x74, 0x34, 0x7b, 0xdb, 0x82, 0xbd, 0x55, 0x79, 0x23, 0x85, 0x27, 0xf2,
-	0xed, 0xec, 0x82, 0x29, 0x4b, 0x7e, 0xd9, 0x1e, 0x68, 0x25, 0x05, 0x92, 0x1d, 0x30, 0x92, 0x2c,
-	0x64, 0xb1, 0x4c, 0x77, 0x5a, 0x2a, 0x31, 0xf2, 0x18, 0xec, 0xcb, 0x80, 0x87, 0xaf, 0x02, 0xbe,
-	0x4e, 0x8b, 0x8d, 0xb2, 0xde, 0x96, 0x16, 0xeb, 0x04, 0xf9, 0x18, 0xec, 0xf3, 0x88, 0x27, 0x15,
-	0x8b, 0x66, 0xc5, 0x42, 0x8b, 0xb5, 0xc5, 0x23, 0x30, 0x31, 0x73, 0xc8, 0x6b, 0xdd, 0xfa, 0xb8,
-	0x5b, 0x89, 0x15, 0xf9, 0x6a, 0xbd, 0x52, 0x49, 0x54, 0x76, 0x39, 0xe3, 0x51, 0x10, 0xfb, 0xe9,
-	0x22, 0x39, 0x63, 0x1c, 0xef, 0xfb, 0xca, 0x7b, 0x5b, 0xca, 0x46, 0x28, 0x12, 0x5c, 0xae, 0x9b,
-	0x23, 0xa7, 0xc2, 0xe5, 0xaa, 0x47, 0xba, 0xbf, 0x6e, 0x82, 0x5a, 0x65, 0x8d, 0x55, 0x2f, 0x44,
-	0x60, 0x73, 0x19, 0x07, 0x29, 0xbe, 0x8e, 0x0e, 0xc5, 0x6f, 0x91, 0x68, 0x93, 0x60, 0x26, 0x5a,
-	0x1c, 0xce, 0x72, 0xf9, 0x36, 0x2c, 0x0a, 0x49, 0x30, 0xeb, 0x4b, 0x84, 0x3c, 0x84, 0x76, 0x34,
-	0x5f, 0xfe, 0x68, 0xa5, 0x21, 0x5e, 0x88, 0xf5, 0xe2, 0x06, 0x6d, 0x09, 0xb4, 0xaa, 0xf4, 0xc9,
-	0x4a, 0x69, 0xab, 0xa4, 0xf4, 0x89, 0x56, 0x7a, 0x1f, 0x3a, 0x97, 0x59, 0x5e, 0xf8, 0x41, 0x1a,
-	0xe2, 0x69, 0x3b, 0xb7, 0xb5, 0x96, 0x80, 0xfb, 0x69, 0x88, 0xaf, 0x6c, 0x17, 0x80, 0x5d, 0x15,
-	0x3c, 0xf0, 0x03, 0x7e, 0x91, 0x3b, 0x77, 0x64, 0x55, 0x8f, 0x48, 0x9f, 0x5f, 0xe4, 0xe4, 0x29,
-	0x74, 0xe6, 0x3c, 0xbb, 0x7a, 0xbd, 0x9a, 0xea, 0x16, 0x52, 0xbd, 0x53, 0xed, 0x7d, 0xf6, 0x4f,
-	0x84, 0x8e, 0x9a, 0x98, 0xb6, 0xe7, 0xa5, 0xd1, 0xf5, 0x00, 0x6a, 0xff, 0x0f, 0x01, 0xf4, 0x69,
-	0x35, 0x80, 0xde, 0x7c, 0x77, 0x00, 0xd5, 0xfc, 0x97, 0xe3, 0xe8, 0xee, 0xaa, 0x94, 0x7a, 0xaf,
-	0x72, 0x85, 0x55, 0x7d, 0xe4, 0x41, 0x77, 0x96, 0xa5, 0xa9, 0xe8, 0x13, 0xd5, 0x1c, 0x04, 0xe7,
-	0xd8, 0xd1, 0x73, 0x0c, 0xa4, 0xf4, 0x6d, 0xd3, 0x74, 0x66, 0x65, 0x19, 0xf9, 0x01, 0x98, 0xb3,
-	0x45, 0x5e, 0x64, 0x89, 0xf3, 0x14, 0x19, 0xda, 0xde, 0x97, 0x0d, 0xff, 0xbe, 0x6e, 0xf8, 0xf7,
-	0xfb, 0xe9, 0x6b, 0xaa, 0x74, 0xc8, 0x13, 0x30, 0xc4, 0x91, 0xe4, 0xce, 0xaf, 0xdf, 0x12, 0x28,
-	0x0e, 0xbb, 0x7f, 0xff, 0xf6, 0x9b, 0x5d, 0x6b, 0x15, 0xe1, 0xa8, 0xd4, 0x25, 0x8f, 0xc1, 0xc0,
-	0x2e, 0xd6, 0xf9, 0x4d, 0x0d, 0xa7, 0x20, 0xfb, 0xe5, 0xa6, 0x1f, 0x1b, 0xd7, 0x43, 0x43, 0x98,
-	0xde, 0xa0, 0x52, 0x51, 0x10, 0x88, 0x62, 0xd5, 0xa5, 0xfc, 0x56, 0xda, 0xdd, 0x79, 0xc3, 0x0e,
-	0xbb, 0x95, 0x95, 0x31, 0x9c, 0xaf, 0x20, 0xf2, 0x19, 0xc0, 0x3c, 0x51, 0x65, 0x61, 0xee, 0x7c,
-	0x25, 0x1d, 0xdc, 0xbc, 0xde, 0xb7, 0xac, 0x4c, 0xad, 0xf9, 0xaa, 0x39, 0x3b, 0x82, 0x2d, 0x59,
-	0x14, 0xea, 0xf2, 0x36, 0x77, 0xbe, 0xae, 0xbd, 0x23, 0xa7, 0x1f, 0xb6, 0x84, 0x0b, 0x53, 0x16,
-	0xf5, 0xb4, 0x1b, 0x55, 0xca, 0x82, 0x7b, 0x5f, 0xd5, 0xa1, 0x5d, 0xbe, 0x64, 0xef, 0xce, 0x0e,
-	0xf7, 0xa1, 0xa5, 0x84, 0xeb, 0x38, 0x4a, 0x21, 0x5c, 0xff, 0x18, 0xb2, 0x0b, 0x30, 0xbb, 0x0c,
-	0xd2, 0x94, 0xc5, 0xc2, 0x7c, 0x43, 0x36, 0xab, 0x0a, 0xf1, 0x42, 0xb2, 0x07, 0xb6, 0x16, 0xcb,
-	0x9e, 0x56, 0x45, 0xd4, 0x0e, 0xed, 0x2a, 0x1c, 0xe9, 0xf1, 0x42, 0x72, 0x00, 0xb7, 0xb4, 0x66,
-	0xc1, 0x78, 0x12, 0xa5, 0x81, 0xa8, 0xaa, 0xd5, 0xef, 0x29, 0x44, 0x89, 0x26, 0x6b, 0x09, 0xb9,
-	0x0d, 0x66, 0x96, 0x2e, 0x84, 0x43, 0x13, 0x1d, 0x1a, 0x59, 0xba, 0xf0, 0x42, 0xf2, 0x3e, 0x74,
-	0x05, 0x9c, 0xb3, 0x5c, 0x84, 0x36, 0x9d, 0xf5, 0x3b, 0xb4, 0x9d, 0xa5, 0x8b, 0xb1, 0x04, 0xbd,
-	0xf0, 0xd0, 0x12, 0x21, 0x07, 0xf7, 0xdf, 0x3b, 0x80, 0x86, 0x7c, 0x7b, 0xe2, 0xa1, 0x57, 0x92,
-	0x4e, 0xb7, 0xfa, 0x36, 0x75, 0xda, 0xf9, 0xe3, 0x06, 0x6c, 0x8f, 0xa3, 0x64, 0x11, 0x07, 0x05,
-	0xeb, 0xc7, 0x01, 0x4f, 0x28, 0x7b, 0xb9, 0x60, 0x79, 0xf1, 0x46, 0x5f, 0xf5, 0x7f, 0x60, 0x45,
-	0x69, 0x18, 0xcd, 0x82, 0x22, 0xd3, 0x3f, 0xef, 0xac, 0x01, 0x91, 0x78, 0xa3, 0xb4, 0x38, 0xd7,
-	0xb4, 0x59, 0xd4, 0x14, 0x43, 0xb9, 0x03, 0xbc, 0xaf, 0x82, 0x71, 0xf9, 0x13, 0x81, 0xec, 0x31,
-	0xdb, 0x73, 0x95, 0x8e, 0xf1, 0x57, 0x82, 0x1e, 0x74, 0xc4, 0x3e, 0xd7, 0x47, 0x27, 0x99, 0x6a,
-	0x65, 0xe9, 0x62, 0xa8, 0x4f, 0xef, 0x09, 0xbc, 0x17, 0xa5, 0x22, 0x05, 0x30, 0xff, 0x2c, 0x2a,
-	0x64, 0xa9, 0xe0, 0x73, 0x11, 0x3c, 0x04, 0x65, 0x06, 0xbd, 0xa5, 0xa4, 0x87, 0x51, 0x81, 0x65,
-	0x03, 0x95, 0x4d, 0x80, 0x11, 0xf2, 0xe8, 0xbc, 0x40, 0xde, 0x0c, 0x2a, 0x07, 0x62, 0xb5, 0x29,
-	0x7b, 0xe5, 0xb3, 0x97, 0x21, 0xe6, 0x12, 0x83, 0x9a, 0x29, 0x7b, 0xe5, 0xbe, 0x14, 0x6d, 0xfe,
-	0x4d, 0xc9, 0x77, 0x39, 0x21, 0xc8, 0xde, 0x68, 0x0b, 0x29, 0x2f, 0x25, 0x83, 0x17, 0x60, 0x89,
-	0x90, 0x22, 0x4f, 0x16, 0x30, 0x40, 0x7c, 0xa8, 0x39, 0x7e, 0x1b, 0xa3, 0x18, 0x99, 0x50, 0x1b,
-	0xeb, 0xc8, 0xb5, 0x71, 0xef, 0x7b, 0xd0, 0xa9, 0xc8, 0x88, 0x05, 0x06, 0xed, 0x7b, 0x63, 0x57,
-	0xfe, 0x26, 0x33, 0x38, 0x72, 0xfb, 0xd4, 0xae, 0x1d, 0x8e, 0xe1, 0x56, 0xc6, 0x2f, 0xf0, 0x95,
-	0xce, 0x32, 0x1e, 0xaa, 0xb9, 0x0e, 0xdb, 0xa7, 0xf8, 0x5f, 0xf2, 0xf4, 0xab, 0xfd, 0x8b, 0xa8,
-	0xb8, 0x5c, 0x9c, 0x89, 0x48, 0x75, 0xa0, 0x35, 0x0f, 0xa4, 0xe6, 0x23, 0xf5, 0x9b, 0xe0, 0xf2,
-	0xc9, 0xc1, 0x45, 0xa6, 0xb0, 0x33, 0x13, 0xc1, 0x27, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x35,
-	0x16, 0x1c, 0x6d, 0xad, 0x14, 0x00, 0x00,
+	// 2383 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x58, 0x4d, 0x6f, 0xdb, 0xc8,
+	0xf9, 0x8f, 0x64, 0x93, 0x12, 0x1f, 0xbd, 0x98, 0x99, 0x38, 0x1b, 0x26, 0xfe, 0x1b, 0xc9, 0x5f,
+	0xd9, 0xa2, 0xde, 0x6c, 0x63, 0xa7, 0x9b, 0x62, 0x77, 0x7b, 0x28, 0x10, 0x59, 0x62, 0x12, 0xa2,
+	0xae, 0xec, 0x8e, 0x24, 0x6f, 0xdb, 0x0b, 0x41, 0x8b, 0x23, 0x9b, 0x08, 0xc9, 0x51, 0x86, 0x94,
+	0xe3, 0xec, 0xa9, 0xed, 0xa2, 0x3d, 0xf5, 0xd6, 0x2f, 0xd1, 0x6f, 0xb0, 0xc7, 0x16, 0xe8, 0x79,
+	0xd1, 0xef, 0xd0, 0x02, 0x45, 0x3f, 0xc1, 0x9e, 0x8b, 0x79, 0x86, 0x23, 0x91, 0x49, 0x9a, 0x6d,
+	0x2f, 0xb6, 0xe6, 0xf7, 0xbc, 0xcc, 0xcc, 0x6f, 0x66, 0x9e, 0x17, 0xc2, 0x9d, 0x4b, 0x1e, 0xe7,
+	0x17, 0x81, 0xbf, 0x10, 0x3c, 0xe7, 0xd9, 0x41, 0xc8, 0x2e, 0xa3, 0x19, 0xdb, 0xc7, 0x11, 0x31,
+	0x95, 0xec, 0xce, 0xed, 0x73, 0xce, 0xcf, 0x63, 0x76, 0x80, 0xe8, 0xd9, 0x72, 0x7e, 0x10, 0xa4,
+	0xaf, 0x95, 0xca, 0x9d, 0x37, 0xcc, 0x67, 0x3c, 0x49, 0x78, 0x5a, 0xc8, 0x9c, 0xaa, 0x2c, 0x61,
+	0x79, 0x50, 0x48, 0xee, 0x56, 0x25, 0x7c, 0xc1, 0xd2, 0x79, 0xcc, 0x5f, 0xf9, 0x3f, 0x7c, 0xac,
+	0x14, 0x7a, 0x7f, 0xae, 0x03, 0x0c, 0x71, 0x29, 0x93, 0xd7, 0x0b, 0x46, 0xba, 0x50, 0x8f, 0x42,
+	0xa7, 0x76, 0xaf, 0xb6, 0x67, 0xd1, 0x7a, 0x14, 0x92, 0x1d, 0xb0, 0x2e, 0x59, 0x1a, 0x72, 0xe1,
+	0x47, 0xa1, 0x63, 0x20, 0xdc, 0x54, 0x80, 0x17, 0x92, 0x5d, 0x80, 0x95, 0x30, 0x73, 0xcc, 0x7b,
+	0x1b, 0x7b, 0x16, 0xb5, 0xb4, 0x34, 0x23, 0x0e, 0x34, 0x82, 0x30, 0x58, 0xe4, 0x4c, 0x38, 0x75,
+	0xb4, 0xd4, 0x43, 0xf2, 0x19, 0x38, 0xc1, 0x6c, 0xc6, 0x16, 0x79, 0xe6, 0x9f, 0x2d, 0xe3, 0x17,
+	0x3e, 0x2e, 0x69, 0xb9, 0x08, 0x83, 0x9c, 0x39, 0x1b, 0xf7, 0x6a, 0x7b, 0x4d, 0x7a, 0xb3, 0x90,
+	0x1f, 0x2e, 0xe3, 0x17, 0x4f, 0x63, 0xfe, 0x6a, 0x8a, 0x42, 0x32, 0x84, 0xbb, 0xda, 0x30, 0x08,
+	0x43, 0x5f, 0xb0, 0x84, 0x5f, 0xb2, 0xb2, 0x79, 0xe6, 0x6c, 0xa2, 0xfd, 0x4e, 0xa1, 0xd6, 0x0f,
+	0x43, 0x8a, 0x4a, 0x6b, 0x27, 0x19, 0x39, 0x82, 0xfb, 0xda, 0x4b, 0x18, 0x09, 0x36, 0xcb, 0xfd,
+	0x98, 0x9f, 0x47, 0xb3, 0x20, 0x46, 0x4f, 0x99, 0x5e, 0x49, 0x03, 0x3d, 0xe9, 0x09, 0x87, 0xa8,
+	0x79, 0xa4, 0x14, 0xa5, 0xb7, 0x4c, 0xb9, 0xeb, 0x7d, 0x06, 0xad, 0x35, 0x81, 0x19, 0xd9, 0x03,
+	0x23, 0xca, 0x59, 0x92, 0x39, 0xb5, 0x7b, 0x1b, 0x7b, 0xad, 0x4f, 0xc8, 0xbe, 0x3a, 0x81, 0xfd,
+	0xb5, 0x0e, 0x55, 0x0a, 0xbd, 0xbf, 0xd4, 0xa0, 0x79, 0x92, 0x0c, 0x78, 0x3a, 0x8f, 0xce, 0x09,
+	0x81, 0xcd, 0x34, 0x48, 0x58, 0x41, 0x3d, 0xfe, 0x26, 0x1f, 0xc3, 0x66, 0xfe, 0x7a, 0xc1, 0x90,
+	0xbd, 0xee, 0x27, 0xb7, 0xb4, 0x27, 0x6d, 0xb3, 0x7f, 0x92, 0xa0, 0x3b, 0x54, 0x92, 0x6c, 0xb3,
+	0x34, 0x38, 0x8b, 0x59, 0x58, 0x50, 0xa8, 0x87, 0xe4, 0x2e, 0xb4, 0xb2, 0x20, 0x59, 0xc4, 0xcc,
+	0x9f, 0x0b, 0xf6, 0x12, 0x09, 0xea, 0x50, 0x50, 0xd0, 0x53, 0xc1, 0x5e, 0xf6, 0x3e, 0x07, 0x53,
+	0xb9, 0x22, 0x2d, 0x68, 0x0c, 0x8e, 0xa7, 0xa3, 0x89, 0x4b, 0xed, 0x6b, 0xc4, 0x02, 0xe3, 0x59,
+	0x7f, 0xfa, 0xcc, 0xb5, 0x6b, 0xf2, 0xe7, 0x78, 0xd2, 0x9f, 0xb8, 0x76, 0x5d, 0xa9, 0x8c, 0x26,
+	0xee, 0x2f, 0x26, 0xf6, 0x46, 0xef, 0x8f, 0x35, 0xe8, 0x9c, 0x24, 0xcf, 0x04, 0x5f, 0x2e, 0x8a,
+	0x7d, 0xec, 0x02, 0x9c, 0xcb, 0xa1, 0x5f, 0xda, 0x8d, 0x85, 0xc8, 0x48, 0x6e, 0x69, 0x25, 0xc6,
+	0xa5, 0xd4, 0x71, 0x29, 0x4a, 0x2c, 0x57, 0xf2, 0x9e, 0x4d, 0x3c, 0x80, 0x46, 0xc2, 0x72, 0x11,
+	0xcd, 0xe4, 0x09, 0x4b, 0x62, 0xed, 0x37, 0xe9, 0xa0, 0x5a, 0xa1, 0xf7, 0xcf, 0x1a, 0x58, 0x1a,
+	0xcd, 0xde, 0xba, 0xd2, 0xff, 0x0f, 0xed, 0x90, 0xcd, 0x83, 0x65, 0x9c, 0x97, 0x17, 0xd1, 0x2a,
+	0x30, 0x5c, 0xc6, 0x5d, 0x68, 0xe0, 0x9a, 0xf4, 0x32, 0x0e, 0x8d, 0x7f, 0x7d, 0xfb, 0xcd, 0x6e,
+	0x8d, 0x6a, 0x94, 0x3c, 0x80, 0x8e, 0xb4, 0xf5, 0xf9, 0x25, 0x13, 0x22, 0x0a, 0x99, 0xba, 0x75,
+	0x5a, 0xad, 0x2d, 0x65, 0xc7, 0x85, 0x88, 0x3c, 0x04, 0x13, 0xcd, 0x32, 0xc7, 0xc0, 0x85, 0xdf,
+	0x5c, 0x2f, 0xbc, 0x44, 0x1c, 0x2d, 0x94, 0xca, 0x1b, 0x35, 0xbf, 0x6b, 0xa3, 0x7f, 0xab, 0x81,
+	0xe1, 0x25, 0xc1, 0x39, 0x7b, 0xe7, 0xf5, 0x71, 0xa0, 0x71, 0xc9, 0x44, 0x16, 0xf1, 0x54, 0xbf,
+	0xbf, 0x62, 0x28, 0xb5, 0x2f, 0x82, 0xec, 0x02, 0x37, 0x67, 0x51, 0xfc, 0x4d, 0x3e, 0x02, 0x3b,
+	0x4a, 0xb3, 0x3c, 0x88, 0x63, 0x5f, 0x5e, 0xeb, 0x3c, 0x4a, 0xd4, 0xae, 0x2c, 0xba, 0x55, 0xe0,
+	0xc3, 0x02, 0x96, 0x41, 0x21, 0xca, 0xfc, 0x60, 0x96, 0x47, 0x97, 0x0c, 0x83, 0x42, 0x93, 0x36,
+	0xa3, 0xac, 0x8f, 0x63, 0x49, 0x6f, 0x94, 0xf9, 0x32, 0x3c, 0x45, 0x79, 0xce, 0x42, 0xc7, 0x44,
+	0x79, 0x2b, 0xca, 0x06, 0x1a, 0x22, 0xb7, 0xa1, 0x19, 0x65, 0xfe, 0x65, 0x10, 0x47, 0x61, 0xf1,
+	0xc8, 0x1a, 0x51, 0x76, 0x2a, 0x87, 0xbd, 0x87, 0x60, 0xe2, 0x86, 0x32, 0x72, 0x1f, 0x8c, 0x48,
+	0xfe, 0x2a, 0xde, 0x51, 0x47, 0xb3, 0x80, 0x62, 0xaa, 0x64, 0xbd, 0x7f, 0x34, 0xa0, 0x83, 0xc0,
+	0x90, 0xbf, 0x4a, 0x63, 0x1e, 0x84, 0x6f, 0x9d, 0xb6, 0x26, 0xa6, 0x5e, 0x22, 0xc6, 0x86, 0x8d,
+	0xa5, 0x88, 0x8b, 0xdd, 0xcb, 0x9f, 0x12, 0x99, 0x89, 0x59, 0xf1, 0x34, 0xe4, 0x4f, 0x72, 0x0c,
+	0xdd, 0xb0, 0xf0, 0xe9, 0x67, 0xb9, 0x0c, 0x07, 0x06, 0xbe, 0xc2, 0xbd, 0xca, 0x3a, 0xf4, 0xb4,
+	0xd5, 0xd1, 0x58, 0xea, 0xd3, 0x4e, 0x58, 0x1e, 0x92, 0xfb, 0xd0, 0xc1, 0x35, 0xfb, 0xfa, 0x4c,
+	0x4c, 0x9c, 0xbe, 0x8d, 0xe0, 0x69, 0x71, 0x30, 0x1f, 0x81, 0xad, 0xad, 0x58, 0xe8, 0x9f, 0xbd,
+	0x96, 0x01, 0xad, 0x81, 0x8b, 0xda, 0x5a, 0xe3, 0x87, 0x12, 0x26, 0xcf, 0xc1, 0x14, 0x2c, 0xc8,
+	0x78, 0xea, 0x34, 0x71, 0x61, 0x8f, 0xfe, 0x8b, 0x85, 0x3d, 0x0d, 0xa2, 0x78, 0x29, 0x18, 0x45,
+	0x3b, 0x5a, 0xd8, 0x93, 0xef, 0xc3, 0x56, 0x10, 0x86, 0x51, 0x1e, 0xf1, 0x34, 0x88, 0xfd, 0x28,
+	0x9d, 0x73, 0xc7, 0xc2, 0xb5, 0x75, 0xd7, 0xb0, 0x97, 0xce, 0xb9, 0x0a, 0x24, 0x97, 0xcc, 0x9f,
+	0xe1, 0x35, 0x74, 0x00, 0x8f, 0x0e, 0x24, 0x54, 0x3c, 0xfe, 0x1d, 0xb0, 0x62, 0x2e, 0xe3, 0x68,
+	0x18, 0x09, 0xa7, 0xa5, 0xb2, 0x05, 0x02, 0xc3, 0x48, 0x10, 0x0f, 0x5a, 0x8a, 0x00, 0x45, 0x67,
+	0xfb, 0x3b, 0xe9, 0xc4, 0x0b, 0x15, 0xe4, 0x4c, 0xd1, 0x09, 0x68, 0xac, 0xb8, 0xdc, 0x01, 0x6b,
+	0x1e, 0xc5, 0xcc, 0xcf, 0xa2, 0x2f, 0x99, 0xd3, 0x41, 0x7e, 0x9a, 0x12, 0x18, 0x47, 0x5f, 0xb2,
+	0xde, 0xd7, 0x35, 0x20, 0x6f, 0x1f, 0x07, 0xd9, 0x06, 0x7b, 0x78, 0xfc, 0xc5, 0xe8, 0xe8, 0xb8,
+	0x3f, 0xf4, 0xa7, 0xa3, 0x9f, 0x8e, 0x8e, 0xbf, 0x18, 0xd9, 0xd7, 0xc8, 0x07, 0x40, 0x56, 0xe8,
+	0x78, 0x3a, 0x18, 0xb8, 0xee, 0xd0, 0x1d, 0xda, 0xb5, 0x0a, 0x4e, 0xdd, 0x9f, 0x4f, 0xdd, 0xf1,
+	0xc4, 0x1d, 0xda, 0xf5, 0x8a, 0x97, 0xf1, 0xa4, 0x4f, 0x25, 0xba, 0x41, 0x6e, 0xc0, 0xd6, 0x0a,
+	0x7d, 0xda, 0xf7, 0x8e, 0xdc, 0xa1, 0xbd, 0x49, 0x1c, 0xd8, 0x2e, 0x4d, 0x38, 0x9e, 0x9e, 0x9c,
+	0x1c, 0xa3, 0xba, 0x51, 0x71, 0x3e, 0xe8, 0x8f, 0x06, 0xee, 0x91, 0xb4, 0x30, 0x7b, 0xbf, 0xaf,
+	0xc1, 0x9d, 0xff, 0x7c, 0x5e, 0xa4, 0x0d, 0xcd, 0xd1, 0xb1, 0xef, 0x52, 0x7a, 0x2c, 0xa3, 0xf3,
+	0x16, 0xb4, 0xbc, 0xd1, 0x69, 0xff, 0xc8, 0x1b, 0xfa, 0x53, 0x7a, 0x64, 0xd7, 0x24, 0x30, 0x74,
+	0x4f, 0xbd, 0x81, 0xeb, 0x1f, 0x4e, 0xc7, 0xbf, 0xb4, 0xeb, 0x72, 0x1a, 0x6f, 0x34, 0x9e, 0x3e,
+	0x7d, 0xea, 0x0d, 0x3c, 0x77, 0x34, 0xf1, 0xc7, 0x27, 0xfd, 0x81, 0x6b, 0x6f, 0x90, 0xeb, 0xd0,
+	0x29, 0x08, 0x28, 0x9c, 0x6d, 0x92, 0x0e, 0x58, 0xeb, 0x85, 0x18, 0xbd, 0x3f, 0x68, 0x0a, 0x2b,
+	0x47, 0x20, 0x0d, 0xbd, 0x9f, 0xf5, 0x9f, 0xb9, 0x25, 0xfe, 0x08, 0x74, 0x15, 0xe4, 0x8d, 0xfa,
+	0x83, 0x89, 0x77, 0x2a, 0x93, 0xc5, 0x36, 0xd8, 0x0a, 0x43, 0xa4, 0x3f, 0xf1, 0x46, 0xcf, 0xec,
+	0x3a, 0xb1, 0xa1, 0x5d, 0x42, 0x5d, 0xc5, 0x9a, 0x42, 0xa8, 0x7b, 0xea, 0x52, 0x54, 0xdb, 0x5c,
+	0x3b, 0x54, 0x20, 0x2e, 0xe7, 0x27, 0xd0, 0xad, 0xd0, 0x92, 0x91, 0x8f, 0x75, 0x92, 0xad, 0x57,
+	0x43, 0x6a, 0x45, 0x4d, 0xe7, 0xd9, 0xaf, 0x0d, 0xd8, 0x3c, 0xe1, 0x22, 0x27, 0xb7, 0xa0, 0xb1,
+	0xe0, 0x22, 0xf7, 0x53, 0x8e, 0x01, 0xa2, 0x43, 0x4d, 0x39, 0x1c, 0x71, 0xb2, 0x0d, 0x46, 0x1c,
+	0x9c, 0xb1, 0xb8, 0x88, 0x12, 0x6a, 0x40, 0x3e, 0x2a, 0xd2, 0xef, 0x06, 0xde, 0xd4, 0x75, 0xd8,
+	0xe6, 0x22, 0xc7, 0x3f, 0xa5, 0xe4, 0xfb, 0x63, 0x68, 0x05, 0x61, 0x12, 0xa5, 0x95, 0x50, 0xe1,
+	0xec, 0x17, 0x45, 0x5a, 0x5f, 0x8a, 0x90, 0xc2, 0x7d, 0xac, 0x11, 0x28, 0x04, 0x2b, 0x44, 0x9a,
+	0xf2, 0x05, 0x13, 0x68, 0xb9, 0xcc, 0x30, 0x2a, 0x94, 0x4c, 0x8f, 0x17, 0x4c, 0x8c, 0x51, 0xa2,
+	0x4d, 0xf9, 0x0a, 0x91, 0xcf, 0x40, 0x55, 0x91, 0x7e, 0x11, 0x48, 0x2d, 0xda, 0x54, 0x80, 0x17,
+	0x4a, 0x8a, 0x16, 0x8c, 0x89, 0xcc, 0x69, 0xbe, 0x91, 0x75, 0x70, 0xf9, 0x8c, 0x09, 0xf9, 0x83,
+	0x2a, 0x1d, 0x99, 0x96, 0xc5, 0x95, 0xbf, 0x08, 0x66, 0x2f, 0x58, 0x9e, 0xe1, 0xeb, 0x37, 0xa9,
+	0x25, 0xae, 0x4e, 0x14, 0x20, 0x03, 0xb6, 0xb8, 0x2a, 0xc2, 0x11, 0xa0, 0xb0, 0x21, 0xae, 0x54,
+	0x18, 0xda, 0x01, 0x4b, 0x5c, 0xf9, 0x4c, 0x08, 0x2e, 0x32, 0x7c, 0xf2, 0x26, 0x6d, 0x8a, 0x2b,
+	0x17, 0xc7, 0xd2, 0x6d, 0xbe, 0x76, 0xdb, 0x56, 0x6e, 0xf3, 0xb2, 0xdb, 0x5c, 0xbb, 0xed, 0x28,
+	0xb7, 0xf9, 0xda, 0x6d, 0xbe, 0x72, 0xdb, 0x55, 0x6e, 0x73, 0xed, 0xf6, 0x11, 0x34, 0xf9, 0x7c,
+	0xe1, 0xcb, 0xc3, 0x73, 0xb6, 0xee, 0xd5, 0x70, 0x77, 0xe5, 0xca, 0x56, 0x0b, 0x69, 0x83, 0xcf,
+	0x17, 0x72, 0x9b, 0x77, 0x9e, 0x40, 0x53, 0x6f, 0xb9, 0xca, 0x5a, 0xed, 0x0d, 0xd6, 0x4a, 0x57,
+	0xa4, 0x5e, 0xbe, 0x22, 0xbd, 0x0c, 0x9a, 0xfa, 0xcc, 0x65, 0x09, 0xb4, 0x7e, 0x01, 0x36, 0xb4,
+	0xdd, 0xc9, 0x73, 0x97, 0x8e, 0xdc, 0x89, 0x3f, 0x1a, 0x79, 0x76, 0xad, 0x82, 0x4c, 0x47, 0x9e,
+	0xaa, 0x99, 0x4e, 0x8e, 0x47, 0xfe, 0xf1, 0xd1, 0xc4, 0xde, 0x58, 0x0d, 0x46, 0x53, 0xf5, 0xf0,
+	0x4e, 0x5d, 0xa9, 0x28, 0x65, 0x46, 0x69, 0x38, 0x9a, 0xda, 0x66, 0xef, 0x63, 0x30, 0xe4, 0xa4,
+	0x19, 0xe9, 0x55, 0x8b, 0xca, 0x76, 0xf9, 0x30, 0xf5, 0x35, 0xff, 0x6b, 0x1b, 0x4c, 0x55, 0x64,
+	0x92, 0x9b, 0xeb, 0x24, 0xa8, 0x6b, 0x12, 0x99, 0x0b, 0x6f, 0x97, 0xea, 0xc9, 0x95, 0x40, 0x5d,
+	0xe0, 0xdb, 0xb0, 0x29, 0x38, 0xcf, 0xab, 0xe5, 0x0e, 0x42, 0xa4, 0x07, 0xd6, 0x22, 0x10, 0x2c,
+	0xcd, 0x25, 0x5f, 0x9b, 0x65, 0xd3, 0xa6, 0xc2, 0xf1, 0xb2, 0x75, 0x0b, 0x1d, 0xcd, 0xde, 0xb6,
+	0x64, 0x6f, 0x55, 0x10, 0x29, 0xe1, 0x89, 0x7a, 0x6d, 0xbb, 0x60, 0xaa, 0x26, 0x41, 0x35, 0x14,
+	0x5a, 0xa9, 0x00, 0xc9, 0x0e, 0x18, 0x09, 0x0f, 0x59, 0xac, 0x12, 0xa4, 0x96, 0x2a, 0x8c, 0x3c,
+	0x02, 0xfb, 0x22, 0x10, 0xe1, 0xab, 0x40, 0xac, 0x13, 0x69, 0xa3, 0xac, 0xb7, 0xa5, 0xc5, 0x3a,
+	0xa5, 0x3e, 0x02, 0x7b, 0x1e, 0x89, 0xa4, 0x62, 0xd1, 0xac, 0x58, 0x68, 0xb1, 0xb6, 0x78, 0x08,
+	0x26, 0xe6, 0x1a, 0xf5, 0x10, 0x5a, 0x9f, 0x74, 0x2b, 0xd1, 0x25, 0x5b, 0xad, 0x57, 0x29, 0xc9,
+	0x5a, 0x30, 0x63, 0x22, 0x0a, 0x62, 0x3f, 0x5d, 0x26, 0x67, 0x4c, 0xe0, 0x0b, 0x59, 0x79, 0x6f,
+	0x2b, 0xd9, 0x08, 0x45, 0x92, 0xcb, 0x75, 0x3b, 0xe5, 0x54, 0xb8, 0x5c, 0x75, 0x55, 0x77, 0xd7,
+	0x6d, 0x53, 0xab, 0xac, 0xb1, 0xea, 0x9e, 0x08, 0x6c, 0x5e, 0xc6, 0x41, 0x8a, 0xef, 0xa9, 0x43,
+	0xf1, 0xb7, 0x4c, 0xcd, 0x49, 0x30, 0x93, 0x4d, 0x91, 0x60, 0x99, 0x7a, 0x4d, 0x16, 0x85, 0x24,
+	0x98, 0xf5, 0x15, 0x42, 0xee, 0x43, 0x3b, 0x5a, 0x5c, 0xfe, 0x68, 0xa5, 0x21, 0xdf, 0x94, 0xf5,
+	0xfc, 0x1a, 0x6d, 0x49, 0xb4, 0xaa, 0xf4, 0xe9, 0x4a, 0x69, 0xab, 0xa4, 0xf4, 0xa9, 0x56, 0xfa,
+	0x10, 0x3a, 0x17, 0x3c, 0xcb, 0xfd, 0x20, 0x0d, 0xd5, 0x13, 0xbc, 0xa9, 0xb5, 0x24, 0xdc, 0x4f,
+	0x43, 0x7c, 0x65, 0xbb, 0x00, 0xec, 0x2a, 0x17, 0x81, 0x1f, 0x88, 0xf3, 0xcc, 0xb9, 0xa5, 0xfa,
+	0x00, 0x44, 0xfa, 0xe2, 0x3c, 0x23, 0x4f, 0xa0, 0xb3, 0x10, 0xfc, 0xea, 0xf5, 0x6a, 0xaa, 0x1b,
+	0x48, 0xf5, 0x4e, 0xb5, 0x5b, 0xda, 0x3f, 0x91, 0x3a, 0xc5, 0xc4, 0xb4, 0xbd, 0x28, 0x8d, 0xde,
+	0x0c, 0xb9, 0xf6, 0xff, 0x10, 0x72, 0x9f, 0x54, 0x43, 0xee, 0xf5, 0xf7, 0x87, 0x5c, 0xcd, 0x7f,
+	0x39, 0xf2, 0xee, 0xae, 0x8a, 0xaf, 0x0f, 0x2a, 0x57, 0xb8, 0xa8, 0xa8, 0x3c, 0xe8, 0xce, 0x78,
+	0x9a, 0xca, 0xce, 0xb2, 0x98, 0x83, 0xe0, 0x1c, 0x3b, 0x7a, 0x8e, 0x81, 0x92, 0xbe, 0x6b, 0x9a,
+	0xce, 0xac, 0x2c, 0x23, 0x3f, 0x00, 0x73, 0xb6, 0xcc, 0x72, 0x9e, 0x38, 0x4f, 0x90, 0xa1, 0xed,
+	0x7d, 0xf5, 0x89, 0x60, 0x5f, 0x7f, 0x22, 0xd8, 0xef, 0xa7, 0xaf, 0x69, 0xa1, 0x43, 0x1e, 0x83,
+	0x21, 0x8f, 0x24, 0x73, 0x7e, 0xfd, 0x8e, 0x40, 0x71, 0xd8, 0xfd, 0xfb, 0xb7, 0xdf, 0xec, 0x5a,
+	0xab, 0x08, 0x47, 0x95, 0x2e, 0x79, 0x04, 0x06, 0xf6, 0xbd, 0xce, 0x6f, 0x6a, 0x38, 0x05, 0xa9,
+	0x04, 0x53, 0x6c, 0x75, 0x0f, 0x0d, 0x69, 0x7a, 0x8d, 0x2a, 0x45, 0x49, 0x20, 0x8a, 0x8b, 0xbe,
+	0xe6, 0xb7, 0xca, 0xee, 0xd6, 0x5b, 0x76, 0xd8, 0xdf, 0xac, 0x8c, 0x61, 0xbe, 0x82, 0xc8, 0xe7,
+	0x00, 0x8b, 0xa4, 0x28, 0x24, 0x33, 0xe7, 0x2b, 0xe5, 0xe0, 0xfa, 0x9b, 0x9d, 0xce, 0xca, 0xd4,
+	0x5a, 0xac, 0xda, 0xb9, 0x23, 0xd8, 0x52, 0x65, 0xa4, 0x2e, 0x88, 0x33, 0xe7, 0x77, 0xb5, 0xf7,
+	0x54, 0x01, 0x87, 0x2d, 0xe9, 0xc2, 0x54, 0x6d, 0x00, 0xed, 0x46, 0x95, 0x42, 0xe2, 0xce, 0x57,
+	0x75, 0x68, 0x97, 0x2f, 0xd9, 0xfb, 0xb3, 0xc3, 0x5d, 0x68, 0x15, 0xc2, 0x75, 0x1c, 0xa5, 0x10,
+	0xae, 0x3f, 0x9f, 0xec, 0x02, 0xcc, 0x2e, 0x82, 0x34, 0x65, 0xb1, 0x34, 0xdf, 0x50, 0xed, 0x6d,
+	0x81, 0x78, 0x21, 0xd9, 0x03, 0x5b, 0x8b, 0x55, 0x17, 0x5c, 0x44, 0xd4, 0x0e, 0xed, 0x16, 0x38,
+	0xd2, 0xe3, 0x85, 0xe4, 0x00, 0x6e, 0x68, 0xcd, 0x9c, 0x89, 0x24, 0x4a, 0x03, 0x59, 0x87, 0x17,
+	0x5f, 0x60, 0x48, 0x21, 0x9a, 0xac, 0x25, 0xe4, 0x26, 0x98, 0x3c, 0x5d, 0x4a, 0x87, 0x26, 0x3a,
+	0x34, 0x78, 0xba, 0xf4, 0x42, 0xf2, 0x21, 0x74, 0x25, 0x9c, 0xb1, 0x4c, 0x86, 0x36, 0x5d, 0x27,
+	0x74, 0x68, 0x9b, 0xa7, 0xcb, 0xb1, 0x02, 0xbd, 0xf0, 0xd0, 0x92, 0x21, 0x07, 0xf7, 0xdf, 0x3b,
+	0x80, 0x86, 0x7a, 0x7b, 0xf2, 0xa1, 0x57, 0x92, 0x4e, 0xb7, 0xfa, 0x36, 0x75, 0xda, 0xf9, 0xd3,
+	0x06, 0x6c, 0x8f, 0xa3, 0x64, 0x19, 0x07, 0x39, 0xeb, 0xc7, 0x81, 0x48, 0x28, 0x7b, 0xb9, 0x64,
+	0x59, 0xfe, 0x56, 0x27, 0xf6, 0x7f, 0x60, 0x45, 0x69, 0x18, 0xcd, 0x82, 0x9c, 0xeb, 0x0f, 0x42,
+	0x6b, 0x40, 0x26, 0xde, 0x28, 0xcd, 0xe7, 0x9a, 0x36, 0x8b, 0x9a, 0x72, 0xa8, 0x76, 0x80, 0xf7,
+	0x55, 0x32, 0xae, 0x3e, 0x2a, 0xa8, 0xae, 0xb4, 0xbd, 0x28, 0xd2, 0x31, 0x7e, 0x57, 0xe8, 0x41,
+	0x47, 0xee, 0x73, 0x7d, 0x74, 0x8a, 0xa9, 0x16, 0x4f, 0x97, 0x43, 0x7d, 0x7a, 0x8f, 0xe1, 0x83,
+	0x28, 0x95, 0x29, 0x80, 0xf9, 0x67, 0x51, 0xae, 0x8a, 0x0b, 0x5f, 0xc8, 0xe0, 0x21, 0x29, 0x33,
+	0xe8, 0x8d, 0x42, 0x7a, 0x18, 0xe5, 0x58, 0x68, 0x50, 0xd5, 0x36, 0x18, 0xa1, 0x88, 0xe6, 0x39,
+	0xf2, 0x66, 0x50, 0x35, 0x90, 0xab, 0x4d, 0xd9, 0x2b, 0x9f, 0xbd, 0x0c, 0x31, 0x97, 0x18, 0xd4,
+	0x4c, 0xd9, 0x2b, 0xf7, 0x65, 0x48, 0x1e, 0xc0, 0x75, 0xc5, 0x77, 0x39, 0x21, 0xa8, 0x6e, 0x6a,
+	0x0b, 0x29, 0x2f, 0x25, 0x83, 0xe7, 0x60, 0xc9, 0x90, 0xa2, 0x4e, 0x16, 0x30, 0x40, 0x3c, 0xd0,
+	0x1c, 0xbf, 0x8b, 0x51, 0x8c, 0x4c, 0xa8, 0x8d, 0x95, 0xe7, 0xda, 0xb8, 0xf7, 0x3d, 0xe8, 0x54,
+	0x64, 0xc4, 0x02, 0x83, 0xf6, 0xbd, 0xb1, 0xab, 0xbe, 0xe2, 0x0c, 0x8e, 0xdc, 0x3e, 0xb5, 0x6b,
+	0x87, 0x63, 0xb8, 0xc1, 0xc5, 0x39, 0xbe, 0xd2, 0x19, 0x17, 0x61, 0x31, 0xd7, 0x61, 0xfb, 0x14,
+	0xff, 0x2b, 0x9e, 0x7e, 0xb5, 0x7f, 0x1e, 0xe5, 0x17, 0xcb, 0x33, 0x19, 0xa9, 0x0e, 0xb4, 0xe6,
+	0x81, 0xd2, 0x7c, 0x58, 0x7c, 0x45, 0xbc, 0x7c, 0x7c, 0x70, 0xce, 0x0b, 0xec, 0xcc, 0x44, 0xf0,
+	0xf1, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x4e, 0x2a, 0x8d, 0xf0, 0xdf, 0x14, 0x00, 0x00,
 }