Getting openonu go to work with latest rw-core master

Change-Id: Iab3a1ec7de438cce8b865737d6f34447f1723298
diff --git a/vendor/github.com/buraksezer/consistent/.gitignore b/vendor/github.com/buraksezer/consistent/.gitignore
new file mode 100644
index 0000000..a1338d6
--- /dev/null
+++ b/vendor/github.com/buraksezer/consistent/.gitignore
@@ -0,0 +1,14 @@
+# Binaries for programs and plugins
+*.exe
+*.dll
+*.so
+*.dylib
+
+# Test binary, build with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
+.glide/
diff --git a/vendor/github.com/buraksezer/consistent/.travis.yml b/vendor/github.com/buraksezer/consistent/.travis.yml
new file mode 100644
index 0000000..4f2ee4d
--- /dev/null
+++ b/vendor/github.com/buraksezer/consistent/.travis.yml
@@ -0,0 +1 @@
+language: go
diff --git a/vendor/github.com/buraksezer/consistent/LICENSE b/vendor/github.com/buraksezer/consistent/LICENSE
new file mode 100644
index 0000000..e470334
--- /dev/null
+++ b/vendor/github.com/buraksezer/consistent/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Burak Sezer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/buraksezer/consistent/README.md b/vendor/github.com/buraksezer/consistent/README.md
new file mode 100644
index 0000000..bde53d1
--- /dev/null
+++ b/vendor/github.com/buraksezer/consistent/README.md
@@ -0,0 +1,235 @@
+consistent
+==========
+[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/buraksezer/consistent) [![Build Status](https://travis-ci.org/buraksezer/consistent.svg?branch=master)](https://travis-ci.org/buraksezer/consistent) [![Coverage](http://gocover.io/_badge/github.com/buraksezer/consistent)](http://gocover.io/github.com/buraksezer/consistent) [![Go Report Card](https://goreportcard.com/badge/github.com/buraksezer/consistent)](https://goreportcard.com/report/github.com/buraksezer/consistent) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go)  
+
+
+This library provides a consistent hashing function which simultaneously achieves both uniformity and consistency. 
+
+For detailed information about the concept, you should take a look at the following resources:
+
+* [Consistent Hashing with Bounded Loads on Google Research Blog](https://research.googleblog.com/2017/04/consistent-hashing-with-bounded-loads.html)
+* [Improving load balancing with a new consistent-hashing algorithm on Vimeo Engineering Blog](https://medium.com/vimeo-engineering-blog/improving-load-balancing-with-a-new-consistent-hashing-algorithm-9f1bd75709ed)
+* [Consistent Hashing with Bounded Loads paper on arXiv](https://arxiv.org/abs/1608.01350)
+
+Table of Content
+----------------
+
+- [Overview](#overview)
+- [Install](#install)
+- [Configuration](#configuration)
+- [Usage](#usage)
+- [Benchmarks](#benchmarks)
+- [Examples](#examples)
+
+Overview
+--------
+
+In this package's context, the keys are distributed among partitions and partitions are distributed among members as well. 
+
+When you create a new consistent instance or call `Add/Remove`:
+
+* The member's name is hashed and inserted into the hash ring,
+* Average load is calculated by the algorithm defined in the paper,
+* Partitions are distributed among members by hashing partition IDs and none of them exceed the average load.
+
+Average load cannot be exceeded. So if all members are loaded at the maximum while trying to add a new member, it panics.
+
+When you want to locate a key by calling `LocateKey`:
+
+* The key(byte slice) is hashed,
+* The result of the hash is mod by the number of partitions,
+* The result of this modulo - `MOD(hash result, partition count)` - is the partition in which the key will be located,
+* Owner of the partition is already determined before calling `LocateKey`. So it returns the partition owner immediately.
+
+No memory is allocated by `consistent` except hashing when you want to locate a key.
+
+Note that the number of partitions cannot be changed after creation. 
+
+Install
+-------
+
+With a correctly configured Go environment:
+
+```
+go get github.com/buraksezer/consistent
+```
+
+You will find some useful usage samples in [examples](https://github.com/buraksezer/consistent/tree/master/_examples) folder.
+
+Configuration
+-------------
+
+```go
+type Config struct {
+	// Hasher is responsible for generating unsigned, 64 bit hash of provided byte slice.
+	Hasher Hasher
+
+	// Keys are distributed among partitions. Prime numbers are good to
+	// distribute keys uniformly. Select a big PartitionCount if you have
+	// too many keys.
+	PartitionCount int
+
+	// Members are replicated on consistent hash ring. This number controls
+	// the number each member is replicated on the ring.
+	ReplicationFactor int
+
+	// Load is used to calculate average load. See the code, the paper and Google's 
+	// blog post to learn about it.
+	Load float64
+}
+```
+
+Any hash algorithm can be used as hasher which implements Hasher interface. Please take a look at the *Sample* section for an example.
+
+Usage
+-----
+
+`LocateKey` function finds a member in the cluster for your key:
+```go
+// With a properly configured and initialized consistent instance
+key := []byte("my-key")
+member := c.LocateKey(key)
+```
+It returns a thread-safe copy of the member you added before.
+
+The second most frequently used function is `GetClosestN`. 
+
+```go
+// With a properly configured and initialized consistent instance
+
+key := []byte("my-key")
+members, err := c.GetClosestN(key, 2)
+```
+
+This may be useful to find backup nodes to store your key.
+
+Benchmarks
+----------
+On an early 2015 Macbook:
+
+```
+BenchmarkAddRemove-4     	  100000	     22006 ns/op
+BenchmarkLocateKey-4     	 5000000	       252 ns/op
+BenchmarkGetClosestN-4   	  500000	      2974 ns/op
+```
+
+Examples
+--------
+
+The most basic use of consistent package should be like this. For detailed list of functions, [visit godoc.org.](https://godoc.org/github.com/buraksezer/consistent)
+More sample code can be found under [_examples](https://github.com/buraksezer/consistent/tree/master/_examples).
+
+```go
+package main
+
+import (
+	"fmt"
+
+	"github.com/buraksezer/consistent"
+	"github.com/cespare/xxhash"
+)
+
+// In your code, you probably have a custom data type 
+// for your cluster members. Just add a String function to implement 
+// consistent.Member interface.
+type myMember string
+
+func (m myMember) String() string {
+	return string(m)
+}
+
+// consistent package doesn't provide a default hashing function. 
+// You should provide a proper one to distribute keys/members uniformly.
+type hasher struct{}
+
+func (h hasher) Sum64(data []byte) uint64 {
+	// you should use a proper hash function for uniformity.
+	return xxhash.Sum64(data)
+}
+
+func main() {
+	// Create a new consistent instance
+	cfg := consistent.Config{
+		PartitionCount:    7,
+		ReplicationFactor: 20,
+		Load:              1.25,
+		Hasher:            hasher{},
+	}
+	c := consistent.New(nil, cfg)
+
+	// Add some members to the consistent hash table.
+	// Add function calculates average load and distributes partitions over members
+	node1 := myMember("node1.olric.com")
+	c.Add(node1)
+
+	node2 := myMember("node2.olric.com")
+	c.Add(node2)
+
+	key := []byte("my-key")
+	// calculates partition id for the given key
+	// partID := hash(key) % partitionCount
+	// the partitions are already distributed among members by Add function.
+	owner := c.LocateKey(key)
+	fmt.Println(owner.String())
+	// Prints node2.olric.com
+}
+```
+
+Another useful example is `_examples/relocation_percentage.go`. It creates a `consistent` object with 8 members and distributes partitions among them. Then adds 9th member, 
+here is the result with a proper configuration and hash function:
+
+```
+bloom:consistent burak$ go run _examples/relocation_percentage.go
+partID: 218 moved to node2.olric from node0.olric
+partID: 173 moved to node9.olric from node3.olric
+partID: 225 moved to node7.olric from node0.olric
+partID:  85 moved to node9.olric from node7.olric
+partID: 220 moved to node5.olric from node0.olric
+partID:  33 moved to node9.olric from node5.olric
+partID: 254 moved to node9.olric from node4.olric
+partID:  71 moved to node9.olric from node3.olric
+partID: 236 moved to node9.olric from node2.olric
+partID: 118 moved to node9.olric from node3.olric
+partID: 233 moved to node3.olric from node0.olric
+partID:  50 moved to node9.olric from node4.olric
+partID: 252 moved to node9.olric from node2.olric
+partID: 121 moved to node9.olric from node2.olric
+partID: 259 moved to node9.olric from node4.olric
+partID:  92 moved to node9.olric from node7.olric
+partID: 152 moved to node9.olric from node3.olric
+partID: 105 moved to node9.olric from node2.olric
+
+6% of the partitions are relocated
+```
+
+Moved partition count is highly dependent on your configuration and quailty of hash function. You should modify the configuration to find an optimum set of configurations
+for your system.
+
+`_examples/load_distribution.go` is also useful to understand load distribution. It creates a `consistent` object with 8 members and locates 1M key. It also calculates average 
+load which cannot be exceeded by any member. Here is the result:
+
+```
+Maximum key count for a member should be around this:  147602
+member: node2.olric, key count: 100362
+member: node5.olric, key count: 99448
+member: node0.olric, key count: 147735
+member: node3.olric, key count: 103455
+member: node6.olric, key count: 147069
+member: node1.olric, key count: 121566
+member: node4.olric, key count: 147932
+member: node7.olric, key count: 132433
+```
+
+Average load can be calculated by using the following formula:
+
+```
+load := (consistent.AverageLoad() * float64(keyCount)) / float64(config.PartitionCount)
+```
+
+Contributions
+-------------
+Please don't hesitate to fork the project and send a pull request or just e-mail me to ask questions and share ideas.
+
+License
+-------
+MIT License, - see LICENSE for more details.
diff --git a/vendor/github.com/buraksezer/consistent/consistent.go b/vendor/github.com/buraksezer/consistent/consistent.go
new file mode 100644
index 0000000..a1446d6
--- /dev/null
+++ b/vendor/github.com/buraksezer/consistent/consistent.go
@@ -0,0 +1,362 @@
+// Copyright (c) 2018 Burak Sezer
+// All rights reserved.
+//
+// This code is licensed under the MIT License.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files(the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions :
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// Package consistent provides a consistent hashing function with bounded loads.
+// For more information about the underlying algorithm, please take a look at
+// https://research.googleblog.com/2017/04/consistent-hashing-with-bounded-loads.html
+//
+// Example Use:
+// 	cfg := consistent.Config{
+// 		PartitionCount:    71,
+// 		ReplicationFactor: 20,
+// 		Load:              1.25,
+// 		Hasher:            hasher{},
+//	}
+//
+//      // Create a new consistent object
+//      // You may call this with a list of members
+//      // instead of adding them one by one.
+//	c := consistent.New(members, cfg)
+//
+//      // myMember struct just needs to implement a String method.
+//      // New/Add/Remove distributes partitions among members using the algorithm
+//      // defined on Google Research Blog.
+//	c.Add(myMember)
+//
+//	key := []byte("my-key")
+//      // LocateKey hashes the key and calculates partition ID with
+//      // this modulo operation: MOD(hash result, partition count)
+//      // The owner of the partition is already calculated by New/Add/Remove.
+//      // LocateKey just returns the member which's responsible for the key.
+//	member := c.LocateKey(key)
+//
+package consistent
+
+import (
+	"encoding/binary"
+	"errors"
+	"fmt"
+	"math"
+	"sort"
+	"sync"
+)
+
+var (
+	//ErrInsufficientMemberCount represents an error which means there are not enough members to complete the task.
+	ErrInsufficientMemberCount = errors.New("insufficient member count")
+
+	// ErrMemberNotFound represents an error which means requested member could not be found in consistent hash ring.
+	ErrMemberNotFound = errors.New("member could not be found in ring")
+)
+
+// Hasher is responsible for generating unsigned, 64 bit hash of provided byte slice.
+// Hasher should minimize collisions (generating same hash for different byte slice)
+// and while performance is also important fast functions are preferable (i.e.
+// you can use FarmHash family).
+type Hasher interface {
+	Sum64([]byte) uint64
+}
+
+// Member interface represents a member in consistent hash ring.
+type Member interface {
+	String() string
+}
+
+// Config represents a structure to control consistent package.
+type Config struct {
+	// Hasher is responsible for generating unsigned, 64 bit hash of provided byte slice.
+	Hasher Hasher
+
+	// Keys are distributed among partitions. Prime numbers are good to
+	// distribute keys uniformly. Select a big PartitionCount if you have
+	// too many keys.
+	PartitionCount int
+
+	// Members are replicated on consistent hash ring. This number means that a member
+	// how many times replicated on the ring.
+	ReplicationFactor int
+
+	// Load is used to calculate average load. See the code, the paper and Google's blog post to learn about it.
+	Load float64
+}
+
+// Consistent holds the information about the members of the consistent hash circle.
+type Consistent struct {
+	mu sync.RWMutex
+
+	config         Config
+	hasher         Hasher
+	sortedSet      []uint64
+	partitionCount uint64
+	loads          map[string]float64
+	members        map[string]*Member
+	partitions     map[int]*Member
+	ring           map[uint64]*Member
+}
+
+// New creates and returns a new Consistent object.
+func New(members []Member, config Config) *Consistent {
+	c := &Consistent{
+		config:         config,
+		members:        make(map[string]*Member),
+		partitionCount: uint64(config.PartitionCount),
+		ring:           make(map[uint64]*Member),
+	}
+	if config.Hasher == nil {
+		panic("Hasher cannot be nil")
+	}
+	// TODO: Check configuration here
+	c.hasher = config.Hasher
+	for _, member := range members {
+		c.add(member)
+	}
+	if members != nil {
+		c.distributePartitions()
+	}
+	return c
+}
+
+// GetMembers returns a thread-safe copy of members.
+func (c *Consistent) GetMembers() []Member {
+	c.mu.RLock()
+	defer c.mu.RUnlock()
+
+	// Create a thread-safe copy of member list.
+	members := make([]Member, 0, len(c.members))
+	for _, member := range c.members {
+		members = append(members, *member)
+	}
+	return members
+}
+
+// AverageLoad exposes the current average load.
+func (c *Consistent) AverageLoad() float64 {
+	avgLoad := float64(c.partitionCount/uint64(len(c.members))) * c.config.Load
+	return math.Ceil(avgLoad)
+}
+
+func (c *Consistent) distributeWithLoad(partID, idx int, partitions map[int]*Member, loads map[string]float64) {
+	avgLoad := c.AverageLoad()
+	var count int
+	for {
+		count++
+		if count >= len(c.sortedSet) {
+			// User needs to decrease partition count, increase member count or increase load factor.
+			panic("not enough room to distribute partitions")
+		}
+		i := c.sortedSet[idx]
+		member := *c.ring[i]
+		load := loads[member.String()]
+		if load+1 <= avgLoad {
+			partitions[partID] = &member
+			loads[member.String()]++
+			return
+		}
+		idx++
+		if idx >= len(c.sortedSet) {
+			idx = 0
+		}
+	}
+}
+
+func (c *Consistent) distributePartitions() {
+	loads := make(map[string]float64)
+	partitions := make(map[int]*Member)
+
+	bs := make([]byte, 8)
+	for partID := uint64(0); partID < c.partitionCount; partID++ {
+		binary.LittleEndian.PutUint64(bs, partID)
+		key := c.hasher.Sum64(bs)
+		idx := sort.Search(len(c.sortedSet), func(i int) bool {
+			return c.sortedSet[i] >= key
+		})
+		if idx >= len(c.sortedSet) {
+			idx = 0
+		}
+		c.distributeWithLoad(int(partID), idx, partitions, loads)
+	}
+	c.partitions = partitions
+	c.loads = loads
+}
+
+func (c *Consistent) add(member Member) {
+	for i := 0; i < c.config.ReplicationFactor; i++ {
+		key := []byte(fmt.Sprintf("%s%d", member.String(), i))
+		h := c.hasher.Sum64(key)
+		c.ring[h] = &member
+		c.sortedSet = append(c.sortedSet, h)
+	}
+	// sort hashes ascendingly
+	sort.Slice(c.sortedSet, func(i int, j int) bool {
+		return c.sortedSet[i] < c.sortedSet[j]
+	})
+	// Storing member at this map is useful to find backup members of a partition.
+	c.members[member.String()] = &member
+}
+
+// Add adds a new member to the consistent hash circle.
+func (c *Consistent) Add(member Member) {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+
+	if _, ok := c.members[member.String()]; ok {
+		// We already have this member. Quit immediately.
+		return
+	}
+	c.add(member)
+	c.distributePartitions()
+}
+
+func (c *Consistent) delSlice(val uint64) {
+	for i := 0; i < len(c.sortedSet); i++ {
+		if c.sortedSet[i] == val {
+			c.sortedSet = append(c.sortedSet[:i], c.sortedSet[i+1:]...)
+			break
+		}
+	}
+}
+
+// Remove removes a member from the consistent hash circle.
+func (c *Consistent) Remove(name string) {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+
+	if _, ok := c.members[name]; !ok {
+		// There is no member with that name. Quit immediately.
+		return
+	}
+
+	for i := 0; i < c.config.ReplicationFactor; i++ {
+		key := []byte(fmt.Sprintf("%s%d", name, i))
+		h := c.hasher.Sum64(key)
+		delete(c.ring, h)
+		c.delSlice(h)
+	}
+	delete(c.members, name)
+	if len(c.members) == 0 {
+		// consistent hash ring is empty now. Reset the partition table.
+		c.partitions = make(map[int]*Member)
+		return
+	}
+	c.distributePartitions()
+}
+
+// LoadDistribution exposes load distribution of members.
+func (c *Consistent) LoadDistribution() map[string]float64 {
+	c.mu.RLock()
+	defer c.mu.RUnlock()
+
+	// Create a thread-safe copy
+	res := make(map[string]float64)
+	for member, load := range c.loads {
+		res[member] = load
+	}
+	return res
+}
+
+// FindPartitionID returns partition id for given key.
+func (c *Consistent) FindPartitionID(key []byte) int {
+	hkey := c.hasher.Sum64(key)
+	return int(hkey % c.partitionCount)
+}
+
+// GetPartitionOwner returns the owner of the given partition.
+func (c *Consistent) GetPartitionOwner(partID int) Member {
+	c.mu.RLock()
+	defer c.mu.RUnlock()
+
+	member, ok := c.partitions[partID]
+	if !ok {
+		return nil
+	}
+	// Create a thread-safe copy of member and return it.
+	return *member
+}
+
+// LocateKey finds a home for given key
+func (c *Consistent) LocateKey(key []byte) Member {
+	partID := c.FindPartitionID(key)
+	return c.GetPartitionOwner(partID)
+}
+
+func (c *Consistent) getClosestN(partID, count int) ([]Member, error) {
+	c.mu.RLock()
+	defer c.mu.RUnlock()
+
+	res := []Member{}
+	if count > len(c.members) {
+		return res, ErrInsufficientMemberCount
+	}
+
+	var ownerKey uint64
+	owner := c.GetPartitionOwner(partID)
+	// Hash and sort all the names.
+	keys := []uint64{}
+	kmems := make(map[uint64]*Member)
+	for name, member := range c.members {
+		key := c.hasher.Sum64([]byte(name))
+		if name == owner.String() {
+			ownerKey = key
+		}
+		keys = append(keys, key)
+		kmems[key] = member
+	}
+	sort.Slice(keys, func(i, j int) bool {
+		return keys[i] < keys[j]
+	})
+
+	// Find the key owner
+	idx := 0
+	for idx < len(keys) {
+		if keys[idx] == ownerKey {
+			key := keys[idx]
+			res = append(res, *kmems[key])
+			break
+		}
+		idx++
+	}
+
+	// Find the closest(replica owners) members.
+	for len(res) < count {
+		idx++
+		if idx >= len(keys) {
+			idx = 0
+		}
+		key := keys[idx]
+		res = append(res, *kmems[key])
+	}
+	return res, nil
+}
+
+// GetClosestN returns the closest N member to a key in the hash ring.
+// This may be useful to find members for replication.
+func (c *Consistent) GetClosestN(key []byte, count int) ([]Member, error) {
+	partID := c.FindPartitionID(key)
+	return c.getClosestN(partID, count)
+}
+
+// GetClosestNForPartition returns the closest N member for given partition.
+// This may be useful to find members for replication.
+func (c *Consistent) GetClosestNForPartition(partID, count int) ([]Member, error) {
+	return c.getClosestN(partID, count)
+}
diff --git a/vendor/github.com/cespare/xxhash/LICENSE.txt b/vendor/github.com/cespare/xxhash/LICENSE.txt
new file mode 100644
index 0000000..24b5306
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2016 Caleb Spare
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/cespare/xxhash/README.md b/vendor/github.com/cespare/xxhash/README.md
new file mode 100644
index 0000000..0982fd2
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/README.md
@@ -0,0 +1,50 @@
+# xxhash
+
+[![GoDoc](https://godoc.org/github.com/cespare/xxhash?status.svg)](https://godoc.org/github.com/cespare/xxhash)
+
+xxhash is a Go implementation of the 64-bit
+[xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a
+high-quality hashing algorithm that is much faster than anything in the Go
+standard library.
+
+The API is very small, taking its cue from the other hashing packages in the
+standard library:
+
+    $ go doc github.com/cespare/xxhash                                                                                                                                                                                              !
+    package xxhash // import "github.com/cespare/xxhash"
+
+    Package xxhash implements the 64-bit variant of xxHash (XXH64) as described
+    at http://cyan4973.github.io/xxHash/.
+
+    func New() hash.Hash64
+    func Sum64(b []byte) uint64
+    func Sum64String(s string) uint64
+
+This implementation provides a fast pure-Go implementation and an even faster
+assembly implementation for amd64.
+
+## Benchmarks
+
+Here are some quick benchmarks comparing the pure-Go and assembly
+implementations of Sum64 against another popular Go XXH64 implementation,
+[github.com/OneOfOne/xxhash](https://github.com/OneOfOne/xxhash):
+
+| input size | OneOfOne | cespare (purego) | cespare |
+| --- | --- | --- | --- |
+| 5 B   |  416 MB/s | 720 MB/s |  872 MB/s  |
+| 100 B | 3980 MB/s | 5013 MB/s | 5252 MB/s  |
+| 4 KB  | 12727 MB/s | 12999 MB/s | 13026 MB/s |
+| 10 MB | 9879 MB/s | 10775 MB/s | 10913 MB/s  |
+
+These numbers were generated with:
+
+```
+$ go test -benchtime 10s -bench '/OneOfOne,'
+$ go test -tags purego -benchtime 10s -bench '/xxhash,'
+$ go test -benchtime 10s -bench '/xxhash,'
+```
+
+## Projects using this package
+
+- [InfluxDB](https://github.com/influxdata/influxdb)
+- [Prometheus](https://github.com/prometheus/prometheus)
diff --git a/vendor/github.com/cespare/xxhash/go.mod b/vendor/github.com/cespare/xxhash/go.mod
new file mode 100644
index 0000000..10605a6
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/go.mod
@@ -0,0 +1,6 @@
+module github.com/cespare/xxhash
+
+require (
+	github.com/OneOfOne/xxhash v1.2.2
+	github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72
+)
diff --git a/vendor/github.com/cespare/xxhash/go.sum b/vendor/github.com/cespare/xxhash/go.sum
new file mode 100644
index 0000000..f6b5542
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/go.sum
@@ -0,0 +1,4 @@
+github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
diff --git a/vendor/github.com/cespare/xxhash/rotate.go b/vendor/github.com/cespare/xxhash/rotate.go
new file mode 100644
index 0000000..f3eac5e
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/rotate.go
@@ -0,0 +1,14 @@
+// +build !go1.9
+
+package xxhash
+
+// TODO(caleb): After Go 1.10 comes out, remove this fallback code.
+
+func rol1(x uint64) uint64  { return (x << 1) | (x >> (64 - 1)) }
+func rol7(x uint64) uint64  { return (x << 7) | (x >> (64 - 7)) }
+func rol11(x uint64) uint64 { return (x << 11) | (x >> (64 - 11)) }
+func rol12(x uint64) uint64 { return (x << 12) | (x >> (64 - 12)) }
+func rol18(x uint64) uint64 { return (x << 18) | (x >> (64 - 18)) }
+func rol23(x uint64) uint64 { return (x << 23) | (x >> (64 - 23)) }
+func rol27(x uint64) uint64 { return (x << 27) | (x >> (64 - 27)) }
+func rol31(x uint64) uint64 { return (x << 31) | (x >> (64 - 31)) }
diff --git a/vendor/github.com/cespare/xxhash/rotate19.go b/vendor/github.com/cespare/xxhash/rotate19.go
new file mode 100644
index 0000000..b99612b
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/rotate19.go
@@ -0,0 +1,14 @@
+// +build go1.9
+
+package xxhash
+
+import "math/bits"
+
+func rol1(x uint64) uint64  { return bits.RotateLeft64(x, 1) }
+func rol7(x uint64) uint64  { return bits.RotateLeft64(x, 7) }
+func rol11(x uint64) uint64 { return bits.RotateLeft64(x, 11) }
+func rol12(x uint64) uint64 { return bits.RotateLeft64(x, 12) }
+func rol18(x uint64) uint64 { return bits.RotateLeft64(x, 18) }
+func rol23(x uint64) uint64 { return bits.RotateLeft64(x, 23) }
+func rol27(x uint64) uint64 { return bits.RotateLeft64(x, 27) }
+func rol31(x uint64) uint64 { return bits.RotateLeft64(x, 31) }
diff --git a/vendor/github.com/cespare/xxhash/xxhash.go b/vendor/github.com/cespare/xxhash/xxhash.go
new file mode 100644
index 0000000..f896bd2
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/xxhash.go
@@ -0,0 +1,168 @@
+// Package xxhash implements the 64-bit variant of xxHash (XXH64) as described
+// at http://cyan4973.github.io/xxHash/.
+package xxhash
+
+import (
+	"encoding/binary"
+	"hash"
+)
+
+const (
+	prime1 uint64 = 11400714785074694791
+	prime2 uint64 = 14029467366897019727
+	prime3 uint64 = 1609587929392839161
+	prime4 uint64 = 9650029242287828579
+	prime5 uint64 = 2870177450012600261
+)
+
+// NOTE(caleb): I'm using both consts and vars of the primes. Using consts where
+// possible in the Go code is worth a small (but measurable) performance boost
+// by avoiding some MOVQs. Vars are needed for the asm and also are useful for
+// convenience in the Go code in a few places where we need to intentionally
+// avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the
+// result overflows a uint64).
+var (
+	prime1v = prime1
+	prime2v = prime2
+	prime3v = prime3
+	prime4v = prime4
+	prime5v = prime5
+)
+
+type xxh struct {
+	v1    uint64
+	v2    uint64
+	v3    uint64
+	v4    uint64
+	total int
+	mem   [32]byte
+	n     int // how much of mem is used
+}
+
+// New creates a new hash.Hash64 that implements the 64-bit xxHash algorithm.
+func New() hash.Hash64 {
+	var x xxh
+	x.Reset()
+	return &x
+}
+
+func (x *xxh) Reset() {
+	x.n = 0
+	x.total = 0
+	x.v1 = prime1v + prime2
+	x.v2 = prime2
+	x.v3 = 0
+	x.v4 = -prime1v
+}
+
+func (x *xxh) Size() int      { return 8 }
+func (x *xxh) BlockSize() int { return 32 }
+
+// Write adds more data to x. It always returns len(b), nil.
+func (x *xxh) Write(b []byte) (n int, err error) {
+	n = len(b)
+	x.total += len(b)
+
+	if x.n+len(b) < 32 {
+		// This new data doesn't even fill the current block.
+		copy(x.mem[x.n:], b)
+		x.n += len(b)
+		return
+	}
+
+	if x.n > 0 {
+		// Finish off the partial block.
+		copy(x.mem[x.n:], b)
+		x.v1 = round(x.v1, u64(x.mem[0:8]))
+		x.v2 = round(x.v2, u64(x.mem[8:16]))
+		x.v3 = round(x.v3, u64(x.mem[16:24]))
+		x.v4 = round(x.v4, u64(x.mem[24:32]))
+		b = b[32-x.n:]
+		x.n = 0
+	}
+
+	if len(b) >= 32 {
+		// One or more full blocks left.
+		b = writeBlocks(x, b)
+	}
+
+	// Store any remaining partial block.
+	copy(x.mem[:], b)
+	x.n = len(b)
+
+	return
+}
+
+func (x *xxh) Sum(b []byte) []byte {
+	s := x.Sum64()
+	return append(
+		b,
+		byte(s>>56),
+		byte(s>>48),
+		byte(s>>40),
+		byte(s>>32),
+		byte(s>>24),
+		byte(s>>16),
+		byte(s>>8),
+		byte(s),
+	)
+}
+
+func (x *xxh) Sum64() uint64 {
+	var h uint64
+
+	if x.total >= 32 {
+		v1, v2, v3, v4 := x.v1, x.v2, x.v3, x.v4
+		h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4)
+		h = mergeRound(h, v1)
+		h = mergeRound(h, v2)
+		h = mergeRound(h, v3)
+		h = mergeRound(h, v4)
+	} else {
+		h = x.v3 + prime5
+	}
+
+	h += uint64(x.total)
+
+	i, end := 0, x.n
+	for ; i+8 <= end; i += 8 {
+		k1 := round(0, u64(x.mem[i:i+8]))
+		h ^= k1
+		h = rol27(h)*prime1 + prime4
+	}
+	if i+4 <= end {
+		h ^= uint64(u32(x.mem[i:i+4])) * prime1
+		h = rol23(h)*prime2 + prime3
+		i += 4
+	}
+	for i < end {
+		h ^= uint64(x.mem[i]) * prime5
+		h = rol11(h) * prime1
+		i++
+	}
+
+	h ^= h >> 33
+	h *= prime2
+	h ^= h >> 29
+	h *= prime3
+	h ^= h >> 32
+
+	return h
+}
+
+func u64(b []byte) uint64 { return binary.LittleEndian.Uint64(b) }
+func u32(b []byte) uint32 { return binary.LittleEndian.Uint32(b) }
+
+func round(acc, input uint64) uint64 {
+	acc += input * prime2
+	acc = rol31(acc)
+	acc *= prime1
+	return acc
+}
+
+func mergeRound(acc, val uint64) uint64 {
+	val = round(0, val)
+	acc ^= val
+	acc = acc*prime1 + prime4
+	return acc
+}
diff --git a/vendor/github.com/cespare/xxhash/xxhash_amd64.go b/vendor/github.com/cespare/xxhash/xxhash_amd64.go
new file mode 100644
index 0000000..d617652
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/xxhash_amd64.go
@@ -0,0 +1,12 @@
+// +build !appengine
+// +build gc
+// +build !purego
+
+package xxhash
+
+// Sum64 computes the 64-bit xxHash digest of b.
+//
+//go:noescape
+func Sum64(b []byte) uint64
+
+func writeBlocks(x *xxh, b []byte) []byte
diff --git a/vendor/github.com/cespare/xxhash/xxhash_amd64.s b/vendor/github.com/cespare/xxhash/xxhash_amd64.s
new file mode 100644
index 0000000..757f201
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/xxhash_amd64.s
@@ -0,0 +1,233 @@
+// +build !appengine
+// +build gc
+// +build !purego
+
+#include "textflag.h"
+
+// Register allocation:
+// AX	h
+// CX	pointer to advance through b
+// DX	n
+// BX	loop end
+// R8	v1, k1
+// R9	v2
+// R10	v3
+// R11	v4
+// R12	tmp
+// R13	prime1v
+// R14	prime2v
+// R15	prime4v
+
+// round reads from and advances the buffer pointer in CX.
+// It assumes that R13 has prime1v and R14 has prime2v.
+#define round(r) \
+	MOVQ  (CX), R12 \
+	ADDQ  $8, CX    \
+	IMULQ R14, R12  \
+	ADDQ  R12, r    \
+	ROLQ  $31, r    \
+	IMULQ R13, r
+
+// mergeRound applies a merge round on the two registers acc and val.
+// It assumes that R13 has prime1v, R14 has prime2v, and R15 has prime4v.
+#define mergeRound(acc, val) \
+	IMULQ R14, val \
+	ROLQ  $31, val \
+	IMULQ R13, val \
+	XORQ  val, acc \
+	IMULQ R13, acc \
+	ADDQ  R15, acc
+
+// func Sum64(b []byte) uint64
+TEXT ·Sum64(SB), NOSPLIT, $0-32
+	// Load fixed primes.
+	MOVQ ·prime1v(SB), R13
+	MOVQ ·prime2v(SB), R14
+	MOVQ ·prime4v(SB), R15
+
+	// Load slice.
+	MOVQ b_base+0(FP), CX
+	MOVQ b_len+8(FP), DX
+	LEAQ (CX)(DX*1), BX
+
+	// The first loop limit will be len(b)-32.
+	SUBQ $32, BX
+
+	// Check whether we have at least one block.
+	CMPQ DX, $32
+	JLT  noBlocks
+
+	// Set up initial state (v1, v2, v3, v4).
+	MOVQ R13, R8
+	ADDQ R14, R8
+	MOVQ R14, R9
+	XORQ R10, R10
+	XORQ R11, R11
+	SUBQ R13, R11
+
+	// Loop until CX > BX.
+blockLoop:
+	round(R8)
+	round(R9)
+	round(R10)
+	round(R11)
+
+	CMPQ CX, BX
+	JLE  blockLoop
+
+	MOVQ R8, AX
+	ROLQ $1, AX
+	MOVQ R9, R12
+	ROLQ $7, R12
+	ADDQ R12, AX
+	MOVQ R10, R12
+	ROLQ $12, R12
+	ADDQ R12, AX
+	MOVQ R11, R12
+	ROLQ $18, R12
+	ADDQ R12, AX
+
+	mergeRound(AX, R8)
+	mergeRound(AX, R9)
+	mergeRound(AX, R10)
+	mergeRound(AX, R11)
+
+	JMP afterBlocks
+
+noBlocks:
+	MOVQ ·prime5v(SB), AX
+
+afterBlocks:
+	ADDQ DX, AX
+
+	// Right now BX has len(b)-32, and we want to loop until CX > len(b)-8.
+	ADDQ $24, BX
+
+	CMPQ CX, BX
+	JG   fourByte
+
+wordLoop:
+	// Calculate k1.
+	MOVQ  (CX), R8
+	ADDQ  $8, CX
+	IMULQ R14, R8
+	ROLQ  $31, R8
+	IMULQ R13, R8
+
+	XORQ  R8, AX
+	ROLQ  $27, AX
+	IMULQ R13, AX
+	ADDQ  R15, AX
+
+	CMPQ CX, BX
+	JLE  wordLoop
+
+fourByte:
+	ADDQ $4, BX
+	CMPQ CX, BX
+	JG   singles
+
+	MOVL  (CX), R8
+	ADDQ  $4, CX
+	IMULQ R13, R8
+	XORQ  R8, AX
+
+	ROLQ  $23, AX
+	IMULQ R14, AX
+	ADDQ  ·prime3v(SB), AX
+
+singles:
+	ADDQ $4, BX
+	CMPQ CX, BX
+	JGE  finalize
+
+singlesLoop:
+	MOVBQZX (CX), R12
+	ADDQ    $1, CX
+	IMULQ   ·prime5v(SB), R12
+	XORQ    R12, AX
+
+	ROLQ  $11, AX
+	IMULQ R13, AX
+
+	CMPQ CX, BX
+	JL   singlesLoop
+
+finalize:
+	MOVQ  AX, R12
+	SHRQ  $33, R12
+	XORQ  R12, AX
+	IMULQ R14, AX
+	MOVQ  AX, R12
+	SHRQ  $29, R12
+	XORQ  R12, AX
+	IMULQ ·prime3v(SB), AX
+	MOVQ  AX, R12
+	SHRQ  $32, R12
+	XORQ  R12, AX
+
+	MOVQ AX, ret+24(FP)
+	RET
+
+// writeBlocks uses the same registers as above except that it uses AX to store
+// the x pointer.
+
+// func writeBlocks(x *xxh, b []byte) []byte
+TEXT ·writeBlocks(SB), NOSPLIT, $0-56
+	// Load fixed primes needed for round.
+	MOVQ ·prime1v(SB), R13
+	MOVQ ·prime2v(SB), R14
+
+	// Load slice.
+	MOVQ b_base+8(FP), CX
+	MOVQ CX, ret_base+32(FP) // initialize return base pointer; see NOTE below
+	MOVQ b_len+16(FP), DX
+	LEAQ (CX)(DX*1), BX
+	SUBQ $32, BX
+
+	// Load vN from x.
+	MOVQ x+0(FP), AX
+	MOVQ 0(AX), R8   // v1
+	MOVQ 8(AX), R9   // v2
+	MOVQ 16(AX), R10 // v3
+	MOVQ 24(AX), R11 // v4
+
+	// We don't need to check the loop condition here; this function is
+	// always called with at least one block of data to process.
+blockLoop:
+	round(R8)
+	round(R9)
+	round(R10)
+	round(R11)
+
+	CMPQ CX, BX
+	JLE  blockLoop
+
+	// Copy vN back to x.
+	MOVQ R8, 0(AX)
+	MOVQ R9, 8(AX)
+	MOVQ R10, 16(AX)
+	MOVQ R11, 24(AX)
+
+	// Construct return slice.
+	// NOTE: It's important that we don't construct a slice that has a base
+	// pointer off the end of the original slice, as in Go 1.7+ this will
+	// cause runtime crashes. (See discussion in, for example,
+	// https://github.com/golang/go/issues/16772.)
+	// Therefore, we calculate the length/cap first, and if they're zero, we
+	// keep the old base. This is what the compiler does as well if you
+	// write code like
+	//   b = b[len(b):]
+
+	// New length is 32 - (CX - BX) -> BX+32 - CX.
+	ADDQ $32, BX
+	SUBQ CX, BX
+	JZ   afterSetBase
+
+	MOVQ CX, ret_base+32(FP)
+
+afterSetBase:
+	MOVQ BX, ret_len+40(FP)
+	MOVQ BX, ret_cap+48(FP) // set cap == len
+
+	RET
diff --git a/vendor/github.com/cespare/xxhash/xxhash_other.go b/vendor/github.com/cespare/xxhash/xxhash_other.go
new file mode 100644
index 0000000..c68d13f
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/xxhash_other.go
@@ -0,0 +1,75 @@
+// +build !amd64 appengine !gc purego
+
+package xxhash
+
+// Sum64 computes the 64-bit xxHash digest of b.
+func Sum64(b []byte) uint64 {
+	// A simpler version would be
+	//   x := New()
+	//   x.Write(b)
+	//   return x.Sum64()
+	// but this is faster, particularly for small inputs.
+
+	n := len(b)
+	var h uint64
+
+	if n >= 32 {
+		v1 := prime1v + prime2
+		v2 := prime2
+		v3 := uint64(0)
+		v4 := -prime1v
+		for len(b) >= 32 {
+			v1 = round(v1, u64(b[0:8:len(b)]))
+			v2 = round(v2, u64(b[8:16:len(b)]))
+			v3 = round(v3, u64(b[16:24:len(b)]))
+			v4 = round(v4, u64(b[24:32:len(b)]))
+			b = b[32:len(b):len(b)]
+		}
+		h = rol1(v1) + rol7(v2) + rol12(v3) + rol18(v4)
+		h = mergeRound(h, v1)
+		h = mergeRound(h, v2)
+		h = mergeRound(h, v3)
+		h = mergeRound(h, v4)
+	} else {
+		h = prime5
+	}
+
+	h += uint64(n)
+
+	i, end := 0, len(b)
+	for ; i+8 <= end; i += 8 {
+		k1 := round(0, u64(b[i:i+8:len(b)]))
+		h ^= k1
+		h = rol27(h)*prime1 + prime4
+	}
+	if i+4 <= end {
+		h ^= uint64(u32(b[i:i+4:len(b)])) * prime1
+		h = rol23(h)*prime2 + prime3
+		i += 4
+	}
+	for ; i < end; i++ {
+		h ^= uint64(b[i]) * prime5
+		h = rol11(h) * prime1
+	}
+
+	h ^= h >> 33
+	h *= prime2
+	h ^= h >> 29
+	h *= prime3
+	h ^= h >> 32
+
+	return h
+}
+
+func writeBlocks(x *xxh, b []byte) []byte {
+	v1, v2, v3, v4 := x.v1, x.v2, x.v3, x.v4
+	for len(b) >= 32 {
+		v1 = round(v1, u64(b[0:8:len(b)]))
+		v2 = round(v2, u64(b[8:16:len(b)]))
+		v3 = round(v3, u64(b[16:24:len(b)]))
+		v4 = round(v4, u64(b[24:32:len(b)]))
+		b = b[32:len(b):len(b)]
+	}
+	x.v1, x.v2, x.v3, x.v4 = v1, v2, v3, v4
+	return b
+}
diff --git a/vendor/github.com/cespare/xxhash/xxhash_safe.go b/vendor/github.com/cespare/xxhash/xxhash_safe.go
new file mode 100644
index 0000000..dfa15ab
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/xxhash_safe.go
@@ -0,0 +1,10 @@
+// +build appengine
+
+// This file contains the safe implementations of otherwise unsafe-using code.
+
+package xxhash
+
+// Sum64String computes the 64-bit xxHash digest of s.
+func Sum64String(s string) uint64 {
+	return Sum64([]byte(s))
+}
diff --git a/vendor/github.com/cespare/xxhash/xxhash_unsafe.go b/vendor/github.com/cespare/xxhash/xxhash_unsafe.go
new file mode 100644
index 0000000..d2b64e8
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/xxhash_unsafe.go
@@ -0,0 +1,30 @@
+// +build !appengine
+
+// This file encapsulates usage of unsafe.
+// xxhash_safe.go contains the safe implementations.
+
+package xxhash
+
+import (
+	"reflect"
+	"unsafe"
+)
+
+// Sum64String computes the 64-bit xxHash digest of s.
+// It may be faster than Sum64([]byte(s)) by avoiding a copy.
+//
+// TODO(caleb): Consider removing this if an optimization is ever added to make
+// it unnecessary: https://golang.org/issue/2205.
+//
+// TODO(caleb): We still have a function call; we could instead write Go/asm
+// copies of Sum64 for strings to squeeze out a bit more speed.
+func Sum64String(s string) uint64 {
+	// See https://groups.google.com/d/msg/golang-nuts/dcjzJy-bSpw/tcZYBzQqAQAJ
+	// for some discussion about this unsafe conversion.
+	var b []byte
+	bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
+	bh.Data = (*reflect.StringHeader)(unsafe.Pointer(&s)).Data
+	bh.Len = len(s)
+	bh.Cap = len(s)
+	return Sum64(b)
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif/core_proxy_if.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif/core_proxy_if.go
index dbf3418..9636a7d 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif/core_proxy_if.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif/core_proxy_if.go
@@ -18,7 +18,6 @@
 
 import (
 	"context"
-
 	"github.com/opencord/voltha-protos/v3/go/voltha"
 )
 
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/adapter_proxy.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/adapter_proxy.go
index 02fa3de..bbae0ed 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/adapter_proxy.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/adapter_proxy.go
@@ -17,6 +17,7 @@
 
 import (
 	"context"
+	"github.com/opencord/voltha-lib-go/v3/pkg/db"
 	"time"
 
 	"github.com/golang/protobuf/proto"
@@ -32,14 +33,17 @@
 	kafkaICProxy kafka.InterContainerProxy
 	adapterTopic string
 	coreTopic    string
+	endpointMgr  kafka.EndpointManager
 }
 
-func NewAdapterProxy(kafkaProxy kafka.InterContainerProxy, adapterTopic string, coreTopic string) *AdapterProxy {
-	var proxy AdapterProxy
-	proxy.kafkaICProxy = kafkaProxy
-	proxy.adapterTopic = adapterTopic
-	proxy.coreTopic = coreTopic
-	logger.Debugw("TOPICS", log.Fields{"core": proxy.coreTopic, "adapter": proxy.adapterTopic})
+func NewAdapterProxy(kafkaProxy kafka.InterContainerProxy, adapterTopic string, coreTopic string, backend *db.Backend) *AdapterProxy {
+	proxy := AdapterProxy{
+		kafkaICProxy: kafkaProxy,
+		adapterTopic: adapterTopic,
+		coreTopic:    coreTopic,
+		endpointMgr:  kafka.NewEndpointManager(backend),
+	}
+	logger.Debugw("topics", log.Fields{"core": proxy.coreTopic, "adapter": proxy.adapterTopic})
 	return &proxy
 }
 
@@ -87,7 +91,11 @@
 	}
 
 	// Set up the required rpc arguments
-	topic := kafka.Topic{Name: toAdapter}
+	endpoint, err := ap.endpointMgr.GetEndpoint(toDeviceId, toAdapter)
+	if err != nil {
+		return err
+	}
+	topic := kafka.Topic{Name: string(endpoint)}
 	replyToTopic := kafka.Topic{Name: fromAdapter}
 	rpc := "process_inter_adapter_message"
 
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/common.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/common.go
index acf818c..95a036d 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/common.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/common.go
@@ -19,16 +19,12 @@
 	"github.com/opencord/voltha-lib-go/v3/pkg/log"
 )
 
-const (
-	logLevel = log.ErrorLevel
-)
-
 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, logLevel, log.Fields{"pkg": "common"})
+	logger, err = log.AddPackage(log.JSON, log.ErrorLevel, log.Fields{"pkg": "common"})
 	if err != nil {
 		panic(err)
 	}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/core_proxy.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/core_proxy.go
index 7cb933d..20e1a52 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/core_proxy.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/core_proxy.go
@@ -99,6 +99,28 @@
 	topic := kafka.Topic{Name: ap.coreTopic}
 	replyToTopic := ap.getAdapterTopic()
 	args := make([]*kafka.KVArg, 2)
+
+	if adapter.TotalReplicas == 0 && adapter.CurrentReplica != 0 {
+		log.Fatal("totalReplicas can't be 0, since you're here you have at least one")
+	}
+
+	if adapter.CurrentReplica == 0 && adapter.TotalReplicas != 0 {
+		log.Fatal("currentReplica can't be 0, it has to start from 1")
+	}
+
+	if adapter.CurrentReplica == 0 && adapter.TotalReplicas == 0 {
+		// if the adapter is not setting these fields they default to 0,
+		// in that case it means the adapter is not ready to be scaled and thus it defaults
+		// to a single instance
+		adapter.CurrentReplica = 1
+		adapter.TotalReplicas = 1
+	}
+
+	if adapter.CurrentReplica > adapter.TotalReplicas {
+		log.Fatalf("CurrentReplica (%d) can't be greater than TotalReplicas (%d)",
+			adapter.CurrentReplica, adapter.TotalReplicas)
+	}
+
 	args[0] = &kafka.KVArg{
 		Key:   "adapter",
 		Value: adapter,
@@ -124,7 +146,7 @@
 	}
 	// Use a device specific topic as we are the only adaptercore handling requests for this device
 	replyToTopic := ap.getAdapterTopic()
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, device.Id, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, device.Id, args...)
 	logger.Debugw("DeviceUpdate-response", log.Fields{"deviceId": device.Id, "success": success})
 	return unPackResponse(rpc, device.Id, success, result)
 }
@@ -148,13 +170,13 @@
 
 	// Use a device specific topic as we are the only adaptercore handling requests for this device
 	replyToTopic := ap.getAdapterTopic()
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, deviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, deviceId, args...)
 	logger.Debugw("PortCreated-response", log.Fields{"deviceId": deviceId, "success": success})
 	return unPackResponse(rpc, deviceId, success, result)
 }
 
 func (ap *CoreProxy) PortsStateUpdate(ctx context.Context, deviceId string, operStatus voltha.OperStatus_Types) error {
-	log.Debugw("PortsStateUpdate", log.Fields{"deviceId": deviceId})
+	logger.Debugw("PortsStateUpdate", log.Fields{"deviceId": deviceId})
 	rpc := "PortsStateUpdate"
 	// Use a device specific topic to send the request.  The adapter handling the device creates a device
 	// specific topic
@@ -174,7 +196,7 @@
 
 	// Use a device specific topic as we are the only adaptercore handling requests for this device
 	replyToTopic := ap.getAdapterTopic()
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, deviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, deviceId, args...)
 	logger.Debugw("PortsStateUpdate-response", log.Fields{"deviceId": deviceId, "success": success})
 	return unPackResponse(rpc, deviceId, success, result)
 }
@@ -195,14 +217,14 @@
 
 	// Use a device specific topic as we are the only adaptercore handling requests for this device
 	replyToTopic := ap.getAdapterTopic()
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, deviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, deviceId, args...)
 	logger.Debugw("DeleteAllPorts-response", log.Fields{"deviceId": deviceId, "success": success})
 	return unPackResponse(rpc, deviceId, success, result)
 }
 
 func (ap *CoreProxy) DeviceStateUpdate(ctx context.Context, deviceId string,
 	connStatus voltha.ConnectStatus_Types, operStatus voltha.OperStatus_Types) error {
-	log.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId})
+	logger.Debugw("DeviceStateUpdate", log.Fields{"deviceId": deviceId})
 	rpc := "DeviceStateUpdate"
 	// Use a device specific topic to send the request.  The adapter handling the device creates a device
 	// specific topic
@@ -226,7 +248,7 @@
 	}
 	// Use a device specific topic as we are the only adaptercore handling requests for this device
 	replyToTopic := ap.getAdapterTopic()
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, deviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, deviceId, args...)
 	logger.Debugw("DeviceStateUpdate-response", log.Fields{"deviceId": deviceId, "success": success})
 	return unPackResponse(rpc, deviceId, success, result)
 }
@@ -277,7 +299,7 @@
 		Value: oId,
 	}
 
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
 	logger.Debugw("ChildDeviceDetected-response", log.Fields{"pDeviceId": parentDeviceId, "success": success})
 
 	if success {
@@ -315,7 +337,7 @@
 		Value: id,
 	}
 
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
 	logger.Debugw("ChildDevicesLost-response", log.Fields{"pDeviceId": parentDeviceId, "success": success})
 	return unPackResponse(rpc, parentDeviceId, success, result)
 }
@@ -335,7 +357,7 @@
 		Value: id,
 	}
 
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
 	logger.Debugw("ChildDevicesDetected-response", log.Fields{"pDeviceId": parentDeviceId, "success": success})
 	return unPackResponse(rpc, parentDeviceId, success, result)
 }
@@ -354,7 +376,7 @@
 		Value: id,
 	}
 
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
 	logger.Debugw("GetDevice-response", log.Fields{"pDeviceId": parentDeviceId, "success": success})
 
 	if success {
@@ -414,7 +436,7 @@
 		}
 	}
 
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
 	logger.Debugw("GetChildDevice-response", log.Fields{"pDeviceId": parentDeviceId, "success": success})
 
 	if success {
@@ -450,7 +472,7 @@
 		Value: id,
 	}
 
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
 	logger.Debugw("GetChildDevices-response", log.Fields{"pDeviceId": parentDeviceId, "success": success})
 
 	if success {
@@ -496,7 +518,7 @@
 		Key:   "packet",
 		Value: pkt,
 	}
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, deviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, deviceId, args...)
 	logger.Debugw("SendPacketIn-response", log.Fields{"pDeviceId": deviceId, "success": success})
 	return unPackResponse(rpc, deviceId, success, result)
 }
@@ -520,7 +542,7 @@
 		Key:   "device_reason",
 		Value: reason,
 	}
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, deviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, deviceId, args...)
 	logger.Debugw("DeviceReason-response", log.Fields{"pDeviceId": deviceId, "success": success})
 	return unPackResponse(rpc, deviceId, success, result)
 }
@@ -538,7 +560,7 @@
 		Key:   "device_pm_config",
 		Value: pmConfigs,
 	}
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, pmConfigs.Id, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, pmConfigs.Id, args...)
 	logger.Debugw("DevicePMConfigUpdate-response", log.Fields{"pDeviceId": pmConfigs.Id, "success": success})
 	return unPackResponse(rpc, pmConfigs.Id, success, result)
 }
@@ -555,7 +577,7 @@
 		{Key: "parent_device_id", Value: &voltha.ID{Id: parentDeviceId}},
 	}
 
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, parentDeviceId, args...)
 	logger.Debugw("ReconcileChildDevices-response", log.Fields{"pDeviceId": parentDeviceId, "success": success})
 	return unPackResponse(rpc, parentDeviceId, success, result)
 }
@@ -592,7 +614,7 @@
 
 	// Use a device specific topic as we are the only adaptercore handling requests for this device
 	replyToTopic := ap.getAdapterTopic()
-	success, result := ap.kafkaICProxy.InvokeRPC(nil, rpc, &toTopic, &replyToTopic, true, deviceId, args...)
+	success, result := ap.kafkaICProxy.InvokeRPC(context.Background(), rpc, &toTopic, &replyToTopic, true, deviceId, args...)
 	logger.Debugw("PortStateUpdate-response", log.Fields{"deviceId": deviceId, "success": success})
 	return unPackResponse(rpc, deviceId, success, result)
 }
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/events_proxy.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/events_proxy.go
index 034de8e..da9c9eb 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/events_proxy.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/events_proxy.go
@@ -23,6 +23,7 @@
 	"strings"
 	"time"
 
+	"github.com/golang/protobuf/ptypes"
 	"github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif"
 	"github.com/opencord/voltha-lib-go/v3/pkg/kafka"
 	"github.com/opencord/voltha-lib-go/v3/pkg/log"
@@ -60,7 +61,11 @@
 	return fmt.Sprintf("Voltha.openolt.%s.%s", eventName, strconv.FormatInt(time.Now().UnixNano(), 10))
 }
 
-func (ep *EventProxy) getEventHeader(eventName string, category adapterif.EventCategory, subCategory adapterif.EventSubCategory, eventType adapterif.EventType, raisedTs int64) *voltha.EventHeader {
+func (ep *EventProxy) getEventHeader(eventName string,
+	category adapterif.EventCategory,
+	subCategory adapterif.EventSubCategory,
+	eventType adapterif.EventType,
+	raisedTs int64) (*voltha.EventHeader, error) {
 	var header voltha.EventHeader
 	if strings.Contains(eventName, "_") {
 		eventName = strings.Join(strings.Split(eventName, "_")[:len(strings.Split(eventName, "_"))-2], "_")
@@ -73,9 +78,21 @@
 	header.SubCategory = subCategory
 	header.Type = eventType
 	header.TypeVersion = adapterif.EventTypeVersion
-	header.RaisedTs = float32(raisedTs)
-	header.ReportedTs = float32(time.Now().UnixNano())
-	return &header
+
+	// raisedTs is in nanoseconds
+	timestamp, err := ptypes.TimestampProto(time.Unix(0, raisedTs))
+	if err != nil {
+		return nil, err
+	}
+	header.RaisedTs = timestamp
+
+	timestamp, err = ptypes.TimestampProto(time.Now())
+	if err != nil {
+		return nil, err
+	}
+	header.ReportedTs = timestamp
+
+	return &header, nil
 }
 
 /* Send out device events*/
@@ -86,8 +103,11 @@
 	}
 	var event voltha.Event
 	var de voltha.Event_DeviceEvent
+	var err error
 	de.DeviceEvent = deviceEvent
-	event.Header = ep.getEventHeader(deviceEvent.DeviceEventName, category, subCategory, voltha.EventType_DEVICE_EVENT, raisedTs)
+	if event.Header, err = ep.getEventHeader(deviceEvent.DeviceEventName, category, subCategory, voltha.EventType_DEVICE_EVENT, raisedTs); err != nil {
+		return err
+	}
 	event.EventType = &de
 	if err := ep.sendEvent(&event); err != nil {
 		logger.Errorw("Failed to send device event to KAFKA bus", log.Fields{"device-event": deviceEvent})
@@ -110,8 +130,11 @@
 	}
 	var event voltha.Event
 	var de voltha.Event_KpiEvent2
+	var err error
 	de.KpiEvent2 = kpiEvent
-	event.Header = ep.getEventHeader(id, category, subCategory, voltha.EventType_KPI_EVENT2, raisedTs)
+	if event.Header, err = ep.getEventHeader(id, category, subCategory, voltha.EventType_KPI_EVENT2, raisedTs); err != nil {
+		return err
+	}
 	event.EventType = &de
 	if err := ep.sendEvent(&event); err != nil {
 		logger.Errorw("Failed to send kpi event to KAFKA bus", log.Fields{"device-event": kpiEvent})
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 78b8eb5..843b95c 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
@@ -658,3 +658,80 @@
 	}
 	return deviceId.Val, port, nil
 }
+
+func (rhp *RequestHandlerProxy) Child_device_lost(args []*ic.Argument) error {
+	if len(args) < 4 {
+		logger.Warn("invalid-number-of-args", log.Fields{"args": args})
+		return errors.New("invalid-number-of-args")
+	}
+
+	pDeviceId := &ic.StrType{}
+	pPortNo := &ic.IntType{}
+	onuID := &ic.IntType{}
+	fromTopic := &ic.StrType{}
+	for _, arg := range args {
+		switch arg.Key {
+		case "pDeviceId":
+			if err := ptypes.UnmarshalAny(arg.Value, pDeviceId); err != nil {
+				logger.Warnw("cannot-unmarshal-parent-deviceId", log.Fields{"error": err})
+				return err
+			}
+		case "pPortNo":
+			if err := ptypes.UnmarshalAny(arg.Value, pPortNo); err != nil {
+				logger.Warnw("cannot-unmarshal-port", log.Fields{"error": err})
+				return err
+			}
+		case "onuID":
+			if err := ptypes.UnmarshalAny(arg.Value, onuID); err != nil {
+				logger.Warnw("cannot-unmarshal-transaction-ID", log.Fields{"error": err})
+				return err
+			}
+		case kafka.FromTopic:
+			if err := ptypes.UnmarshalAny(arg.Value, fromTopic); err != nil {
+				logger.Warnw("cannot-unmarshal-from-topic", log.Fields{"error": err})
+				return err
+			}
+		}
+	}
+	//Update the core reference for that device
+	rhp.coreProxy.UpdateCoreReference(pDeviceId.Val, fromTopic.Val)
+	//Invoke the Child_device_lost API on the adapter
+	if err := rhp.adapter.Child_device_lost(pDeviceId.Val, uint32(pPortNo.Val), uint32(onuID.Val)); err != nil {
+		return status.Errorf(codes.NotFound, "%s", err.Error())
+	}
+	return nil
+}
+
+func (rhp *RequestHandlerProxy) Start_omci_test(args []*ic.Argument) (*ic.TestResponse, error) {
+	if len(args) < 2 {
+		logger.Warn("invalid-number-of-args", log.Fields{"args": args})
+		err := errors.New("invalid-number-of-args")
+		return nil, err
+	}
+
+	// TODO: See related comment in voltha-go:adapter_proxy_go:startOmciTest()
+	//   Second argument should perhaps be uuid instead of omcitestrequest
+
+	device := &voltha.Device{}
+	request := &voltha.OmciTestRequest{}
+	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 "omcitestrequest":
+			if err := ptypes.UnmarshalAny(arg.Value, request); err != nil {
+				logger.Warnw("cannot-unmarshal-omcitestrequest", log.Fields{"error": err})
+				return nil, err
+			}
+		}
+	}
+	logger.Debugw("Start_omci_test", log.Fields{"device-id": device.Id, "req": request})
+	result, err := rhp.adapter.Start_omci_test(device, request)
+	if err != nil {
+		return nil, status.Errorf(codes.NotFound, "%s", err.Error())
+	}
+	return result, nil
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/utils.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/utils.go
index b782ebe..94e8bd6 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/utils.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/adapters/common/utils.go
@@ -84,7 +84,7 @@
 	case ic.ErrorCode_DEADLINE_EXCEEDED:
 		return codes.DeadlineExceeded
 	default:
-		log.Warnw("cannnot-map-ic-error-code-to-grpc-error-code", log.Fields{"err": icErr})
+		logger.Warnw("cannnot-map-ic-error-code-to-grpc-error-code", log.Fields{"err": icErr})
 		return codes.Internal
 	}
 }
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 c0e44be..112fb94 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
@@ -51,4 +51,6 @@
 	Revert_image_update(device *voltha.Device, request *voltha.ImageDownload) (*voltha.ImageDownload, error)
 	Enable_port(deviceId string, port *voltha.Port) error
 	Disable_port(deviceId string, port *voltha.Port) error
+	Child_device_lost(parentDeviceId string, parentPortNo uint32, onuID uint32) error
+	Start_omci_test(device *voltha.Device, request *voltha.OmciTestRequest) (*voltha.TestResponse, error)
 }
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
new file mode 100644
index 0000000..42574d0
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/backend.go
@@ -0,0 +1,269 @@
+/*
+ * 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.
+ */
+
+package db
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"strconv"
+	"sync"
+	"time"
+
+	"github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore"
+	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+)
+
+const (
+	// Default Minimal Interval for posting alive state of backend kvstore on Liveness Channel
+	DefaultLivenessChannelInterval = time.Second * 30
+)
+
+// 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
+	PathPrefix              string
+	alive                   bool          // Is this backend connection alive?
+	liveness                chan bool     // channel to post alive state
+	LivenessChannelInterval time.Duration // regularly push alive state beyond this interval
+	lastLivenessTime        time.Time     // Instant of last alive state push
+}
+
+// NewBackend creates a new instance of a Backend structure
+func NewBackend(storeType string, host string, port int, timeout int, pathPrefix string) *Backend {
+	var err error
+
+	b := &Backend{
+		StoreType:               storeType,
+		Host:                    host,
+		Port:                    port,
+		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,
+				"timeout": timeout, "prefix": pathPrefix,
+				"error": err.Error(),
+			})
+	}
+
+	return b
+}
+
+func (b *Backend) newClient(address string, timeout int) (kvstore.Client, error) {
+	switch b.StoreType {
+	case "consul":
+		return kvstore.NewConsulClient(address, timeout)
+	case "etcd":
+		return kvstore.NewEtcdClient(address, timeout)
+	}
+	return nil, errors.New("unsupported-kv-store")
+}
+
+func (b *Backend) makePath(key string) string {
+	path := fmt.Sprintf("%s/%s", b.PathPrefix, key)
+	return path
+}
+
+func (b *Backend) updateLiveness(alive bool) {
+	// Periodically push stream of liveness data to the channel,
+	// so that in a live state, the core does not timeout and
+	// send a forced liveness message. Push alive state if the
+	// last push to channel was beyond livenessChannelInterval
+	if b.liveness != nil {
+
+		if b.alive != alive {
+			logger.Debug("update-liveness-channel-reason-change")
+			b.liveness <- alive
+			b.lastLivenessTime = time.Now()
+		} else if time.Since(b.lastLivenessTime) > b.LivenessChannelInterval {
+			logger.Debug("update-liveness-channel-reason-interval")
+			b.liveness <- alive
+			b.lastLivenessTime = time.Now()
+		}
+	}
+
+	// Emit log message only for alive state change
+	if b.alive != alive {
+		logger.Debugw("change-kvstore-alive-status", log.Fields{"alive": alive})
+		b.alive = alive
+	}
+}
+
+// Perform a dummy Key Lookup on kvstore to test Connection Liveness and
+// post on Liveness channel
+func (b *Backend) PerformLivenessCheck(ctx context.Context) bool {
+	alive := b.Client.IsConnectionUp(ctx)
+	logger.Debugw("kvstore-liveness-check-result", log.Fields{"alive": alive})
+
+	b.updateLiveness(alive)
+	return alive
+}
+
+// Enable the liveness monitor channel. This channel will report
+// a "true" or "false" on every kvstore operation which indicates whether
+// or not the connection is still Live. This channel is then picked up
+// by the service (i.e. rw_core / ro_core) to update readiness status
+// and/or take other actions.
+func (b *Backend) EnableLivenessChannel() chan bool {
+	logger.Debug("enable-kvstore-liveness-channel")
+
+	if b.liveness == nil {
+		logger.Debug("create-kvstore-liveness-channel")
+
+		// Channel size of 10 to avoid any possibility of blocking in Load conditions
+		b.liveness = make(chan bool, 10)
+
+		// Post initial alive state
+		b.liveness <- b.alive
+		b.lastLivenessTime = time.Now()
+	}
+
+	return b.liveness
+}
+
+// Extract Alive status of Kvstore based on type of error
+func (b *Backend) isErrorIndicatingAliveKvstore(err error) bool {
+	// Alive unless observed an error indicating so
+	alive := true
+
+	if err != nil {
+
+		// timeout indicates kvstore not reachable/alive
+		if err == context.DeadlineExceeded {
+			alive = false
+		}
+
+		// Need to analyze client-specific errors based on backend type
+		if b.StoreType == "etcd" {
+
+			// For etcd backend, consider not-alive only for errors indicating
+			// timedout request or unavailable/corrupted cluster. For all remaining
+			// error codes listed in https://godoc.org/google.golang.org/grpc/codes#Code,
+			// we would not infer a not-alive backend because such a error may also
+			// occur due to bad client requests or sequence of operations
+			switch status.Code(err) {
+			case codes.DeadlineExceeded:
+				fallthrough
+			case codes.Unavailable:
+				fallthrough
+			case codes.DataLoss:
+				alive = false
+			}
+
+			//} else {
+			// TODO: Implement for consul backend; would it be needed ever?
+		}
+	}
+
+	return alive
+}
+
+// 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})
+
+	pair, err := b.Client.List(ctx, formattedPath)
+
+	b.updateLiveness(b.isErrorIndicatingAliveKvstore(err))
+
+	return pair, err
+}
+
+// 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})
+
+	pair, err := b.Client.Get(ctx, formattedPath)
+
+	b.updateLiveness(b.isErrorIndicatingAliveKvstore(err))
+
+	return pair, err
+}
+
+// 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})
+
+	err := b.Client.Put(ctx, formattedPath, value)
+
+	b.updateLiveness(b.isErrorIndicatingAliveKvstore(err))
+
+	return err
+}
+
+// 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})
+
+	err := b.Client.Delete(ctx, formattedPath)
+
+	b.updateLiveness(b.isErrorIndicatingAliveKvstore(err))
+
+	return err
+}
+
+// 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})
+
+	return b.Client.Watch(ctx, formattedPath, withPrefix)
+}
+
+// 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})
+
+	b.Client.CloseWatch(formattedPath, ch)
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/common.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/common.go
new file mode 100644
index 0000000..1cf2e1c
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/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 db
+
+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": "db"})
+	if err != nil {
+		panic(err)
+	}
+}
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 d30e049..b9cb1ee 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
@@ -81,7 +81,7 @@
 	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) chan *Event
+	Watch(ctx context.Context, key string, withPrefix bool) chan *Event
 	AcquireLock(ctx context.Context, lockName string, timeout int) error
 	ReleaseLock(lockName string) error
 	IsConnectionUp(ctx context.Context) bool // timeout in second
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/common.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/common.go
index 2d2a6a6..aa7aeb0 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/common.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/db/kvstore/common.go
@@ -19,16 +19,12 @@
 	"github.com/opencord/voltha-lib-go/v3/pkg/log"
 )
 
-const (
-	logLevel = log.ErrorLevel
-)
-
 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, logLevel, log.Fields{"pkg": "kvstore"})
+	logger, err = log.AddPackage(log.JSON, log.ErrorLevel, log.Fields{"pkg": "kvstore"})
 	if err != nil {
 		panic(err)
 	}
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 fdf39be..bdf2d10 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
@@ -360,7 +360,7 @@
 
 // Watch provides the watch capability on a given key.  It returns a channel onto which the callee needs to
 // listen to receive Events.
-func (c *ConsulClient) Watch(ctx context.Context, key string) chan *Event {
+func (c *ConsulClient) Watch(ctx context.Context, key string, withPrefix bool) chan *Event {
 
 	// Create a new channel
 	ch := make(chan *Event, maxClientChannelBufferSize)
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 a0f39cd..d38f0f6 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
@@ -29,19 +29,15 @@
 
 // EtcdClient represents the Etcd KV store client
 type EtcdClient struct {
-	ectdAPI          *v3Client.Client
-	leaderRev        v3Client.Client
-	keyReservations  map[string]*v3Client.LeaseID
-	watchedChannels  sync.Map
-	writeLock        sync.Mutex
-	lockToMutexMap   map[string]*v3Concurrency.Mutex
-	lockToSessionMap map[string]*v3Concurrency.Session
-	lockToMutexLock  sync.Mutex
+	ectdAPI             *v3Client.Client
+	keyReservations     map[string]*v3Client.LeaseID
+	watchedChannels     sync.Map
+	keyReservationsLock sync.RWMutex
+	lockToMutexMap      map[string]*v3Concurrency.Mutex
+	lockToSessionMap    map[string]*v3Concurrency.Session
+	lockToMutexLock     sync.Mutex
 }
 
-// Connection Timeout in Seconds
-var connTimeout int = 2
-
 // NewEtcdClient returns a new client for the Etcd KV store
 func NewEtcdClient(addr string, timeout int) (*EtcdClient, error) {
 	duration := GetDuration(timeout)
@@ -118,13 +114,13 @@
 		return fmt.Errorf("unexpected-type-%T", value)
 	}
 
-	c.writeLock.Lock()
-	defer c.writeLock.Unlock()
-
 	var err error
 	// Check if there is already a lease for this key - if there is then use it, otherwise a PUT will make
 	// that KV key permanent instead of automatically removing it after a lease expiration
-	if leaseID, ok := c.keyReservations[key]; ok {
+	c.keyReservationsLock.RLock()
+	leaseID, ok := c.keyReservations[key]
+	c.keyReservationsLock.RUnlock()
+	if ok {
 		_, err = c.ectdAPI.Put(ctx, key, val, v3Client.WithLease(*leaseID))
 	} else {
 		_, err = c.ectdAPI.Put(ctx, key, val)
@@ -150,9 +146,6 @@
 // wait for a response
 func (c *EtcdClient) Delete(ctx context.Context, key string) error {
 
-	c.writeLock.Lock()
-	defer c.writeLock.Unlock()
-
 	// delete the key
 	if _, err := c.ectdAPI.Delete(ctx, key); err != nil {
 		logger.Errorw("failed-to-delete-key", log.Fields{"key": key, "error": err})
@@ -181,9 +174,9 @@
 		return nil, err
 	}
 	// Register the lease id
-	c.writeLock.Lock()
+	c.keyReservationsLock.Lock()
 	c.keyReservations[key] = &resp.ID
-	c.writeLock.Unlock()
+	c.keyReservationsLock.Unlock()
 
 	// Revoke lease if reservation is not successful
 	reservationSuccessful := false
@@ -239,8 +232,8 @@
 
 // ReleaseAllReservations releases all key reservations previously made (using Reserve API)
 func (c *EtcdClient) ReleaseAllReservations(ctx context.Context) error {
-	c.writeLock.Lock()
-	defer c.writeLock.Unlock()
+	c.keyReservationsLock.Lock()
+	defer c.keyReservationsLock.Unlock()
 
 	for key, leaseID := range c.keyReservations {
 		_, err := c.ectdAPI.Revoke(ctx, *leaseID)
@@ -259,8 +252,8 @@
 	logger.Debugw("Release-reservation", log.Fields{"key": key})
 	var ok bool
 	var leaseID *v3Client.LeaseID
-	c.writeLock.Lock()
-	defer c.writeLock.Unlock()
+	c.keyReservationsLock.Lock()
+	defer c.keyReservationsLock.Unlock()
 	if leaseID, ok = c.keyReservations[key]; !ok {
 		return nil
 	}
@@ -282,9 +275,11 @@
 	// Get the leaseid using the key
 	var ok bool
 	var leaseID *v3Client.LeaseID
-	c.writeLock.Lock()
-	defer c.writeLock.Unlock()
-	if leaseID, ok = c.keyReservations[key]; !ok {
+	c.keyReservationsLock.RLock()
+	leaseID, ok = c.keyReservations[key]
+	c.keyReservationsLock.RUnlock()
+
+	if !ok {
 		return errors.New("key-not-reserved")
 	}
 
@@ -302,10 +297,15 @@
 
 // Watch provides the watch capability on a given key.  It returns a channel onto which the callee needs to
 // listen to receive Events.
-func (c *EtcdClient) Watch(ctx context.Context, key string) chan *Event {
+func (c *EtcdClient) Watch(ctx context.Context, key string, withPrefix bool) chan *Event {
 	w := v3Client.NewWatcher(c.ectdAPI)
 	ctx, cancel := context.WithCancel(ctx)
-	channel := w.Watch(ctx, key)
+	var channel v3Client.WatchChan
+	if withPrefix {
+		channel = w.Watch(ctx, key, v3Client.WithPrefix())
+	} else {
+		channel = w.Watch(ctx, key)
+	}
 
 	// Create a new channel
 	ch := make(chan *Event, maxClientChannelBufferSize)
@@ -371,8 +371,6 @@
 	// Get the array of channels mapping
 	var watchedChannels []map[chan *Event]v3Client.Watcher
 	var ok bool
-	c.writeLock.Lock()
-	defer c.writeLock.Unlock()
 
 	if watchedChannels, ok = c.getChannelMaps(key); !ok {
 		logger.Warnw("key-has-no-watched-channels", log.Fields{"key": key})
@@ -424,8 +422,6 @@
 
 // Close closes the KV store client
 func (c *EtcdClient) Close() {
-	c.writeLock.Lock()
-	defer c.writeLock.Unlock()
 	if err := c.ectdAPI.Close(); err != nil {
 		logger.Errorw("error-closing-client", log.Fields{"error": err})
 	}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/common.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/common.go
index cb6acb2..149c150 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/common.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/common.go
@@ -19,16 +19,12 @@
 	"github.com/opencord/voltha-lib-go/v3/pkg/log"
 )
 
-const (
-	logLevel = log.ErrorLevel
-)
-
 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, logLevel, log.Fields{"pkg": "kafka"})
+	logger, err = log.AddPackage(log.JSON, log.ErrorLevel, log.Fields{"pkg": "kafka"})
 	if err != nil {
 		panic(err)
 	}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/endpoint_manager.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/endpoint_manager.go
new file mode 100644
index 0000000..1258382
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/endpoint_manager.go
@@ -0,0 +1,352 @@
+/*
+ * 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 kafka
+
+import (
+	"context"
+	"fmt"
+	"github.com/buraksezer/consistent"
+	"github.com/cespare/xxhash"
+	"github.com/golang/protobuf/proto"
+	"github.com/opencord/voltha-lib-go/v3/pkg/db"
+	"github.com/opencord/voltha-lib-go/v3/pkg/log"
+	"github.com/opencord/voltha-protos/v3/go/voltha"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+	"sync"
+)
+
+const (
+	// All the values below can be tuned to get optimal data distribution.  The numbers below seems to work well when
+	// supporting 1000-10000 devices and 1 - 20 replicas of a service
+
+	// Keys are distributed among partitions. Prime numbers are good to distribute keys uniformly.
+	DefaultPartitionCount = 1117
+
+	// Represents how many times a node is replicated on the consistent ring.
+	DefaultReplicationFactor = 117
+
+	// Load is used to calculate average load.
+	DefaultLoad = 1.1
+)
+
+type Endpoint string // Endpoint of a service instance.  When using kafka, this is the topic name of a service
+type ReplicaID int32 // The replication ID of a service instance
+
+type EndpointManager interface {
+
+	// GetEndpoint is called to get the endpoint to communicate with for a specific device and service type.  For
+	// now this will return the topic name
+	GetEndpoint(deviceID string, serviceType string) (Endpoint, error)
+
+	// IsDeviceOwnedByService is invoked when a specific service (service type + replicaNumber) is restarted and
+	// devices owned by that service need to be reconciled
+	IsDeviceOwnedByService(deviceID string, serviceType string, replicaNumber int32) (bool, error)
+
+	// GetReplicaAssignment returns the replica number of the service that owns the deviceID.  This is used by the
+	// test only
+	GetReplicaAssignment(deviceID string, serviceType string) (ReplicaID, error)
+}
+
+type service struct {
+	id             string // Id of the service.  The same id is used for all replicas
+	totalReplicas  int32
+	replicas       map[ReplicaID]Endpoint
+	consistentRing *consistent.Consistent
+}
+
+type endpointManager struct {
+	partitionCount           int
+	replicationFactor        int
+	load                     float64
+	backend                  *db.Backend
+	services                 map[string]*service
+	servicesLock             sync.RWMutex
+	deviceTypeServiceMap     map[string]string
+	deviceTypeServiceMapLock sync.RWMutex
+}
+
+type EndpointManagerOption func(*endpointManager)
+
+func PartitionCount(count int) EndpointManagerOption {
+	return func(args *endpointManager) {
+		args.partitionCount = count
+	}
+}
+
+func ReplicationFactor(replicas int) EndpointManagerOption {
+	return func(args *endpointManager) {
+		args.replicationFactor = replicas
+	}
+}
+
+func Load(load float64) EndpointManagerOption {
+	return func(args *endpointManager) {
+		args.load = load
+	}
+}
+
+func newEndpointManager(backend *db.Backend, opts ...EndpointManagerOption) EndpointManager {
+	tm := &endpointManager{
+		partitionCount:       DefaultPartitionCount,
+		replicationFactor:    DefaultReplicationFactor,
+		load:                 DefaultLoad,
+		backend:              backend,
+		services:             make(map[string]*service),
+		deviceTypeServiceMap: make(map[string]string),
+	}
+
+	for _, option := range opts {
+		option(tm)
+	}
+	return tm
+}
+
+func NewEndpointManager(backend *db.Backend, opts ...EndpointManagerOption) EndpointManager {
+	return newEndpointManager(backend, opts...)
+}
+
+func (ep *endpointManager) GetEndpoint(deviceID string, serviceType string) (Endpoint, error) {
+	logger.Debugw("getting-endpoint", log.Fields{"device-id": deviceID, "service": serviceType})
+	owner, err := ep.getOwner(deviceID, serviceType)
+	if err != nil {
+		return "", err
+	}
+	m, ok := owner.(Member)
+	if !ok {
+		return "", status.Errorf(codes.Aborted, "invalid-member-%v", owner)
+	}
+	endpoint := m.getEndPoint()
+	if endpoint == "" {
+		return "", status.Errorf(codes.Unavailable, "endpoint-not-set-%s", serviceType)
+	}
+	logger.Debugw("returning-endpoint", log.Fields{"device-id": deviceID, "service": serviceType, "endpoint": endpoint})
+	return endpoint, nil
+}
+
+func (ep *endpointManager) IsDeviceOwnedByService(deviceID string, serviceType string, replicaNumber int32) (bool, error) {
+	logger.Debugw("device-ownership", log.Fields{"device-id": deviceID, "service": serviceType, "replica-number": replicaNumber})
+	owner, err := ep.getOwner(deviceID, serviceType)
+	if err != nil {
+		return false, nil
+	}
+	m, ok := owner.(Member)
+	if !ok {
+		return false, status.Errorf(codes.Aborted, "invalid-member-%v", owner)
+	}
+	return m.getReplica() == ReplicaID(replicaNumber), nil
+}
+
+func (ep *endpointManager) GetReplicaAssignment(deviceID string, serviceType string) (ReplicaID, error) {
+	owner, err := ep.getOwner(deviceID, serviceType)
+	if err != nil {
+		return 0, nil
+	}
+	m, ok := owner.(Member)
+	if !ok {
+		return 0, status.Errorf(codes.Aborted, "invalid-member-%v", owner)
+	}
+	return m.getReplica(), nil
+}
+
+func (ep *endpointManager) getOwner(deviceID string, serviceType string) (consistent.Member, error) {
+	serv, dType, err := ep.getServiceAndDeviceType(serviceType)
+	if err != nil {
+		return nil, err
+	}
+	key := ep.makeKey(deviceID, dType, serviceType)
+	return serv.consistentRing.LocateKey(key), nil
+}
+
+func (ep *endpointManager) getServiceAndDeviceType(serviceType string) (*service, string, error) {
+	// Check whether service exist
+	ep.servicesLock.RLock()
+	serv, serviceExist := ep.services[serviceType]
+	ep.servicesLock.RUnlock()
+
+	// Load the service and device types if needed
+	if !serviceExist || serv == nil || int(serv.totalReplicas) != len(serv.consistentRing.GetMembers()) {
+		if err := ep.loadServices(); err != nil {
+			return nil, "", err
+		}
+
+		// Check whether the service exists now
+		ep.servicesLock.RLock()
+		serv, serviceExist = ep.services[serviceType]
+		ep.servicesLock.RUnlock()
+		if !serviceExist || serv == nil || int(serv.totalReplicas) != len(serv.consistentRing.GetMembers()) {
+			return nil, "", status.Errorf(codes.NotFound, "service-%s", serviceType)
+		}
+	}
+
+	ep.deviceTypeServiceMapLock.RLock()
+	defer ep.deviceTypeServiceMapLock.RUnlock()
+	for dType, sType := range ep.deviceTypeServiceMap {
+		if sType == serviceType {
+			return serv, dType, nil
+		}
+	}
+	return nil, "", status.Errorf(codes.NotFound, "service-%s", serviceType)
+}
+
+func (ep *endpointManager) getConsistentConfig() consistent.Config {
+	return consistent.Config{
+		PartitionCount:    ep.partitionCount,
+		ReplicationFactor: ep.replicationFactor,
+		Load:              ep.load,
+		Hasher:            hasher{},
+	}
+}
+
+// loadServices loads the services (adapters) and device types in memory. Because of the small size of the data and
+// the data format in the dB being binary protobuf then it is better to load all the data if inconsistency is detected,
+// instead of watching for updates in the dB and acting on it.
+func (ep *endpointManager) loadServices() error {
+	ep.servicesLock.Lock()
+	defer ep.servicesLock.Unlock()
+	ep.deviceTypeServiceMapLock.Lock()
+	defer ep.deviceTypeServiceMapLock.Unlock()
+
+	if ep.backend == nil {
+		return status.Error(codes.Aborted, "backend-not-set")
+	}
+	ep.services = make(map[string]*service)
+	ep.deviceTypeServiceMap = make(map[string]string)
+
+	// Load the adapters
+	blobs, err := ep.backend.List(context.Background(), "adapters")
+	if err != nil {
+		return err
+	}
+
+	// Data is marshalled as proto bytes in the data store
+	for _, blob := range blobs {
+		data := blob.Value.([]byte)
+		adapter := &voltha.Adapter{}
+		if err := proto.Unmarshal(data, adapter); err != nil {
+			return err
+		}
+		// A valid adapter should have the vendorID set
+		if adapter.Vendor != "" {
+			if _, ok := ep.services[adapter.Type]; !ok {
+				ep.services[adapter.Type] = &service{
+					id:             adapter.Type,
+					totalReplicas:  adapter.TotalReplicas,
+					replicas:       make(map[ReplicaID]Endpoint),
+					consistentRing: consistent.New(nil, ep.getConsistentConfig()),
+				}
+
+			}
+			currentReplica := ReplicaID(adapter.CurrentReplica)
+			endpoint := Endpoint(adapter.Endpoint)
+			ep.services[adapter.Type].replicas[currentReplica] = endpoint
+			ep.services[adapter.Type].consistentRing.Add(newMember(adapter.Id, adapter.Type, adapter.Vendor, endpoint, adapter.Version, currentReplica))
+		}
+	}
+	// Load the device types
+	blobs, err = ep.backend.List(context.Background(), "device_types")
+	if err != nil {
+		return err
+	}
+	for _, blob := range blobs {
+		data := blob.Value.([]byte)
+		deviceType := &voltha.DeviceType{}
+		if err := proto.Unmarshal(data, deviceType); err != nil {
+			return err
+		}
+		if _, ok := ep.deviceTypeServiceMap[deviceType.Id]; !ok {
+			ep.deviceTypeServiceMap[deviceType.Id] = deviceType.Adapter
+		}
+	}
+
+	// Log the loaded data in debug mode to facilitate trouble shooting
+	if logger.V(log.DebugLevel) {
+		for key, val := range ep.services {
+			members := val.consistentRing.GetMembers()
+			logger.Debugw("service", log.Fields{"service": key, "expected-replica": val.totalReplicas, "replicas": len(val.consistentRing.GetMembers())})
+			for _, m := range members {
+				n := m.(Member)
+				logger.Debugw("service-loaded", log.Fields{"serviceId": n.getID(), "serviceType": n.getServiceType(), "replica": n.getReplica(), "endpoint": n.getEndPoint()})
+			}
+		}
+		logger.Debugw("device-types-loaded", log.Fields{"device-types": ep.deviceTypeServiceMap})
+	}
+	return nil
+}
+
+// makeKey creates the string that the hash function uses to create the hash
+func (ep *endpointManager) makeKey(deviceID string, deviceType string, serviceType string) []byte {
+	return []byte(fmt.Sprintf("%s_%s_%s", serviceType, deviceType, deviceID))
+}
+
+// The consistent package requires a hasher function
+type hasher struct{}
+
+// Sum64 provides the hasher function.  Based upon numerous testing scenarios, the xxhash package seems to provide the
+// best distribution compare to other hash packages
+func (h hasher) Sum64(data []byte) uint64 {
+	return xxhash.Sum64(data)
+}
+
+// Member represents a member on the consistent ring
+type Member interface {
+	String() string
+	getReplica() ReplicaID
+	getEndPoint() Endpoint
+	getID() string
+	getServiceType() string
+}
+
+// member implements the Member interface
+type member struct {
+	id          string
+	serviceType string
+	vendor      string
+	version     string
+	replica     ReplicaID
+	endpoint    Endpoint
+}
+
+func newMember(ID string, serviceType string, vendor string, endPoint Endpoint, version string, replica ReplicaID) Member {
+	return &member{
+		id:          ID,
+		serviceType: serviceType,
+		vendor:      vendor,
+		version:     version,
+		replica:     replica,
+		endpoint:    endPoint,
+	}
+}
+
+func (m *member) String() string {
+	return string(m.endpoint)
+}
+
+func (m *member) getReplica() ReplicaID {
+	return m.replica
+}
+
+func (m *member) getEndPoint() Endpoint {
+	return m.endpoint
+}
+
+func (m *member) getID() string {
+	return m.id
+}
+
+func (m *member) getServiceType() string {
+	return m.serviceType
+}
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 d21fdd5..fc2334d 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,6 +19,8 @@
 	"context"
 	"errors"
 	"fmt"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
 	"reflect"
 	"strings"
 	"sync"
@@ -34,7 +36,7 @@
 
 const (
 	DefaultMaxRetries     = 3
-	DefaultRequestTimeout = 10000 // 10000 milliseconds - to handle a wider latency range
+	DefaultRequestTimeout = 60000 // 60000 milliseconds - to handle a wider latency range
 )
 
 const (
@@ -66,6 +68,7 @@
 	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
 	SubscribeWithDefaultRequestHandler(topic Topic, initialOffset int64) error
 	UnSubscribeFromRequestHandler(topic Topic) error
@@ -189,9 +192,15 @@
 	kp.doneOnce.Do(func() { close(kp.doneCh) })
 	// TODO : Perform cleanup
 	kp.kafkaClient.Stop()
-	//kp.deleteAllTopicRequestHandlerChannelMap()
-	//kp.deleteAllTopicResponseChannelMap()
-	//kp.deleteAllTransactionIdToChannelMap()
+	err := kp.deleteAllTopicRequestHandlerChannelMap()
+	if err != nil {
+		logger.Errorw("failed-delete-all-topic-request-handler-channel-map", log.Fields{"error": err})
+	}
+	err = kp.deleteAllTopicResponseChannelMap()
+	if err != nil {
+		logger.Errorw("failed-delete-all-topic-response-channel-map", log.Fields{"error": err})
+	}
+	kp.deleteAllTransactionIdToChannelMap()
 }
 
 func (kp *interContainerProxy) GetDefaultTopic() *Topic {
@@ -240,6 +249,104 @@
 	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 {
+
+	logger.Debugw("InvokeAsyncRPC", log.Fields{"rpc": rpc, "key": key})
+	//	If a replyToTopic is provided then we use it, otherwise just use the  default toTopic.  The replyToTopic is
+	// typically the device ID.
+	responseTopic := replyToTopic
+	if responseTopic == nil {
+		responseTopic = kp.GetDefaultTopic()
+	}
+
+	chnl := make(chan *RpcResponse)
+
+	go func() {
+
+		// once we're done,
+		// close the response channel
+		defer close(chnl)
+
+		var err error
+		var protoRequest *ic.InterContainerMessage
+
+		// Encode the request
+		protoRequest, err = encodeRequest(rpc, toTopic, responseTopic, key, kvArgs...)
+		if err != nil {
+			logger.Warnw("cannot-format-request", log.Fields{"rpc": rpc, "error": err})
+			chnl <- NewResponse(RpcFormattingError, err, nil)
+			return
+		}
+
+		// Subscribe for response, if needed, before sending request
+		var ch <-chan *ic.InterContainerMessage
+		if ch, err = kp.subscribeForResponse(*responseTopic, protoRequest.Header.Id); err != nil {
+			logger.Errorw("failed-to-subscribe-for-response", log.Fields{"error": err, "toTopic": toTopic.Name})
+			chnl <- NewResponse(RpcTransportError, err, nil)
+			return
+		}
+
+		// Send request - if the topic is formatted with a device Id then we will send the request using a
+		// specific key, hence ensuring a single partition is used to publish the request.  This ensures that the
+		// subscriber on that topic will receive the request in the order it was sent.  The key used is the deviceId.
+		logger.Debugw("sending-msg", log.Fields{"rpc": rpc, "toTopic": toTopic, "replyTopic": responseTopic, "key": key, "xId": protoRequest.Header.Id})
+
+		// if the message is not sent on kafka publish an event an close the channel
+		if err = kp.kafkaClient.Send(protoRequest, toTopic, key); err != nil {
+			chnl <- NewResponse(RpcTransportError, err, nil)
+			return
+		}
+
+		// if the client is not waiting for a response send the ack and close the channel
+		chnl <- NewResponse(RpcSent, nil, nil)
+		if !waitForResponse {
+			return
+		}
+
+		defer func() {
+			// Remove the subscription for a response on return
+			if err := kp.unSubscribeForResponse(protoRequest.Header.Id); err != nil {
+				logger.Warnw("invoke-async-rpc-unsubscriber-for-response-failed", log.Fields{"err": err})
+			}
+		}()
+
+		// Wait for response as well as timeout or cancellation
+		select {
+		case msg, ok := <-ch:
+			if !ok {
+				logger.Warnw("channel-closed", log.Fields{"rpc": rpc, "replyTopic": replyToTopic.Name})
+				chnl <- NewResponse(RpcTransportError, status.Error(codes.Aborted, "channel closed"), nil)
+			}
+			logger.Debugw("received-response", log.Fields{"rpc": rpc, "msgHeader": msg.Header})
+			if responseBody, err := decodeResponse(msg); err != nil {
+				chnl <- NewResponse(RpcReply, err, nil)
+			} else {
+				if responseBody.Success {
+					chnl <- NewResponse(RpcReply, nil, responseBody.Result)
+				} else {
+					// response body contains an error
+					unpackErr := &ic.Error{}
+					if err := ptypes.UnmarshalAny(responseBody.Result, unpackErr); err != nil {
+						chnl <- NewResponse(RpcReply, err, nil)
+					} else {
+						chnl <- NewResponse(RpcReply, status.Error(codes.Internal, unpackErr.Reason), nil)
+					}
+				}
+			}
+		case <-ctx.Done():
+			logger.Errorw("context-cancelled", log.Fields{"rpc": rpc, "ctx": ctx.Err()})
+			err := status.Error(codes.DeadlineExceeded, ctx.Err().Error())
+			chnl <- NewResponse(RpcTimeout, err, nil)
+		case <-kp.doneCh:
+			chnl <- NewResponse(RpcSystemClosing, nil, nil)
+			logger.Warnw("received-exit-signal", log.Fields{"toTopic": toTopic.Name, "rpc": rpc})
+		}
+	}()
+	return chnl
+}
+
 // InvokeRPC is used to send a request to a given topic
 func (kp *interContainerProxy) InvokeRPC(ctx context.Context, rpc string, toTopic *Topic, replyToTopic *Topic,
 	waitForResponse bool, key string, kvArgs ...*KVArg) (bool, *any.Any) {
@@ -272,7 +379,14 @@
 	// subscriber on that topic will receive the request in the order it was sent.  The key used is the deviceId.
 	//key := GetDeviceIdFromTopic(*toTopic)
 	logger.Debugw("sending-msg", log.Fields{"rpc": rpc, "toTopic": toTopic, "replyTopic": responseTopic, "key": key, "xId": protoRequest.Header.Id})
-	go kp.kafkaClient.Send(protoRequest, toTopic, key)
+	go func() {
+		if err := kp.kafkaClient.Send(protoRequest, toTopic, key); err != nil {
+			logger.Errorw("send-failed", log.Fields{
+				"topic": toTopic,
+				"key":   key,
+				"error": err})
+		}
+	}()
 
 	if waitForResponse {
 		// Create a child context based on the parent context, if any
@@ -287,7 +401,13 @@
 
 		// Wait for response as well as timeout or cancellation
 		// Remove the subscription for a response on return
-		defer kp.unSubscribeForResponse(protoRequest.Header.Id)
+		defer func() {
+			if err := kp.unSubscribeForResponse(protoRequest.Header.Id); err != nil {
+				logger.Errorw("response-unsubscribe-failed", log.Fields{
+					"id":    protoRequest.Header.Id,
+					"error": err})
+			}
+		}()
 		select {
 		case msg, ok := <-ch:
 			if !ok {
@@ -378,23 +498,6 @@
 	return kp.deleteFromTopicRequestHandlerChannelMap(topic.Name)
 }
 
-// setupTopicResponseChannelMap sets up single consumers channel that will act as a broadcast channel for all
-// responses from that topic.
-func (kp *interContainerProxy) setupTopicResponseChannelMap(topic string, arg <-chan *ic.InterContainerMessage) {
-	kp.lockTopicResponseChannelMap.Lock()
-	defer kp.lockTopicResponseChannelMap.Unlock()
-	if _, exist := kp.topicToResponseChannelMap[topic]; !exist {
-		kp.topicToResponseChannelMap[topic] = arg
-	}
-}
-
-func (kp *interContainerProxy) isTopicSubscribedForResponse(topic string) bool {
-	kp.lockTopicResponseChannelMap.RLock()
-	defer kp.lockTopicResponseChannelMap.RUnlock()
-	_, exist := kp.topicToResponseChannelMap[topic]
-	return exist
-}
-
 func (kp *interContainerProxy) deleteFromTopicResponseChannelMap(topic string) error {
 	kp.lockTopicResponseChannelMap.Lock()
 	defer kp.lockTopicResponseChannelMap.Unlock()
@@ -407,22 +510,31 @@
 		delete(kp.topicToResponseChannelMap, topic)
 		return err
 	} else {
-		return errors.New(fmt.Sprintf("%s-Topic-not-found", topic))
+		return fmt.Errorf("%s-Topic-not-found", topic)
 	}
 }
 
+// nolint: unused
 func (kp *interContainerProxy) deleteAllTopicResponseChannelMap() error {
+	logger.Debug("delete-all-topic-response-channel")
 	kp.lockTopicResponseChannelMap.Lock()
 	defer kp.lockTopicResponseChannelMap.Unlock()
-	var err error
-	for topic, _ := range kp.topicToResponseChannelMap {
+	var unsubscribeFailTopics []string
+	for topic := range kp.topicToResponseChannelMap {
 		// Unsubscribe to this topic first - this will close the subscribed channel
-		if err = kp.kafkaClient.UnSubscribe(&Topic{Name: topic}, kp.topicToResponseChannelMap[topic]); err != nil {
+		if err := kp.kafkaClient.UnSubscribe(&Topic{Name: topic}, kp.topicToResponseChannelMap[topic]); err != nil {
+			unsubscribeFailTopics = append(unsubscribeFailTopics, topic)
 			logger.Errorw("unsubscribing-error", log.Fields{"topic": topic, "error": err})
+			// Do not return. Continue to try to unsubscribe to other topics.
+		} else {
+			// Only delete from channel map if successfully unsubscribed.
+			delete(kp.topicToResponseChannelMap, topic)
 		}
-		delete(kp.topicToResponseChannelMap, topic)
 	}
-	return err
+	if len(unsubscribeFailTopics) > 0 {
+		return fmt.Errorf("unsubscribe-errors: %v", unsubscribeFailTopics)
+	}
+	return nil
 }
 
 func (kp *interContainerProxy) addToTopicRequestHandlerChannelMap(topic string, arg *requestHandlerChannel) {
@@ -438,26 +550,37 @@
 	defer kp.lockTopicRequestHandlerChannelMap.Unlock()
 	if _, exist := kp.topicToRequestHandlerChannelMap[topic]; exist {
 		// Close the kafka client client first by unsubscribing to this topic
-		kp.kafkaClient.UnSubscribe(&Topic{Name: topic}, kp.topicToRequestHandlerChannelMap[topic].ch)
+		if err := kp.kafkaClient.UnSubscribe(&Topic{Name: topic}, kp.topicToRequestHandlerChannelMap[topic].ch); err != nil {
+			return err
+		}
 		delete(kp.topicToRequestHandlerChannelMap, topic)
 		return nil
 	} else {
-		return errors.New(fmt.Sprintf("%s-Topic-not-found", topic))
+		return fmt.Errorf("%s-Topic-not-found", topic)
 	}
 }
 
+// nolint: unused
 func (kp *interContainerProxy) deleteAllTopicRequestHandlerChannelMap() error {
+	logger.Debug("delete-all-topic-request-channel")
 	kp.lockTopicRequestHandlerChannelMap.Lock()
 	defer kp.lockTopicRequestHandlerChannelMap.Unlock()
-	var err error
-	for topic, _ := range kp.topicToRequestHandlerChannelMap {
+	var unsubscribeFailTopics []string
+	for topic := range kp.topicToRequestHandlerChannelMap {
 		// Close the kafka client client first by unsubscribing to this topic
-		if err = kp.kafkaClient.UnSubscribe(&Topic{Name: topic}, kp.topicToRequestHandlerChannelMap[topic].ch); err != nil {
+		if err := kp.kafkaClient.UnSubscribe(&Topic{Name: topic}, kp.topicToRequestHandlerChannelMap[topic].ch); err != nil {
+			unsubscribeFailTopics = append(unsubscribeFailTopics, topic)
 			logger.Errorw("unsubscribing-error", log.Fields{"topic": topic, "error": err})
+			// Do not return. Continue to try to unsubscribe to other topics.
+		} else {
+			// Only delete from channel map if successfully unsubscribed.
+			delete(kp.topicToRequestHandlerChannelMap, topic)
 		}
-		delete(kp.topicToRequestHandlerChannelMap, topic)
 	}
-	return err
+	if len(unsubscribeFailTopics) > 0 {
+		return fmt.Errorf("unsubscribe-errors: %v", unsubscribeFailTopics)
+	}
+	return nil
 }
 
 func (kp *interContainerProxy) addToTransactionIdToChannelMap(id string, topic *Topic, arg chan *ic.InterContainerMessage) {
@@ -489,7 +612,9 @@
 	}
 }
 
+// nolint: unused
 func (kp *interContainerProxy) deleteAllTransactionIdToChannelMap() {
+	logger.Debug("delete-all-transaction-id-channel-map")
 	kp.lockTransactionIdToChannelMap.Lock()
 	defer kp.lockTransactionIdToChannelMap.Unlock()
 	for key, value := range kp.transactionIdToChannelMap {
@@ -575,11 +700,12 @@
 	// Go over all returned values
 	var marshalledReturnedVal *any.Any
 	var err error
-	for _, returnVal := range returnedValues {
-		if marshalledReturnedVal, err = encodeReturnedValue(returnVal); err != nil {
+
+	// for now we support only 1 returned value - (excluding the error)
+	if len(returnedValues) > 0 {
+		if marshalledReturnedVal, err = encodeReturnedValue(returnedValues[0]); err != nil {
 			logger.Warnw("cannot-marshal-response-body", log.Fields{"error": err})
 		}
-		break // for now we support only 1 returned value - (excluding the error)
 	}
 
 	responseBody := &ic.InterContainerResponseBody{
@@ -730,7 +856,14 @@
 			key := msg.Header.KeyTopic
 			logger.Debugw("sending-response-to-kafka", log.Fields{"rpc": requestBody.Rpc, "header": icm.Header, "key": key})
 			// TODO: handle error response.
-			go kp.kafkaClient.Send(icm, replyTopic, key)
+			go func() {
+				if err := kp.kafkaClient.Send(icm, replyTopic, key); err != nil {
+					logger.Errorw("send-reply-failed", log.Fields{
+						"topic": replyTopic,
+						"key":   key,
+						"error": err})
+				}
+			}()
 		}
 	} else if msg.Header.Type == ic.MessageType_RESPONSE {
 		logger.Debugw("response-received", log.Fields{"msg-header": msg.Header})
@@ -767,7 +900,8 @@
 
 	// Create a specific channel for this consumers.  We cannot use the channel from the kafkaclient as it will
 	// broadcast any message for this topic to all channels waiting on it.
-	ch := make(chan *ic.InterContainerMessage)
+	// Set channel size to 1 to prevent deadlock, see VOL-2708
+	ch := make(chan *ic.InterContainerMessage, 1)
 	kp.addToTransactionIdToChannelMap(trnsId, &topic, ch)
 
 	return ch, nil
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 c0c16f9..deb72fd 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
@@ -32,8 +32,6 @@
 	ic "github.com/opencord/voltha-protos/v3/go/inter_container"
 )
 
-type returnErrorFunction func() error
-
 // consumerChannels represents one or more consumers listening on a kafka topic.  Once a message is received on that
 // topic, the consumer(s) broadcasts the message to all the listening channels.   The consumer can be a partition
 //consumer or a group consumer
@@ -48,7 +46,6 @@
 // SaramaClient represents the messaging proxy
 type SaramaClient struct {
 	cAdmin                        sarama.ClusterAdmin
-	client                        sarama.Client
 	KafkaHost                     string
 	KafkaPort                     int
 	producer                      sarama.AsyncProducer
@@ -478,7 +475,7 @@
 			logger.Info("update-liveness-channel-because-change")
 			sc.liveness <- alive
 			sc.lastLivenessTime = time.Now()
-		} else if time.Now().Sub(sc.lastLivenessTime) > sc.livenessChannelInterval {
+		} else if time.Since(sc.lastLivenessTime) > sc.livenessChannelInterval {
 			logger.Info("update-liveness-channel-because-interval")
 			sc.liveness <- alive
 			sc.lastLivenessTime = time.Now()
@@ -558,7 +555,7 @@
 	// ascertain the value interface type is a proto.Message
 	if protoMsg, ok = msg.(proto.Message); !ok {
 		logger.Warnw("message-not-proto-message", log.Fields{"msg": msg})
-		return errors.New(fmt.Sprintf("not-a-proto-msg-%s", msg))
+		return fmt.Errorf("not-a-proto-msg-%s", msg)
 	}
 
 	var marshalled []byte
@@ -740,14 +737,6 @@
 	}
 }
 
-func (sc *SaramaClient) deleteFromTopicToConsumerChannelMap(id string) {
-	sc.lockTopicToConsumerChannelMap.Lock()
-	defer sc.lockTopicToConsumerChannelMap.Unlock()
-	if _, exist := sc.topicToConsumerChannelMap[id]; exist {
-		delete(sc.topicToConsumerChannelMap, id)
-	}
-}
-
 func (sc *SaramaClient) getConsumerChannel(topic *Topic) *consumerChannels {
 	sc.lockTopicToConsumerChannelMap.RLock()
 	defer sc.lockTopicToConsumerChannelMap.RUnlock()
@@ -838,24 +827,6 @@
 	return nil
 }
 
-func (sc *SaramaClient) clearConsumerChannelMap() error {
-	sc.lockTopicToConsumerChannelMap.Lock()
-	defer sc.lockTopicToConsumerChannelMap.Unlock()
-	var err error
-	for topic, consumerCh := range sc.topicToConsumerChannelMap {
-		for _, ch := range consumerCh.channels {
-			// Channel will be closed in the removeChannel method
-			removeChannel(consumerCh.channels, ch)
-		}
-		if errTemp := closeConsumers(consumerCh.consumers); errTemp != nil {
-			err = errTemp
-		}
-		//err = consumerCh.consumers.Close()
-		delete(sc.topicToConsumerChannelMap, topic)
-	}
-	return err
-}
-
 //createPublisher creates the publisher which is used to send a message onto kafka
 func (sc *SaramaClient) createPublisher() error {
 	// This Creates the publisher
@@ -1082,7 +1053,13 @@
 	sc.addTopicToConsumerChannelMap(topic.Name, cc)
 
 	//Start a consumers to listen on that specific topic
-	go sc.startConsumers(topic)
+	go func() {
+		if err := sc.startConsumers(topic); err != nil {
+			logger.Errorw("start-consumers-failed", log.Fields{
+				"topic": topic,
+				"error": err})
+		}
+	}()
 
 	return consumerListeningChannel, nil
 }
@@ -1109,7 +1086,13 @@
 	sc.addTopicToConsumerChannelMap(topic.Name, cc)
 
 	//Start a consumers to listen on that specific topic
-	go sc.startConsumers(topic)
+	go func() {
+		if err := sc.startConsumers(topic); err != nil {
+			logger.Errorw("start-consumers-failed", log.Fields{
+				"topic": topic,
+				"error": err})
+		}
+	}()
 
 	return consumerListeningChannel, nil
 }
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/utils.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/utils.go
index 0cb9535..bdc615f 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/utils.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/kafka/utils.go
@@ -15,7 +15,10 @@
  */
 package kafka
 
-import "strings"
+import (
+	"github.com/golang/protobuf/ptypes/any"
+	"strings"
+)
 
 const (
 	TopicSeparator = "_"
@@ -36,6 +39,31 @@
 	Value interface{}
 }
 
+type RpcMType int
+
+const (
+	RpcFormattingError RpcMType = iota
+	RpcSent
+	RpcReply
+	RpcTimeout
+	RpcTransportError
+	RpcSystemClosing
+)
+
+type RpcResponse struct {
+	MType RpcMType
+	Err   error
+	Reply *any.Any
+}
+
+func NewResponse(messageType RpcMType, err error, body *any.Any) *RpcResponse {
+	return &RpcResponse{
+		MType: messageType,
+		Err:   err,
+		Reply: body,
+	}
+}
+
 // TODO:  Remove and provide better may to get the device id
 // GetDeviceIdFromTopic extract the deviceId from the topic name.  The topic name is formatted either as:
 //			<any string> or <any string>_<deviceId>.  The device Id is 24 characters long.
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 43567e3..d0169bd 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
@@ -50,9 +50,11 @@
 	"strings"
 )
 
+type LogLevel int8
+
 const (
 	// DebugLevel logs a message at debug level
-	DebugLevel = iota
+	DebugLevel = LogLevel(iota)
 	// InfoLevel logs a message at info level
 	InfoLevel
 	// WarnLevel logs a message at warning level
@@ -106,10 +108,10 @@
 	Warningf(string, ...interface{})
 
 	// V reports whether verbosity level l is at least the requested verbose level.
-	V(l int) bool
+	V(l LogLevel) bool
 
 	//Returns the log level of this specific logger
-	GetLogLevel() int
+	GetLogLevel() LogLevel
 }
 
 // Fields is used as key-value pairs for structured logging
@@ -127,7 +129,7 @@
 	packageName string
 }
 
-func intToAtomicLevel(l int) zp.AtomicLevel {
+func logLevelToAtomicLevel(l LogLevel) zp.AtomicLevel {
 	switch l {
 	case DebugLevel:
 		return zp.NewAtomicLevelAt(zc.DebugLevel)
@@ -143,7 +145,7 @@
 	return zp.NewAtomicLevelAt(zc.ErrorLevel)
 }
 
-func intToLevel(l int) zc.Level {
+func logLevelToLevel(l LogLevel) zc.Level {
 	switch l {
 	case DebugLevel:
 		return zc.DebugLevel
@@ -159,7 +161,7 @@
 	return zc.ErrorLevel
 }
 
-func levelToInt(l zc.Level) int {
+func levelToLogLevel(l zc.Level) LogLevel {
 	switch l {
 	case zc.DebugLevel:
 		return DebugLevel
@@ -175,25 +177,41 @@
 	return ErrorLevel
 }
 
-func StringToInt(l string) int {
-	switch l {
+func StringToLogLevel(l string) (LogLevel, error) {
+	switch strings.ToUpper(l) {
 	case "DEBUG":
-		return DebugLevel
+		return DebugLevel, nil
 	case "INFO":
-		return InfoLevel
+		return InfoLevel, nil
 	case "WARN":
-		return WarnLevel
+		return WarnLevel, nil
 	case "ERROR":
-		return ErrorLevel
+		return ErrorLevel, nil
 	case "FATAL":
-		return FatalLevel
+		return FatalLevel, nil
 	}
-	return ErrorLevel
+	return 0, errors.New("Given LogLevel is invalid : " + l)
 }
 
-func getDefaultConfig(outputType string, level int, defaultFields Fields) zp.Config {
+func LogLevelToString(l LogLevel) (string, error) {
+	switch l {
+	case DebugLevel:
+		return "DEBUG", nil
+	case InfoLevel:
+		return "INFO", nil
+	case WarnLevel:
+		return "WARN", nil
+	case ErrorLevel:
+		return "ERROR", nil
+	case FatalLevel:
+		return "FATAL", nil
+	}
+	return "", errors.New("Given LogLevel is invalid " + string(l))
+}
+
+func getDefaultConfig(outputType string, level LogLevel, defaultFields Fields) zp.Config {
 	return zp.Config{
-		Level:            intToAtomicLevel(level),
+		Level:            logLevelToAtomicLevel(level),
 		Encoding:         outputType,
 		Development:      true,
 		OutputPaths:      []string{"stdout"},
@@ -203,6 +221,7 @@
 			LevelKey:       "level",
 			MessageKey:     "msg",
 			TimeKey:        "ts",
+			CallerKey:      "caller",
 			StacktraceKey:  "stacktrace",
 			LineEnding:     zc.DefaultLineEnding,
 			EncodeLevel:    zc.LowercaseLevelEncoder,
@@ -215,11 +234,11 @@
 
 // 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 int, defaultFields Fields) (Logger, error) {
+func SetDefaultLogger(outputType string, level LogLevel, defaultFields Fields) (Logger, error) {
 	// Build a custom config using zap
 	cfg = getDefaultConfig(outputType, level, defaultFields)
 
-	l, err := cfg.Build()
+	l, err := cfg.Build(zp.AddCallerSkip(1))
 	if err != nil {
 		return nil, err
 	}
@@ -241,7 +260,7 @@
 // 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 int, defaultFields Fields, pkgNames ...string) (Logger, error) {
+func AddPackage(outputType string, level LogLevel, defaultFields Fields, pkgNames ...string) (Logger, error) {
 	if cfgs == nil {
 		cfgs = make(map[string]zp.Config)
 	}
@@ -264,7 +283,7 @@
 
 	cfgs[pkgName] = getDefaultConfig(outputType, level, defaultFields)
 
-	l, err := cfgs[pkgName].Build()
+	l, err := cfgs[pkgName].Build(zp.AddCallerSkip(1))
 	if err != nil {
 		return nil, err
 	}
@@ -286,16 +305,14 @@
 			}
 			cfg.InitialFields[k] = v
 		}
-		l, err := cfg.Build()
+		l, err := cfg.Build(zp.AddCallerSkip(1))
 		if err != nil {
 			return err
 		}
 
-		loggers[pkgName] = &logger{
-			log:         l.Sugar(),
-			parent:      l,
-			packageName: pkgName,
-		}
+		// Update the existing zap logger instance
+		loggers[pkgName].log = l.Sugar()
+		loggers[pkgName].parent = l
 	}
 	return nil
 }
@@ -311,19 +328,16 @@
 	return keys
 }
 
-// UpdateLogger deletes the logger associated with a caller's package and creates a new logger with the
-// defaultFields.  If a calling package is holding on to a Logger reference obtained from AddPackage invocation, then
-// that package needs to invoke UpdateLogger if it needs to make changes to the default fields and obtain a new logger
-// reference
-func UpdateLogger(defaultFields Fields) (Logger, error) {
+// UpdateLogger updates the logger associated with a caller's package with supplied defaultFields
+func UpdateLogger(defaultFields Fields) error {
 	pkgName, _, _, _ := getCallerInfo()
 	if _, exist := loggers[pkgName]; !exist {
-		return nil, errors.New(fmt.Sprintf("package-%s-not-registered", pkgName))
+		return fmt.Errorf("package-%s-not-registered", pkgName)
 	}
 
 	// Build a new logger
 	if _, exist := cfgs[pkgName]; !exist {
-		return nil, errors.New(fmt.Sprintf("config-%s-not-registered", pkgName))
+		return fmt.Errorf("config-%s-not-registered", pkgName)
 	}
 
 	cfg := cfgs[pkgName]
@@ -333,21 +347,19 @@
 		}
 		cfg.InitialFields[k] = v
 	}
-	l, err := cfg.Build()
+	l, err := cfg.Build(zp.AddCallerSkip(1))
 	if err != nil {
-		return nil, err
+		return err
 	}
 
-	// Set the logger
-	loggers[pkgName] = &logger{
-		log:         l.Sugar(),
-		parent:      l,
-		packageName: pkgName,
-	}
-	return loggers[pkgName], nil
+	// Update the existing zap logger instance
+	loggers[pkgName].log = l.Sugar()
+	loggers[pkgName].parent = l
+
+	return nil
 }
 
-func setLevel(cfg zp.Config, level int) {
+func setLevel(cfg zp.Config, level LogLevel) {
 	switch level {
 	case DebugLevel:
 		cfg.Level.SetLevel(zc.DebugLevel)
@@ -366,7 +378,7 @@
 
 //SetPackageLogLevel dynamically sets the log level of a given package to level.  This is typically invoked at an
 // application level during debugging
-func SetPackageLogLevel(packageName string, level int) {
+func SetPackageLogLevel(packageName string, level LogLevel) {
 	// Get proper config
 	if cfg, ok := cfgs[packageName]; ok {
 		setLevel(cfg, level)
@@ -374,7 +386,7 @@
 }
 
 //SetAllLogLevel sets the log level of all registered packages to level
-func SetAllLogLevel(level int) {
+func SetAllLogLevel(level LogLevel) {
 	// Get proper config
 	for _, cfg := range cfgs {
 		setLevel(cfg, level)
@@ -382,7 +394,7 @@
 }
 
 //GetPackageLogLevel returns the current log level of a package.
-func GetPackageLogLevel(packageName ...string) (int, error) {
+func GetPackageLogLevel(packageName ...string) (LogLevel, error) {
 	var name string
 	if len(packageName) == 1 {
 		name = packageName[0]
@@ -390,21 +402,21 @@
 		name, _, _, _ = getCallerInfo()
 	}
 	if cfg, ok := cfgs[name]; ok {
-		return levelToInt(cfg.Level.Level()), nil
+		return levelToLogLevel(cfg.Level.Level()), nil
 	}
-	return 0, errors.New(fmt.Sprintf("unknown-package-%s", name))
+	return 0, fmt.Errorf("unknown-package-%s", name)
 }
 
 //GetDefaultLogLevel gets the log level used for packages that don't have specific loggers
-func GetDefaultLogLevel() int {
-	return levelToInt(cfg.Level.Level())
+func GetDefaultLogLevel() LogLevel {
+	return levelToLogLevel(cfg.Level.Level())
 }
 
 //SetLogLevel sets the log level for the logger corresponding to the caller's package
-func SetLogLevel(level int) error {
+func SetLogLevel(level LogLevel) error {
 	pkgName, _, _, _ := getCallerInfo()
 	if _, exist := cfgs[pkgName]; !exist {
-		return errors.New(fmt.Sprintf("unregistered-package-%s", pkgName))
+		return fmt.Errorf("unregistered-package-%s", pkgName)
 	}
 	cfg := cfgs[pkgName]
 	setLevel(cfg, level)
@@ -412,7 +424,7 @@
 }
 
 //SetDefaultLogLevel sets the log level used for packages that don't have specific loggers
-func SetDefaultLogLevel(level int) {
+func SetDefaultLogLevel(level LogLevel) {
 	setLevel(cfg, level)
 }
 
@@ -487,11 +499,11 @@
 }
 
 func getPackageLevelSugaredLogger() *zp.SugaredLogger {
-	pkgName, fileName, funcName, line := getCallerInfo()
+	pkgName, _, _, _ := getCallerInfo()
 	if _, exist := loggers[pkgName]; exist {
-		return loggers[pkgName].log.With("caller", fmt.Sprintf("%s.%s:%d", fileName, funcName, line))
+		return loggers[pkgName].log
 	}
-	return defaultLogger.log.With("caller", fmt.Sprintf("%s.%s:%d", fileName, funcName, line))
+	return defaultLogger.log
 }
 
 func getPackageLevelLogger() Logger {
@@ -641,13 +653,13 @@
 }
 
 // V reports whether verbosity level l is at least the requested verbose level.
-func (l logger) V(level int) bool {
-	return l.parent.Core().Enabled(intToLevel(level))
+func (l logger) V(level LogLevel) bool {
+	return l.parent.Core().Enabled(logLevelToLevel(level))
 }
 
 // GetLogLevel returns the current level of the logger
-func (l logger) GetLogLevel() int {
-	return levelToInt(cfgs[l.packageName].Level.Level())
+func (l logger) GetLogLevel() LogLevel {
+	return levelToLogLevel(cfgs[l.packageName].Level.Level())
 }
 
 // With returns a logger initialized with the key-value pairs
@@ -776,11 +788,11 @@
 }
 
 // V reports whether verbosity level l is at least the requested verbose level.
-func V(level int) bool {
+func V(level LogLevel) bool {
 	return getPackageLevelLogger().V(level)
 }
 
 //GetLogLevel returns the log level of the invoking package
-func GetLogLevel() int {
+func GetLogLevel() LogLevel {
 	return getPackageLevelLogger().GetLogLevel()
 }
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/probe/common.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/probe/common.go
new file mode 100644
index 0000000..211419d
--- /dev/null
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/probe/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 probe
+
+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": "probe"})
+	if err != nil {
+		panic(err)
+	}
+}
diff --git a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/probe/probe.go b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/probe/probe.go
index 9f00953..e89d5bc 100644
--- a/vendor/github.com/opencord/voltha-lib-go/v3/pkg/probe/probe.go
+++ b/vendor/github.com/opencord/voltha-lib-go/v3/pkg/probe/probe.go
@@ -118,7 +118,7 @@
 	for _, name := range names {
 		if _, ok := p.status[name]; !ok {
 			p.status[name] = ServiceStatusUnknown
-			log.Debugw("probe-service-registered", log.Fields{"service-name": name})
+			logger.Debugw("probe-service-registered", log.Fields{"service-name": name})
 		}
 	}
 
@@ -161,7 +161,7 @@
 	} else {
 		p.isHealthy = defaultHealthFunc(p.status)
 	}
-	log.Debugw("probe-service-status-updated",
+	logger.Debugw("probe-service-status-updated",
 		log.Fields{
 			"service-name": name,
 			"status":       status.String(),
@@ -231,15 +231,26 @@
 	p.mutex.RLock()
 	defer p.mutex.RUnlock()
 	w.Header().Set("Content-Type", "application/json")
-	w.Write([]byte("{"))
+	if _, err := w.Write([]byte("{")); err != nil {
+		logger.Errorw("write-response", log.Fields{"error": err})
+		w.WriteHeader(http.StatusInternalServerError)
+		return
+	}
 	comma := ""
 	for c, s := range p.status {
-		w.Write([]byte(fmt.Sprintf("%s\"%s\": \"%s\"", comma, c, s.String())))
+		if _, err := w.Write([]byte(fmt.Sprintf("%s\"%s\": \"%s\"", comma, c, s.String()))); err != nil {
+			logger.Errorw("write-response", log.Fields{"error": err})
+			w.WriteHeader(http.StatusInternalServerError)
+			return
+		}
 		comma = ", "
 	}
-	w.Write([]byte("}"))
+	if _, err := w.Write([]byte("}")); err != nil {
+		logger.Errorw("write-response", log.Fields{"error": err})
+		w.WriteHeader(http.StatusInternalServerError)
+		return
+	}
 	w.WriteHeader(http.StatusOK)
-
 }
 
 // ListenAndServe implements 3 HTTP endpoints on the given port for healthz, readz, and detailz. Returns only on error
@@ -258,7 +269,7 @@
 		Addr:    address,
 		Handler: mux,
 	}
-	log.Fatal(s.ListenAndServe())
+	logger.Fatal(s.ListenAndServe())
 }
 
 func (p *Probe) IsReady() bool {
diff --git a/vendor/github.com/opencord/voltha-protos/v3/go/common/common.pb.go b/vendor/github.com/opencord/voltha-protos/v3/go/common/common.pb.go
index 96d2f34..c4b9028 100644
--- a/vendor/github.com/opencord/voltha-protos/v3/go/common/common.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/v3/go/common/common.pb.go
@@ -42,44 +42,6 @@
 	return fileDescriptor_c2e3fd231961e826, []int{0}
 }
 
-// Logging verbosity level
-type LogLevel_Types int32
-
-const (
-	LogLevel_DEBUG    LogLevel_Types = 0
-	LogLevel_INFO     LogLevel_Types = 1
-	LogLevel_WARNING  LogLevel_Types = 2
-	LogLevel_ERROR    LogLevel_Types = 3
-	LogLevel_CRITICAL LogLevel_Types = 4
-	LogLevel_FATAL    LogLevel_Types = 5
-)
-
-var LogLevel_Types_name = map[int32]string{
-	0: "DEBUG",
-	1: "INFO",
-	2: "WARNING",
-	3: "ERROR",
-	4: "CRITICAL",
-	5: "FATAL",
-}
-
-var LogLevel_Types_value = map[string]int32{
-	"DEBUG":    0,
-	"INFO":     1,
-	"WARNING":  2,
-	"ERROR":    3,
-	"CRITICAL": 4,
-	"FATAL":    5,
-}
-
-func (x LogLevel_Types) String() string {
-	return proto.EnumName(LogLevel_Types_name, int32(x))
-}
-
-func (LogLevel_Types) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{2, 0}
-}
-
 // Administrative State
 type AdminState_Types int32
 
@@ -122,7 +84,7 @@
 }
 
 func (AdminState_Types) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{6, 0}
+	return fileDescriptor_c2e3fd231961e826, []int{2, 0}
 }
 
 // Operational Status
@@ -166,7 +128,7 @@
 }
 
 func (OperStatus_Types) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{7, 0}
+	return fileDescriptor_c2e3fd231961e826, []int{3, 0}
 }
 
 // Connectivity Status
@@ -198,7 +160,7 @@
 }
 
 func (ConnectStatus_Types) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{8, 0}
+	return fileDescriptor_c2e3fd231961e826, []int{4, 0}
 }
 
 type OperationResp_OperationReturnCode int32
@@ -226,7 +188,7 @@
 }
 
 func (OperationResp_OperationReturnCode) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{9, 0}
+	return fileDescriptor_c2e3fd231961e826, []int{5, 0}
 }
 
 // Convey a resource identifier
@@ -309,172 +271,6 @@
 	return nil
 }
 
-type LogLevel struct {
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *LogLevel) Reset()         { *m = LogLevel{} }
-func (m *LogLevel) String() string { return proto.CompactTextString(m) }
-func (*LogLevel) ProtoMessage()    {}
-func (*LogLevel) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{2}
-}
-
-func (m *LogLevel) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_LogLevel.Unmarshal(m, b)
-}
-func (m *LogLevel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_LogLevel.Marshal(b, m, deterministic)
-}
-func (m *LogLevel) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LogLevel.Merge(m, src)
-}
-func (m *LogLevel) XXX_Size() int {
-	return xxx_messageInfo_LogLevel.Size(m)
-}
-func (m *LogLevel) XXX_DiscardUnknown() {
-	xxx_messageInfo_LogLevel.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_LogLevel proto.InternalMessageInfo
-
-type Logging struct {
-	Level                LogLevel_Types `protobuf:"varint,1,opt,name=level,proto3,enum=common.LogLevel_Types" json:"level,omitempty"`
-	PackageName          string         `protobuf:"bytes,2,opt,name=package_name,json=packageName,proto3" json:"package_name,omitempty"`
-	ComponentName        string         `protobuf:"bytes,3,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
-	XXX_unrecognized     []byte         `json:"-"`
-	XXX_sizecache        int32          `json:"-"`
-}
-
-func (m *Logging) Reset()         { *m = Logging{} }
-func (m *Logging) String() string { return proto.CompactTextString(m) }
-func (*Logging) ProtoMessage()    {}
-func (*Logging) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{3}
-}
-
-func (m *Logging) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Logging.Unmarshal(m, b)
-}
-func (m *Logging) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Logging.Marshal(b, m, deterministic)
-}
-func (m *Logging) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Logging.Merge(m, src)
-}
-func (m *Logging) XXX_Size() int {
-	return xxx_messageInfo_Logging.Size(m)
-}
-func (m *Logging) XXX_DiscardUnknown() {
-	xxx_messageInfo_Logging.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Logging proto.InternalMessageInfo
-
-func (m *Logging) GetLevel() LogLevel_Types {
-	if m != nil {
-		return m.Level
-	}
-	return LogLevel_DEBUG
-}
-
-func (m *Logging) GetPackageName() string {
-	if m != nil {
-		return m.PackageName
-	}
-	return ""
-}
-
-func (m *Logging) GetComponentName() string {
-	if m != nil {
-		return m.ComponentName
-	}
-	return ""
-}
-
-// For GetLogLevels(), select component to query
-type LoggingComponent struct {
-	ComponentName        string   `protobuf:"bytes,1,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *LoggingComponent) Reset()         { *m = LoggingComponent{} }
-func (m *LoggingComponent) String() string { return proto.CompactTextString(m) }
-func (*LoggingComponent) ProtoMessage()    {}
-func (*LoggingComponent) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{4}
-}
-
-func (m *LoggingComponent) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_LoggingComponent.Unmarshal(m, b)
-}
-func (m *LoggingComponent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_LoggingComponent.Marshal(b, m, deterministic)
-}
-func (m *LoggingComponent) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LoggingComponent.Merge(m, src)
-}
-func (m *LoggingComponent) XXX_Size() int {
-	return xxx_messageInfo_LoggingComponent.Size(m)
-}
-func (m *LoggingComponent) XXX_DiscardUnknown() {
-	xxx_messageInfo_LoggingComponent.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_LoggingComponent proto.InternalMessageInfo
-
-func (m *LoggingComponent) GetComponentName() string {
-	if m != nil {
-		return m.ComponentName
-	}
-	return ""
-}
-
-// For returning multiple log levels
-type Loggings struct {
-	Items                []*Logging `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
-	XXX_unrecognized     []byte     `json:"-"`
-	XXX_sizecache        int32      `json:"-"`
-}
-
-func (m *Loggings) Reset()         { *m = Loggings{} }
-func (m *Loggings) String() string { return proto.CompactTextString(m) }
-func (*Loggings) ProtoMessage()    {}
-func (*Loggings) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{5}
-}
-
-func (m *Loggings) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Loggings.Unmarshal(m, b)
-}
-func (m *Loggings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Loggings.Marshal(b, m, deterministic)
-}
-func (m *Loggings) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Loggings.Merge(m, src)
-}
-func (m *Loggings) XXX_Size() int {
-	return xxx_messageInfo_Loggings.Size(m)
-}
-func (m *Loggings) XXX_DiscardUnknown() {
-	xxx_messageInfo_Loggings.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_Loggings proto.InternalMessageInfo
-
-func (m *Loggings) GetItems() []*Logging {
-	if m != nil {
-		return m.Items
-	}
-	return nil
-}
-
 type AdminState struct {
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
@@ -485,7 +281,7 @@
 func (m *AdminState) String() string { return proto.CompactTextString(m) }
 func (*AdminState) ProtoMessage()    {}
 func (*AdminState) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{6}
+	return fileDescriptor_c2e3fd231961e826, []int{2}
 }
 
 func (m *AdminState) XXX_Unmarshal(b []byte) error {
@@ -516,7 +312,7 @@
 func (m *OperStatus) String() string { return proto.CompactTextString(m) }
 func (*OperStatus) ProtoMessage()    {}
 func (*OperStatus) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{7}
+	return fileDescriptor_c2e3fd231961e826, []int{3}
 }
 
 func (m *OperStatus) XXX_Unmarshal(b []byte) error {
@@ -547,7 +343,7 @@
 func (m *ConnectStatus) String() string { return proto.CompactTextString(m) }
 func (*ConnectStatus) ProtoMessage()    {}
 func (*ConnectStatus) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{8}
+	return fileDescriptor_c2e3fd231961e826, []int{4}
 }
 
 func (m *ConnectStatus) XXX_Unmarshal(b []byte) error {
@@ -582,7 +378,7 @@
 func (m *OperationResp) String() string { return proto.CompactTextString(m) }
 func (*OperationResp) ProtoMessage()    {}
 func (*OperationResp) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c2e3fd231961e826, []int{9}
+	return fileDescriptor_c2e3fd231961e826, []int{5}
 }
 
 func (m *OperationResp) XXX_Unmarshal(b []byte) error {
@@ -619,17 +415,12 @@
 
 func init() {
 	proto.RegisterEnum("common.TestModeKeys", TestModeKeys_name, TestModeKeys_value)
-	proto.RegisterEnum("common.LogLevel_Types", LogLevel_Types_name, LogLevel_Types_value)
 	proto.RegisterEnum("common.AdminState_Types", AdminState_Types_name, AdminState_Types_value)
 	proto.RegisterEnum("common.OperStatus_Types", OperStatus_Types_name, OperStatus_Types_value)
 	proto.RegisterEnum("common.ConnectStatus_Types", ConnectStatus_Types_name, ConnectStatus_Types_value)
 	proto.RegisterEnum("common.OperationResp_OperationReturnCode", OperationResp_OperationReturnCode_name, OperationResp_OperationReturnCode_value)
 	proto.RegisterType((*ID)(nil), "common.ID")
 	proto.RegisterType((*IDs)(nil), "common.IDs")
-	proto.RegisterType((*LogLevel)(nil), "common.LogLevel")
-	proto.RegisterType((*Logging)(nil), "common.Logging")
-	proto.RegisterType((*LoggingComponent)(nil), "common.LoggingComponent")
-	proto.RegisterType((*Loggings)(nil), "common.Loggings")
 	proto.RegisterType((*AdminState)(nil), "common.AdminState")
 	proto.RegisterType((*OperStatus)(nil), "common.OperStatus")
 	proto.RegisterType((*ConnectStatus)(nil), "common.ConnectStatus")
@@ -639,45 +430,35 @@
 func init() { proto.RegisterFile("voltha_protos/common.proto", fileDescriptor_c2e3fd231961e826) }
 
 var fileDescriptor_c2e3fd231961e826 = []byte{
-	// 640 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x53, 0x5d, 0x4f, 0xdb, 0x4a,
-	0x10, 0x8d, 0x9d, 0x2f, 0x98, 0x90, 0xb0, 0x77, 0xb9, 0x5c, 0x71, 0xab, 0x3e, 0x50, 0x4b, 0x08,
-	0x5a, 0xb5, 0x89, 0x0a, 0x7d, 0xe9, 0x43, 0x1f, 0x8c, 0xbd, 0xa4, 0x2b, 0xcc, 0x3a, 0x5a, 0x3b,
-	0xa0, 0xf6, 0xa1, 0x91, 0x89, 0x17, 0x63, 0x35, 0xf1, 0x5a, 0xb1, 0x83, 0xc4, 0x63, 0x7f, 0x65,
-	0xff, 0x4e, 0xb5, 0xfe, 0x28, 0x20, 0xe5, 0x71, 0xce, 0x9c, 0xd9, 0x33, 0x73, 0x66, 0x07, 0x5e,
-	0x3d, 0xc8, 0x45, 0x7e, 0x1f, 0xcc, 0xd2, 0x95, 0xcc, 0x65, 0x36, 0x9a, 0xcb, 0xe5, 0x52, 0x26,
-	0xc3, 0x22, 0xc2, 0x9d, 0x32, 0x32, 0xfe, 0x05, 0x9d, 0xda, 0x78, 0x00, 0x7a, 0x1c, 0x1e, 0x68,
-	0x87, 0xda, 0xc9, 0x36, 0xd7, 0xe3, 0xd0, 0x38, 0x86, 0x26, 0xb5, 0x33, 0x7c, 0x08, 0xed, 0x38,
-	0x17, 0xcb, 0xec, 0x40, 0x3b, 0x6c, 0x9e, 0xf4, 0x4e, 0x61, 0x58, 0x3d, 0x41, 0x6d, 0x5e, 0x26,
-	0x8c, 0x6f, 0xb0, 0xe5, 0xc8, 0xc8, 0x11, 0x0f, 0x62, 0x61, 0x5c, 0x41, 0xdb, 0x7f, 0x4c, 0x45,
-	0x86, 0xb7, 0xa1, 0x6d, 0x93, 0xf3, 0xe9, 0x18, 0x35, 0xf0, 0x16, 0xb4, 0x28, 0xbb, 0x70, 0x91,
-	0x86, 0x7b, 0xd0, 0xbd, 0x31, 0x39, 0xa3, 0x6c, 0x8c, 0x74, 0xc5, 0x20, 0x9c, 0xbb, 0x1c, 0x35,
-	0xf1, 0x0e, 0x6c, 0x59, 0x9c, 0xfa, 0xd4, 0x32, 0x1d, 0xd4, 0x52, 0x89, 0x0b, 0xd3, 0x37, 0x1d,
-	0xd4, 0x36, 0x7e, 0x69, 0xd0, 0x75, 0x64, 0x14, 0xc5, 0x49, 0x84, 0xdf, 0x43, 0x7b, 0xa1, 0x34,
-	0x8a, 0x16, 0x07, 0xa7, 0xff, 0xd5, 0x8d, 0xd4, 0xda, 0xc3, 0x42, 0x98, 0x97, 0x24, 0xfc, 0x06,
-	0x76, 0xd2, 0x60, 0xfe, 0x33, 0x88, 0xc4, 0x2c, 0x09, 0x96, 0xe2, 0x40, 0x2f, 0xe6, 0xea, 0x55,
-	0x18, 0x0b, 0x96, 0x02, 0x1f, 0xc1, 0x60, 0x2e, 0x97, 0xa9, 0x4c, 0x44, 0x92, 0x97, 0xa4, 0x66,
-	0x41, 0xea, 0xff, 0x45, 0x15, 0xcd, 0xf8, 0x0c, 0xa8, 0x6a, 0xc1, 0xaa, 0xf1, 0x0d, 0xa5, 0xda,
-	0xa6, 0xd2, 0x8f, 0x85, 0x33, 0xaa, 0x34, 0xc3, 0x47, 0x2f, 0x7d, 0xdc, 0x7d, 0xd6, 0xbe, 0x22,
-	0xd4, 0x66, 0xae, 0x01, 0xcc, 0x70, 0x19, 0x27, 0x5e, 0x1e, 0xe4, 0xc2, 0x88, 0x6a, 0x3b, 0x7b,
-	0xd0, 0x9d, 0xb2, 0x4b, 0xe6, 0xde, 0x30, 0xd4, 0xc0, 0x18, 0x06, 0x13, 0x4e, 0x26, 0xdc, 0xbd,
-	0xa6, 0x1e, 0x75, 0x19, 0xb1, 0x4b, 0x6b, 0x09, 0x33, 0xcf, 0x1d, 0x62, 0x23, 0x5d, 0xf9, 0x69,
-	0x53, 0xaf, 0x8c, 0x9a, 0x78, 0x1f, 0xfe, 0xb1, 0xdd, 0x1b, 0xe6, 0xb8, 0xa6, 0x4d, 0xd9, 0x78,
-	0x46, 0xaf, 0xcc, 0x31, 0x41, 0x2d, 0x55, 0x61, 0x13, 0x87, 0xf8, 0xc4, 0x46, 0x6d, 0x23, 0x02,
-	0x70, 0x53, 0xb1, 0x52, 0xaa, 0x6b, 0xb5, 0xd1, 0x4d, 0xb2, 0x03, 0x00, 0x9b, 0x7a, 0x96, 0x7b,
-	0x4d, 0x78, 0x21, 0x39, 0x00, 0x30, 0x2d, 0x9f, 0x5e, 0x9b, 0x7e, 0xb9, 0xd0, 0x1e, 0x74, 0x7d,
-	0xe2, 0x15, 0x41, 0x13, 0x03, 0x74, 0x8a, 0xa4, 0x52, 0x02, 0xe8, 0x5c, 0x98, 0xd4, 0x29, 0x84,
-	0x08, 0xf4, 0x2d, 0x99, 0x24, 0x62, 0x9e, 0x57, 0x5a, 0x9f, 0x36, 0x6a, 0xed, 0x42, 0x6f, 0xca,
-	0x38, 0x31, 0xad, 0xaf, 0x6a, 0x0a, 0xa4, 0xe1, 0x3e, 0x6c, 0x3f, 0x85, 0xba, 0xf1, 0x5b, 0x83,
-	0xbe, 0x6a, 0x38, 0xc8, 0x63, 0x99, 0x70, 0x91, 0xa5, 0xf8, 0x0b, 0xb4, 0xe6, 0x32, 0x14, 0xd5,
-	0xef, 0x78, 0x5b, 0xdb, 0xfb, 0x82, 0xf4, 0x3c, 0xca, 0xd7, 0xab, 0xc4, 0x92, 0xa1, 0xe0, 0x45,
-	0x19, 0x3e, 0x86, 0xdd, 0x20, 0x0c, 0x63, 0x95, 0x0b, 0x16, 0xb3, 0x38, 0xb9, 0x93, 0xd5, 0x97,
-	0x19, 0x3c, 0xc1, 0x34, 0xb9, 0x93, 0xc6, 0x0f, 0xd8, 0xdb, 0xf0, 0x8a, 0x32, 0xd9, 0x9d, 0x10,
-	0x6e, 0xfa, 0xd4, 0x65, 0x33, 0x6f, 0x6a, 0x59, 0xc4, 0xf3, 0x50, 0xe3, 0x25, 0xac, 0x4c, 0x98,
-	0x72, 0x35, 0xcd, 0xff, 0xb0, 0xff, 0x04, 0x4f, 0x99, 0x37, 0x9d, 0x4c, 0x5c, 0xae, 0x36, 0xa1,
-	0xbf, 0x7b, 0x0d, 0x3b, 0xbe, 0xc8, 0xf2, 0x2b, 0x19, 0x8a, 0x4b, 0xf1, 0x98, 0xa9, 0x5d, 0x06,
-	0x69, 0x3c, 0xcb, 0x45, 0x96, 0xa3, 0xc6, 0x39, 0x81, 0x3d, 0xb9, 0x8a, 0x86, 0x32, 0x15, 0xc9,
-	0x5c, 0xae, 0xc2, 0x61, 0x79, 0xdd, 0xdf, 0x87, 0x51, 0x9c, 0xdf, 0xaf, 0x6f, 0xd5, 0xd0, 0xa3,
-	0x3a, 0x37, 0x2a, 0x73, 0x1f, 0xaa, 0xcb, 0x7f, 0x38, 0x1b, 0x45, 0xb2, 0xba, 0xff, 0xdb, 0x4e,
-	0x01, 0x9e, 0xfd, 0x09, 0x00, 0x00, 0xff, 0xff, 0x80, 0xbf, 0xca, 0x42, 0x1e, 0x04, 0x00, 0x00,
+	// 480 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xd1, 0x4e, 0xdb, 0x30,
+	0x14, 0x6d, 0x52, 0xda, 0x8d, 0x5b, 0x1a, 0x32, 0x33, 0xa4, 0x6e, 0xda, 0x43, 0x95, 0x17, 0xd8,
+	0xa4, 0xb5, 0x12, 0xec, 0x75, 0x0f, 0x21, 0xf6, 0x3a, 0x8b, 0x62, 0x57, 0x4e, 0x52, 0xb4, 0x3d,
+	0xac, 0x0a, 0x8d, 0x29, 0x91, 0x68, 0x1c, 0x25, 0x2e, 0x12, 0x5f, 0xba, 0xdf, 0x99, 0x9c, 0x14,
+	0x75, 0x48, 0x7d, 0x3c, 0xe7, 0x5c, 0xdf, 0xe3, 0x7b, 0xee, 0x85, 0x8f, 0x4f, 0xea, 0x51, 0x3f,
+	0x24, 0x8b, 0xa2, 0x54, 0x5a, 0x55, 0xe3, 0xa5, 0x5a, 0xaf, 0x55, 0x3e, 0xaa, 0x11, 0xea, 0x36,
+	0xc8, 0x7b, 0x0f, 0x36, 0xc5, 0xc8, 0x01, 0x3b, 0x4b, 0x07, 0xd6, 0xd0, 0x3a, 0x3f, 0x14, 0x76,
+	0x96, 0x7a, 0x67, 0xd0, 0xa6, 0xb8, 0x42, 0x43, 0xe8, 0x64, 0x5a, 0xae, 0xab, 0x81, 0x35, 0x6c,
+	0x9f, 0xf7, 0x2e, 0x60, 0xb4, 0x6d, 0x41, 0xb1, 0x68, 0x04, 0x6f, 0x03, 0xe0, 0xa7, 0xeb, 0x2c,
+	0x0f, 0x75, 0xa2, 0xa5, 0xb7, 0x82, 0x4e, 0xf4, 0x5c, 0xc8, 0x0a, 0xf5, 0xe0, 0x4d, 0xcc, 0xae,
+	0x19, 0xbf, 0x65, 0x6e, 0x0b, 0x21, 0x70, 0x66, 0x82, 0xcc, 0x04, 0x9f, 0xd3, 0x90, 0x72, 0x46,
+	0xb0, 0x6b, 0x99, 0x02, 0xc2, 0xfc, 0xab, 0x29, 0xc1, 0xae, 0x8d, 0x8e, 0xe0, 0x2d, 0xa6, 0x61,
+	0x83, 0xda, 0xe8, 0x14, 0xde, 0x61, 0x7e, 0xcb, 0xa6, 0xdc, 0xc7, 0x94, 0x4d, 0x16, 0xf4, 0xc6,
+	0x9f, 0x10, 0xf7, 0xc0, 0xbc, 0xc0, 0x64, 0x4a, 0x22, 0x82, 0xdd, 0x8e, 0xb7, 0x02, 0xe0, 0x85,
+	0x2c, 0x8d, 0xeb, 0xa6, 0xf2, 0x7e, 0xed, 0xb5, 0x75, 0x00, 0x30, 0x0d, 0x03, 0x3e, 0x27, 0xa2,
+	0xb6, 0x74, 0x00, 0xfc, 0x20, 0xa2, 0x73, 0x3f, 0xa2, 0x6c, 0xe2, 0xda, 0xa6, 0x38, 0x22, 0x61,
+	0x0d, 0xda, 0x08, 0xa0, 0x5b, 0x8b, 0xc6, 0x09, 0xa0, 0xfb, 0xc3, 0xa7, 0xd3, 0xda, 0x88, 0x40,
+	0x3f, 0x50, 0x79, 0x2e, 0x97, 0x7a, 0xeb, 0xf5, 0x6d, 0xaf, 0xd7, 0x31, 0xf4, 0x62, 0x26, 0x88,
+	0x1f, 0xfc, 0x34, 0x53, 0xb8, 0x16, 0xea, 0xc3, 0xe1, 0x0e, 0xda, 0xde, 0x5f, 0x0b, 0xfa, 0xe6,
+	0xc3, 0x89, 0xce, 0x54, 0x2e, 0x64, 0x55, 0xa0, 0xef, 0x70, 0xb0, 0x54, 0xa9, 0xac, 0x33, 0x77,
+	0x2e, 0x3e, 0xbf, 0x24, 0xfb, 0xaa, 0xe8, 0x7f, 0xa4, 0x37, 0x65, 0x1e, 0xa8, 0x54, 0x8a, 0xfa,
+	0x19, 0x3a, 0x83, 0xe3, 0x24, 0x4d, 0x33, 0xa3, 0x25, 0x8f, 0x8b, 0x2c, 0xbf, 0x57, 0x03, 0xbb,
+	0xde, 0x9e, 0xb3, 0xa3, 0x69, 0x7e, 0xaf, 0xbc, 0x3f, 0x70, 0xb2, 0xa7, 0x8b, 0x09, 0x99, 0xcf,
+	0x88, 0xf0, 0x23, 0xca, 0xd9, 0x22, 0x8c, 0x83, 0x80, 0x84, 0xa1, 0xdb, 0x7a, 0x4d, 0x9b, 0x10,
+	0x62, 0x61, 0xa6, 0xf9, 0x00, 0xa7, 0x3b, 0x3a, 0x66, 0x61, 0x3c, 0x9b, 0x71, 0x61, 0x36, 0x61,
+	0x7f, 0xf9, 0x04, 0x47, 0x91, 0xac, 0xf4, 0x8d, 0x4a, 0xe5, 0xb5, 0x7c, 0xae, 0xcc, 0x2e, 0x93,
+	0x22, 0x5b, 0x68, 0x59, 0x69, 0xb7, 0x75, 0x45, 0xe0, 0x44, 0x95, 0xab, 0x91, 0x2a, 0x64, 0xbe,
+	0x54, 0x65, 0x3a, 0x6a, 0x0e, 0xf2, 0xf7, 0x68, 0x95, 0xe9, 0x87, 0xcd, 0x9d, 0x19, 0x7a, 0xfc,
+	0xa2, 0x8d, 0x1b, 0xed, 0xeb, 0xf6, 0x58, 0x9f, 0x2e, 0xc7, 0x2b, 0xb5, 0x3d, 0xd9, 0xbb, 0x6e,
+	0x4d, 0x5e, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xd2, 0x21, 0x5c, 0x35, 0xd1, 0x02, 0x00, 0x00,
 }
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 880a0a2..cfb521b 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
@@ -30,18 +30,6 @@
 // IDs from public import voltha_protos/common.proto
 type IDs = common.IDs
 
-// LogLevel from public import voltha_protos/common.proto
-type LogLevel = common.LogLevel
-
-// Logging from public import voltha_protos/common.proto
-type Logging = common.Logging
-
-// LoggingComponent from public import voltha_protos/common.proto
-type LoggingComponent = common.LoggingComponent
-
-// Loggings from public import voltha_protos/common.proto
-type Loggings = common.Loggings
-
 // AdminState from public import voltha_protos/common.proto
 type AdminState = common.AdminState
 
@@ -62,19 +50,6 @@
 
 const TestModeKeys_api_test = TestModeKeys(common.TestModeKeys_api_test)
 
-// LogLevel_Types from public import voltha_protos/common.proto
-type LogLevel_Types = common.LogLevel_Types
-
-var LogLevel_Types_name = common.LogLevel_Types_name
-var LogLevel_Types_value = common.LogLevel_Types_value
-
-const LogLevel_DEBUG = LogLevel_Types(common.LogLevel_DEBUG)
-const LogLevel_INFO = LogLevel_Types(common.LogLevel_INFO)
-const LogLevel_WARNING = LogLevel_Types(common.LogLevel_WARNING)
-const LogLevel_ERROR = LogLevel_Types(common.LogLevel_ERROR)
-const LogLevel_CRITICAL = LogLevel_Types(common.LogLevel_CRITICAL)
-const LogLevel_FATAL = LogLevel_Types(common.LogLevel_FATAL)
-
 // AdminState_Types from public import voltha_protos/common.proto
 type AdminState_Types = common.AdminState_Types
 
@@ -145,6 +120,12 @@
 // CoreInstances from public import voltha_protos/voltha.proto
 type CoreInstances = voltha.CoreInstances
 
+// OmciTestRequest from public import voltha_protos/voltha.proto
+type OmciTestRequest = voltha.OmciTestRequest
+
+// TestResponse from public import voltha_protos/voltha.proto
+type TestResponse = voltha.TestResponse
+
 // Voltha from public import voltha_protos/voltha.proto
 type Voltha = voltha.Voltha
 
@@ -173,6 +154,15 @@
 const EventFilterRuleKey_config_event_type = EventFilterRuleKey_EventFilterRuleType(voltha.EventFilterRuleKey_config_event_type)
 const EventFilterRuleKey_device_event_type = EventFilterRuleKey_EventFilterRuleType(voltha.EventFilterRuleKey_device_event_type)
 
+// TestResponse_TestResponseResult from public import voltha_protos/voltha.proto
+type TestResponse_TestResponseResult = voltha.TestResponse_TestResponseResult
+
+var TestResponse_TestResponseResult_name = voltha.TestResponse_TestResponseResult_name
+var TestResponse_TestResponseResult_value = voltha.TestResponse_TestResponseResult_value
+
+const TestResponse_SUCCESS = TestResponse_TestResponseResult(voltha.TestResponse_SUCCESS)
+const TestResponse_FAILURE = TestResponse_TestResponseResult(voltha.TestResponse_FAILURE)
+
 // SelfTestResponse_SelfTestResult from public import voltha_protos/voltha.proto
 type SelfTestResponse_SelfTestResult = voltha.SelfTestResponse_SelfTestResult
 
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 5bc0537..bf7d1a8 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
@@ -193,7 +193,7 @@
 }
 
 func (GroupMember_InterfaceType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{36, 0}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{41, 0}
 }
 
 type Group_GroupMembersCommand int32
@@ -221,7 +221,7 @@
 }
 
 func (Group_GroupMembersCommand) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{37, 0}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{42, 0}
 }
 
 type Indication struct {
@@ -439,6 +439,11 @@
 	//	*AlarmIndication_OnuProcessingErrorInd
 	//	*AlarmIndication_OnuLossOfSyncFailInd
 	//	*AlarmIndication_OnuItuPonStatsInd
+	//	*AlarmIndication_OnuDeactivationFailureInd
+	//	*AlarmIndication_OnuRemoteDefectInd
+	//	*AlarmIndication_OnuLossGemDelineationInd
+	//	*AlarmIndication_OnuPhysicalEquipmentErrorInd
+	//	*AlarmIndication_OnuLossOfAckInd
 	Data                 isAlarmIndication_Data `protobuf_oneof:"data"`
 	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
 	XXX_unrecognized     []byte                 `json:"-"`
@@ -526,6 +531,26 @@
 	OnuItuPonStatsInd *OnuItuPonStatsIndication `protobuf:"bytes,13,opt,name=onu_itu_pon_stats_ind,json=onuItuPonStatsInd,proto3,oneof"`
 }
 
+type AlarmIndication_OnuDeactivationFailureInd struct {
+	OnuDeactivationFailureInd *OnuDeactivationFailureIndication `protobuf:"bytes,14,opt,name=onu_deactivation_failure_ind,json=onuDeactivationFailureInd,proto3,oneof"`
+}
+
+type AlarmIndication_OnuRemoteDefectInd struct {
+	OnuRemoteDefectInd *OnuRemoteDefectIndication `protobuf:"bytes,15,opt,name=onu_remote_defect_ind,json=onuRemoteDefectInd,proto3,oneof"`
+}
+
+type AlarmIndication_OnuLossGemDelineationInd struct {
+	OnuLossGemDelineationInd *OnuLossOfGEMChannelDelineationIndication `protobuf:"bytes,16,opt,name=onu_loss_gem_delineation_ind,json=onuLossGemDelineationInd,proto3,oneof"`
+}
+
+type AlarmIndication_OnuPhysicalEquipmentErrorInd struct {
+	OnuPhysicalEquipmentErrorInd *OnuPhysicalEquipmentErrorIndication `protobuf:"bytes,17,opt,name=onu_physical_equipment_error_ind,json=onuPhysicalEquipmentErrorInd,proto3,oneof"`
+}
+
+type AlarmIndication_OnuLossOfAckInd struct {
+	OnuLossOfAckInd *OnuLossOfAcknowledgementIndication `protobuf:"bytes,18,opt,name=onu_loss_of_ack_ind,json=onuLossOfAckInd,proto3,oneof"`
+}
+
 func (*AlarmIndication_LosInd) isAlarmIndication_Data() {}
 
 func (*AlarmIndication_DyingGaspInd) isAlarmIndication_Data() {}
@@ -552,6 +577,16 @@
 
 func (*AlarmIndication_OnuItuPonStatsInd) isAlarmIndication_Data() {}
 
+func (*AlarmIndication_OnuDeactivationFailureInd) isAlarmIndication_Data() {}
+
+func (*AlarmIndication_OnuRemoteDefectInd) isAlarmIndication_Data() {}
+
+func (*AlarmIndication_OnuLossGemDelineationInd) isAlarmIndication_Data() {}
+
+func (*AlarmIndication_OnuPhysicalEquipmentErrorInd) isAlarmIndication_Data() {}
+
+func (*AlarmIndication_OnuLossOfAckInd) isAlarmIndication_Data() {}
+
 func (m *AlarmIndication) GetData() isAlarmIndication_Data {
 	if m != nil {
 		return m.Data
@@ -650,6 +685,41 @@
 	return nil
 }
 
+func (m *AlarmIndication) GetOnuDeactivationFailureInd() *OnuDeactivationFailureIndication {
+	if x, ok := m.GetData().(*AlarmIndication_OnuDeactivationFailureInd); ok {
+		return x.OnuDeactivationFailureInd
+	}
+	return nil
+}
+
+func (m *AlarmIndication) GetOnuRemoteDefectInd() *OnuRemoteDefectIndication {
+	if x, ok := m.GetData().(*AlarmIndication_OnuRemoteDefectInd); ok {
+		return x.OnuRemoteDefectInd
+	}
+	return nil
+}
+
+func (m *AlarmIndication) GetOnuLossGemDelineationInd() *OnuLossOfGEMChannelDelineationIndication {
+	if x, ok := m.GetData().(*AlarmIndication_OnuLossGemDelineationInd); ok {
+		return x.OnuLossGemDelineationInd
+	}
+	return nil
+}
+
+func (m *AlarmIndication) GetOnuPhysicalEquipmentErrorInd() *OnuPhysicalEquipmentErrorIndication {
+	if x, ok := m.GetData().(*AlarmIndication_OnuPhysicalEquipmentErrorInd); ok {
+		return x.OnuPhysicalEquipmentErrorInd
+	}
+	return nil
+}
+
+func (m *AlarmIndication) GetOnuLossOfAckInd() *OnuLossOfAcknowledgementIndication {
+	if x, ok := m.GetData().(*AlarmIndication_OnuLossOfAckInd); ok {
+		return x.OnuLossOfAckInd
+	}
+	return nil
+}
+
 // XXX_OneofWrappers is for the internal use of the proto package.
 func (*AlarmIndication) XXX_OneofWrappers() []interface{} {
 	return []interface{}{
@@ -666,6 +736,11 @@
 		(*AlarmIndication_OnuProcessingErrorInd)(nil),
 		(*AlarmIndication_OnuLossOfSyncFailInd)(nil),
 		(*AlarmIndication_OnuItuPonStatsInd)(nil),
+		(*AlarmIndication_OnuDeactivationFailureInd)(nil),
+		(*AlarmIndication_OnuRemoteDefectInd)(nil),
+		(*AlarmIndication_OnuLossGemDelineationInd)(nil),
+		(*AlarmIndication_OnuPhysicalEquipmentErrorInd)(nil),
+		(*AlarmIndication_OnuLossOfAckInd)(nil),
 	}
 }
 
@@ -3222,6 +3297,291 @@
 	return 0
 }
 
+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"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OnuDeactivationFailureIndication) Reset()         { *m = OnuDeactivationFailureIndication{} }
+func (m *OnuDeactivationFailureIndication) String() string { return proto.CompactTextString(m) }
+func (*OnuDeactivationFailureIndication) ProtoMessage()    {}
+func (*OnuDeactivationFailureIndication) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{36}
+}
+
+func (m *OnuDeactivationFailureIndication) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuDeactivationFailureIndication.Unmarshal(m, b)
+}
+func (m *OnuDeactivationFailureIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuDeactivationFailureIndication.Marshal(b, m, deterministic)
+}
+func (m *OnuDeactivationFailureIndication) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuDeactivationFailureIndication.Merge(m, src)
+}
+func (m *OnuDeactivationFailureIndication) XXX_Size() int {
+	return xxx_messageInfo_OnuDeactivationFailureIndication.Size(m)
+}
+func (m *OnuDeactivationFailureIndication) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuDeactivationFailureIndication.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuDeactivationFailureIndication proto.InternalMessageInfo
+
+func (m *OnuDeactivationFailureIndication) GetIntfId() uint32 {
+	if m != nil {
+		return m.IntfId
+	}
+	return 0
+}
+
+func (m *OnuDeactivationFailureIndication) GetOnuId() uint32 {
+	if m != nil {
+		return m.OnuId
+	}
+	return 0
+}
+
+func (m *OnuDeactivationFailureIndication) GetFailReason() uint32 {
+	if m != nil {
+		return m.FailReason
+	}
+	return 0
+}
+
+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"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OnuRemoteDefectIndication) Reset()         { *m = OnuRemoteDefectIndication{} }
+func (m *OnuRemoteDefectIndication) String() string { return proto.CompactTextString(m) }
+func (*OnuRemoteDefectIndication) ProtoMessage()    {}
+func (*OnuRemoteDefectIndication) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{37}
+}
+
+func (m *OnuRemoteDefectIndication) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuRemoteDefectIndication.Unmarshal(m, b)
+}
+func (m *OnuRemoteDefectIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuRemoteDefectIndication.Marshal(b, m, deterministic)
+}
+func (m *OnuRemoteDefectIndication) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuRemoteDefectIndication.Merge(m, src)
+}
+func (m *OnuRemoteDefectIndication) XXX_Size() int {
+	return xxx_messageInfo_OnuRemoteDefectIndication.Size(m)
+}
+func (m *OnuRemoteDefectIndication) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuRemoteDefectIndication.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuRemoteDefectIndication proto.InternalMessageInfo
+
+func (m *OnuRemoteDefectIndication) GetIntfId() uint32 {
+	if m != nil {
+		return m.IntfId
+	}
+	return 0
+}
+
+func (m *OnuRemoteDefectIndication) GetOnuId() uint32 {
+	if m != nil {
+		return m.OnuId
+	}
+	return 0
+}
+
+func (m *OnuRemoteDefectIndication) GetRdiErrors() uint32 {
+	if m != nil {
+		return m.RdiErrors
+	}
+	return 0
+}
+
+type OnuLossOfGEMChannelDelineationIndication 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"`
+	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
+	DelineationErrors    uint32   `protobuf:"fixed32,4,opt,name=delineation_errors,json=delineationErrors,proto3" json:"delineation_errors,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OnuLossOfGEMChannelDelineationIndication) Reset() {
+	*m = OnuLossOfGEMChannelDelineationIndication{}
+}
+func (m *OnuLossOfGEMChannelDelineationIndication) String() string { return proto.CompactTextString(m) }
+func (*OnuLossOfGEMChannelDelineationIndication) ProtoMessage()    {}
+func (*OnuLossOfGEMChannelDelineationIndication) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{38}
+}
+
+func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Unmarshal(m, b)
+}
+func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Marshal(b, m, deterministic)
+}
+func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Merge(m, src)
+}
+func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Size() int {
+	return xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Size(m)
+}
+func (m *OnuLossOfGEMChannelDelineationIndication) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication proto.InternalMessageInfo
+
+func (m *OnuLossOfGEMChannelDelineationIndication) GetIntfId() uint32 {
+	if m != nil {
+		return m.IntfId
+	}
+	return 0
+}
+
+func (m *OnuLossOfGEMChannelDelineationIndication) GetOnuId() uint32 {
+	if m != nil {
+		return m.OnuId
+	}
+	return 0
+}
+
+func (m *OnuLossOfGEMChannelDelineationIndication) GetStatus() string {
+	if m != nil {
+		return m.Status
+	}
+	return ""
+}
+
+func (m *OnuLossOfGEMChannelDelineationIndication) GetDelineationErrors() uint32 {
+	if m != nil {
+		return m.DelineationErrors
+	}
+	return 0
+}
+
+type OnuPhysicalEquipmentErrorIndication 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"`
+	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OnuPhysicalEquipmentErrorIndication) Reset()         { *m = OnuPhysicalEquipmentErrorIndication{} }
+func (m *OnuPhysicalEquipmentErrorIndication) String() string { return proto.CompactTextString(m) }
+func (*OnuPhysicalEquipmentErrorIndication) ProtoMessage()    {}
+func (*OnuPhysicalEquipmentErrorIndication) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{39}
+}
+
+func (m *OnuPhysicalEquipmentErrorIndication) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Unmarshal(m, b)
+}
+func (m *OnuPhysicalEquipmentErrorIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Marshal(b, m, deterministic)
+}
+func (m *OnuPhysicalEquipmentErrorIndication) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Merge(m, src)
+}
+func (m *OnuPhysicalEquipmentErrorIndication) XXX_Size() int {
+	return xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Size(m)
+}
+func (m *OnuPhysicalEquipmentErrorIndication) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuPhysicalEquipmentErrorIndication proto.InternalMessageInfo
+
+func (m *OnuPhysicalEquipmentErrorIndication) GetIntfId() uint32 {
+	if m != nil {
+		return m.IntfId
+	}
+	return 0
+}
+
+func (m *OnuPhysicalEquipmentErrorIndication) GetOnuId() uint32 {
+	if m != nil {
+		return m.OnuId
+	}
+	return 0
+}
+
+func (m *OnuPhysicalEquipmentErrorIndication) GetStatus() string {
+	if m != nil {
+		return m.Status
+	}
+	return ""
+}
+
+type OnuLossOfAcknowledgementIndication 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"`
+	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OnuLossOfAcknowledgementIndication) Reset()         { *m = OnuLossOfAcknowledgementIndication{} }
+func (m *OnuLossOfAcknowledgementIndication) String() string { return proto.CompactTextString(m) }
+func (*OnuLossOfAcknowledgementIndication) ProtoMessage()    {}
+func (*OnuLossOfAcknowledgementIndication) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c072e7aa0dfd74d5, []int{40}
+}
+
+func (m *OnuLossOfAcknowledgementIndication) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OnuLossOfAcknowledgementIndication.Unmarshal(m, b)
+}
+func (m *OnuLossOfAcknowledgementIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OnuLossOfAcknowledgementIndication.Marshal(b, m, deterministic)
+}
+func (m *OnuLossOfAcknowledgementIndication) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OnuLossOfAcknowledgementIndication.Merge(m, src)
+}
+func (m *OnuLossOfAcknowledgementIndication) XXX_Size() int {
+	return xxx_messageInfo_OnuLossOfAcknowledgementIndication.Size(m)
+}
+func (m *OnuLossOfAcknowledgementIndication) XXX_DiscardUnknown() {
+	xxx_messageInfo_OnuLossOfAcknowledgementIndication.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OnuLossOfAcknowledgementIndication proto.InternalMessageInfo
+
+func (m *OnuLossOfAcknowledgementIndication) GetIntfId() uint32 {
+	if m != nil {
+		return m.IntfId
+	}
+	return 0
+}
+
+func (m *OnuLossOfAcknowledgementIndication) GetOnuId() uint32 {
+	if m != nil {
+		return m.OnuId
+	}
+	return 0
+}
+
+func (m *OnuLossOfAcknowledgementIndication) GetStatus() string {
+	if m != nil {
+		return m.Status
+	}
+	return ""
+}
+
 type GroupMember struct {
 	InterfaceId          uint32                    `protobuf:"varint,1,opt,name=interface_id,json=interfaceId,proto3" json:"interface_id,omitempty"`
 	InterfaceType        GroupMember_InterfaceType `protobuf:"varint,2,opt,name=interface_type,json=interfaceType,proto3,enum=openolt.GroupMember_InterfaceType" json:"interface_type,omitempty"`
@@ -3236,7 +3596,7 @@
 func (m *GroupMember) String() string { return proto.CompactTextString(m) }
 func (*GroupMember) ProtoMessage()    {}
 func (*GroupMember) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{36}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{41}
 }
 
 func (m *GroupMember) XXX_Unmarshal(b []byte) error {
@@ -3299,7 +3659,7 @@
 func (m *Group) String() string { return proto.CompactTextString(m) }
 func (*Group) ProtoMessage()    {}
 func (*Group) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{37}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{42}
 }
 
 func (m *Group) XXX_Unmarshal(b []byte) error {
@@ -3358,7 +3718,7 @@
 func (m *Empty) String() string { return proto.CompactTextString(m) }
 func (*Empty) ProtoMessage()    {}
 func (*Empty) Descriptor() ([]byte, []int) {
-	return fileDescriptor_c072e7aa0dfd74d5, []int{38}
+	return fileDescriptor_c072e7aa0dfd74d5, []int{43}
 }
 
 func (m *Empty) XXX_Unmarshal(b []byte) error {
@@ -3422,6 +3782,11 @@
 	proto.RegisterType((*OnuLossOfKeySyncFailureIndication)(nil), "openolt.OnuLossOfKeySyncFailureIndication")
 	proto.RegisterType((*OnuItuPonStatsIndication)(nil), "openolt.OnuItuPonStatsIndication")
 	proto.RegisterType((*OnuProcessingErrorIndication)(nil), "openolt.OnuProcessingErrorIndication")
+	proto.RegisterType((*OnuDeactivationFailureIndication)(nil), "openolt.OnuDeactivationFailureIndication")
+	proto.RegisterType((*OnuRemoteDefectIndication)(nil), "openolt.OnuRemoteDefectIndication")
+	proto.RegisterType((*OnuLossOfGEMChannelDelineationIndication)(nil), "openolt.OnuLossOfGEMChannelDelineationIndication")
+	proto.RegisterType((*OnuPhysicalEquipmentErrorIndication)(nil), "openolt.OnuPhysicalEquipmentErrorIndication")
+	proto.RegisterType((*OnuLossOfAcknowledgementIndication)(nil), "openolt.OnuLossOfAcknowledgementIndication")
 	proto.RegisterType((*GroupMember)(nil), "openolt.GroupMember")
 	proto.RegisterType((*Group)(nil), "openolt.Group")
 	proto.RegisterType((*Empty)(nil), "openolt.Empty")
@@ -3430,225 +3795,240 @@
 func init() { proto.RegisterFile("voltha_protos/openolt.proto", fileDescriptor_c072e7aa0dfd74d5) }
 
 var fileDescriptor_c072e7aa0dfd74d5 = []byte{
-	// 3481 bytes of a gzipped FileDescriptorProto
+	// 3713 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x4f, 0x73, 0x1c, 0x49,
-	0x56, 0x77, 0xab, 0xff, 0x54, 0xf7, 0xeb, 0x3f, 0x6a, 0xa7, 0x2c, 0x5b, 0x7f, 0xbc, 0xb6, 0xa6,
-	0x30, 0x3b, 0x66, 0x60, 0xa5, 0x19, 0xcf, 0x06, 0xb0, 0xc3, 0x02, 0x23, 0xab, 0xdb, 0x56, 0x33,
-	0x96, 0x5b, 0x94, 0xda, 0x33, 0xb0, 0xc4, 0x44, 0x6d, 0xa9, 0x2a, 0xbb, 0x95, 0xa1, 0xea, 0xca,
-	0x9a, 0xaa, 0x6c, 0xc9, 0xba, 0x2e, 0x2c, 0x1f, 0x80, 0x0d, 0x0e, 0x70, 0x84, 0x2f, 0xb1, 0x11,
-	0x7b, 0xe4, 0x4a, 0x70, 0xe1, 0x2b, 0x70, 0xe1, 0x0b, 0x70, 0xe2, 0x40, 0xe4, 0xcb, 0xac, 0x7f,
-	0xdd, 0x2d, 0xd9, 0x1a, 0x4c, 0x70, 0x51, 0x74, 0xbe, 0xf7, 0x7b, 0xbf, 0xcc, 0x97, 0xf9, 0xf2,
-	0xe5, 0xab, 0x4c, 0xc1, 0xf6, 0x05, 0xf7, 0xc5, 0x99, 0x63, 0x87, 0x11, 0x17, 0x3c, 0xde, 0xe3,
-	0x21, 0x0d, 0xb8, 0x2f, 0x76, 0xb1, 0x49, 0x0c, 0xdd, 0xdc, 0x7a, 0x38, 0xe1, 0x7c, 0xe2, 0xd3,
-	0x3d, 0x27, 0x64, 0x7b, 0x4e, 0x10, 0x70, 0xe1, 0x08, 0xc6, 0x83, 0x58, 0xc1, 0xb6, 0x76, 0x8a,
-	0x1c, 0x82, 0xba, 0x67, 0xf2, 0xf7, 0x98, 0xf9, 0x54, 0x21, 0xcc, 0x7f, 0xad, 0x00, 0x0c, 0x02,
-	0x8f, 0xb9, 0x68, 0x47, 0x3e, 0x03, 0x83, 0xfb, 0xc2, 0x66, 0x81, 0xb7, 0x51, 0xda, 0x29, 0x3d,
-	0x6d, 0x3e, 0xbb, 0xbf, 0x9b, 0x74, 0x3c, 0xf4, 0x45, 0x06, 0x3c, 0xbc, 0x63, 0xd5, 0x38, 0x0a,
-	0xc8, 0x8f, 0xa1, 0xce, 0x02, 0x31, 0x46, 0x9b, 0x15, 0xb4, 0x79, 0x90, 0xda, 0x0c, 0x02, 0x31,
-	0x2e, 0x18, 0x19, 0x4c, 0x49, 0xc8, 0x3e, 0xb4, 0xd1, 0x8a, 0x87, 0x34, 0x42, 0xd3, 0x32, 0x9a,
-	0x6e, 0x17, 0x4c, 0x87, 0x21, 0x8d, 0x0a, 0xe6, 0x4d, 0x96, 0x49, 0xc9, 0x9f, 0x40, 0x8b, 0x07,
-	0x33, 0xdb, 0x63, 0xb1, 0x8b, 0x0c, 0x15, 0x64, 0xd8, 0xca, 0x06, 0x1c, 0xcc, 0x7a, 0x2c, 0x76,
-	0x0b, 0x04, 0xc0, 0x53, 0x21, 0xfa, 0x1a, 0xcc, 0xd0, 0xb4, 0x3a, 0xef, 0x6b, 0x30, 0x9b, 0xf3,
-	0x15, 0x05, 0xd2, 0x57, 0x3e, 0x75, 0x19, 0xda, 0xd4, 0xe6, 0x7c, 0x1d, 0x4e, 0x5d, 0x56, 0xf4,
-	0x95, 0x2b, 0x09, 0xf9, 0x31, 0x18, 0xe1, 0xb9, 0x9a, 0x54, 0x03, 0x8d, 0x36, 0x53, 0xa3, 0x63,
-	0xc7, 0x3d, 0xa7, 0x73, 0xf3, 0x1a, 0x9e, 0xe3, 0xbc, 0xfe, 0x21, 0x40, 0xc8, 0x23, 0x61, 0xc7,
-	0xc2, 0x11, 0xf1, 0x46, 0x7d, 0xae, 0xb7, 0x63, 0x1e, 0x89, 0x13, 0xb9, 0xd8, 0xb1, 0x60, 0x6e,
-	0x7c, 0x78, 0xc7, 0x6a, 0x84, 0x5a, 0x12, 0x4b, 0xcb, 0xb1, 0xcf, 0x2f, 0xb5, 0x65, 0x63, 0xce,
-	0xf2, 0x85, 0xcf, 0x2f, 0x8b, 0x96, 0x63, 0x2d, 0x89, 0xc9, 0x1f, 0x40, 0xc3, 0xf1, 0x9d, 0x68,
-	0x8a, 0x63, 0x05, 0x34, 0xdc, 0x48, 0x0d, 0xf7, 0xa5, 0xa6, 0x30, 0xd4, 0xba, 0xa3, 0x45, 0xcf,
-	0x6b, 0x50, 0xf1, 0x1c, 0xe1, 0x98, 0xff, 0x59, 0x87, 0xd5, 0x39, 0x9c, 0x9c, 0x67, 0x9f, 0xc7,
-	0x4b, 0x63, 0xea, 0x15, 0x8f, 0x8b, 0xbe, 0xfb, 0x28, 0x20, 0x3d, 0xe8, 0x78, 0x57, 0x2c, 0x98,
-	0xd8, 0x13, 0x27, 0x0e, 0x73, 0x91, 0xf5, 0x30, 0xb5, 0xec, 0x49, 0xf5, 0x4b, 0x27, 0x0e, 0x0b,
-	0xf6, 0x2d, 0x2f, 0x27, 0x96, 0x31, 0x26, 0x17, 0x38, 0xf3, 0x68, 0x3e, 0xc6, 0x86, 0xc1, 0x6c,
-	0xd1, 0xa9, 0x26, 0xcf, 0xa4, 0xe4, 0x1b, 0xb8, 0x27, 0x29, 0x62, 0xe1, 0x44, 0x62, 0x16, 0xda,
-	0x63, 0x87, 0xf9, 0xb9, 0x58, 0x7b, 0x92, 0x67, 0x3a, 0x51, 0x98, 0x17, 0x0e, 0xf3, 0x67, 0x11,
-	0x2d, 0x50, 0xde, 0xe5, 0x05, 0xb5, 0x24, 0xfe, 0x19, 0xdc, 0x47, 0x62, 0x36, 0x09, 0x1c, 0xdf,
-	0xf6, 0xe8, 0x24, 0x72, 0x3c, 0x9a, 0x8b, 0xc5, 0xdf, 0x2a, 0x50, 0x23, 0xaa, 0xa7, 0x40, 0x05,
-	0xe6, 0x35, 0xbe, 0xa8, 0x25, 0x7f, 0x05, 0x0f, 0x70, 0x63, 0x44, 0x6c, 0x2c, 0x6c, 0x3e, 0xb6,
-	0x2f, 0x59, 0xe0, 0xf1, 0xcb, 0x5c, 0xd0, 0x16, 0xc8, 0x7b, 0x12, 0x36, 0x1c, 0x7f, 0x83, 0xa0,
-	0x05, 0xf2, 0x79, 0x2d, 0x19, 0x81, 0xf4, 0xc6, 0xf6, 0x79, 0x1c, 0xdb, 0xe9, 0x5e, 0x50, 0x61,
-	0xfd, 0x71, 0x9e, 0xf6, 0x15, 0x8f, 0xe3, 0xe1, 0x58, 0x6e, 0x8a, 0x83, 0x33, 0x27, 0x08, 0xa8,
-	0x5f, 0xa0, 0xee, 0x70, 0x8d, 0xd0, 0x5b, 0x24, 0x99, 0x67, 0x74, 0x25, 0xce, 0xe6, 0xb9, 0xbe,
-	0x64, 0x9e, 0x15, 0xe6, 0xda, 0x79, 0xce, 0xd4, 0x92, 0x78, 0xa8, 0x92, 0x84, 0x60, 0x97, 0x6a,
-	0xa4, 0x6a, 0x37, 0xfc, 0x6e, 0x9e, 0x70, 0x14, 0x39, 0x41, 0x3c, 0x65, 0x71, 0xcc, 0x78, 0x30,
-	0x08, 0x04, 0x8d, 0xc6, 0x34, 0xa2, 0x81, 0x4b, 0xbf, 0x71, 0xa2, 0x80, 0x05, 0x13, 0x9d, 0x35,
-	0x46, 0xec, 0x12, 0x47, 0xfa, 0x73, 0x35, 0xb9, 0x8e, 0x2b, 0xd8, 0x05, 0xf6, 0x9b, 0x0d, 0x16,
-	0x16, 0x67, 0x61, 0x3f, 0x85, 0x2d, 0x1b, 0xaf, 0xf4, 0xb9, 0x88, 0x50, 0x3d, 0x6c, 0xc8, 0x1e,
-	0xc2, 0x88, 0xbb, 0x34, 0x8e, 0xe5, 0x2e, 0xa0, 0x51, 0xc4, 0x55, 0x96, 0x6c, 0x62, 0x17, 0xbf,
-	0x9d, 0xef, 0xe2, 0x38, 0xc5, 0xf5, 0x25, 0xac, 0xd0, 0xc1, 0x3a, 0x5f, 0xa6, 0x27, 0x14, 0x36,
-	0xb3, 0x35, 0x1c, 0xdb, 0xf1, 0x55, 0xe0, 0x66, 0x5e, 0xb4, 0xb0, 0x8b, 0x4f, 0x16, 0xd7, 0xf2,
-	0x2b, 0x7a, 0x75, 0x72, 0x15, 0xb8, 0xd7, 0x39, 0xa2, 0x40, 0x09, 0x42, 0x76, 0xf3, 0x06, 0xd6,
-	0x31, 0xc1, 0x8a, 0x99, 0x1d, 0xf2, 0x40, 0xa5, 0x23, 0xec, 0xa2, 0x8d, 0x5d, 0x7c, 0x54, 0x48,
-	0xb7, 0x62, 0x76, 0xcc, 0x03, 0xcc, 0x42, 0x0b, 0x4b, 0x5a, 0xd4, 0xa5, 0xb9, 0x66, 0x17, 0xda,
-	0x85, 0x33, 0x89, 0xfc, 0x00, 0x00, 0x8f, 0x13, 0xd9, 0x11, 0xc5, 0x5c, 0xd3, 0xb0, 0x1a, 0x52,
-	0x22, 0x4d, 0xa9, 0x79, 0x08, 0x9d, 0xe2, 0x79, 0x44, 0x1e, 0x80, 0xa1, 0x8e, 0x2e, 0x95, 0x99,
-	0x0c, 0xab, 0x86, 0xc7, 0x93, 0x37, 0xc7, 0xb4, 0x32, 0xcf, 0x74, 0x06, 0x77, 0x17, 0x0e, 0x97,
-	0xeb, 0xc9, 0xbe, 0x80, 0x76, 0x4c, 0x23, 0xe6, 0xf8, 0x76, 0x30, 0x9b, 0x9e, 0xd2, 0x48, 0xe7,
-	0xb2, 0xf5, 0xd4, 0xfd, 0x13, 0xd4, 0xbe, 0x46, 0xa5, 0xd5, 0x8a, 0x73, 0x2d, 0xf3, 0x37, 0x25,
-	0x68, 0x17, 0x0e, 0xa3, 0xeb, 0xbb, 0x59, 0x87, 0x1a, 0xce, 0xb6, 0xca, 0x95, 0x86, 0x55, 0x95,
-	0x33, 0x37, 0xef, 0x4a, 0x79, 0xce, 0x15, 0xf2, 0x18, 0x9a, 0x8e, 0x37, 0x65, 0x81, 0xd6, 0x57,
-	0x51, 0x0f, 0x28, 0x52, 0x80, 0x85, 0xd1, 0x57, 0xde, 0x7f, 0xf4, 0x3f, 0x07, 0xb2, 0x78, 0x8c,
-	0x13, 0x02, 0x15, 0x71, 0x15, 0x26, 0x0b, 0x84, 0xbf, 0xf3, 0x5e, 0xad, 0xdc, 0xb0, 0x12, 0xf3,
-	0xc3, 0x37, 0x2d, 0xe8, 0x14, 0xcf, 0xdd, 0x5b, 0xcf, 0x4f, 0x17, 0xca, 0xe1, 0xb9, 0x40, 0xe6,
-	0x96, 0x25, 0x7f, 0x9a, 0xff, 0x52, 0x82, 0xee, 0xfc, 0xb9, 0x4c, 0xb6, 0xa1, 0x81, 0xb4, 0x38,
-	0x72, 0x35, 0x4b, 0x58, 0xf6, 0x8c, 0xe6, 0x46, 0xbf, 0x10, 0x47, 0x13, 0x3a, 0xc5, 0x63, 0x3c,
-	0xed, 0xb7, 0xa1, 0x25, 0x03, 0x4f, 0xda, 0xe1, 0x41, 0xcd, 0xd4, 0xd1, 0x64, 0x58, 0x35, 0xd9,
-	0x54, 0x0a, 0x34, 0x0a, 0x38, 0x66, 0x6c, 0xc3, 0xaa, 0xc9, 0xe6, 0x6b, 0x4e, 0xee, 0x43, 0xcd,
-	0xe5, 0xfc, 0x9c, 0x51, 0x4c, 0xb9, 0x35, 0x4b, 0xb7, 0x12, 0x2f, 0x2a, 0x99, 0x17, 0x4f, 0xa0,
-	0xa1, 0x92, 0x99, 0xe3, 0x5e, 0x3f, 0x40, 0xf3, 0xa7, 0xd0, 0x38, 0xa4, 0x4e, 0x24, 0x4e, 0xa9,
-	0x23, 0xc8, 0x1e, 0xac, 0x9d, 0x25, 0x0d, 0x95, 0x8a, 0xc5, 0x2c, 0xa2, 0xda, 0x82, 0xa4, 0xaa,
-	0x93, 0x44, 0x63, 0xfe, 0x75, 0x09, 0xca, 0xc3, 0x60, 0x76, 0xeb, 0x39, 0x5f, 0x88, 0xa9, 0xf2,
-	0x7b, 0xc7, 0x14, 0x7a, 0xca, 0x54, 0x14, 0x1a, 0x96, 0xfc, 0x69, 0x7e, 0x05, 0x86, 0x8c, 0x81,
-	0xa3, 0x78, 0xf2, 0x01, 0x16, 0xff, 0x97, 0x25, 0x68, 0xc8, 0xa4, 0x8a, 0xeb, 0x7f, 0x6b, 0xbe,
-	0xdc, 0xba, 0x55, 0x0a, 0xeb, 0x56, 0x0c, 0x84, 0xea, 0x7c, 0x20, 0x2c, 0x8e, 0xe3, 0x27, 0xd0,
-	0x7a, 0x13, 0xfa, 0x2c, 0x38, 0x7f, 0xd7, 0x48, 0xb4, 0xe9, 0x4a, 0x66, 0xfa, 0x77, 0x0d, 0x80,
-	0x1e, 0xbd, 0x60, 0x2e, 0x1d, 0x04, 0x63, 0x0c, 0x99, 0x0b, 0x1a, 0x78, 0x3c, 0xd2, 0x1b, 0x4e,
-	0xb7, 0xc8, 0x3d, 0xa8, 0x4e, 0xb9, 0x47, 0x7d, 0x9d, 0xde, 0x54, 0x83, 0xfc, 0x0e, 0x74, 0xcf,
-	0x9c, 0xc8, 0xbb, 0x74, 0x22, 0x6a, 0x5f, 0xd0, 0x48, 0x9e, 0x89, 0x7a, 0xd7, 0xad, 0x26, 0xf2,
-	0xaf, 0x95, 0x58, 0x42, 0xc7, 0x2c, 0x9a, 0x16, 0xa0, 0x15, 0x05, 0x4d, 0xe4, 0x09, 0x74, 0x1b,
-	0x1a, 0x1e, 0x8e, 0x48, 0x8e, 0xbf, 0xab, 0x76, 0x8f, 0x12, 0x0c, 0x3c, 0xf2, 0x29, 0xdc, 0xd3,
-	0xca, 0x62, 0x50, 0xdc, 0x45, 0x1c, 0x51, 0xba, 0x7c, 0x44, 0x48, 0x3a, 0x79, 0xa0, 0xc8, 0xc9,
-	0x8b, 0xf1, 0xbc, 0x32, 0xac, 0x7a, 0xc8, 0x03, 0x59, 0x13, 0xc7, 0xe4, 0x11, 0x80, 0xfc, 0xce,
-	0x09, 0xb8, 0xcf, 0x27, 0x57, 0x49, 0x42, 0xcb, 0x24, 0x64, 0x47, 0x55, 0x04, 0xcc, 0x53, 0x55,
-	0x9d, 0xde, 0x60, 0x80, 0x0b, 0x88, 0x45, 0x1a, 0x79, 0x08, 0xa0, 0x11, 0x54, 0xd7, 0x36, 0x86,
-	0x55, 0x47, 0x7d, 0x3f, 0xf0, 0xc8, 0x13, 0xe8, 0x38, 0xbe, 0xcf, 0xdd, 0x8c, 0xa1, 0x8e, 0x88,
-	0x16, 0x4a, 0x13, 0x8e, 0x1d, 0x68, 0xa5, 0x28, 0xaa, 0xeb, 0x0e, 0xc3, 0x02, 0x8d, 0x91, 0x3c,
-	0x4f, 0xa1, 0x9b, 0x85, 0x84, 0x66, 0x02, 0x44, 0x75, 0xd2, 0xc0, 0x50, 0x5c, 0x4f, 0xa0, 0x93,
-	0x43, 0x52, 0x5d, 0x06, 0x18, 0x56, 0x2b, 0xc5, 0x49, 0x3e, 0x13, 0xda, 0x3a, 0x99, 0x68, 0xb2,
-	0x36, 0x82, 0x9a, 0x2a, 0xa5, 0x28, 0xa6, 0x47, 0xd0, 0x4c, 0x30, 0x92, 0xa6, 0xa3, 0xe2, 0x50,
-	0x21, 0x24, 0xc7, 0x97, 0x50, 0x8b, 0x9c, 0x60, 0x42, 0xe3, 0x8d, 0xd5, 0x9d, 0xf2, 0xd3, 0xe6,
-	0xb3, 0xa7, 0x59, 0xbd, 0x9d, 0x06, 0x94, 0xfe, 0x69, 0xd1, 0x98, 0xcf, 0x22, 0x97, 0x5a, 0x88,
-	0xb7, 0xb4, 0xdd, 0xd6, 0xdf, 0x57, 0xe0, 0xde, 0x32, 0x00, 0xd9, 0x4c, 0x3e, 0x13, 0xbd, 0x78,
-	0xa3, 0xb4, 0x53, 0x7e, 0x6a, 0xe8, 0x6f, 0x41, 0x6f, 0x7e, 0xc5, 0x56, 0x16, 0x56, 0xec, 0x00,
-	0xaa, 0x21, 0xe7, 0x7e, 0xbc, 0x51, 0xc6, 0x41, 0xfd, 0xe8, 0x7d, 0x07, 0xb5, 0x7b, 0xcc, 0xb9,
-	0x6f, 0x29, 0xdb, 0xad, 0xff, 0x5e, 0x81, 0x8a, 0x6c, 0x93, 0x3f, 0xcb, 0x1d, 0x3f, 0x9d, 0x67,
-	0xbf, 0x7f, 0x2b, 0x32, 0xfc, 0x23, 0x53, 0xbe, 0x3e, 0xb6, 0x4e, 0xc0, 0x88, 0xcf, 0x9c, 0x88,
-	0x05, 0x13, 0x1c, 0x76, 0xe7, 0xd9, 0x4f, 0x6e, 0x47, 0x77, 0xa2, 0x8c, 0x91, 0x31, 0x61, 0x92,
-	0x1b, 0x53, 0x2d, 0xa0, 0x3a, 0x13, 0x54, 0x43, 0xee, 0x73, 0xaa, 0x3f, 0x3c, 0x0c, 0x4b, 0xfe,
-	0x34, 0xf7, 0xa1, 0x9e, 0x0c, 0x87, 0x00, 0xd4, 0x86, 0xaf, 0xdf, 0xd8, 0x83, 0x5e, 0xf7, 0x0e,
-	0x69, 0x41, 0x7d, 0xff, 0xd5, 0xab, 0xe1, 0x81, 0x6c, 0x95, 0x48, 0x07, 0xe0, 0x65, 0xff, 0xe8,
-	0x78, 0x68, 0x8d, 0x64, 0x7b, 0x85, 0x34, 0xc1, 0x78, 0xf1, 0x6a, 0xf8, 0x8d, 0x6c, 0x94, 0xcd,
-	0x33, 0x68, 0xe6, 0x86, 0x40, 0xee, 0x03, 0xe9, 0xf5, 0x7b, 0x83, 0x83, 0xfd, 0x51, 0xbf, 0x67,
-	0x1f, 0xf7, 0x2d, 0x7b, 0xf0, 0x7a, 0xf4, 0xa2, 0x7b, 0x87, 0x3c, 0x86, 0xed, 0x93, 0xc3, 0x7d,
-	0xab, 0xdf, 0xb3, 0x9f, 0xff, 0xa5, 0xbd, 0xff, 0xea, 0x15, 0xca, 0xf1, 0xc7, 0xa8, 0x7f, 0x70,
-	0xd8, 0x2d, 0x91, 0x1d, 0x78, 0xb8, 0x04, 0x70, 0xb2, 0x7f, 0xd4, 0x57, 0x88, 0x15, 0xf3, 0x6f,
-	0xca, 0x00, 0x07, 0xbe, 0x13, 0xc7, 0x6c, 0xcc, 0x68, 0x84, 0xf9, 0xd3, 0x16, 0x61, 0x9a, 0xcd,
-	0xaa, 0x7c, 0x14, 0x32, 0x8f, 0xac, 0x41, 0x95, 0xdb, 0x17, 0x69, 0x56, 0xad, 0xf0, 0xaf, 0x19,
-	0xe6, 0x5a, 0xa6, 0xb0, 0x7a, 0x42, 0x58, 0x82, 0x65, 0x88, 0x55, 0x53, 0x52, 0x61, 0x12, 0xfb,
-	0x00, 0x0c, 0x6e, 0x87, 0xa7, 0x4c, 0xc4, 0x3a, 0xc9, 0xd6, 0xf8, 0xb1, 0x6c, 0x61, 0xfe, 0xd4,
-	0x0a, 0x7d, 0xa2, 0x32, 0xa5, 0xd8, 0x84, 0x3a, 0x15, 0x67, 0xea, 0x5c, 0x57, 0x5b, 0xdd, 0xa0,
-	0xe2, 0x2c, 0x39, 0xd6, 0xbd, 0x58, 0xd8, 0x53, 0xc7, 0xc5, 0x2d, 0xde, 0xb2, 0x6a, 0x5e, 0x2c,
-	0x8e, 0x1c, 0x57, 0x2a, 0xe2, 0xc8, 0x45, 0x45, 0x43, 0x29, 0xe2, 0xc8, 0x95, 0x0a, 0x19, 0xe4,
-	0xa1, 0xba, 0x6d, 0xd1, 0x7b, 0xd9, 0x60, 0xe1, 0x31, 0xde, 0xd8, 0xac, 0x83, 0xb4, 0xb6, 0x59,
-	0xa8, 0x37, 0x6f, 0xd5, 0x8b, 0xc5, 0x20, 0x94, 0x62, 0x49, 0xc5, 0x42, 0x9d, 0xc7, 0xaa, 0x71,
-	0xe4, 0x0e, 0x42, 0x49, 0x24, 0xc5, 0x72, 0x77, 0xeb, 0x7d, 0x2c, 0x7b, 0x94, 0x09, 0x4e, 0xaa,
-	0x24, 0x11, 0xaa, 0xd4, 0x06, 0x96, 0xa3, 0x44, 0xd5, 0x0e, 0xb4, 0xc2, 0x73, 0x61, 0x0b, 0x67,
-	0xa2, 0xfc, 0x59, 0x55, 0x5b, 0x29, 0x3c, 0x17, 0x23, 0x07, 0x57, 0xd8, 0xfc, 0x65, 0x19, 0x1a,
-	0xf2, 0x8b, 0x83, 0x07, 0x07, 0x53, 0x4c, 0x19, 0x8e, 0xe7, 0xd9, 0x7c, 0x26, 0x68, 0x24, 0xad,
-	0x70, 0x31, 0xea, 0x56, 0xd3, 0xf1, 0xbc, 0xa1, 0x94, 0x8d, 0x9c, 0x89, 0x4c, 0x53, 0x11, 0x9d,
-	0xf2, 0x0b, 0x9a, 0x83, 0xad, 0x20, 0xac, 0xa3, 0xe4, 0x29, 0x72, 0x07, 0x5a, 0x22, 0x72, 0x42,
-	0x5b, 0x70, 0xfb, 0x8c, 0xc7, 0x2a, 0x7c, 0xeb, 0x16, 0x48, 0xd9, 0x88, 0x1f, 0xf2, 0x58, 0x90,
-	0xdf, 0x03, 0x12, 0xd1, 0xa9, 0x13, 0x9d, 0x6b, 0x2e, 0xb5, 0x1e, 0x15, 0xc4, 0x75, 0x95, 0x06,
-	0xd9, 0xd4, 0xca, 0x64, 0x68, 0x16, 0x04, 0x29, 0xba, 0x9a, 0x47, 0x0f, 0xa4, 0x42, 0xa1, 0xb5,
-	0x2f, 0x0a, 0x2a, 0x07, 0x59, 0x4b, 0x7d, 0x41, 0x54, 0xd1, 0x97, 0x0c, 0x66, 0xe4, 0x7d, 0x49,
-	0x91, 0xbb, 0xb0, 0x26, 0xe4, 0x67, 0xa1, 0xef, 0x88, 0x3c, 0xb8, 0x8e, 0xe0, 0xbb, 0xa9, 0x6a,
-	0x39, 0x3e, 0x9b, 0xa8, 0xc6, 0x1c, 0x3e, 0x99, 0x2b, 0xf3, 0xd7, 0x25, 0xa8, 0xa9, 0x75, 0x20,
-	0x4f, 0xa0, 0xec, 0x4e, 0x93, 0xab, 0x11, 0x92, 0xdd, 0xb6, 0x24, 0xab, 0x64, 0x49, 0xf5, 0xf2,
-	0x9d, 0x91, 0x8b, 0xf6, 0x72, 0x21, 0xda, 0xb3, 0xed, 0x55, 0x99, 0xdb, 0x5e, 0x6a, 0xcb, 0x54,
-	0x8b, 0x5b, 0x66, 0xf9, 0xce, 0xc8, 0xf6, 0x9d, 0x91, 0xdb, 0x77, 0xe6, 0xaf, 0xcb, 0x50, 0x79,
-	0xe1, 0xf3, 0x4b, 0x3c, 0x08, 0x5d, 0xf9, 0x69, 0x69, 0xe7, 0x2b, 0x93, 0x55, 0xab, 0xa5, 0xa4,
-	0x83, 0x65, 0x95, 0xd2, 0x6a, 0x52, 0x29, 0xad, 0x43, 0x6d, 0x16, 0x30, 0x29, 0x6e, 0x2a, 0xf1,
-	0x2c, 0x60, 0x37, 0x55, 0xc4, 0xdb, 0x80, 0xc7, 0x94, 0x8a, 0x6b, 0x55, 0x65, 0xd4, 0xa5, 0x00,
-	0x37, 0xea, 0x26, 0xd4, 0x93, 0xc3, 0x16, 0xb7, 0xdd, 0xaa, 0x65, 0xe8, 0x83, 0x96, 0xfc, 0x10,
-	0x56, 0x03, 0x2a, 0x2e, 0x39, 0x46, 0x91, 0x1a, 0x65, 0x15, 0x11, 0x6d, 0x2d, 0x1e, 0x2c, 0xab,
-	0xd4, 0x6b, 0x08, 0xc9, 0x15, 0x68, 0x9f, 0x03, 0xb8, 0x69, 0xf6, 0xd2, 0xd7, 0x1d, 0x6b, 0xe9,
-	0x5a, 0x65, 0x89, 0xcd, 0xca, 0xc1, 0xc8, 0xc7, 0x50, 0x73, 0x70, 0x15, 0xf5, 0x35, 0xc6, 0xea,
-	0xdc, 0xe2, 0x5a, 0x5a, 0x4d, 0xb6, 0xa0, 0x1e, 0x46, 0x8c, 0x47, 0x4c, 0x5c, 0x61, 0xc8, 0xac,
-	0x5a, 0x69, 0x3b, 0x57, 0xf1, 0xb7, 0x0a, 0x15, 0x7f, 0xae, 0xd4, 0x6c, 0x17, 0x4a, 0xcd, 0x4d,
-	0xa8, 0x4f, 0x22, 0x3e, 0x0b, 0xa5, 0x1f, 0x3a, 0x3f, 0x60, 0x7b, 0xe0, 0x99, 0x23, 0x68, 0xcd,
-	0xd7, 0x51, 0xaa, 0x18, 0x4c, 0x16, 0xaf, 0x65, 0xd5, 0x95, 0x60, 0xe0, 0x91, 0x8f, 0x61, 0x55,
-	0x2b, 0xe3, 0x90, 0xba, 0x6c, 0xcc, 0x5c, 0x5d, 0x64, 0x76, 0x94, 0xf8, 0x44, 0x4b, 0xcd, 0x7f,
-	0xab, 0x40, 0xa7, 0x78, 0x1d, 0x79, 0x7d, 0xb5, 0xba, 0x09, 0xf5, 0xe8, 0xad, 0x7d, 0x7a, 0x25,
-	0x68, 0x8c, 0x6c, 0x35, 0xcb, 0x88, 0xde, 0x3e, 0x97, 0x4d, 0xb9, 0x02, 0xd1, 0x5b, 0x3b, 0xc4,
-	0x72, 0x57, 0xc5, 0x73, 0xcd, 0x6a, 0x44, 0x6f, 0x55, 0xfd, 0x1b, 0xe3, 0xde, 0x7d, 0x6b, 0xcf,
-	0x5c, 0x47, 0xe6, 0x3e, 0x0d, 0xaa, 0x20, 0xa8, 0x13, 0xbd, 0x7d, 0x23, 0xc5, 0x45, 0xe4, 0xb4,
-	0x80, 0xac, 0x26, 0xc8, 0xa3, 0x45, 0xe4, 0x69, 0x01, 0x59, 0x4b, 0x90, 0xcf, 0x17, 0x91, 0xea,
-	0x1e, 0x26, 0x41, 0x1a, 0x09, 0x12, 0xef, 0x55, 0x12, 0xe4, 0x26, 0xd4, 0x45, 0xe2, 0x61, 0x5d,
-	0x79, 0x28, 0x32, 0x0f, 0x45, 0xe6, 0x61, 0x43, 0x79, 0x28, 0xf2, 0x1e, 0x8a, 0x79, 0x0f, 0x41,
-	0xf5, 0x21, 0x16, 0x3c, 0x14, 0xf3, 0x1e, 0x36, 0x13, 0xe4, 0xd1, 0x22, 0xb2, 0xe8, 0x61, 0x2b,
-	0x41, 0x3e, 0x5f, 0x44, 0x16, 0x3d, 0x6c, 0x27, 0xc8, 0x82, 0x87, 0x26, 0xb4, 0xa3, 0xb7, 0xb6,
-	0x1b, 0xb9, 0x0a, 0x1d, 0x63, 0x94, 0xd5, 0xac, 0x66, 0xf4, 0xf6, 0x20, 0x72, 0x11, 0x89, 0xae,
-	0x9e, 0xb2, 0x30, 0x01, 0xac, 0x2a, 0x57, 0x4f, 0x59, 0xa8, 0xd5, 0x0f, 0xa1, 0x21, 0xd8, 0x94,
-	0xc6, 0xc2, 0x99, 0x86, 0xf8, 0x3d, 0x60, 0x58, 0x99, 0xc0, 0xfc, 0x4d, 0x09, 0x3a, 0xc5, 0x5b,
-	0xea, 0x7c, 0x5e, 0x28, 0x15, 0xf2, 0xc2, 0xf7, 0x0f, 0xa8, 0xef, 0xbf, 0x50, 0x37, 0x8f, 0xfe,
-	0x4b, 0x68, 0x17, 0xae, 0xb5, 0xaf, 0xdf, 0x0c, 0xf7, 0xa1, 0x16, 0x0b, 0x47, 0xcc, 0x62, 0x5d,
-	0xf3, 0xea, 0x96, 0xf9, 0x2d, 0xac, 0x2d, 0xb9, 0xde, 0xbe, 0xf5, 0xc7, 0x68, 0x46, 0x5f, 0x2e,
-	0xd0, 0xff, 0xf3, 0x0a, 0x90, 0xc5, 0x9b, 0xef, 0xef, 0x73, 0xb1, 0xe4, 0xf3, 0xd8, 0x2e, 0x74,
-	0xd1, 0xf0, 0x79, 0x7c, 0x82, 0x02, 0xa5, 0x3e, 0x4d, 0xd4, 0x95, 0x44, 0x7d, 0xaa, 0xd5, 0x4f,
-	0xa1, 0xeb, 0xf3, 0xd0, 0xb5, 0xa7, 0x2c, 0x4e, 0x39, 0xd4, 0xb7, 0x5a, 0x47, 0xca, 0x8f, 0x58,
-	0x9c, 0x10, 0x7d, 0x06, 0xeb, 0x1a, 0xa9, 0x03, 0x2e, 0x81, 0xd7, 0xd4, 0xf7, 0xa1, 0x82, 0xab,
-	0xc0, 0xd3, 0x26, 0x8f, 0xa1, 0xe9, 0xf3, 0x31, 0x4b, 0x80, 0x86, 0x2a, 0x83, 0xa4, 0x48, 0x03,
-	0x3e, 0x82, 0x96, 0xcf, 0x9d, 0x69, 0x8a, 0xa8, 0x23, 0xa2, 0x89, 0x32, 0x05, 0x31, 0x29, 0x6c,
-	0xdf, 0x70, 0xa9, 0xff, 0xc1, 0x16, 0xe3, 0x1f, 0x4a, 0xb0, 0x75, 0xfd, 0x0d, 0xff, 0x87, 0xea,
-	0x86, 0x7c, 0x0e, 0xf7, 0x59, 0x20, 0x3f, 0xd2, 0xa9, 0x7d, 0xca, 0x84, 0x9e, 0xc7, 0xc8, 0x11,
-	0x54, 0x17, 0x08, 0x6b, 0x5a, 0xfb, 0x9c, 0x09, 0x9c, 0x48, 0xcb, 0x11, 0xd4, 0xfc, 0x95, 0x1a,
-	0xdb, 0x35, 0x0f, 0x04, 0x1f, 0x6c, 0x6c, 0xf7, 0xa0, 0x8a, 0x4f, 0x15, 0x49, 0xad, 0x82, 0x0d,
-	0xc9, 0x1e, 0xd0, 0x4b, 0x9b, 0x7e, 0x97, 0x54, 0x2b, 0xb5, 0x80, 0x5e, 0xf6, 0xbf, 0xf3, 0xcc,
-	0x33, 0x78, 0x74, 0xf3, 0xf3, 0xc2, 0x07, 0x5b, 0x9b, 0x7f, 0x2c, 0xa9, 0x18, 0xb8, 0xe6, 0xc1,
-	0xe1, 0xff, 0x77, 0x71, 0x7e, 0x51, 0x02, 0xf3, 0xdd, 0x8f, 0x17, 0xff, 0xb7, 0x8b, 0x64, 0x7e,
-	0x87, 0x6b, 0x71, 0xc3, 0x23, 0xc7, 0xad, 0xfb, 0x7f, 0x0c, 0x4d, 0x7c, 0x89, 0x88, 0xa8, 0x13,
-	0xeb, 0xab, 0x27, 0xc3, 0x02, 0x29, 0xb2, 0x50, 0x62, 0x9e, 0xc3, 0x47, 0xef, 0x7c, 0x91, 0xf8,
-	0x60, 0x11, 0xc0, 0x60, 0xe3, 0xba, 0xb7, 0x89, 0xef, 0x93, 0x2f, 0x23, 0x8f, 0x25, 0x47, 0xa2,
-	0x72, 0xac, 0x11, 0x79, 0x4c, 0x1d, 0x89, 0xe6, 0x6b, 0x78, 0x78, 0xd3, 0x63, 0xce, 0x6d, 0xbb,
-	0x33, 0xff, 0xab, 0x04, 0xcd, 0x97, 0xb2, 0xee, 0x3b, 0xa2, 0x58, 0xeb, 0x7d, 0x04, 0x2d, 0x96,
-	0xdc, 0x07, 0x27, 0x24, 0x6d, 0x7c, 0x50, 0x57, 0xb2, 0x81, 0x47, 0x06, 0xd0, 0xc9, 0x20, 0x58,
-	0x68, 0xab, 0x4b, 0x0d, 0x33, 0xad, 0x5b, 0x73, 0x84, 0xbb, 0xe9, 0xed, 0x32, 0xde, 0x5e, 0xb4,
-	0x59, 0xbe, 0x49, 0x1e, 0x41, 0x73, 0x42, 0xa7, 0x76, 0x52, 0x4f, 0x97, 0xb1, 0x33, 0x59, 0x4f,
-	0x1f, 0xab, 0x7a, 0x3a, 0x5f, 0xf1, 0x56, 0x50, 0x99, 0xb6, 0xcd, 0x3f, 0x86, 0x76, 0x81, 0x9b,
-	0x18, 0x50, 0x3e, 0x1e, 0xbe, 0xee, 0xde, 0x21, 0x5d, 0x68, 0xf5, 0x8f, 0x87, 0xaf, 0xed, 0xcf,
-	0x5e, 0xda, 0xc7, 0xfb, 0xa3, 0xc3, 0x6e, 0x89, 0xdc, 0x85, 0xb6, 0x92, 0x7c, 0xaa, 0x45, 0x2b,
-	0xe6, 0xdf, 0xae, 0x40, 0x15, 0xc7, 0x59, 0xa8, 0x84, 0x95, 0xbb, 0x49, 0x25, 0x4c, 0x7e, 0x0a,
-	0x86, 0xcb, 0xa7, 0x53, 0x47, 0xbf, 0x2c, 0x2f, 0xf8, 0x98, 0xf7, 0x34, 0x3e, 0x50, 0x48, 0x2b,
-	0x31, 0x21, 0xbb, 0x60, 0x4c, 0x95, 0x4a, 0x5f, 0x49, 0xdd, 0x5b, 0x36, 0x43, 0x56, 0x02, 0xca,
-	0x7d, 0x08, 0x54, 0x6e, 0xfc, 0x10, 0x30, 0xbf, 0x82, 0xb5, 0x25, 0x1d, 0x93, 0x55, 0x68, 0xee,
-	0xf7, 0x7a, 0xf6, 0x51, 0xff, 0xe8, 0x79, 0xdf, 0x3a, 0xe9, 0xde, 0x21, 0x04, 0x3a, 0x56, 0xff,
-	0x68, 0xf8, 0x75, 0x3f, 0x95, 0x95, 0x24, 0xe8, 0xa4, 0x3f, 0x4a, 0x05, 0x2b, 0xa6, 0x01, 0xd5,
-	0xfe, 0x34, 0x14, 0x57, 0xcf, 0xfe, 0xa9, 0x03, 0xc6, 0x50, 0x75, 0x48, 0x7a, 0x00, 0x3d, 0x16,
-	0x3b, 0xa7, 0x3e, 0x1d, 0xfa, 0x82, 0x74, 0xd2, 0x81, 0x20, 0x72, 0x6b, 0xae, 0x6d, 0xde, 0xff,
-	0xc5, 0xbf, 0xff, 0xc7, 0xaf, 0x56, 0xba, 0x66, 0x73, 0xef, 0xe2, 0xb3, 0x3d, 0x6d, 0xf7, 0x45,
-	0xe9, 0x13, 0xf2, 0x02, 0x9a, 0x16, 0xa5, 0xc1, 0xfb, 0xd2, 0x3c, 0x40, 0x9a, 0xbb, 0x66, 0x4b,
-	0xd2, 0x24, 0x86, 0x92, 0xa7, 0x0f, 0x4d, 0x9d, 0x3c, 0xe8, 0x30, 0x98, 0x91, 0x56, 0xfe, 0x45,
-	0x70, 0x81, 0x65, 0x03, 0x59, 0x88, 0xd9, 0x96, 0x2c, 0x7d, 0xd5, 0x79, 0x30, 0x93, 0x34, 0x87,
-	0xd0, 0xee, 0x51, 0xe7, 0xbd, 0x89, 0x36, 0x91, 0x68, 0xcd, 0xec, 0xe4, 0xbc, 0xd2, 0x4c, 0x07,
-	0xd0, 0xe8, 0x51, 0x9f, 0xde, 0x7a, 0x38, 0xa9, 0x91, 0x24, 0x19, 0x00, 0xe8, 0x07, 0x89, 0xe1,
-	0x4c, 0x90, 0x6e, 0xe1, 0x3f, 0x44, 0x8e, 0xe2, 0xc9, 0xcd, 0xe3, 0xc9, 0x2c, 0x25, 0xd5, 0x10,
-	0x5a, 0xe9, 0x6b, 0x84, 0x24, 0x23, 0x85, 0x97, 0x5f, 0x14, 0x2f, 0xd0, 0x6d, 0x23, 0xdd, 0xba,
-	0xd9, 0x45, 0xba, 0x9c, 0xb5, 0x24, 0xfc, 0x0b, 0x58, 0xcd, 0xbf, 0x2b, 0x48, 0xce, 0xec, 0xd9,
-	0x25, 0xaf, 0x59, 0xa0, 0x7d, 0x84, 0xb4, 0x1b, 0xe6, 0x9a, 0xa4, 0x9d, 0xe3, 0x90, 0xcc, 0x5f,
-	0x82, 0x21, 0x8b, 0xf6, 0x7d, 0xcf, 0x23, 0xed, 0xc2, 0x3f, 0x9b, 0xdc, 0x1c, 0x55, 0xda, 0x46,
-	0x45, 0x15, 0xc8, 0x96, 0x85, 0x57, 0x31, 0xef, 0x22, 0x29, 0x4c, 0x5a, 0x66, 0x26, 0x79, 0x4e,
-	0xa0, 0x93, 0x3e, 0x6a, 0x1d, 0x9c, 0x51, 0xf7, 0x7c, 0x21, 0x40, 0xb3, 0x69, 0x4c, 0x81, 0xe6,
-	0x0f, 0x90, 0xf0, 0x81, 0x49, 0x24, 0x61, 0xd1, 0x5e, 0x92, 0x1e, 0x41, 0x53, 0xc5, 0xdc, 0x31,
-	0x0f, 0x06, 0xe3, 0xdc, 0x42, 0xa4, 0xb9, 0x6a, 0x61, 0x88, 0x5b, 0xc8, 0x78, 0xcf, 0x5c, 0xcd,
-	0x02, 0x16, 0x8d, 0xf5, 0xc2, 0xea, 0xc8, 0x7b, 0x7f, 0xbe, 0xc2, 0xc2, 0xe6, 0xad, 0x25, 0xa1,
-	0x05, 0xed, 0x97, 0x54, 0xe4, 0xde, 0x7d, 0xe6, 0x7d, 0x5e, 0x5b, 0x72, 0x35, 0x6d, 0x3e, 0x44,
-	0xca, 0xfb, 0xe6, 0x5d, 0x49, 0x59, 0xb0, 0x97, 0x9c, 0x7f, 0x0a, 0x35, 0x8b, 0x9e, 0x72, 0xfe,
-	0xee, 0x1d, 0xbe, 0x8e, 0x3c, 0xab, 0x26, 0xa8, 0x1d, 0x2e, 0x6d, 0x24, 0xc1, 0x1b, 0xb8, 0x7b,
-	0xc0, 0x7d, 0x9f, 0xba, 0xf9, 0xcb, 0x81, 0x77, 0x71, 0xed, 0x20, 0xd7, 0x96, 0xb9, 0x2e, 0xb9,
-	0x16, 0xcc, 0x25, 0x6d, 0x04, 0x0f, 0x0e, 0x22, 0xea, 0x08, 0x3a, 0x8a, 0x9c, 0xf1, 0x98, 0xb9,
-	0x27, 0xee, 0x19, 0xf5, 0x66, 0xbe, 0x4c, 0xb5, 0x8f, 0x77, 0x0b, 0xff, 0xe4, 0xb6, 0x00, 0x58,
-	0xe8, 0xed, 0x87, 0xd8, 0xdb, 0x8e, 0xb9, 0x8d, 0xbd, 0x2d, 0x67, 0xd5, 0x7d, 0xaa, 0x08, 0xfb,
-	0xd0, 0x7d, 0x5e, 0xc3, 0x2a, 0xfb, 0x1c, 0xc3, 0x5a, 0x61, 0x44, 0x7f, 0x3e, 0xa3, 0x33, 0x1a,
-	0x93, 0xed, 0xa5, 0xfd, 0x29, 0xe5, 0x42, 0x5f, 0x26, 0xf6, 0xf5, 0xd0, 0x7c, 0xb0, 0xe0, 0x9f,
-	0x32, 0xd0, 0xfd, 0x14, 0x46, 0xf1, 0xbf, 0xee, 0x67, 0x09, 0x9b, 0xec, 0xe7, 0x8f, 0xa0, 0xab,
-	0xb6, 0x41, 0xae, 0xae, 0xb9, 0x3e, 0x4c, 0x33, 0x90, 0x79, 0xe7, 0xd3, 0x12, 0xf9, 0x16, 0xd6,
-	0x8f, 0x69, 0x34, 0xe6, 0xd1, 0x14, 0x8f, 0xc8, 0x61, 0x48, 0xa3, 0x79, 0x06, 0x54, 0x2c, 0x8c,
-	0xec, 0x09, 0x8e, 0xec, 0x91, 0xb9, 0x29, 0x47, 0xb6, 0x94, 0xe2, 0x8b, 0xd2, 0x27, 0xcf, 0xbf,
-	0x85, 0x6d, 0x1e, 0x4d, 0xd0, 0xd4, 0xe5, 0x91, 0xb7, 0xab, 0xfe, 0x73, 0x32, 0xa1, 0x7a, 0xde,
-	0xfe, 0x1a, 0xdb, 0xf2, 0x18, 0x1d, 0xbe, 0x1a, 0xfd, 0x6c, 0x6f, 0xc2, 0xc4, 0xd9, 0xec, 0x74,
-	0xd7, 0xe5, 0xd3, 0xbd, 0xc4, 0x64, 0x4f, 0x99, 0xfc, 0x48, 0xff, 0xb3, 0xe5, 0xc5, 0xe7, 0x7b,
-	0x13, 0x9e, 0xfc, 0xdb, 0xe6, 0x71, 0xe9, 0xb4, 0x86, 0xf2, 0xcf, 0xff, 0x27, 0x00, 0x00, 0xff,
-	0xff, 0xf2, 0x03, 0xdf, 0xca, 0xd8, 0x29, 0x00, 0x00,
+	0x56, 0x77, 0x4b, 0xad, 0xae, 0xee, 0xd7, 0x7f, 0x95, 0xb2, 0x6c, 0xfd, 0x5b, 0x5b, 0x53, 0x6b,
+	0x76, 0xbc, 0xc3, 0x8e, 0x34, 0xf6, 0x6c, 0x00, 0x3b, 0x2c, 0x30, 0x92, 0xba, 0x6d, 0x35, 0x63,
+	0xb9, 0x45, 0xa9, 0x3d, 0x86, 0xdd, 0x98, 0xa8, 0x2d, 0x55, 0x65, 0xb7, 0x12, 0x55, 0x57, 0xd6,
+	0x54, 0x55, 0x4b, 0xd6, 0x75, 0x61, 0xf9, 0x00, 0x6c, 0x70, 0x80, 0x1b, 0xf0, 0x25, 0x36, 0x62,
+	0x8f, 0x5c, 0x09, 0x2e, 0x7c, 0x05, 0x3e, 0x03, 0x07, 0x82, 0x03, 0x91, 0x2f, 0xb3, 0xfe, 0x75,
+	0xb5, 0x64, 0x6b, 0x10, 0xc1, 0x45, 0xa1, 0x7c, 0xef, 0xf7, 0x7e, 0x2f, 0x5f, 0xe6, 0xcb, 0xcc,
+	0x97, 0x95, 0x0d, 0x9b, 0x17, 0xdc, 0x8d, 0xce, 0x2c, 0xd3, 0x0f, 0x78, 0xc4, 0xc3, 0x5d, 0xee,
+	0x53, 0x8f, 0xbb, 0xd1, 0x0e, 0x36, 0x89, 0xa6, 0x9a, 0x1b, 0x5b, 0x63, 0xce, 0xc7, 0x2e, 0xdd,
+	0xb5, 0x7c, 0xb6, 0x6b, 0x79, 0x1e, 0x8f, 0xac, 0x88, 0x71, 0x2f, 0x94, 0xb0, 0x8d, 0xed, 0x3c,
+	0x47, 0x44, 0xed, 0x33, 0xf1, 0xff, 0x88, 0xb9, 0x54, 0x22, 0xf4, 0x7f, 0x2d, 0x03, 0xf4, 0x3d,
+	0x87, 0xd9, 0x68, 0x47, 0x9e, 0x81, 0xc6, 0xdd, 0xc8, 0x64, 0x9e, 0xb3, 0x56, 0xda, 0x2e, 0x3d,
+	0xad, 0x3f, 0x7f, 0xb0, 0x13, 0x3b, 0x1e, 0xb8, 0x51, 0x0a, 0x3c, 0xbc, 0x67, 0x54, 0x38, 0x0a,
+	0xc8, 0x8f, 0xa1, 0xca, 0xbc, 0x68, 0x84, 0x36, 0x0b, 0x68, 0xf3, 0x30, 0xb1, 0xe9, 0x7b, 0xd1,
+	0x28, 0x67, 0xa4, 0x31, 0x29, 0x21, 0x7b, 0xd0, 0x44, 0x2b, 0xee, 0xd3, 0x00, 0x4d, 0x17, 0xd1,
+	0x74, 0x33, 0x67, 0x3a, 0xf0, 0x69, 0x90, 0x33, 0xaf, 0xb3, 0x54, 0x4a, 0xfe, 0x18, 0x1a, 0xdc,
+	0x9b, 0x9a, 0x0e, 0x0b, 0x6d, 0x64, 0x28, 0x23, 0xc3, 0x46, 0xda, 0x61, 0x6f, 0xda, 0x65, 0xa1,
+	0x9d, 0x23, 0x00, 0x9e, 0x08, 0x31, 0x56, 0x6f, 0x8a, 0xa6, 0x4b, 0xb3, 0xb1, 0x7a, 0xd3, 0x99,
+	0x58, 0x51, 0x20, 0x62, 0xe5, 0x13, 0x9b, 0xa1, 0x4d, 0x65, 0x26, 0xd6, 0xc1, 0xc4, 0x66, 0xf9,
+	0x58, 0xb9, 0x94, 0x90, 0x1f, 0x83, 0xe6, 0x9f, 0xcb, 0x41, 0xd5, 0xd0, 0x68, 0x3d, 0x31, 0x3a,
+	0xb6, 0xec, 0x73, 0x3a, 0x33, 0xae, 0xfe, 0x39, 0x8e, 0xeb, 0x1f, 0x00, 0xf8, 0x3c, 0x88, 0xcc,
+	0x30, 0xb2, 0xa2, 0x70, 0xad, 0x3a, 0xe3, 0xed, 0x98, 0x07, 0xd1, 0x89, 0x98, 0xec, 0x30, 0x62,
+	0x76, 0x78, 0x78, 0xcf, 0xa8, 0xf9, 0x4a, 0x12, 0x0a, 0xcb, 0x91, 0xcb, 0x2f, 0x95, 0x65, 0x6d,
+	0xc6, 0xf2, 0x85, 0xcb, 0x2f, 0xf3, 0x96, 0x23, 0x25, 0x09, 0xc9, 0xef, 0x43, 0xcd, 0x72, 0xad,
+	0x60, 0x82, 0x7d, 0x05, 0x34, 0x5c, 0x4b, 0x0c, 0xf7, 0x84, 0x26, 0xd7, 0xd5, 0xaa, 0xa5, 0x44,
+	0xfb, 0x15, 0x28, 0x3b, 0x56, 0x64, 0xe9, 0xff, 0xd5, 0x80, 0xf6, 0x0c, 0x4e, 0x8c, 0xb3, 0xcb,
+	0xc3, 0xb9, 0x39, 0xf5, 0x8a, 0x87, 0xf9, 0xd8, 0x5d, 0x14, 0x90, 0x2e, 0xb4, 0x9c, 0x2b, 0xe6,
+	0x8d, 0xcd, 0xb1, 0x15, 0xfa, 0x99, 0xcc, 0xda, 0x4a, 0x2c, 0xbb, 0x42, 0xfd, 0xd2, 0x0a, 0xfd,
+	0x9c, 0x7d, 0xc3, 0xc9, 0x88, 0x45, 0x8e, 0x89, 0x09, 0x4e, 0x23, 0x9a, 0xcd, 0xb1, 0x81, 0x37,
+	0x2d, 0x06, 0x55, 0xe7, 0xa9, 0x94, 0xbc, 0x85, 0xfb, 0x82, 0x22, 0x8c, 0xac, 0x20, 0x9a, 0xfa,
+	0xe6, 0xc8, 0x62, 0x6e, 0x26, 0xd7, 0x9e, 0x64, 0x99, 0x4e, 0x24, 0xe6, 0x85, 0xc5, 0xdc, 0x69,
+	0x40, 0x73, 0x94, 0xcb, 0x3c, 0xa7, 0x16, 0xc4, 0x3f, 0x83, 0x07, 0x48, 0xcc, 0xc6, 0x9e, 0xe5,
+	0x9a, 0x0e, 0x1d, 0x07, 0x96, 0x43, 0x33, 0xb9, 0xf8, 0xfd, 0x1c, 0x35, 0xa2, 0xba, 0x12, 0x94,
+	0x63, 0x5e, 0xe1, 0x45, 0x2d, 0xf9, 0x39, 0x3c, 0xc4, 0x85, 0x11, 0xb0, 0x51, 0x64, 0xf2, 0x91,
+	0x79, 0xc9, 0x3c, 0x87, 0x5f, 0x66, 0x92, 0x36, 0x47, 0xde, 0x15, 0xb0, 0xc1, 0xe8, 0x2d, 0x82,
+	0x0a, 0xe4, 0xb3, 0x5a, 0x32, 0x04, 0x11, 0x8d, 0xe9, 0xf2, 0x30, 0x34, 0x93, 0xb5, 0x20, 0xd3,
+	0xfa, 0xe3, 0x2c, 0xed, 0x2b, 0x1e, 0x86, 0x83, 0x91, 0x58, 0x14, 0x07, 0x67, 0x96, 0xe7, 0x51,
+	0x37, 0x47, 0xdd, 0xe2, 0x0a, 0xa1, 0x96, 0x48, 0x3c, 0xce, 0x18, 0x4a, 0x98, 0x8e, 0x73, 0x75,
+	0xce, 0x38, 0x4b, 0xcc, 0xb5, 0xe3, 0x9c, 0xaa, 0x05, 0xf1, 0x40, 0x6e, 0x12, 0x11, 0xbb, 0x94,
+	0x3d, 0x95, 0xab, 0xe1, 0x77, 0xb3, 0x84, 0xc3, 0xc0, 0xf2, 0xc2, 0x09, 0x0b, 0x43, 0xc6, 0xbd,
+	0xbe, 0x17, 0xd1, 0x60, 0x44, 0x03, 0xea, 0xd9, 0xf4, 0xad, 0x15, 0x78, 0xcc, 0x1b, 0xab, 0x5d,
+	0x63, 0xc8, 0x2e, 0xb1, 0xa7, 0xbf, 0x90, 0x83, 0x6b, 0xd9, 0x11, 0xbb, 0x40, 0xbf, 0x69, 0x67,
+	0xa1, 0x38, 0x0a, 0x7b, 0x09, 0x6c, 0x5e, 0x7f, 0x45, 0xcc, 0x79, 0x84, 0xf4, 0xb0, 0x26, 0x3c,
+	0xf8, 0x01, 0xb7, 0x69, 0x18, 0x8a, 0x55, 0x40, 0x83, 0x80, 0xcb, 0x5d, 0xb2, 0x8e, 0x2e, 0x7e,
+	0x27, 0xeb, 0xe2, 0x38, 0xc1, 0xf5, 0x04, 0x2c, 0xe7, 0x60, 0x95, 0xcf, 0xd3, 0x13, 0x0a, 0xeb,
+	0xe9, 0x1c, 0x8e, 0xcc, 0xf0, 0xca, 0xb3, 0xd3, 0x28, 0x1a, 0xe8, 0xe2, 0x93, 0xe2, 0x5c, 0x7e,
+	0x45, 0xaf, 0x4e, 0xae, 0x3c, 0xfb, 0xba, 0x40, 0x24, 0x28, 0x46, 0x08, 0x37, 0x6f, 0x60, 0x15,
+	0x37, 0xd8, 0x68, 0x6a, 0xfa, 0xdc, 0x93, 0xdb, 0x11, 0xba, 0x68, 0xa2, 0x8b, 0x8f, 0x72, 0xdb,
+	0x6d, 0x34, 0x3d, 0xe6, 0x1e, 0xee, 0x42, 0x85, 0x29, 0xcd, 0xeb, 0x88, 0x0b, 0x5b, 0x98, 0xde,
+	0x74, 0x66, 0x0e, 0xa6, 0x81, 0x5c, 0x40, 0x2d, 0x64, 0xff, 0x61, 0x2e, 0xc7, 0x33, 0xd8, 0x79,
+	0xfd, 0x17, 0xc3, 0x31, 0x1f, 0x43, 0xde, 0xca, 0x20, 0x02, 0x3a, 0xe1, 0x11, 0x35, 0x1d, 0x3a,
+	0xa2, 0xb6, 0xdc, 0xca, 0xdb, 0xe8, 0x46, 0xcf, 0xba, 0x31, 0x10, 0xd4, 0x45, 0x4c, 0x8e, 0x9f,
+	0xf0, 0x82, 0x92, 0x84, 0x32, 0x0c, 0x9c, 0x84, 0x31, 0x9d, 0x98, 0x0e, 0x75, 0x99, 0x47, 0x65,
+	0x38, 0x82, 0xbf, 0x83, 0xfc, 0xcf, 0x8a, 0xf3, 0xf0, 0xb2, 0x77, 0xa4, 0x96, 0x54, 0x37, 0x35,
+	0xc9, 0xb9, 0x5b, 0x53, 0xd3, 0xf1, 0x92, 0x4e, 0xf2, 0x10, 0x72, 0x01, 0xdb, 0x98, 0x5b, 0x67,
+	0x57, 0x21, 0xb3, 0x2d, 0xd7, 0xa4, 0xdf, 0x4e, 0x99, 0x3f, 0xa1, 0x5e, 0x94, 0xc9, 0xb1, 0x65,
+	0x74, 0xfc, 0xa3, 0x5c, 0x8e, 0x29, 0x7c, 0x2f, 0x86, 0x17, 0x53, 0x4d, 0x04, 0x73, 0x2d, 0x8c,
+	0xfc, 0x1c, 0x56, 0xb2, 0x19, 0x67, 0xd9, 0xe7, 0xe8, 0x8a, 0x14, 0x57, 0xa3, 0x8c, 0x71, 0xcf,
+	0x3e, 0xf7, 0xf8, 0xa5, 0x4b, 0x9d, 0x31, 0x15, 0x3c, 0x39, 0x4f, 0x6d, 0x9e, 0x41, 0x65, 0x0f,
+	0x9f, 0x1d, 0x68, 0xe6, 0x8a, 0x14, 0xf2, 0x3d, 0x00, 0xac, 0x2f, 0x44, 0xe6, 0x51, 0x3c, 0x7c,
+	0x6a, 0x46, 0x4d, 0x48, 0x44, 0x2e, 0x51, 0xfd, 0x10, 0x5a, 0xf9, 0x02, 0x85, 0x3c, 0x04, 0x4d,
+	0xd6, 0x32, 0xf2, 0xa8, 0xd2, 0x8c, 0x0a, 0xd6, 0x2b, 0xce, 0x0c, 0xd3, 0xc2, 0x2c, 0xd3, 0x19,
+	0x2c, 0x17, 0xaa, 0x8d, 0xeb, 0xc9, 0xbe, 0x80, 0x66, 0x48, 0x03, 0x66, 0xb9, 0xa6, 0x37, 0x9d,
+	0x9c, 0xd2, 0x40, 0x1d, 0x6e, 0xab, 0xc9, 0x30, 0x9c, 0xa0, 0xf6, 0x35, 0x2a, 0x8d, 0x46, 0x98,
+	0x69, 0xe9, 0xbf, 0x2d, 0x41, 0x33, 0x57, 0x9d, 0x5c, 0xef, 0x66, 0x15, 0x2a, 0xb8, 0xfc, 0xe4,
+	0xe1, 0xa9, 0x19, 0x4b, 0x62, 0x29, 0xcd, 0x86, 0xb2, 0x38, 0x13, 0x0a, 0x79, 0x0c, 0x75, 0xcb,
+	0x99, 0x30, 0x4f, 0xe9, 0x97, 0x50, 0x0f, 0x28, 0x92, 0x80, 0x42, 0xef, 0xcb, 0x1f, 0xde, 0xfb,
+	0x5f, 0x00, 0x29, 0xd6, 0x75, 0x84, 0x40, 0x39, 0xba, 0xf2, 0xe3, 0x09, 0xc2, 0xff, 0xb3, 0x51,
+	0x2d, 0xdc, 0x30, 0x13, 0xb3, 0xdd, 0xd7, 0x0d, 0x68, 0xe5, 0x0b, 0xb1, 0x5b, 0x8f, 0x4f, 0x07,
+	0x16, 0xfd, 0xf3, 0x08, 0x99, 0x1b, 0x86, 0xf8, 0x57, 0xff, 0x97, 0x12, 0x74, 0x66, 0x0b, 0x35,
+	0xb2, 0x09, 0x35, 0xa4, 0xc5, 0x9e, 0xcb, 0x51, 0xc2, 0x3a, 0x78, 0x38, 0xd3, 0xfb, 0x42, 0x1e,
+	0x8d, 0xe9, 0x04, 0xeb, 0xba, 0xc4, 0x6f, 0x4d, 0x49, 0xfa, 0x8e, 0xb0, 0xc3, 0xca, 0x8d, 0xc9,
+	0x5a, 0x45, 0x33, 0x2a, 0xa2, 0x29, 0x15, 0x68, 0xe4, 0x71, 0x3c, 0xc2, 0x35, 0xa3, 0x22, 0x9a,
+	0xaf, 0x39, 0x79, 0x00, 0x15, 0x9b, 0xf3, 0x73, 0x46, 0xf1, 0x0c, 0xae, 0x18, 0xaa, 0x15, 0x47,
+	0x51, 0x4e, 0xa3, 0x78, 0x02, 0x35, 0x79, 0xba, 0x59, 0xf6, 0xf5, 0x1d, 0xd4, 0x7f, 0x0a, 0xb5,
+	0x43, 0x6a, 0x05, 0xd1, 0x29, 0xb5, 0x22, 0xb2, 0x0b, 0x2b, 0x67, 0x71, 0x43, 0x9e, 0xcd, 0xd1,
+	0x34, 0xa0, 0xca, 0x82, 0x24, 0xaa, 0x93, 0x58, 0xa3, 0xff, 0x55, 0x09, 0x16, 0x07, 0xde, 0xf4,
+	0xd6, 0x63, 0x5e, 0xc8, 0xa9, 0xc5, 0x0f, 0xce, 0x29, 0x8c, 0x94, 0xc9, 0x2c, 0xd4, 0x0c, 0xf1,
+	0xaf, 0xfe, 0x15, 0x68, 0x22, 0x07, 0x8e, 0xc2, 0xf1, 0x1d, 0x4c, 0xfe, 0xaf, 0x4a, 0x50, 0x13,
+	0x3b, 0x20, 0xce, 0xff, 0xad, 0xf9, 0x32, 0xf3, 0x56, 0xce, 0xcd, 0x5b, 0x3e, 0x11, 0x96, 0x66,
+	0x13, 0xa1, 0xd8, 0x8f, 0x9f, 0x40, 0xe3, 0x8d, 0xef, 0x32, 0xef, 0xfc, 0x7d, 0x3d, 0x51, 0xa6,
+	0x0b, 0xa9, 0xe9, 0xdf, 0xd6, 0x00, 0xba, 0xf4, 0x82, 0xd9, 0xb4, 0xef, 0x8d, 0x30, 0x65, 0x2e,
+	0xa8, 0xe7, 0xf0, 0x40, 0x2d, 0x38, 0xd5, 0x22, 0xf7, 0x61, 0x69, 0xc2, 0x1d, 0xea, 0xaa, 0xed,
+	0x4d, 0x36, 0xc8, 0x0f, 0xa1, 0x73, 0x66, 0x05, 0xce, 0xa5, 0x15, 0x50, 0xf3, 0x82, 0x06, 0xa2,
+	0x48, 0x52, 0xab, 0xae, 0x1d, 0xcb, 0xbf, 0x96, 0x62, 0x01, 0x1d, 0xb1, 0x60, 0x92, 0x83, 0x96,
+	0x25, 0x34, 0x96, 0xc7, 0xd0, 0x4d, 0xa8, 0x39, 0xd8, 0x23, 0xd1, 0xff, 0x8e, 0x5c, 0x3d, 0x52,
+	0xd0, 0x77, 0xc8, 0x67, 0x70, 0x5f, 0x29, 0xf3, 0x49, 0xb1, 0x8c, 0x38, 0x22, 0x75, 0xd9, 0x8c,
+	0x10, 0x74, 0xa2, 0xc2, 0x10, 0x83, 0x17, 0x62, 0x01, 0xa3, 0x19, 0x55, 0x9f, 0x7b, 0xe2, 0x92,
+	0x14, 0x92, 0x47, 0x00, 0xe2, 0xe2, 0xeb, 0x71, 0x97, 0x8f, 0xaf, 0xe2, 0x0d, 0x2d, 0x95, 0x90,
+	0x6d, 0x59, 0x22, 0x32, 0x47, 0x96, 0xf9, 0x6a, 0x81, 0x01, 0x4e, 0x20, 0x56, 0xed, 0x64, 0x0b,
+	0x40, 0x21, 0xa8, 0x2a, 0x76, 0x35, 0xa3, 0x8a, 0xfa, 0x9e, 0xe7, 0x90, 0x27, 0xd0, 0xb2, 0x5c,
+	0x97, 0xdb, 0x29, 0x43, 0x15, 0x11, 0x0d, 0x94, 0xc6, 0x1c, 0xdb, 0xd0, 0x48, 0x50, 0x54, 0x15,
+	0xa2, 0x9a, 0x01, 0x0a, 0x23, 0x78, 0x9e, 0x42, 0x27, 0x4d, 0x09, 0xc5, 0x04, 0x88, 0x6a, 0x25,
+	0x89, 0x21, 0xb9, 0x9e, 0x40, 0x2b, 0x83, 0xa4, 0xaa, 0x2e, 0xd4, 0x8c, 0x46, 0x82, 0x13, 0x7c,
+	0x3a, 0x34, 0xd5, 0x66, 0xa2, 0xc8, 0x9a, 0x08, 0xaa, 0xcb, 0x2d, 0x45, 0x32, 0x3d, 0x82, 0x7a,
+	0x8c, 0xa1, 0xaa, 0x74, 0xd2, 0xe4, 0x85, 0x50, 0x72, 0x7c, 0x09, 0x95, 0xc0, 0xf2, 0xc6, 0x34,
+	0x5c, 0x6b, 0x6f, 0x2f, 0x3e, 0xad, 0x3f, 0x7f, 0x9a, 0x5e, 0xc0, 0x92, 0x84, 0x52, 0xff, 0x1a,
+	0x34, 0xe4, 0xd3, 0xc0, 0xa6, 0x06, 0xe2, 0x0d, 0x65, 0xb7, 0xf1, 0x77, 0x65, 0xb8, 0x3f, 0x0f,
+	0x40, 0xd6, 0xe3, 0xef, 0x06, 0x4e, 0xb8, 0x56, 0xda, 0x5e, 0x7c, 0xaa, 0xa9, 0x8f, 0x03, 0xce,
+	0xec, 0x8c, 0x2d, 0x14, 0x66, 0xec, 0x00, 0x96, 0x7c, 0xce, 0xdd, 0x70, 0x6d, 0x11, 0x3b, 0xf5,
+	0xe9, 0x87, 0x76, 0x6a, 0xe7, 0x98, 0x73, 0xd7, 0x90, 0xb6, 0x1b, 0xff, 0xbd, 0x00, 0x65, 0xd1,
+	0x26, 0x7f, 0x9a, 0x39, 0x7e, 0x5a, 0xcf, 0x7f, 0xef, 0x56, 0x64, 0xf8, 0x47, 0x6c, 0xf9, 0xea,
+	0xd8, 0x3a, 0x01, 0x2d, 0x3c, 0xb3, 0x02, 0xe6, 0x8d, 0xb1, 0xdb, 0xad, 0xe7, 0x3f, 0xb9, 0x1d,
+	0xdd, 0x89, 0x34, 0x46, 0xc6, 0x98, 0x49, 0x2c, 0x4c, 0x39, 0x81, 0xf2, 0x4c, 0x90, 0x0d, 0xb1,
+	0xce, 0xa9, 0xba, 0x89, 0x6a, 0x86, 0xf8, 0x57, 0xdf, 0x83, 0x6a, 0xdc, 0x1d, 0x02, 0x50, 0x19,
+	0xbc, 0x7e, 0x63, 0xf6, 0xbb, 0x9d, 0x7b, 0xa4, 0x01, 0xd5, 0xbd, 0x57, 0xaf, 0x06, 0x07, 0xa2,
+	0x55, 0x22, 0x2d, 0x80, 0x97, 0xbd, 0xa3, 0xe3, 0x81, 0x31, 0x14, 0xed, 0x05, 0x52, 0x07, 0xed,
+	0xc5, 0xab, 0xc1, 0x5b, 0xd1, 0x58, 0xd4, 0xcf, 0xa0, 0x9e, 0xe9, 0x02, 0x79, 0x00, 0xa4, 0xdb,
+	0xeb, 0xf6, 0x0f, 0xf6, 0x86, 0xbd, 0xae, 0x79, 0xdc, 0x33, 0xcc, 0xfe, 0xeb, 0xe1, 0x8b, 0xce,
+	0x3d, 0xf2, 0x18, 0x36, 0x4f, 0x0e, 0xf7, 0x8c, 0x5e, 0xd7, 0xdc, 0xff, 0x0b, 0x73, 0xef, 0xd5,
+	0x2b, 0x94, 0xe3, 0x3f, 0xc3, 0xde, 0xc1, 0x61, 0xa7, 0x44, 0xb6, 0x61, 0x6b, 0x0e, 0xe0, 0x64,
+	0xef, 0xa8, 0x27, 0x11, 0x0b, 0xfa, 0x5f, 0x2f, 0x02, 0x1c, 0xb8, 0x56, 0x18, 0xb2, 0x11, 0xa3,
+	0x01, 0xee, 0x9f, 0x66, 0xe4, 0x27, 0xbb, 0xd9, 0x12, 0x1f, 0xfa, 0xcc, 0x21, 0x2b, 0xb0, 0xc4,
+	0xcd, 0x8b, 0x64, 0x57, 0x2d, 0xf3, 0xaf, 0x19, 0xee, 0xb5, 0x4c, 0x62, 0xd5, 0x80, 0xb0, 0x18,
+	0xcb, 0x10, 0x2b, 0x87, 0xa4, 0xcc, 0x04, 0xf6, 0x21, 0x68, 0xdc, 0xf4, 0x4f, 0x59, 0x14, 0xaa,
+	0x4d, 0xb6, 0xc2, 0x8f, 0x45, 0x0b, 0xf7, 0x4f, 0xa5, 0x50, 0x27, 0x2a, 0x93, 0x8a, 0x75, 0xa8,
+	0xd2, 0xe8, 0x4c, 0x9e, 0xeb, 0x72, 0xa9, 0x6b, 0x34, 0x3a, 0x8b, 0x8f, 0x75, 0x27, 0x8c, 0xcc,
+	0x89, 0x65, 0xe3, 0x12, 0x6f, 0x18, 0x15, 0x27, 0x8c, 0x8e, 0x2c, 0x5b, 0x28, 0xc2, 0xc0, 0x46,
+	0x45, 0x4d, 0x2a, 0xc2, 0xc0, 0x16, 0x0a, 0x91, 0xe4, 0xbe, 0xfc, 0xfc, 0xa6, 0xd6, 0xb2, 0xc6,
+	0xfc, 0x63, 0xfc, 0x84, 0xb7, 0x0a, 0xc2, 0xda, 0x64, 0xbe, 0x5a, 0xbc, 0x4b, 0x4e, 0x18, 0xf5,
+	0x7d, 0x21, 0x16, 0x54, 0xcc, 0x57, 0xfb, 0xd8, 0x52, 0x18, 0xd8, 0x7d, 0x5f, 0x10, 0x09, 0xb1,
+	0x58, 0xdd, 0x6a, 0x1d, 0x0b, 0x8f, 0x62, 0x83, 0x13, 0x2a, 0x41, 0x84, 0x2a, 0xb9, 0x80, 0x45,
+	0x2f, 0x51, 0xb5, 0x0d, 0x0d, 0xff, 0x3c, 0x32, 0x23, 0x6b, 0x2c, 0xe3, 0x69, 0xcb, 0xa5, 0xe4,
+	0x9f, 0x47, 0x43, 0x0b, 0x67, 0x58, 0xff, 0xd5, 0x22, 0xd4, 0xc4, 0x15, 0x94, 0x7b, 0x07, 0x13,
+	0xdc, 0x32, 0x2c, 0xc7, 0x31, 0xf9, 0x34, 0xa2, 0x81, 0xb0, 0xc2, 0xc9, 0xa8, 0x1a, 0x75, 0xcb,
+	0x71, 0x06, 0x42, 0x36, 0xb4, 0xc6, 0x62, 0x9b, 0x12, 0x97, 0xa1, 0x0b, 0x9a, 0x81, 0x2d, 0x20,
+	0xac, 0x25, 0xe5, 0x09, 0x72, 0x1b, 0x1a, 0x51, 0x60, 0xf9, 0x66, 0xc4, 0xcd, 0x33, 0x1e, 0xca,
+	0xf4, 0xad, 0x1a, 0x20, 0x64, 0x43, 0x7e, 0xc8, 0xc3, 0x88, 0xfc, 0x08, 0x48, 0x40, 0x27, 0x56,
+	0x70, 0xae, 0xb8, 0xe4, 0x7c, 0x94, 0x11, 0xd7, 0x91, 0x1a, 0x64, 0x93, 0x33, 0x93, 0xa2, 0x99,
+	0xe7, 0x25, 0xe8, 0xa5, 0x2c, 0xba, 0x2f, 0x14, 0x12, 0xad, 0x62, 0x91, 0x50, 0xd1, 0xc9, 0x4a,
+	0x12, 0x0b, 0xa2, 0xf2, 0xb1, 0xa4, 0x30, 0x2d, 0x1b, 0x4b, 0x82, 0xdc, 0x81, 0x95, 0x28, 0xb0,
+	0xbc, 0xd0, 0xb5, 0xa2, 0x2c, 0xb8, 0x8a, 0xe0, 0xe5, 0x44, 0x35, 0x1f, 0x9f, 0x0e, 0x54, 0x6d,
+	0x06, 0x1f, 0x8f, 0x95, 0xfe, 0x9b, 0x12, 0x54, 0xe4, 0x3c, 0x90, 0x27, 0xb0, 0x68, 0x4f, 0xe2,
+	0x6f, 0x65, 0x24, 0xfd, 0xfc, 0x16, 0xcf, 0x92, 0x21, 0xd4, 0xf3, 0x57, 0x46, 0x26, 0xdb, 0x17,
+	0x73, 0xd9, 0x9e, 0x2e, 0xaf, 0xf2, 0xcc, 0xf2, 0x92, 0x4b, 0x66, 0x29, 0xbf, 0x64, 0xe6, 0xaf,
+	0x8c, 0x74, 0xdd, 0x69, 0x99, 0x75, 0xa7, 0xff, 0x66, 0x11, 0xca, 0x2f, 0x5c, 0x7e, 0x89, 0x07,
+	0xa1, 0x6d, 0xd3, 0x50, 0x5c, 0xf2, 0xd3, 0xca, 0xa4, 0x6d, 0x34, 0xa4, 0xb4, 0x3f, 0xaf, 0x52,
+	0x6a, 0xc7, 0x95, 0xd2, 0x2a, 0x54, 0xa6, 0x1e, 0x13, 0xe2, 0xba, 0x14, 0x4f, 0x3d, 0x76, 0x53,
+	0x45, 0xbc, 0x09, 0x78, 0x4c, 0xc9, 0xbc, 0x96, 0x55, 0x46, 0x55, 0x08, 0x70, 0xa1, 0xae, 0x43,
+	0x35, 0x3e, 0x6c, 0x71, 0xd9, 0xb5, 0x0d, 0x4d, 0x1d, 0xb4, 0xe4, 0x07, 0xd0, 0xf6, 0x68, 0x74,
+	0xc9, 0x31, 0x8b, 0x64, 0x2f, 0x97, 0x10, 0xd1, 0x54, 0xe2, 0xfe, 0xbc, 0x4a, 0xbd, 0x82, 0x90,
+	0x4c, 0x81, 0xf6, 0x39, 0x80, 0x9d, 0xec, 0x5e, 0xea, 0xfb, 0xd7, 0x4a, 0x32, 0x57, 0xe9, 0xc6,
+	0x66, 0x64, 0x60, 0xe4, 0x63, 0xa8, 0x58, 0x38, 0x8b, 0xea, 0xbb, 0x56, 0x7b, 0x66, 0x72, 0x0d,
+	0xa5, 0x26, 0x1b, 0x50, 0xf5, 0x03, 0xc6, 0x03, 0x16, 0x5d, 0x61, 0xca, 0xb4, 0x8d, 0xa4, 0x9d,
+	0xa9, 0xf8, 0x1b, 0xb9, 0x8a, 0x3f, 0x53, 0x6a, 0x36, 0x73, 0xa5, 0xe6, 0x3a, 0x54, 0xc7, 0x01,
+	0x9f, 0xfa, 0x22, 0x0e, 0xb5, 0x3f, 0x60, 0xbb, 0xef, 0xe8, 0x43, 0x68, 0xcc, 0xd6, 0x51, 0xb2,
+	0x18, 0x8c, 0x27, 0xaf, 0x61, 0x54, 0xa5, 0xa0, 0xef, 0x90, 0x8f, 0xa1, 0xad, 0x94, 0xa1, 0x4f,
+	0x6d, 0x36, 0x62, 0xb6, 0x2a, 0x32, 0x5b, 0x52, 0x7c, 0xa2, 0xa4, 0xfa, 0xbf, 0x95, 0xa1, 0x95,
+	0xff, 0x3e, 0x7d, 0x7d, 0xb5, 0xba, 0x0e, 0xd5, 0xe0, 0x9d, 0x79, 0x7a, 0x15, 0xd1, 0x10, 0xd9,
+	0x2a, 0x86, 0x16, 0xbc, 0xdb, 0x17, 0x4d, 0x31, 0x03, 0xc1, 0x3b, 0xd3, 0xc7, 0x72, 0x57, 0xe6,
+	0x73, 0xc5, 0xa8, 0x05, 0xef, 0x64, 0xfd, 0x1b, 0xe2, 0xda, 0x7d, 0x67, 0x4e, 0x6d, 0x4b, 0xec,
+	0x7d, 0x0a, 0x54, 0x46, 0x50, 0x2b, 0x78, 0xf7, 0x46, 0x88, 0xf3, 0xc8, 0x49, 0x0e, 0xb9, 0x14,
+	0x23, 0x8f, 0x8a, 0xc8, 0xd3, 0x1c, 0xb2, 0x12, 0x23, 0xf7, 0x8b, 0x48, 0xf9, 0xd1, 0x24, 0x46,
+	0x6a, 0x31, 0x12, 0x3f, 0x7b, 0xc4, 0xc8, 0x75, 0xa8, 0x46, 0x71, 0x84, 0x55, 0x19, 0x61, 0x94,
+	0x46, 0x18, 0xa5, 0x11, 0xd6, 0x64, 0x84, 0x51, 0x36, 0xc2, 0x68, 0x36, 0x42, 0x90, 0x3e, 0xa2,
+	0x42, 0x84, 0xd1, 0x6c, 0x84, 0xf5, 0x18, 0x79, 0x54, 0x44, 0xe6, 0x23, 0x6c, 0xc4, 0xc8, 0xfd,
+	0x22, 0x32, 0x1f, 0x61, 0x33, 0x46, 0xe6, 0x22, 0xd4, 0xa1, 0x19, 0xbc, 0x33, 0xed, 0xc0, 0x96,
+	0xe8, 0x10, 0xb3, 0xac, 0x62, 0xd4, 0x83, 0x77, 0x07, 0x81, 0x8d, 0x48, 0x0c, 0xf5, 0x94, 0xf9,
+	0x31, 0xa0, 0x2d, 0x43, 0x3d, 0x65, 0xbe, 0x52, 0x6f, 0x41, 0x2d, 0x62, 0x13, 0x1a, 0x46, 0xd6,
+	0xc4, 0xc7, 0xfb, 0x80, 0x66, 0xa4, 0x02, 0xfd, 0xb7, 0x25, 0x68, 0xe5, 0x9f, 0x2d, 0xb2, 0xfb,
+	0x42, 0x29, 0xb7, 0x2f, 0x7c, 0xf7, 0x84, 0xfa, 0xee, 0x13, 0x75, 0x73, 0xef, 0xbf, 0x84, 0x66,
+	0xee, 0x9d, 0xe3, 0xfa, 0xc5, 0xf0, 0x00, 0x2a, 0x61, 0x64, 0x45, 0xd3, 0x50, 0xd5, 0xbc, 0xaa,
+	0xa5, 0x7f, 0x03, 0x2b, 0x73, 0xde, 0x3b, 0x6e, 0x7d, 0x19, 0x4d, 0xe9, 0x17, 0x73, 0xf4, 0xff,
+	0xbc, 0x00, 0xa4, 0xf8, 0x14, 0xf2, 0x5d, 0x3e, 0x2c, 0xb9, 0x3c, 0x34, 0x73, 0x2e, 0x6a, 0x2e,
+	0x0f, 0x4f, 0x50, 0x20, 0xd5, 0xa7, 0xb1, 0xba, 0x1c, 0xab, 0x4f, 0x95, 0xfa, 0x29, 0x74, 0x5c,
+	0xee, 0xdb, 0xe6, 0x84, 0x85, 0x09, 0x87, 0xbc, 0xab, 0xb5, 0x84, 0xfc, 0x88, 0x85, 0x31, 0xd1,
+	0x33, 0x58, 0x55, 0x48, 0x95, 0x70, 0x31, 0xbc, 0x22, 0xef, 0x87, 0x12, 0x2e, 0x13, 0x4f, 0x99,
+	0x3c, 0x86, 0xba, 0xcb, 0x47, 0x2c, 0x06, 0x6a, 0xb2, 0x0c, 0x12, 0x22, 0x05, 0xf8, 0x08, 0x1a,
+	0x2e, 0xb7, 0x26, 0x09, 0xa2, 0x8a, 0x88, 0x3a, 0xca, 0x24, 0x44, 0xa7, 0xb0, 0x79, 0xc3, 0x2b,
+	0xcf, 0x9d, 0x4d, 0xc6, 0xdf, 0x97, 0x60, 0xe3, 0xfa, 0x27, 0x9f, 0xbb, 0x72, 0x43, 0x3e, 0x87,
+	0x07, 0xcc, 0x13, 0x97, 0x74, 0x6a, 0x9e, 0xb2, 0xf8, 0xeb, 0x6f, 0x60, 0x45, 0x54, 0x15, 0x08,
+	0x2b, 0x4a, 0xbb, 0xcf, 0xe4, 0x47, 0x5c, 0xc3, 0x8a, 0xa8, 0xfe, 0x6b, 0xd9, 0xb7, 0x6b, 0x5e,
+	0x8c, 0xee, 0xac, 0x6f, 0xf7, 0x61, 0x09, 0xdf, 0xae, 0xe2, 0x5a, 0x05, 0x1b, 0x82, 0xdd, 0xa3,
+	0x97, 0x26, 0xfd, 0x36, 0xae, 0x56, 0x2a, 0x1e, 0xbd, 0xec, 0x7d, 0xeb, 0xe8, 0x67, 0xf0, 0xe8,
+	0xe6, 0xf7, 0xa6, 0x3b, 0x9b, 0x9b, 0x7f, 0x28, 0xc9, 0x1c, 0xb8, 0xe6, 0x05, 0xea, 0xff, 0x77,
+	0x72, 0x7e, 0x59, 0x02, 0xfd, 0xfd, 0xaf, 0x59, 0xff, 0xb7, 0x93, 0xa4, 0x7f, 0x8b, 0x73, 0x71,
+	0xc3, 0xab, 0xd7, 0xad, 0xfd, 0x3f, 0x86, 0x3a, 0x3e, 0x4d, 0x05, 0xd4, 0x0a, 0xd5, 0xa7, 0x27,
+	0xcd, 0x00, 0x21, 0x32, 0x50, 0xa2, 0x9f, 0xc3, 0x47, 0xef, 0x7d, 0xa2, 0xba, 0xb3, 0x0c, 0x60,
+	0xb0, 0x76, 0xdd, 0x63, 0xd5, 0x77, 0xd9, 0x2f, 0x03, 0x87, 0xc5, 0x47, 0xa2, 0x0c, 0xac, 0x16,
+	0x38, 0x4c, 0x1e, 0x89, 0xfa, 0x6b, 0xd8, 0xba, 0xe9, 0x75, 0xef, 0xb6, 0xee, 0xf4, 0x10, 0xb6,
+	0xdf, 0xf7, 0x12, 0x76, 0xf7, 0x93, 0xf3, 0x97, 0xb0, 0x7e, 0xed, 0xbb, 0xd8, 0x5d, 0x0f, 0xd8,
+	0x3f, 0x96, 0xe0, 0xe9, 0x87, 0x3e, 0x92, 0xdd, 0xd9, 0x32, 0xf8, 0x14, 0x48, 0xf6, 0xe1, 0x4e,
+	0xf5, 0x4d, 0xae, 0x89, 0xe5, 0x8c, 0x46, 0xf5, 0x71, 0x02, 0xdf, 0xff, 0x80, 0xe7, 0xb4, 0x3b,
+	0x4b, 0x57, 0x17, 0xb7, 0x84, 0xf7, 0x3c, 0xa9, 0xdd, 0x99, 0xb7, 0xff, 0x2c, 0x41, 0xfd, 0xa5,
+	0xb8, 0x59, 0x1c, 0x51, 0xbc, 0x4d, 0x7c, 0x04, 0x0d, 0x16, 0xbf, 0x38, 0xc4, 0xe4, 0x4d, 0xfc,
+	0x0d, 0x8f, 0x94, 0xf5, 0x1d, 0xd2, 0x87, 0x56, 0x0a, 0xc1, 0xab, 0x9c, 0xfc, 0x6c, 0x96, 0x3e,
+	0xab, 0x66, 0x08, 0x77, 0x92, 0xf7, 0x0b, 0xfc, 0x3e, 0xd6, 0x64, 0xd9, 0x26, 0x79, 0x04, 0xf5,
+	0x31, 0x9d, 0x98, 0xf1, 0x8d, 0x6d, 0x11, 0x9d, 0x89, 0x1b, 0xdb, 0xb1, 0xbc, 0xb1, 0x65, 0xef,
+	0x54, 0x65, 0x54, 0x26, 0x6d, 0xfd, 0x8f, 0xa0, 0x99, 0xe3, 0x26, 0x1a, 0x2c, 0x1e, 0x0f, 0x5e,
+	0x77, 0xee, 0x91, 0x0e, 0x34, 0x7a, 0xc7, 0x83, 0xd7, 0xe6, 0xb3, 0x97, 0xe6, 0xf1, 0xde, 0xf0,
+	0xb0, 0x53, 0x22, 0xcb, 0xd0, 0x94, 0x92, 0xcf, 0x94, 0x68, 0x41, 0xff, 0x9b, 0x05, 0x58, 0xc2,
+	0x7e, 0xe6, 0xee, 0x5a, 0x32, 0xdc, 0xf8, 0xae, 0x45, 0x7e, 0x0a, 0x9a, 0xcd, 0x27, 0x13, 0x4b,
+	0xfd, 0x98, 0xa5, 0x10, 0x63, 0x36, 0xd2, 0xf0, 0x40, 0x22, 0x8d, 0xd8, 0x84, 0xec, 0x80, 0x36,
+	0x91, 0x2a, 0xf5, 0xd1, 0xf3, 0xfe, 0xbc, 0x11, 0x32, 0x62, 0x50, 0xe6, 0xaa, 0x59, 0xbe, 0xf1,
+	0xaa, 0xa9, 0x7f, 0x05, 0x2b, 0x73, 0x1c, 0x93, 0x36, 0xd4, 0xf7, 0xba, 0x5d, 0xf3, 0xa8, 0x77,
+	0xb4, 0xdf, 0x33, 0x4e, 0x3a, 0xf7, 0x08, 0x81, 0x96, 0xd1, 0x3b, 0x1a, 0x7c, 0xdd, 0x4b, 0x64,
+	0x25, 0x01, 0x3a, 0xe9, 0x0d, 0x13, 0xc1, 0x82, 0xae, 0xc1, 0x52, 0x6f, 0xe2, 0x47, 0x57, 0xcf,
+	0xff, 0xa9, 0x05, 0xda, 0x40, 0x3a, 0x24, 0x5d, 0x80, 0x2e, 0x0b, 0xad, 0x53, 0x97, 0x0e, 0xdc,
+	0x88, 0xb4, 0x92, 0x8e, 0x20, 0x72, 0x63, 0xa6, 0xad, 0x3f, 0xf8, 0xe5, 0xbf, 0xff, 0xc7, 0xaf,
+	0x17, 0x3a, 0x7a, 0x7d, 0xf7, 0xe2, 0xd9, 0xae, 0xb2, 0xfb, 0xa2, 0xf4, 0x09, 0x79, 0x01, 0x75,
+	0x83, 0x52, 0xef, 0x43, 0x69, 0x1e, 0x22, 0xcd, 0xb2, 0xde, 0x10, 0x34, 0xb1, 0xa1, 0xe0, 0xe9,
+	0x41, 0x5d, 0x1d, 0x4f, 0x74, 0xe0, 0x4d, 0x49, 0x23, 0xfb, 0xf6, 0x5c, 0x60, 0x59, 0x43, 0x16,
+	0xa2, 0x37, 0x05, 0x4b, 0x4f, 0x3a, 0xf7, 0xa6, 0x82, 0xe6, 0x10, 0x9a, 0xc9, 0x56, 0xfa, 0x01,
+	0x44, 0xeb, 0x48, 0xb4, 0xa2, 0xb7, 0x32, 0x51, 0x29, 0xa6, 0x03, 0xa8, 0x75, 0xa9, 0x4b, 0x6f,
+	0xdd, 0x9d, 0xc4, 0x48, 0x90, 0xf4, 0x01, 0xd4, 0x93, 0xd7, 0x60, 0x1a, 0x91, 0x4e, 0xee, 0x47,
+	0x69, 0x47, 0xe1, 0xf8, 0xe6, 0xfe, 0xa4, 0x96, 0x82, 0x6a, 0x00, 0x8d, 0xe4, 0xbd, 0x4b, 0x90,
+	0x91, 0xdc, 0x0f, 0x01, 0x50, 0x5c, 0xa0, 0xdb, 0x44, 0xba, 0x55, 0xbd, 0x83, 0x74, 0x19, 0x6b,
+	0x41, 0xf8, 0xe7, 0xd0, 0xce, 0xbe, 0x5c, 0x09, 0xce, 0xf4, 0x61, 0x2f, 0xab, 0x29, 0xd0, 0x3e,
+	0x42, 0xda, 0x35, 0x7d, 0x45, 0xd0, 0xce, 0x70, 0x08, 0xe6, 0x2f, 0x41, 0x13, 0xd7, 0xc2, 0x3d,
+	0xc7, 0x21, 0xcd, 0xdc, 0xef, 0xdb, 0x6e, 0xce, 0x2a, 0x65, 0x23, 0xb3, 0x0a, 0x44, 0xcb, 0xc0,
+	0x8f, 0x7d, 0xef, 0x23, 0xc9, 0x0d, 0x5a, 0x6a, 0x26, 0x78, 0x4e, 0xa0, 0x95, 0x3c, 0x9b, 0x1e,
+	0x9c, 0x51, 0xfb, 0xbc, 0x90, 0xa0, 0xe9, 0x30, 0x26, 0x40, 0xfd, 0x7b, 0x48, 0xf8, 0x50, 0x27,
+	0x82, 0x30, 0x6f, 0x2f, 0x48, 0x8f, 0xa0, 0x2e, 0x73, 0xee, 0x98, 0x7b, 0xfd, 0x51, 0x66, 0x22,
+	0x92, 0xbd, 0xaa, 0xd0, 0xc5, 0x0d, 0x64, 0xbc, 0xaf, 0xb7, 0xd3, 0x84, 0x45, 0x63, 0x35, 0xb1,
+	0x2a, 0xf3, 0x3e, 0x9c, 0x2f, 0x37, 0xb1, 0x59, 0x6b, 0x41, 0x68, 0x40, 0xf3, 0x25, 0x8d, 0x32,
+	0x2f, 0x8b, 0xb3, 0x31, 0xaf, 0xcc, 0x79, 0xfc, 0xd0, 0xb7, 0x90, 0xf2, 0x81, 0xbe, 0x2c, 0x28,
+	0x73, 0xf6, 0x82, 0xf3, 0x4f, 0xa0, 0x62, 0xd0, 0x53, 0xce, 0xdf, 0xbf, 0xc2, 0x57, 0x91, 0xa7,
+	0xad, 0x83, 0x5c, 0xe1, 0xc2, 0x46, 0x10, 0xbc, 0x81, 0xe5, 0x03, 0xee, 0xba, 0xd4, 0xce, 0x7e,
+	0x7e, 0x7a, 0x1f, 0xd7, 0x36, 0x72, 0x6d, 0xe8, 0xab, 0x82, 0xab, 0x60, 0x2e, 0x68, 0x03, 0x78,
+	0x78, 0x10, 0x50, 0x2b, 0xa2, 0xc3, 0xc0, 0x1a, 0x8d, 0x98, 0x7d, 0x62, 0x9f, 0x51, 0x67, 0xea,
+	0x8a, 0xad, 0xf6, 0xf1, 0x4e, 0xee, 0x77, 0xb5, 0x05, 0x40, 0xc1, 0xdb, 0x0f, 0xd0, 0xdb, 0xb6,
+	0xbe, 0x89, 0xde, 0xe6, 0xb3, 0x2a, 0x9f, 0x32, 0xc3, 0xee, 0xda, 0xe7, 0x35, 0xac, 0xc2, 0xe7,
+	0x08, 0x56, 0x72, 0x3d, 0xfa, 0xb3, 0x29, 0x9d, 0xd2, 0x90, 0x6c, 0xce, 0xf5, 0x27, 0x95, 0x05,
+	0x5f, 0x3a, 0xfa, 0xda, 0xd2, 0x1f, 0x16, 0xe2, 0x93, 0x06, 0xca, 0x4f, 0xae, 0x17, 0xff, 0x6b,
+	0x3f, 0x73, 0xd8, 0x84, 0x9f, 0x3f, 0x84, 0x8e, 0x5c, 0x06, 0x99, 0x7a, 0xe7, 0xfa, 0x34, 0x4d,
+	0x41, 0xfa, 0xbd, 0xcf, 0x4a, 0xe4, 0x1b, 0x58, 0x3d, 0xa6, 0xc1, 0x88, 0x07, 0x13, 0x3c, 0x22,
+	0x07, 0x3e, 0x0d, 0x66, 0x19, 0x50, 0x51, 0xe8, 0xd9, 0x13, 0xec, 0xd9, 0x23, 0x7d, 0x5d, 0xf4,
+	0x6c, 0x2e, 0xc5, 0x17, 0xa5, 0x4f, 0xf6, 0xbf, 0x81, 0x4d, 0x1e, 0x8c, 0xd1, 0xd4, 0xe6, 0x81,
+	0xb3, 0x23, 0x7f, 0xac, 0x1d, 0x53, 0xed, 0x37, 0xbf, 0xc6, 0xb6, 0x38, 0x46, 0x07, 0xaf, 0x86,
+	0x3f, 0xdb, 0x1d, 0xb3, 0xe8, 0x6c, 0x7a, 0xba, 0x63, 0xf3, 0xc9, 0x6e, 0x6c, 0xb2, 0x2b, 0x4d,
+	0x3e, 0x55, 0xbf, 0xef, 0xbe, 0xf8, 0x7c, 0x77, 0xcc, 0xe3, 0x5f, 0x8a, 0x1f, 0x97, 0x4e, 0x2b,
+	0x28, 0xff, 0xfc, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x02, 0x2e, 0x0d, 0xf1, 0x4b, 0x2e, 0x00,
+	0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
diff --git a/vendor/github.com/opencord/voltha-protos/v3/go/voltha/adapter.pb.go b/vendor/github.com/opencord/voltha-protos/v3/go/voltha/adapter.pb.go
index 1f24221..9359dc1 100644
--- a/vendor/github.com/opencord/voltha-protos/v3/go/voltha/adapter.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/v3/go/voltha/adapter.pb.go
@@ -8,7 +8,7 @@
 	proto "github.com/golang/protobuf/proto"
 	any "github.com/golang/protobuf/ptypes/any"
 	timestamp "github.com/golang/protobuf/ptypes/timestamp"
-	common "github.com/opencord/voltha-protos/v3/go/common"
+	_ "github.com/opencord/voltha-protos/v3/go/common"
 	math "math"
 )
 
@@ -24,8 +24,6 @@
 const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 
 type AdapterConfig struct {
-	// Common adapter config attributes here
-	LogLevel common.LogLevel_Types `protobuf:"varint,1,opt,name=log_level,json=logLevel,proto3,enum=common.LogLevel_Types" json:"log_level,omitempty"`
 	// Custom (vendor-specific) configuration attributes
 	AdditionalConfig     *any.Any `protobuf:"bytes,64,opt,name=additional_config,json=additionalConfig,proto3" json:"additional_config,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -58,13 +56,6 @@
 
 var xxx_messageInfo_AdapterConfig proto.InternalMessageInfo
 
-func (m *AdapterConfig) GetLogLevel() common.LogLevel_Types {
-	if m != nil {
-		return m.LogLevel
-	}
-	return common.LogLevel_DEBUG
-}
-
 func (m *AdapterConfig) GetAdditionalConfig() *any.Any {
 	if m != nil {
 		return m.AdditionalConfig
@@ -74,8 +65,8 @@
 
 // Adapter (software plugin)
 type Adapter struct {
-	// Unique name of adapter, matching the python package name under
-	// voltha/adapters.
+	// the adapter ID has to be unique,
+	// it will be generated as Type + CurrentReplica
 	Id      string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 	Vendor  string `protobuf:"bytes,2,opt,name=vendor,proto3" json:"vendor,omitempty"`
 	Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
@@ -85,10 +76,16 @@
 	AdditionalDescription *any.Any `protobuf:"bytes,64,opt,name=additional_description,json=additionalDescription,proto3" json:"additional_description,omitempty"`
 	LogicalDeviceIds      []string `protobuf:"bytes,4,rep,name=logical_device_ids,json=logicalDeviceIds,proto3" json:"logical_device_ids,omitempty"`
 	// timestamp when the adapter last sent a message to the core
-	LastCommunication    *timestamp.Timestamp `protobuf:"bytes,5,opt,name=last_communication,json=lastCommunication,proto3" json:"last_communication,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+	LastCommunication *timestamp.Timestamp `protobuf:"bytes,5,opt,name=last_communication,json=lastCommunication,proto3" json:"last_communication,omitempty"`
+	CurrentReplica    int32                `protobuf:"varint,6,opt,name=currentReplica,proto3" json:"currentReplica,omitempty"`
+	TotalReplicas     int32                `protobuf:"varint,7,opt,name=totalReplicas,proto3" json:"totalReplicas,omitempty"`
+	Endpoint          string               `protobuf:"bytes,8,opt,name=endpoint,proto3" json:"endpoint,omitempty"`
+	// all replicas of the same adapter will have the same type
+	// it is used to associate a device to an adapter
+	Type                 string   `protobuf:"bytes,9,opt,name=type,proto3" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
 }
 
 func (m *Adapter) Reset()         { *m = Adapter{} }
@@ -165,6 +162,34 @@
 	return nil
 }
 
+func (m *Adapter) GetCurrentReplica() int32 {
+	if m != nil {
+		return m.CurrentReplica
+	}
+	return 0
+}
+
+func (m *Adapter) GetTotalReplicas() int32 {
+	if m != nil {
+		return m.TotalReplicas
+	}
+	return 0
+}
+
+func (m *Adapter) GetEndpoint() string {
+	if m != nil {
+		return m.Endpoint
+	}
+	return ""
+}
+
+func (m *Adapter) GetType() string {
+	if m != nil {
+		return m.Type
+	}
+	return ""
+}
+
 type Adapters struct {
 	Items                []*Adapter `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
@@ -213,33 +238,34 @@
 func init() { proto.RegisterFile("voltha_protos/adapter.proto", fileDescriptor_7e998ce153307274) }
 
 var fileDescriptor_7e998ce153307274 = []byte{
-	// 439 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0xdd, 0x6a, 0xdb, 0x30,
-	0x14, 0xc6, 0xc9, 0x92, 0x36, 0x2a, 0xdd, 0x52, 0x6d, 0x29, 0x5e, 0x46, 0x69, 0x08, 0x0c, 0x72,
-	0xb1, 0xca, 0x2c, 0x79, 0x81, 0x25, 0xed, 0x4d, 0xa1, 0x57, 0x26, 0xec, 0x62, 0x37, 0x46, 0xb1,
-	0x54, 0x55, 0x20, 0xeb, 0x18, 0x4b, 0x31, 0xe4, 0x09, 0xf6, 0x74, 0x7b, 0x83, 0x3d, 0xc0, 0x9e,
-	0x60, 0xd7, 0xc3, 0x92, 0x4c, 0x7e, 0x06, 0xbd, 0x32, 0xe7, 0xfb, 0xbe, 0x73, 0xbe, 0xef, 0x1c,
-	0x0b, 0x7d, 0xaa, 0x41, 0xd9, 0x17, 0x9a, 0x95, 0x15, 0x58, 0x30, 0x09, 0x65, 0xb4, 0xb4, 0xbc,
-	0x22, 0xae, 0xc4, 0x7d, 0x4f, 0x8e, 0x3f, 0x0a, 0x00, 0xa1, 0x78, 0xe2, 0xd0, 0xcd, 0xf6, 0x39,
-	0xa1, 0x7a, 0xe7, 0x25, 0xe3, 0xf1, 0x71, 0x7f, 0x0e, 0x45, 0x01, 0x3a, 0x70, 0xf1, 0x31, 0x57,
-	0x70, 0x4b, 0x03, 0x73, 0x7b, 0x3a, 0xd0, 0xca, 0x82, 0x1b, 0x4b, 0x8b, 0xd2, 0x0b, 0xa6, 0x3f,
-	0x23, 0x74, 0xb9, 0xf4, 0x59, 0xee, 0x41, 0x3f, 0x4b, 0x81, 0x17, 0x68, 0xa0, 0x40, 0x64, 0x8a,
-	0xd7, 0x5c, 0xc5, 0xd1, 0x24, 0x9a, 0xbd, 0x9d, 0x5f, 0x93, 0x60, 0xf7, 0x04, 0xe2, 0xa9, 0xc1,
-	0xc9, 0x7a, 0x57, 0x72, 0x93, 0x9e, 0xab, 0x50, 0xe3, 0x25, 0xba, 0xa2, 0x8c, 0x49, 0x2b, 0x41,
-	0x53, 0x95, 0xe5, 0x6e, 0x52, 0xfc, 0x6d, 0x12, 0xcd, 0x2e, 0xe6, 0x1f, 0x88, 0xcf, 0x40, 0xda,
-	0x0c, 0x64, 0xa9, 0x77, 0xe9, 0x70, 0x2f, 0xf7, 0xbe, 0xd3, 0xdf, 0x1d, 0x74, 0x16, 0x92, 0xe0,
-	0x11, 0xea, 0x48, 0xe6, 0xcc, 0x07, 0xab, 0xde, 0x9f, 0xbf, 0xbf, 0x6e, 0xa2, 0xb4, 0x23, 0x19,
-	0xbe, 0x41, 0xfd, 0x9a, 0x6b, 0x06, 0x55, 0xdc, 0x39, 0xa4, 0x02, 0x88, 0x6f, 0xd1, 0x59, 0xcd,
-	0x2b, 0x23, 0x41, 0xc7, 0xdd, 0x43, 0xbe, 0x45, 0xf1, 0x1d, 0xea, 0x87, 0x68, 0x43, 0x17, 0x6d,
-	0x44, 0xfc, 0xe1, 0xc8, 0xd1, 0x05, 0xd2, 0x20, 0xc2, 0x29, 0xba, 0x3e, 0x58, 0x8a, 0x71, 0x93,
-	0x57, 0xb2, 0x6c, 0xaa, 0xd7, 0x36, 0x6b, 0x4d, 0x47, 0xfb, 0xd6, 0x87, 0x7d, 0x27, 0xfe, 0x82,
-	0xb0, 0x02, 0x21, 0x73, 0x37, 0xb0, 0x96, 0x39, 0xcf, 0x24, 0x33, 0xf1, 0x9b, 0x49, 0x77, 0x36,
-	0x48, 0x87, 0x81, 0x79, 0x70, 0xc4, 0x23, 0x33, 0xf8, 0x11, 0x61, 0x45, 0x8d, 0xcd, 0x9a, 0xf3,
-	0x6f, 0xb5, 0xcc, 0xa9, 0x73, 0xef, 0x39, 0xf7, 0xf1, 0x7f, 0xee, 0xeb, 0xf6, 0xdf, 0xa6, 0x57,
-	0x4d, 0xd7, 0xfd, 0x61, 0xd3, 0xf4, 0x2b, 0x3a, 0x0f, 0x5b, 0x1a, 0xfc, 0x19, 0xf5, 0xa4, 0xe5,
-	0x85, 0x89, 0xa3, 0x49, 0x77, 0x76, 0x31, 0x7f, 0x77, 0x72, 0x86, 0xd4, 0xb3, 0xab, 0x35, 0x7a,
-	0x0f, 0x95, 0x20, 0x50, 0x72, 0x9d, 0x43, 0xc5, 0x82, 0x6a, 0x75, 0xf9, 0xdd, 0x7d, 0x83, 0xf8,
-	0x07, 0x11, 0xd2, 0xbe, 0x6c, 0x37, 0xcd, 0x13, 0x49, 0x5a, 0x69, 0xe2, 0xa5, 0x77, 0xe1, 0x41,
-	0xd6, 0x8b, 0x44, 0x40, 0xc0, 0x36, 0x7d, 0x07, 0x2e, 0xfe, 0x05, 0x00, 0x00, 0xff, 0xff, 0x4d,
-	0xb1, 0x4a, 0xa8, 0x11, 0x03, 0x00, 0x00,
+	// 463 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0xdd, 0x6e, 0xd3, 0x30,
+	0x14, 0x56, 0xda, 0x35, 0x6d, 0x3d, 0x15, 0x3a, 0x43, 0x91, 0x09, 0x9a, 0x16, 0x55, 0x80, 0x72,
+	0xc1, 0x12, 0xb1, 0xbd, 0x00, 0xed, 0x76, 0xb3, 0x5b, 0x6b, 0xe2, 0x82, 0x9b, 0xca, 0xb5, 0xbd,
+	0xcc, 0x52, 0xe2, 0x13, 0xc5, 0x6e, 0xa4, 0x3e, 0x24, 0x2f, 0xc0, 0x13, 0xf0, 0x04, 0x5c, 0xa3,
+	0x3a, 0x0e, 0xfd, 0x41, 0xda, 0x55, 0x72, 0xbe, 0xef, 0x3b, 0xdf, 0xf9, 0x33, 0xfa, 0xd0, 0x40,
+	0x61, 0x9f, 0xd9, 0xaa, 0xaa, 0xc1, 0x82, 0xc9, 0x98, 0x60, 0x95, 0x95, 0x75, 0xea, 0x42, 0x1c,
+	0xb6, 0x64, 0xf4, 0x3e, 0x07, 0xc8, 0x0b, 0x99, 0x39, 0x74, 0xbd, 0x79, 0xca, 0x98, 0xde, 0xb6,
+	0x92, 0x28, 0x3a, 0xce, 0xe7, 0x50, 0x96, 0xa0, 0x3d, 0x47, 0x8e, 0xb9, 0x52, 0x5a, 0xe6, 0x99,
+	0xab, 0x53, 0x43, 0xab, 0x4a, 0x69, 0x2c, 0x2b, 0xab, 0x56, 0x30, 0xa7, 0x68, 0xb2, 0x68, 0x5b,
+	0xb9, 0x03, 0xfd, 0xa4, 0x72, 0xbc, 0x40, 0x17, 0x4c, 0x08, 0x65, 0x15, 0x68, 0x56, 0xac, 0xb8,
+	0x03, 0xc9, 0xb7, 0x38, 0x48, 0xce, 0x6f, 0xde, 0xa6, 0xad, 0x5b, 0xda, 0xb9, 0xa5, 0x0b, 0xbd,
+	0xa5, 0xd3, 0xbd, 0xbc, 0xb5, 0x98, 0xff, 0xea, 0xa3, 0xa1, 0x37, 0xc5, 0x33, 0xd4, 0x53, 0x82,
+	0x04, 0x71, 0x90, 0x8c, 0x97, 0x83, 0xdf, 0x7f, 0x7e, 0x5e, 0x06, 0xb4, 0xa7, 0x04, 0xbe, 0x44,
+	0x61, 0x23, 0xb5, 0x80, 0x9a, 0xf4, 0x0e, 0x29, 0x0f, 0xe2, 0x2b, 0x34, 0x6c, 0x64, 0x6d, 0x14,
+	0x68, 0xd2, 0x3f, 0xe4, 0x3b, 0x14, 0x5f, 0xa3, 0xd0, 0xb7, 0x36, 0x75, 0xad, 0xcd, 0xd2, 0x76,
+	0x05, 0xe9, 0xd1, 0x30, 0xd4, 0x8b, 0x30, 0x45, 0xef, 0x0e, 0x86, 0x12, 0xd2, 0xf0, 0x5a, 0x55,
+	0xbb, 0xe8, 0xa5, 0xc9, 0xba, 0xa2, 0xb3, 0x7d, 0xea, 0xfd, 0x3e, 0x13, 0x7f, 0x41, 0xb8, 0x80,
+	0x5c, 0x71, 0x67, 0xd8, 0x28, 0x2e, 0x57, 0x4a, 0x18, 0x72, 0x16, 0xf7, 0x93, 0x31, 0x9d, 0x7a,
+	0xe6, 0xde, 0x11, 0x0f, 0xc2, 0xe0, 0x07, 0x84, 0x0b, 0x66, 0xec, 0x6a, 0x77, 0xb7, 0x8d, 0x56,
+	0x9c, 0xb9, 0xea, 0x03, 0x57, 0x3d, 0xfa, 0xaf, 0xfa, 0x63, 0x77, 0x25, 0x7a, 0xb1, 0xcb, 0xba,
+	0x3b, 0x4c, 0xc2, 0x9f, 0xd1, 0x2b, 0xbe, 0xa9, 0x6b, 0xa9, 0x2d, 0x95, 0x55, 0xa1, 0x38, 0x23,
+	0x61, 0x1c, 0x24, 0x03, 0x7a, 0x82, 0xe2, 0x8f, 0x68, 0x62, 0xc1, 0xb2, 0xc2, 0xc7, 0x86, 0x0c,
+	0x9d, 0xec, 0x18, 0xc4, 0x11, 0x1a, 0x49, 0x2d, 0x2a, 0x50, 0xda, 0x92, 0xd1, 0x6e, 0xd7, 0xf4,
+	0x5f, 0x8c, 0x31, 0x3a, 0xb3, 0xdb, 0x4a, 0x92, 0xb1, 0xc3, 0xdd, 0xff, 0xfc, 0x2b, 0x1a, 0xf9,
+	0x1d, 0x1b, 0xfc, 0x09, 0x0d, 0x94, 0x95, 0xa5, 0x21, 0x41, 0xdc, 0x4f, 0xce, 0x6f, 0x5e, 0x9f,
+	0x1c, 0x81, 0xb6, 0xec, 0xf2, 0x11, 0xbd, 0x81, 0x3a, 0x4f, 0xa1, 0x92, 0x9a, 0x43, 0x2d, 0xbc,
+	0x6a, 0x39, 0xf9, 0xee, 0xbe, 0x5e, 0xfc, 0x23, 0xcd, 0x95, 0x7d, 0xde, 0xac, 0x53, 0x0e, 0x65,
+	0xd6, 0x49, 0xb3, 0x56, 0x7a, 0xed, 0x1f, 0x76, 0x73, 0x9b, 0xe5, 0xe0, 0xb1, 0x75, 0xe8, 0xc0,
+	0xdb, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xef, 0x64, 0x5e, 0x10, 0x59, 0x03, 0x00, 0x00,
 }
diff --git a/vendor/github.com/opencord/voltha-protos/v3/go/voltha/events.pb.go b/vendor/github.com/opencord/voltha-protos/v3/go/voltha/events.pb.go
index 7df3e27..fd6eba6 100644
--- a/vendor/github.com/opencord/voltha-protos/v3/go/voltha/events.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/v3/go/voltha/events.pb.go
@@ -6,6 +6,7 @@
 import (
 	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
 	_ "github.com/opencord/voltha-protos/v3/go/common"
 	_ "google.golang.org/genproto/googleapis/api/annotations"
 	math "math"
@@ -436,6 +437,7 @@
 	SerialNo             string            `protobuf:"bytes,4,opt,name=serial_no,json=serialNo,proto3" json:"serial_no,omitempty"`
 	DeviceId             string            `protobuf:"bytes,5,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
 	Context              map[string]string `protobuf:"bytes,6,rep,name=context,proto3" json:"context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	Uuid                 string            `protobuf:"bytes,7,opt,name=uuid,proto3" json:"uuid,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
 	XXX_unrecognized     []byte            `json:"-"`
 	XXX_sizecache        int32             `json:"-"`
@@ -508,6 +510,13 @@
 	return nil
 }
 
+func (m *MetricMetaData) GetUuid() string {
+	if m != nil {
+		return m.Uuid
+	}
+	return ""
+}
+
 //
 // Struct to convey a dictionary of metric->value pairs. Typically used in
 // pure shared-timestamp or shared-timestamp + shared object prefix situations.
@@ -876,11 +885,13 @@
 	// Overall impact of the alarm on the system
 	Severity AlarmEventSeverity_Types `protobuf:"varint,5,opt,name=severity,proto3,enum=voltha.AlarmEventSeverity_Types" json:"severity,omitempty"`
 	// Timestamp at which the alarm was first raised
-	RaisedTs float32 `protobuf:"fixed32,6,opt,name=raised_ts,json=raisedTs,proto3" json:"raised_ts,omitempty"`
+	// TODO: Is this obsolete? Eventheader already has a raised_ts
+	RaisedTs *timestamp.Timestamp `protobuf:"bytes,6,opt,name=raised_ts,json=raisedTs,proto3" json:"raised_ts,omitempty"`
 	// Timestamp at which the alarm was reported
-	ReportedTs float32 `protobuf:"fixed32,7,opt,name=reported_ts,json=reportedTs,proto3" json:"reported_ts,omitempty"`
+	// TODO: Is this obsolete? Eventheader already has a reported_ts
+	ReportedTs *timestamp.Timestamp `protobuf:"bytes,7,opt,name=reported_ts,json=reportedTs,proto3" json:"reported_ts,omitempty"`
 	// Timestamp at which the alarm has changed since it was raised
-	ChangedTs float32 `protobuf:"fixed32,8,opt,name=changed_ts,json=changedTs,proto3" json:"changed_ts,omitempty"`
+	ChangedTs *timestamp.Timestamp `protobuf:"bytes,8,opt,name=changed_ts,json=changedTs,proto3" json:"changed_ts,omitempty"`
 	// Identifier of the originating resource of the alarm
 	ResourceId string `protobuf:"bytes,9,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"`
 	// Textual explanation of the alarm
@@ -956,25 +967,25 @@
 	return AlarmEventSeverity_INDETERMINATE
 }
 
-func (m *AlarmEvent) GetRaisedTs() float32 {
+func (m *AlarmEvent) GetRaisedTs() *timestamp.Timestamp {
 	if m != nil {
 		return m.RaisedTs
 	}
-	return 0
+	return nil
 }
 
-func (m *AlarmEvent) GetReportedTs() float32 {
+func (m *AlarmEvent) GetReportedTs() *timestamp.Timestamp {
 	if m != nil {
 		return m.ReportedTs
 	}
-	return 0
+	return nil
 }
 
-func (m *AlarmEvent) GetChangedTs() float32 {
+func (m *AlarmEvent) GetChangedTs() *timestamp.Timestamp {
 	if m != nil {
 		return m.ChangedTs
 	}
-	return 0
+	return nil
 }
 
 func (m *AlarmEvent) GetResourceId() string {
@@ -1201,16 +1212,16 @@
 	// the event was first raised from the source entity.
 	// If the source entity doesn't send the raised_ts, this shall be set
 	// to timestamp when the event was received.
-	RaisedTs float32 `protobuf:"fixed32,6,opt,name=raised_ts,json=raisedTs,proto3" json:"raised_ts,omitempty"`
+	RaisedTs *timestamp.Timestamp `protobuf:"bytes,6,opt,name=raised_ts,json=raisedTs,proto3" json:"raised_ts,omitempty"`
 	// Timestamp at which the event was reported.
 	// This represents the UTC time stamp since epoch (in seconds) when the
 	// the event was reported (this time stamp is >= raised_ts).
 	// If the source entity that reported this event doesn't send the
 	// reported_ts, this shall be set to the same value as raised_ts.
-	ReportedTs           float32  `protobuf:"fixed32,7,opt,name=reported_ts,json=reportedTs,proto3" json:"reported_ts,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	ReportedTs           *timestamp.Timestamp `protobuf:"bytes,7,opt,name=reported_ts,json=reportedTs,proto3" json:"reported_ts,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
 }
 
 func (m *EventHeader) Reset()         { *m = EventHeader{} }
@@ -1273,18 +1284,18 @@
 	return ""
 }
 
-func (m *EventHeader) GetRaisedTs() float32 {
+func (m *EventHeader) GetRaisedTs() *timestamp.Timestamp {
 	if m != nil {
 		return m.RaisedTs
 	}
-	return 0
+	return nil
 }
 
-func (m *EventHeader) GetReportedTs() float32 {
+func (m *EventHeader) GetReportedTs() *timestamp.Timestamp {
 	if m != nil {
 		return m.ReportedTs
 	}
-	return 0
+	return nil
 }
 
 //
@@ -1450,89 +1461,92 @@
 func init() { proto.RegisterFile("voltha_protos/events.proto", fileDescriptor_e63e6c07044fd2c4) }
 
 var fileDescriptor_e63e6c07044fd2c4 = []byte{
-	// 1334 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0xdd, 0x72, 0xdb, 0x44,
-	0x14, 0xb6, 0xe4, 0x9f, 0xd8, 0x47, 0x4e, 0xa2, 0x6c, 0x19, 0x30, 0xee, 0x5f, 0x10, 0x43, 0x27,
-	0xd3, 0x0e, 0x36, 0x38, 0xcc, 0x10, 0x02, 0x0c, 0xb8, 0x8e, 0x68, 0xd4, 0xd6, 0x72, 0x90, 0x9d,
-	0x74, 0xe0, 0xc6, 0xb3, 0xb1, 0x36, 0xb6, 0x26, 0xb6, 0xe4, 0x91, 0x36, 0xa6, 0x79, 0x00, 0xae,
-	0xb9, 0xe4, 0x82, 0x07, 0xe0, 0x49, 0x78, 0x0c, 0x5e, 0x80, 0x6b, 0x1e, 0x80, 0xd9, 0x1f, 0x59,
-	0x92, 0xe3, 0xc2, 0x45, 0xa6, 0x5c, 0x79, 0x75, 0xfe, 0xf6, 0x3b, 0xdf, 0x9e, 0x73, 0x76, 0x0d,
-	0xf5, 0x45, 0x30, 0xa5, 0x13, 0x3c, 0x9c, 0x87, 0x01, 0x0d, 0xa2, 0x26, 0x59, 0x10, 0x9f, 0x46,
-	0x0d, 0xfe, 0x85, 0x4a, 0x42, 0x57, 0xaf, 0x65, 0x6d, 0x66, 0x84, 0x62, 0x61, 0x51, 0xbf, 0x37,
-	0x0e, 0x82, 0xf1, 0x94, 0x34, 0xf1, 0xdc, 0x6b, 0x62, 0xdf, 0x0f, 0x28, 0xa6, 0x5e, 0xe0, 0x4b,
-	0x7f, 0xe3, 0x4b, 0xd8, 0xee, 0x04, 0xfe, 0x85, 0x37, 0x36, 0x59, 0xd4, 0xc1, 0xf5, 0x9c, 0x18,
-	0x7b, 0x50, 0x64, 0xbf, 0x11, 0xda, 0x80, 0x3c, 0x76, 0x5d, 0x3d, 0x87, 0x00, 0x4a, 0x21, 0x99,
-	0x05, 0x0b, 0xa2, 0x2b, 0x6c, 0x7d, 0x35, 0x77, 0x31, 0x25, 0xba, 0x6a, 0x4c, 0x40, 0x4b, 0x39,
-	0xa3, 0x4f, 0xa1, 0x40, 0xaf, 0xe7, 0xa4, 0xa6, 0xec, 0x2a, 0x7b, 0x5b, 0xad, 0xfb, 0x0d, 0x01,
-	0xa9, 0xb1, 0x12, 0xbf, 0xc1, 0x83, 0x3b, 0xdc, 0x14, 0x21, 0x28, 0x4c, 0x70, 0x34, 0xa9, 0xa9,
-	0xbb, 0xca, 0x5e, 0xc5, 0xe1, 0x6b, 0x26, 0x73, 0x31, 0xc5, 0xb5, 0xbc, 0x90, 0xb1, 0xb5, 0xf1,
-	0x18, 0xaa, 0x2f, 0xe6, 0x5e, 0x82, 0xb1, 0x1e, 0x63, 0xac, 0x40, 0x31, 0x9a, 0x7a, 0x23, 0xa2,
-	0xe7, 0x50, 0x09, 0x54, 0x1a, 0xe9, 0x8a, 0xf1, 0xab, 0x0a, 0x5b, 0x5d, 0x42, 0x43, 0x6f, 0xd4,
-	0x25, 0x14, 0x1f, 0x61, 0x8a, 0xd1, 0x3b, 0x50, 0xa4, 0x1e, 0x9d, 0x0a, 0x68, 0x15, 0x47, 0x7c,
-	0xa0, 0x2d, 0xe6, 0xc0, 0xb7, 0x56, 0x1c, 0x95, 0x46, 0xe8, 0x31, 0xec, 0x4c, 0x83, 0xb1, 0x37,
-	0xc2, 0xd3, 0xa1, 0x4b, 0x16, 0xde, 0x88, 0x0c, 0x3d, 0x57, 0xa2, 0xd8, 0x96, 0x8a, 0x23, 0x2e,
-	0xb7, 0x5c, 0x74, 0x17, 0x2a, 0x11, 0x09, 0x3d, 0x3c, 0x1d, 0xfa, 0x41, 0xad, 0xc0, 0x6d, 0xca,
-	0x42, 0x60, 0x07, 0x4c, 0x99, 0x04, 0x28, 0x0a, 0xa5, 0x1b, 0x7b, 0x7e, 0x0d, 0x1b, 0xa3, 0xc0,
-	0xa7, 0xe4, 0x35, 0xad, 0x95, 0x76, 0xf3, 0x7b, 0x5a, 0xeb, 0xc3, 0x98, 0xa8, 0x2c, 0x68, 0xc6,
-	0x1b, 0xb3, 0x32, 0x7d, 0x1a, 0x5e, 0x3b, 0xb1, 0x4f, 0xfd, 0x10, 0xaa, 0x69, 0x05, 0xd2, 0x21,
-	0x7f, 0x49, 0xae, 0x65, 0x62, 0x6c, 0xc9, 0x92, 0x5d, 0xe0, 0xe9, 0x15, 0x91, 0xa4, 0x8a, 0x8f,
-	0x43, 0xf5, 0x40, 0x31, 0x7e, 0x51, 0x40, 0x17, 0x9b, 0x9c, 0x31, 0xd9, 0x09, 0xf6, 0xc2, 0x08,
-	0x7d, 0x03, 0x1b, 0x33, 0x2e, 0x8b, 0x6a, 0x0a, 0xc7, 0xf3, 0x51, 0x16, 0x4f, 0x62, 0x2a, 0x05,
-	0x91, 0x44, 0x24, 0xbd, 0x18, 0xa2, 0xb4, 0xe2, 0xbf, 0x10, 0xa9, 0x69, 0x44, 0x7f, 0x28, 0xb0,
-	0x23, 0x9c, 0x2d, 0xff, 0x22, 0x08, 0x67, 0xbc, 0x36, 0x51, 0x0b, 0xca, 0xac, 0x80, 0x79, 0x15,
-	0xb0, 0x30, 0x5a, 0xeb, 0xdd, 0xf5, 0x1c, 0x39, 0x4b, 0x3b, 0xf4, 0x6d, 0x92, 0x86, 0xca, 0xd3,
-	0x78, 0x94, 0x75, 0x49, 0xc5, 0x7f, 0x0b, 0x79, 0xfc, 0xa9, 0x40, 0x39, 0x2e, 0x50, 0xd4, 0xc8,
-	0xf4, 0x41, 0x3d, 0xc6, 0x91, 0x2e, 0xe0, 0x4c, 0x13, 0x24, 0x75, 0xa8, 0xf2, 0x3a, 0x3c, 0x84,
-	0xf2, 0x3c, 0x24, 0x17, 0xde, 0x6b, 0x12, 0xd5, 0xf2, 0x3c, 0x97, 0x07, 0xab, 0x31, 0x1a, 0x27,
-	0xd2, 0x40, 0xe4, 0xb0, 0xb4, 0xaf, 0x9f, 0xc2, 0x66, 0x46, 0xb5, 0x26, 0x8b, 0x46, 0x3a, 0x0b,
-	0xad, 0x55, 0x7b, 0xd3, 0x71, 0xa7, 0xf3, 0xfb, 0x59, 0x81, 0x4a, 0xbc, 0x77, 0xeb, 0x16, 0x09,
-	0x8a, 0x46, 0x3b, 0x00, 0xe0, 0x4d, 0x3b, 0x94, 0x7d, 0xce, 0x52, 0x7c, 0xff, 0x8d, 0xc7, 0xe5,
-	0x54, 0xb8, 0x31, 0x3b, 0x6f, 0xe3, 0x27, 0xd8, 0x6a, 0x4f, 0x71, 0x38, 0x4b, 0x26, 0x01, 0x89,
-	0x27, 0xc1, 0x0e, 0x6c, 0x76, 0x7a, 0xdd, 0xee, 0xa9, 0x6d, 0x75, 0xda, 0x03, 0xab, 0x67, 0xeb,
-	0x39, 0xb4, 0x0d, 0x9a, 0x69, 0x9f, 0x59, 0x4e, 0xcf, 0xee, 0x9a, 0xf6, 0x40, 0x57, 0xd0, 0x26,
-	0x54, 0xcc, 0xef, 0x4f, 0xad, 0x13, 0xfe, 0xa9, 0x22, 0x0d, 0x36, 0xfa, 0xa6, 0x73, 0x66, 0x75,
-	0x4c, 0x3d, 0x8f, 0xb6, 0x00, 0x4e, 0x9c, 0x5e, 0xc7, 0xec, 0xf7, 0x2d, 0xfb, 0x99, 0x5e, 0x40,
-	0x55, 0x28, 0xf7, 0xcd, 0xce, 0xa9, 0x63, 0x0d, 0x7e, 0xd0, 0x8b, 0xc6, 0x73, 0x40, 0xc9, 0xc6,
-	0x1d, 0x4c, 0xc9, 0x38, 0x08, 0xaf, 0x8d, 0xcf, 0x52, 0xa3, 0xf2, 0x84, 0x6f, 0xb9, 0x01, 0xf9,
-	0xde, 0x4b, 0xb6, 0x15, 0x5b, 0xf0, 0x4d, 0xf8, 0xe2, 0x54, 0xcf, 0xb3, 0x85, 0x6d, 0x5b, 0x7a,
-	0xc1, 0xd8, 0x87, 0xed, 0x24, 0x56, 0x9f, 0x62, 0x4a, 0x8c, 0xdd, 0x38, 0x10, 0x40, 0xc9, 0x69,
-	0x5b, 0x7d, 0xf3, 0x48, 0xcf, 0x31, 0x78, 0x9d, 0x97, 0x66, 0xdb, 0x31, 0x8f, 0x74, 0xc5, 0xc0,
-	0x69, 0x00, 0x7d, 0xb2, 0x20, 0xa1, 0x47, 0xaf, 0x8d, 0x17, 0xa9, 0xec, 0x2d, 0xfb, 0xc8, 0x1c,
-	0x98, 0x4e, 0xd7, 0xb2, 0xdb, 0x03, 0x53, 0xb8, 0xbf, 0x6a, 0x3b, 0x36, 0xcb, 0x46, 0x61, 0x73,
-	0xb2, 0x6b, 0xd9, 0x3d, 0x47, 0x57, 0xf9, 0xb2, 0xfd, 0xbc, 0xe7, 0xe8, 0x79, 0x96, 0x63, 0xc7,
-	0xb1, 0x06, 0x56, 0xa7, 0xfd, 0x52, 0x2f, 0x18, 0x7f, 0x15, 0x00, 0x92, 0x3d, 0xd8, 0xa9, 0x79,
-	0xae, 0x2c, 0x1c, 0xd5, 0x73, 0xd1, 0x27, 0xf2, 0xd4, 0x55, 0x7e, 0xea, 0xf7, 0xe2, 0xf3, 0xca,
-	0x9e, 0x47, 0xe6, 0xdc, 0xbf, 0x82, 0xf2, 0x48, 0x52, 0xc5, 0xe7, 0xe8, 0x56, 0x6b, 0xf7, 0xa6,
-	0x57, 0x4c, 0xa6, 0xf4, 0x5c, 0x7a, 0xa0, 0x7d, 0x28, 0x46, 0x8c, 0x1c, 0x3e, 0x5e, 0x53, 0xf7,
-	0xc9, 0x0a, 0x77, 0xd2, 0x4f, 0xd8, 0xb2, 0x2d, 0x23, 0x49, 0x0e, 0x9f, 0xbc, 0x6b, 0xb7, 0x8c,
-	0xe9, 0x8b, 0xb7, 0x8c, 0x3d, 0xd8, 0xe0, 0x0e, 0xb1, 0x17, 0x11, 0x77, 0x48, 0xa3, 0x5a, 0x89,
-	0x37, 0x64, 0x59, 0x08, 0x06, 0x11, 0x7a, 0x08, 0x5a, 0x48, 0xe6, 0x41, 0x48, 0x85, 0x7a, 0x83,
-	0xab, 0x21, 0x16, 0x0d, 0x22, 0x74, 0x1f, 0x60, 0x34, 0xc1, 0xfe, 0x58, 0xe8, 0xcb, 0x5c, 0x5f,
-	0x91, 0x92, 0xd8, 0x3f, 0x0a, 0xae, 0x42, 0x71, 0x2f, 0x54, 0x38, 0xb1, 0x10, 0x8b, 0x2c, 0x17,
-	0xed, 0x82, 0xe6, 0x92, 0x68, 0x14, 0x7a, 0x73, 0x56, 0xf6, 0x35, 0xe0, 0x06, 0x69, 0x11, 0xfa,
-	0x22, 0xb9, 0x3b, 0x34, 0xde, 0x35, 0x0f, 0x6f, 0x26, 0xb7, 0xfe, 0xde, 0x58, 0x7f, 0xb9, 0x55,
-	0xd7, 0x5f, 0x6e, 0x8f, 0x60, 0x1b, 0xb3, 0x78, 0x43, 0x76, 0x8a, 0x43, 0x1f, 0xcf, 0x48, 0x6d,
-	0x93, 0x5b, 0x6e, 0x72, 0x31, 0x63, 0xcd, 0xc6, 0x33, 0x72, 0xab, 0xbb, 0xe8, 0x6f, 0x05, 0x34,
-	0xb1, 0xa1, 0xa8, 0xb6, 0x15, 0x76, 0x94, 0x1b, 0xec, 0x3c, 0x86, 0x1d, 0x09, 0x9c, 0x3f, 0x80,
-	0x04, 0x2c, 0x11, 0x76, 0xdb, 0x4d, 0x02, 0x31, 0x60, 0xab, 0x4c, 0xe6, 0x6f, 0x32, 0x79, 0x98,
-	0x30, 0x59, 0xe0, 0x4c, 0x2e, 0xcb, 0x24, 0x05, 0xea, 0x2d, 0x5c, 0xc1, 0x0b, 0xd8, 0xcc, 0x8e,
-	0x90, 0xff, 0x69, 0x7e, 0x1d, 0x83, 0x2e, 0x4a, 0xff, 0xea, 0xfc, 0x96, 0xd3, 0xeb, 0x15, 0x54,
-	0x92, 0xe9, 0xfb, 0x3c, 0x0e, 0xa1, 0x43, 0xb5, 0xd3, 0xb3, 0xbf, 0xb3, 0x9e, 0x0d, 0xcd, 0x33,
-	0x06, 0x2e, 0xc7, 0xb0, 0xbe, 0x38, 0xb1, 0xe4, 0xa7, 0xc2, 0xe0, 0x2d, 0x3f, 0x5b, 0xba, 0xca,
-	0x1c, 0x8e, 0x4c, 0x06, 0x5d, 0x5a, 0xe4, 0x8d, 0xdf, 0x55, 0xd0, 0x78, 0xe4, 0x63, 0x82, 0x5d,
-	0x12, 0xde, 0x98, 0x3f, 0x9f, 0xa7, 0xa6, 0x89, 0x98, 0x41, 0x77, 0xe3, 0x33, 0xfb, 0xf7, 0x41,
-	0xd2, 0x86, 0x6a, 0x74, 0x75, 0x3e, 0x5c, 0x19, 0x45, 0x0f, 0x32, 0xce, 0x29, 0x5e, 0xa4, 0xbf,
-	0x16, 0x25, 0x22, 0xf4, 0x44, 0xce, 0x3e, 0x31, 0x8a, 0xde, 0xcb, 0xb8, 0xde, 0x18, 0x7b, 0x1f,
-	0x40, 0x95, 0x37, 0xce, 0x82, 0x84, 0x11, 0x2b, 0x3f, 0xf1, 0x02, 0xd4, 0x98, 0xec, 0x4c, 0x88,
-	0x6e, 0x37, 0x68, 0x8c, 0xdf, 0x54, 0x28, 0x8a, 0xae, 0x79, 0x02, 0xa5, 0x09, 0x67, 0x4b, 0xbe,
-	0x93, 0xee, 0x64, 0x90, 0x09, 0x22, 0x1d, 0x69, 0x82, 0x0e, 0xa0, 0x3a, 0xe2, 0x6f, 0x71, 0xd1,
-	0x41, 0xf2, 0xfe, 0xbf, 0xb3, 0xe6, 0x9d, 0x7e, 0x9c, 0x73, 0xb4, 0x51, 0xea, 0x65, 0xdf, 0x84,
-	0xca, 0xe5, 0xdc, 0x93, 0x6e, 0x79, 0xee, 0xa6, 0xaf, 0xde, 0xfa, 0xc7, 0x39, 0xa7, 0x7c, 0x19,
-	0x3f, 0x81, 0x5a, 0x00, 0x4b, 0x87, 0x16, 0x67, 0x4d, 0x6b, 0xed, 0xac, 0x7a, 0xb4, 0x8e, 0x73,
-	0x4e, 0xe5, 0x72, 0xf9, 0xaa, 0x38, 0x80, 0x6a, 0xba, 0xc1, 0x39, 0x6d, 0x29, 0x78, 0xa9, 0xbe,
-	0x64, 0xf0, 0x52, 0x2d, 0xff, 0xb4, 0x0a, 0x20, 0x66, 0x02, 0xa3, 0xf8, 0xa9, 0x09, 0x77, 0x82,
-	0x70, 0xdc, 0x08, 0xe6, 0xc4, 0x1f, 0x05, 0xa1, 0x2b, 0xfd, 0x7f, 0x6c, 0x8c, 0x3d, 0x3a, 0xb9,
-	0x3a, 0x6f, 0x8c, 0x82, 0x59, 0x33, 0xd6, 0x35, 0x85, 0xee, 0x63, 0xf9, 0xaf, 0x69, 0xb1, 0xdf,
-	0x1c, 0x07, 0x52, 0x76, 0x5e, 0xe2, 0xc2, 0xfd, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x4c,
-	0x16, 0xa6, 0x7e, 0x0d, 0x00, 0x00,
+	// 1388 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x57, 0x5d, 0x6e, 0xdb, 0xc6,
+	0x16, 0x16, 0xa9, 0xff, 0x43, 0xd9, 0xa6, 0x27, 0x17, 0xf7, 0xea, 0x2a, 0xb9, 0x89, 0x2f, 0x8b,
+	0x06, 0x46, 0x82, 0x4a, 0xad, 0x5c, 0x20, 0x8e, 0xd3, 0xa2, 0x55, 0x64, 0x36, 0x66, 0x12, 0x51,
+	0x2e, 0x25, 0x3b, 0x68, 0x5f, 0x84, 0xb1, 0x38, 0x96, 0x08, 0x4b, 0xa2, 0x40, 0x8e, 0xd4, 0x78,
+	0x01, 0x7d, 0xee, 0x02, 0xba, 0x84, 0xee, 0xa1, 0x6f, 0x5d, 0x46, 0xd1, 0x4d, 0x74, 0x01, 0xc5,
+	0xfc, 0x50, 0x24, 0x65, 0xa5, 0x79, 0x30, 0xda, 0x3e, 0x69, 0x78, 0xe6, 0x7c, 0xe7, 0xe7, 0x3b,
+	0x73, 0xce, 0x8c, 0xa0, 0xb6, 0xf4, 0x27, 0x74, 0x8c, 0x07, 0xf3, 0xc0, 0xa7, 0x7e, 0xd8, 0x20,
+	0x4b, 0x32, 0xa3, 0x61, 0x9d, 0x7f, 0xa1, 0x82, 0xd8, 0xab, 0x55, 0xd3, 0x3a, 0x53, 0x42, 0xb1,
+	0xd0, 0xa8, 0xdd, 0x1b, 0xf9, 0xfe, 0x68, 0x42, 0x1a, 0x78, 0xee, 0x35, 0xf0, 0x6c, 0xe6, 0x53,
+	0x4c, 0x3d, 0x7f, 0x26, 0xf1, 0xb5, 0x07, 0x72, 0x97, 0x7f, 0x5d, 0x2c, 0x2e, 0x1b, 0xd4, 0x9b,
+	0x92, 0x90, 0xe2, 0xe9, 0x5c, 0x28, 0x18, 0xcf, 0x60, 0xa7, 0xed, 0xcf, 0x2e, 0xbd, 0x91, 0xc9,
+	0xdc, 0xf6, 0xaf, 0xe7, 0xc4, 0xd8, 0x87, 0x3c, 0xfb, 0x0d, 0x51, 0x11, 0xb2, 0xd8, 0x75, 0xf5,
+	0x0c, 0x02, 0x28, 0x04, 0x64, 0xea, 0x2f, 0x89, 0xae, 0xb0, 0xf5, 0x62, 0xee, 0x62, 0x4a, 0x74,
+	0xd5, 0x18, 0x83, 0x96, 0x00, 0xa3, 0x4f, 0x20, 0x47, 0xaf, 0xe7, 0xa4, 0xaa, 0xec, 0x29, 0xfb,
+	0xdb, 0xcd, 0xff, 0xd5, 0x45, 0xcc, 0xf5, 0x35, 0xfb, 0x75, 0x6e, 0xdc, 0xe1, 0xaa, 0x08, 0x41,
+	0x6e, 0x8c, 0xc3, 0x71, 0x55, 0xdd, 0x53, 0xf6, 0xcb, 0x0e, 0x5f, 0x33, 0x99, 0x8b, 0x29, 0xae,
+	0x66, 0x85, 0x8c, 0xad, 0x8d, 0x47, 0x50, 0x79, 0x35, 0xf7, 0xe2, 0x18, 0x6b, 0x51, 0x8c, 0x65,
+	0xc8, 0x87, 0x13, 0x6f, 0x48, 0xf4, 0x0c, 0x2a, 0x80, 0x4a, 0x43, 0x5d, 0x31, 0x7e, 0x52, 0x61,
+	0xbb, 0x43, 0x68, 0xe0, 0x0d, 0x3b, 0x84, 0xe2, 0x63, 0x4c, 0x31, 0xfa, 0x17, 0xe4, 0xa9, 0x47,
+	0x27, 0x22, 0xb4, 0xb2, 0x23, 0x3e, 0xd0, 0x36, 0x03, 0x70, 0xd7, 0x8a, 0xa3, 0xd2, 0x10, 0x3d,
+	0x82, 0xdd, 0x89, 0x3f, 0xf2, 0x86, 0x78, 0x32, 0x70, 0xc9, 0xd2, 0x1b, 0x92, 0x81, 0xe7, 0xca,
+	0x28, 0x76, 0xe4, 0xc6, 0x31, 0x97, 0x5b, 0x2e, 0xba, 0x0b, 0xe5, 0x90, 0x04, 0x1e, 0x9e, 0x0c,
+	0x66, 0x7e, 0x35, 0xc7, 0x75, 0x4a, 0x42, 0x60, 0xfb, 0x6c, 0x33, 0x36, 0x90, 0x17, 0x9b, 0x6e,
+	0x84, 0xfc, 0x1c, 0x8a, 0x43, 0x7f, 0x46, 0xc9, 0x5b, 0x5a, 0x2d, 0xec, 0x65, 0xf7, 0xb5, 0xe6,
+	0x07, 0x11, 0x51, 0xe9, 0xa0, 0x19, 0x6f, 0x4c, 0xcb, 0x9c, 0xd1, 0xe0, 0xda, 0x89, 0x30, 0x8c,
+	0x9d, 0xc5, 0xc2, 0x73, 0xab, 0x45, 0xc1, 0x0e, 0x5b, 0xd7, 0x8e, 0xa0, 0x92, 0x54, 0x46, 0x3a,
+	0x64, 0xaf, 0xc8, 0xb5, 0x4c, 0x96, 0x2d, 0x19, 0x01, 0x4b, 0x3c, 0x59, 0x10, 0x49, 0xb4, 0xf8,
+	0x38, 0x52, 0x0f, 0x15, 0xe3, 0x07, 0x05, 0x74, 0xe1, 0xf8, 0x9c, 0xc9, 0x4e, 0xb1, 0x17, 0x84,
+	0xe8, 0x0b, 0x28, 0x4e, 0xb9, 0x2c, 0xac, 0x2a, 0x3c, 0xc6, 0x0f, 0xd3, 0x31, 0xc6, 0xaa, 0x52,
+	0x10, 0xca, 0x28, 0x25, 0x8a, 0x45, 0x94, 0xdc, 0x78, 0x5f, 0x44, 0x6a, 0x32, 0xa2, 0x5f, 0x14,
+	0xd8, 0x15, 0x60, 0x6b, 0x76, 0xe9, 0x07, 0x53, 0x7e, 0xa0, 0x51, 0x13, 0x4a, 0xec, 0xd4, 0xf3,
+	0x93, 0xc1, 0xcc, 0x68, 0xcd, 0x7f, 0x6f, 0xe6, 0xcd, 0x59, 0xe9, 0xa1, 0x2f, 0xe3, 0x34, 0x54,
+	0x9e, 0xc6, 0xc3, 0x34, 0x24, 0x61, 0xff, 0x2f, 0xc8, 0xe3, 0x57, 0x05, 0x4a, 0xd1, 0xa1, 0x45,
+	0xf5, 0x54, 0x6f, 0xd4, 0xa2, 0x38, 0x92, 0x87, 0x3a, 0xd5, 0x18, 0xf1, 0xd9, 0x54, 0xf9, 0xd9,
+	0x3c, 0x82, 0xd2, 0x3c, 0x20, 0x97, 0xde, 0x5b, 0x12, 0x56, 0xb3, 0x3c, 0x97, 0xfb, 0xeb, 0x36,
+	0xea, 0xa7, 0x52, 0x41, 0xe4, 0xb0, 0xd2, 0xaf, 0x9d, 0xc1, 0x56, 0x6a, 0x6b, 0x43, 0x16, 0xf5,
+	0x64, 0x16, 0x5a, 0xb3, 0xfa, 0xae, 0x72, 0x27, 0xf3, 0xfb, 0x5e, 0x81, 0x72, 0xe4, 0xbb, 0x79,
+	0x8b, 0x04, 0x45, 0xf3, 0x1d, 0x02, 0xf0, 0x46, 0x1e, 0xc8, 0xde, 0x67, 0x29, 0xfe, 0xf7, 0x9d,
+	0xe5, 0x72, 0xca, 0x5c, 0x99, 0xd5, 0xdb, 0xf8, 0x0e, 0xb6, 0x5b, 0x13, 0x1c, 0x4c, 0xe3, 0xe9,
+	0x40, 0xa2, 0xe9, 0xb0, 0x0b, 0x5b, 0xed, 0x6e, 0xa7, 0x73, 0x66, 0x5b, 0xed, 0x56, 0xdf, 0xea,
+	0xda, 0x7a, 0x06, 0xed, 0x80, 0x66, 0xda, 0xe7, 0x96, 0xd3, 0xb5, 0x3b, 0xa6, 0xdd, 0xd7, 0x15,
+	0xb4, 0x05, 0x65, 0xf3, 0xeb, 0x33, 0xeb, 0x94, 0x7f, 0xaa, 0x48, 0x83, 0x62, 0xcf, 0x74, 0xce,
+	0xad, 0xb6, 0xa9, 0x67, 0xd1, 0x36, 0xc0, 0xa9, 0xd3, 0x6d, 0x9b, 0xbd, 0x9e, 0x65, 0xbf, 0xd0,
+	0x73, 0xa8, 0x02, 0xa5, 0x9e, 0xd9, 0x3e, 0x73, 0xac, 0xfe, 0x37, 0x7a, 0xde, 0x78, 0x09, 0x28,
+	0x76, 0xdc, 0xc6, 0x94, 0x8c, 0xfc, 0xe0, 0xda, 0xf8, 0x34, 0x31, 0x3e, 0x4f, 0xb9, 0xcb, 0x22,
+	0x64, 0xbb, 0xaf, 0x99, 0x2b, 0xb6, 0xe0, 0x4e, 0xf8, 0xe2, 0x4c, 0xcf, 0xb2, 0x85, 0x6d, 0x5b,
+	0x7a, 0xce, 0x38, 0x80, 0x9d, 0xd8, 0x56, 0x8f, 0x62, 0x4a, 0x8c, 0xbd, 0xc8, 0x10, 0x40, 0xc1,
+	0x69, 0x59, 0x3d, 0xf3, 0x58, 0xcf, 0xb0, 0xf0, 0xda, 0xaf, 0xcd, 0x96, 0x63, 0x1e, 0xeb, 0x8a,
+	0x81, 0x93, 0x01, 0xf4, 0xc8, 0x92, 0x04, 0x1e, 0xbd, 0x36, 0x5e, 0x25, 0xb2, 0xb7, 0xec, 0x63,
+	0xb3, 0x6f, 0x3a, 0x1d, 0xcb, 0x6e, 0xf5, 0x4d, 0x01, 0x7f, 0xd3, 0x72, 0x6c, 0x96, 0x8d, 0xc2,
+	0x66, 0x67, 0xc7, 0xb2, 0xbb, 0x8e, 0xae, 0xf2, 0x65, 0xeb, 0x65, 0xd7, 0xd1, 0xb3, 0x2c, 0xc7,
+	0xb6, 0x63, 0xf5, 0xad, 0x76, 0xeb, 0xb5, 0x9e, 0x33, 0x7e, 0xce, 0x03, 0xc4, 0x3e, 0x58, 0xd5,
+	0x3c, 0x57, 0x1e, 0x1c, 0xd5, 0x73, 0xd1, 0xc7, 0xb2, 0xea, 0x2a, 0xaf, 0xfa, 0xbd, 0xa8, 0x5e,
+	0xe9, 0x7a, 0xa4, 0xea, 0xfe, 0x19, 0x94, 0x86, 0x92, 0x2a, 0x3e, 0x5b, 0xb7, 0x9b, 0x7b, 0x37,
+	0x51, 0x11, 0x99, 0x12, 0xb9, 0x42, 0xa0, 0x03, 0xc8, 0x87, 0x8c, 0x1c, 0x3e, 0x72, 0x13, 0x77,
+	0xcc, 0x1a, 0x77, 0x12, 0x27, 0x74, 0x99, 0xcb, 0x50, 0x92, 0xc3, 0xa7, 0xf1, 0x46, 0x97, 0x11,
+	0x7d, 0x91, 0xcb, 0x08, 0x81, 0x9e, 0x40, 0x39, 0xc0, 0x5e, 0x48, 0xdc, 0x01, 0x0d, 0xab, 0x05,
+	0xde, 0x1e, 0xb5, 0xba, 0xb8, 0x56, 0xeb, 0xd1, 0xb5, 0x5a, 0xef, 0x47, 0xd7, 0xaa, 0x53, 0x12,
+	0xca, 0xfd, 0x10, 0x3d, 0x03, 0x2d, 0x20, 0x73, 0x3f, 0xa0, 0x02, 0x5a, 0x7c, 0x2f, 0x14, 0x22,
+	0xf5, 0x7e, 0x88, 0x9e, 0x02, 0x0c, 0xc7, 0x78, 0x36, 0x12, 0xd8, 0xd2, 0x7b, 0xb1, 0x65, 0xa9,
+	0xdd, 0x0f, 0xd1, 0x03, 0xe6, 0x37, 0xf4, 0x17, 0x81, 0xb8, 0x7f, 0xca, 0xbc, 0x58, 0x10, 0x89,
+	0x2c, 0x17, 0xed, 0x81, 0xe6, 0x92, 0x70, 0x18, 0x78, 0x73, 0xd6, 0x4a, 0x55, 0xe0, 0x0a, 0x49,
+	0x11, 0x7a, 0x1a, 0xdf, 0x51, 0x1a, 0xef, 0xc4, 0x07, 0x37, 0x09, 0x7b, 0xc7, 0xfd, 0xb4, 0xf1,
+	0x12, 0xad, 0x6c, 0xbe, 0x44, 0x1f, 0xc2, 0x0e, 0x66, 0xf6, 0x06, 0xec, 0x64, 0x0c, 0x66, 0x78,
+	0x4a, 0xaa, 0x5b, 0x5c, 0x73, 0x8b, 0x8b, 0x59, 0x25, 0x6c, 0x3c, 0x25, 0xb7, 0xba, 0xdf, 0x7e,
+	0x57, 0x40, 0x13, 0x0e, 0xc5, 0x09, 0x5e, 0x63, 0x47, 0xb9, 0xc1, 0xce, 0x23, 0xd8, 0x95, 0x81,
+	0xf3, 0x97, 0x98, 0x08, 0x4b, 0x98, 0xdd, 0x71, 0x63, 0x43, 0x2c, 0xb0, 0x75, 0x26, 0xb3, 0x37,
+	0x99, 0x3c, 0x8a, 0x99, 0xcc, 0x71, 0x26, 0x57, 0x47, 0x2f, 0x11, 0xd4, 0x66, 0x2a, 0x6f, 0x95,
+	0xf6, 0x12, 0xb6, 0xd2, 0x63, 0xe9, 0x6f, 0x9a, 0x89, 0x27, 0xa0, 0x8b, 0x76, 0x5a, 0x5c, 0xdc,
+	0x72, 0x22, 0xbe, 0x81, 0x72, 0x3c, 0xd1, 0x5f, 0x46, 0x26, 0x74, 0xa8, 0xb4, 0xbb, 0xf6, 0x57,
+	0xd6, 0x8b, 0x81, 0x79, 0xce, 0x82, 0xcb, 0xb0, 0x58, 0x5f, 0x9d, 0x5a, 0xf2, 0x53, 0x61, 0xe1,
+	0xad, 0x3e, 0x9b, 0xba, 0xca, 0x00, 0xc7, 0x26, 0x0b, 0x5d, 0x6a, 0x64, 0x8d, 0xdf, 0x54, 0xd0,
+	0xb8, 0xe5, 0x13, 0x82, 0x5d, 0x12, 0xdc, 0x98, 0x69, 0x4f, 0x12, 0x13, 0x4a, 0xcc, 0xb5, 0xbb,
+	0x51, 0xcd, 0xfe, 0x7c, 0x38, 0xb5, 0xa0, 0x12, 0x2e, 0x2e, 0x06, 0x6b, 0xe3, 0xed, 0x7e, 0x0a,
+	0x9c, 0xe0, 0x45, 0xe2, 0xb5, 0x30, 0x16, 0xa1, 0xc7, 0x72, 0x9e, 0x8a, 0xf1, 0xf6, 0x9f, 0x14,
+	0xf4, 0xc6, 0x28, 0xfd, 0x3f, 0x54, 0x78, 0xe3, 0x2c, 0x49, 0x10, 0xb2, 0xe3, 0x27, 0x5e, 0x9a,
+	0x1a, 0x93, 0x9d, 0x0b, 0xd1, 0x3f, 0x33, 0xbc, 0x8c, 0x1f, 0x55, 0xc8, 0x8b, 0x6e, 0x7b, 0x0c,
+	0x85, 0x31, 0x67, 0x59, 0xbe, 0xd9, 0xee, 0xa4, 0x32, 0x12, 0x05, 0x70, 0xa4, 0x0a, 0x3a, 0x84,
+	0xca, 0x90, 0xff, 0x57, 0x10, 0x9d, 0x27, 0xdf, 0x22, 0x77, 0x36, 0xfc, 0x8f, 0x38, 0xc9, 0x38,
+	0xda, 0x30, 0xf1, 0xcf, 0xa3, 0x01, 0xe5, 0xab, 0xb9, 0x27, 0x61, 0x59, 0x0e, 0xd3, 0xd7, 0x5f,
+	0x20, 0x27, 0x19, 0xa7, 0x74, 0x15, 0x3d, 0xc7, 0x9a, 0x00, 0x2b, 0x40, 0x93, 0xb3, 0xad, 0x35,
+	0x77, 0xd7, 0x11, 0xcd, 0x93, 0x8c, 0x53, 0xbe, 0x5a, 0xbd, 0x70, 0x0e, 0xa1, 0x92, 0x1c, 0x0c,
+	0x9c, 0xee, 0x44, 0x78, 0x89, 0x7e, 0x66, 0xe1, 0x25, 0x46, 0xc5, 0xf3, 0x0a, 0x80, 0x98, 0x25,
+	0xac, 0x34, 0xcf, 0x4d, 0xb8, 0xe3, 0x07, 0xa3, 0xba, 0x3f, 0x27, 0xb3, 0xa1, 0x1f, 0xb8, 0x12,
+	0xff, 0x6d, 0x7d, 0xe4, 0xd1, 0xf1, 0xe2, 0xa2, 0x3e, 0xf4, 0xa7, 0x8d, 0x68, 0xaf, 0x21, 0xf6,
+	0x3e, 0x92, 0x7f, 0xfb, 0x96, 0x07, 0x8d, 0x91, 0x2f, 0x65, 0x17, 0x05, 0x2e, 0x3c, 0xf8, 0x23,
+	0x00, 0x00, 0xff, 0xff, 0xe5, 0xa6, 0xf9, 0x0e, 0x3f, 0x0e, 0x00, 0x00,
 }
diff --git a/vendor/github.com/opencord/voltha-protos/v3/go/voltha/voltha.pb.go b/vendor/github.com/opencord/voltha-protos/v3/go/voltha/voltha.pb.go
index f6512d6..83fb298 100644
--- a/vendor/github.com/opencord/voltha-protos/v3/go/voltha/voltha.pb.go
+++ b/vendor/github.com/opencord/voltha-protos/v3/go/voltha/voltha.pb.go
@@ -50,18 +50,6 @@
 // IDs from public import voltha_protos/common.proto
 type IDs = common.IDs
 
-// LogLevel from public import voltha_protos/common.proto
-type LogLevel = common.LogLevel
-
-// Logging from public import voltha_protos/common.proto
-type Logging = common.Logging
-
-// LoggingComponent from public import voltha_protos/common.proto
-type LoggingComponent = common.LoggingComponent
-
-// Loggings from public import voltha_protos/common.proto
-type Loggings = common.Loggings
-
 // AdminState from public import voltha_protos/common.proto
 type AdminState = common.AdminState
 
@@ -82,19 +70,6 @@
 
 const TestModeKeys_api_test = TestModeKeys(common.TestModeKeys_api_test)
 
-// LogLevel_Types from public import voltha_protos/common.proto
-type LogLevel_Types = common.LogLevel_Types
-
-var LogLevel_Types_name = common.LogLevel_Types_name
-var LogLevel_Types_value = common.LogLevel_Types_value
-
-const LogLevel_DEBUG = LogLevel_Types(common.LogLevel_DEBUG)
-const LogLevel_INFO = LogLevel_Types(common.LogLevel_INFO)
-const LogLevel_WARNING = LogLevel_Types(common.LogLevel_WARNING)
-const LogLevel_ERROR = LogLevel_Types(common.LogLevel_ERROR)
-const LogLevel_CRITICAL = LogLevel_Types(common.LogLevel_CRITICAL)
-const LogLevel_FATAL = LogLevel_Types(common.LogLevel_FATAL)
-
 // AdminState_Types from public import voltha_protos/common.proto
 type AdminState_Types = common.AdminState_Types
 
@@ -1307,6 +1282,31 @@
 	return fileDescriptor_e084f1a60ce7016c, []int{2, 0}
 }
 
+type TestResponse_TestResponseResult int32
+
+const (
+	TestResponse_SUCCESS TestResponse_TestResponseResult = 0
+	TestResponse_FAILURE TestResponse_TestResponseResult = 1
+)
+
+var TestResponse_TestResponseResult_name = map[int32]string{
+	0: "SUCCESS",
+	1: "FAILURE",
+}
+
+var TestResponse_TestResponseResult_value = map[string]int32{
+	"SUCCESS": 0,
+	"FAILURE": 1,
+}
+
+func (x TestResponse_TestResponseResult) String() string {
+	return proto.EnumName(TestResponse_TestResponseResult_name, int32(x))
+}
+
+func (TestResponse_TestResponseResult) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_e084f1a60ce7016c, []int{9, 0}
+}
+
 type SelfTestResponse_SelfTestResult int32
 
 const (
@@ -1335,7 +1335,7 @@
 }
 
 func (SelfTestResponse_SelfTestResult) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{9, 0}
+	return fileDescriptor_e084f1a60ce7016c, []int{11, 0}
 }
 
 type DeviceGroup struct {
@@ -1708,6 +1708,92 @@
 	return nil
 }
 
+type OmciTestRequest struct {
+	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	Uuid                 string   `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *OmciTestRequest) Reset()         { *m = OmciTestRequest{} }
+func (m *OmciTestRequest) String() string { return proto.CompactTextString(m) }
+func (*OmciTestRequest) ProtoMessage()    {}
+func (*OmciTestRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e084f1a60ce7016c, []int{8}
+}
+
+func (m *OmciTestRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OmciTestRequest.Unmarshal(m, b)
+}
+func (m *OmciTestRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OmciTestRequest.Marshal(b, m, deterministic)
+}
+func (m *OmciTestRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OmciTestRequest.Merge(m, src)
+}
+func (m *OmciTestRequest) XXX_Size() int {
+	return xxx_messageInfo_OmciTestRequest.Size(m)
+}
+func (m *OmciTestRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_OmciTestRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OmciTestRequest proto.InternalMessageInfo
+
+func (m *OmciTestRequest) GetId() string {
+	if m != nil {
+		return m.Id
+	}
+	return ""
+}
+
+func (m *OmciTestRequest) GetUuid() string {
+	if m != nil {
+		return m.Uuid
+	}
+	return ""
+}
+
+type TestResponse struct {
+	Result               TestResponse_TestResponseResult `protobuf:"varint,1,opt,name=result,proto3,enum=voltha.TestResponse_TestResponseResult" json:"result,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
+	XXX_unrecognized     []byte                          `json:"-"`
+	XXX_sizecache        int32                           `json:"-"`
+}
+
+func (m *TestResponse) Reset()         { *m = TestResponse{} }
+func (m *TestResponse) String() string { return proto.CompactTextString(m) }
+func (*TestResponse) ProtoMessage()    {}
+func (*TestResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_e084f1a60ce7016c, []int{9}
+}
+
+func (m *TestResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TestResponse.Unmarshal(m, b)
+}
+func (m *TestResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TestResponse.Marshal(b, m, deterministic)
+}
+func (m *TestResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TestResponse.Merge(m, src)
+}
+func (m *TestResponse) XXX_Size() int {
+	return xxx_messageInfo_TestResponse.Size(m)
+}
+func (m *TestResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_TestResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TestResponse proto.InternalMessageInfo
+
+func (m *TestResponse) GetResult() TestResponse_TestResponseResult {
+	if m != nil {
+		return m.Result
+	}
+	return TestResponse_SUCCESS
+}
+
 // Voltha represents the Voltha cluster data.  Each Core instance will hold a subset of
 // the entire cluster. However, some items (e.g. adapters) will be held by all cores
 // for better performance
@@ -1730,7 +1816,7 @@
 func (m *Voltha) String() string { return proto.CompactTextString(m) }
 func (*Voltha) ProtoMessage()    {}
 func (*Voltha) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{8}
+	return fileDescriptor_e084f1a60ce7016c, []int{10}
 }
 
 func (m *Voltha) XXX_Unmarshal(b []byte) error {
@@ -1826,7 +1912,7 @@
 func (m *SelfTestResponse) String() string { return proto.CompactTextString(m) }
 func (*SelfTestResponse) ProtoMessage()    {}
 func (*SelfTestResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{9}
+	return fileDescriptor_e084f1a60ce7016c, []int{11}
 }
 
 func (m *SelfTestResponse) XXX_Unmarshal(b []byte) error {
@@ -1868,7 +1954,7 @@
 func (m *OfAgentSubscriber) String() string { return proto.CompactTextString(m) }
 func (*OfAgentSubscriber) ProtoMessage()    {}
 func (*OfAgentSubscriber) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{10}
+	return fileDescriptor_e084f1a60ce7016c, []int{12}
 }
 
 func (m *OfAgentSubscriber) XXX_Unmarshal(b []byte) error {
@@ -1918,7 +2004,7 @@
 func (m *Membership) String() string { return proto.CompactTextString(m) }
 func (*Membership) ProtoMessage()    {}
 func (*Membership) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{11}
+	return fileDescriptor_e084f1a60ce7016c, []int{13}
 }
 
 func (m *Membership) XXX_Unmarshal(b []byte) error {
@@ -1966,7 +2052,7 @@
 func (m *FlowMetadata) String() string { return proto.CompactTextString(m) }
 func (*FlowMetadata) ProtoMessage()    {}
 func (*FlowMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_e084f1a60ce7016c, []int{12}
+	return fileDescriptor_e084f1a60ce7016c, []int{14}
 }
 
 func (m *FlowMetadata) XXX_Unmarshal(b []byte) error {
@@ -1996,6 +2082,7 @@
 
 func init() {
 	proto.RegisterEnum("voltha.EventFilterRuleKey_EventFilterRuleType", EventFilterRuleKey_EventFilterRuleType_name, EventFilterRuleKey_EventFilterRuleType_value)
+	proto.RegisterEnum("voltha.TestResponse_TestResponseResult", TestResponse_TestResponseResult_name, TestResponse_TestResponseResult_value)
 	proto.RegisterEnum("voltha.SelfTestResponse_SelfTestResult", SelfTestResponse_SelfTestResult_name, SelfTestResponse_SelfTestResult_value)
 	proto.RegisterType((*DeviceGroup)(nil), "voltha.DeviceGroup")
 	proto.RegisterType((*DeviceGroups)(nil), "voltha.DeviceGroups")
@@ -2005,6 +2092,8 @@
 	proto.RegisterType((*EventFilters)(nil), "voltha.EventFilters")
 	proto.RegisterType((*CoreInstance)(nil), "voltha.CoreInstance")
 	proto.RegisterType((*CoreInstances)(nil), "voltha.CoreInstances")
+	proto.RegisterType((*OmciTestRequest)(nil), "voltha.OmciTestRequest")
+	proto.RegisterType((*TestResponse)(nil), "voltha.TestResponse")
 	proto.RegisterType((*Voltha)(nil), "voltha.Voltha")
 	proto.RegisterType((*SelfTestResponse)(nil), "voltha.SelfTestResponse")
 	proto.RegisterType((*OfAgentSubscriber)(nil), "voltha.OfAgentSubscriber")
@@ -2015,162 +2104,163 @@
 func init() { proto.RegisterFile("voltha_protos/voltha.proto", fileDescriptor_e084f1a60ce7016c) }
 
 var fileDescriptor_e084f1a60ce7016c = []byte{
-	// 2467 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x9a, 0xcd, 0x73, 0xdb, 0xc6,
-	0x15, 0xc0, 0x05, 0x7d, 0xeb, 0x89, 0x92, 0xc8, 0xa5, 0x3e, 0x68, 0x4a, 0x8a, 0xed, 0x8d, 0x63,
-	0xab, 0x4a, 0x4c, 0xda, 0x96, 0xe3, 0x69, 0xed, 0x66, 0x1a, 0x89, 0x92, 0x55, 0xd6, 0x92, 0xc9,
-	0x42, 0x96, 0xdd, 0x8f, 0x78, 0x38, 0x20, 0xb1, 0xa4, 0x30, 0x06, 0x01, 0x16, 0xbb, 0xa4, 0xa3,
-	0xf1, 0xe4, 0x92, 0x7e, 0xa4, 0xf7, 0xdc, 0x7b, 0x6a, 0xa7, 0x33, 0xfd, 0x5f, 0x72, 0xea, 0xa9,
-	0xd7, 0x4e, 0x0f, 0xfd, 0x0b, 0x32, 0xd3, 0x5b, 0x67, 0x3f, 0x40, 0x02, 0x04, 0x20, 0x89, 0x69,
-	0x66, 0x7a, 0xb2, 0xb1, 0x6f, 0xf7, 0xf7, 0xde, 0xbe, 0xdd, 0x7d, 0xfb, 0xf6, 0x51, 0x90, 0xef,
-	0xb9, 0x36, 0x3b, 0x33, 0x6a, 0x1d, 0xcf, 0x65, 0x2e, 0x2d, 0xca, 0xaf, 0x82, 0xf8, 0x42, 0xd3,
-	0xf2, 0x2b, 0xbf, 0xd1, 0x72, 0xdd, 0x96, 0x4d, 0x8a, 0x46, 0xc7, 0x2a, 0x1a, 0x8e, 0xe3, 0x32,
-	0x83, 0x59, 0xae, 0x43, 0x65, 0xaf, 0xfc, 0xba, 0x92, 0x8a, 0xaf, 0x7a, 0xb7, 0x59, 0x24, 0xed,
-	0x0e, 0x3b, 0x57, 0xc2, 0x5c, 0x18, 0xdf, 0x26, 0x4c, 0xc1, 0xf3, 0x43, 0x8a, 0x1b, 0x6e, 0xbb,
-	0xed, 0x3a, 0xf1, 0xb2, 0x33, 0x62, 0xd8, 0xec, 0x4c, 0xc9, 0x70, 0x58, 0x66, 0xbb, 0x2d, 0xab,
-	0x61, 0xd8, 0x35, 0x93, 0xf4, 0xac, 0x06, 0x89, 0x1f, 0x1f, 0x92, 0xad, 0x87, 0x65, 0x86, 0x69,
-	0x74, 0x18, 0xf1, 0x94, 0xf0, 0x7a, 0x58, 0xe8, 0x76, 0x88, 0xd3, 0xb4, 0xdd, 0xb7, 0xb5, 0xfb,
-	0x3b, 0x09, 0x1d, 0xda, 0x0d, 0xab, 0xd6, 0xb6, 0xea, 0x35, 0xb3, 0xae, 0x3a, 0xdc, 0x8c, 0xe9,
-	0x60, 0xd8, 0x86, 0xd7, 0xee, 0x77, 0xc1, 0x7f, 0xd6, 0x60, 0x7e, 0x5f, 0x98, 0x74, 0xe8, 0xb9,
-	0xdd, 0x0e, 0x5a, 0x81, 0x71, 0xcb, 0xcc, 0x69, 0x37, 0xb4, 0xad, 0xb9, 0xbd, 0xa9, 0x7f, 0x7f,
-	0xfb, 0xcd, 0xa6, 0xa6, 0x8f, 0x5b, 0x26, 0x2a, 0xc3, 0x52, 0x78, 0x72, 0x34, 0x37, 0x7e, 0x63,
-	0x62, 0x6b, 0xfe, 0xc1, 0x4a, 0x41, 0xad, 0xd2, 0x91, 0x14, 0x4b, 0xd6, 0xde, 0xdc, 0x3f, 0xbf,
-	0xfd, 0x66, 0x73, 0x92, 0xb3, 0xf4, 0x45, 0x3b, 0x28, 0xa1, 0x68, 0x07, 0x66, 0x7c, 0xc4, 0x84,
-	0x40, 0x2c, 0xfa, 0x88, 0xe8, 0x58, 0xbf, 0x27, 0xfe, 0x11, 0xa4, 0x02, 0x56, 0x52, 0xf4, 0x03,
-	0x98, 0xb2, 0x18, 0x69, 0xd3, 0x9c, 0x26, 0x10, 0xd9, 0x30, 0x42, 0x74, 0xd2, 0x65, 0x0f, 0xfc,
-	0x27, 0x0d, 0xd0, 0x41, 0x8f, 0x38, 0xec, 0xa9, 0x65, 0x33, 0xe2, 0xe9, 0x5d, 0x9b, 0x3c, 0x23,
-	0xe7, 0xf8, 0x2b, 0x0d, 0xb2, 0x43, 0xcd, 0x2f, 0xce, 0x3b, 0x04, 0x2d, 0x02, 0x34, 0x45, 0x4b,
-	0xcd, 0xb0, 0xed, 0xf4, 0x18, 0x4a, 0xc1, 0x6c, 0xc3, 0x60, 0xa4, 0xe5, 0x7a, 0xe7, 0x69, 0x0d,
-	0xa5, 0x21, 0x45, 0xbb, 0xf5, 0x5a, 0xbf, 0x65, 0x1c, 0x21, 0x58, 0x7c, 0xd3, 0xb1, 0x6a, 0x84,
-	0xa3, 0x6a, 0xec, 0xbc, 0x43, 0xd2, 0x13, 0x68, 0x05, 0x32, 0x0d, 0xd7, 0x69, 0x5a, 0xad, 0x60,
-	0xf3, 0x24, 0x6f, 0x96, 0xf3, 0x09, 0x36, 0x4f, 0x61, 0x0b, 0x96, 0x86, 0x0c, 0x41, 0x9f, 0xc2,
-	0xc4, 0x1b, 0x72, 0x2e, 0x96, 0x61, 0xf1, 0x41, 0xc1, 0x9f, 0x5c, 0x74, 0x16, 0x85, 0x98, 0x19,
-	0xe8, 0x7c, 0x28, 0x5a, 0x86, 0xa9, 0x9e, 0x61, 0x77, 0x49, 0x6e, 0x9c, 0x2f, 0xa5, 0x2e, 0x3f,
-	0xf0, 0x5f, 0x35, 0x98, 0x0f, 0x0c, 0x49, 0x5a, 0xed, 0x55, 0x98, 0x26, 0x8e, 0x51, 0xb7, 0xe5,
-	0xe8, 0x59, 0x5d, 0x7d, 0xa1, 0x75, 0x98, 0x53, 0x13, 0xb0, 0xcc, 0xdc, 0x84, 0x00, 0xcf, 0xca,
-	0x86, 0xb2, 0x89, 0x36, 0x01, 0x06, 0xd3, 0xca, 0x4d, 0x0a, 0xe9, 0x9c, 0x68, 0x11, 0x7e, 0xbd,
-	0x0b, 0x53, 0x5e, 0xd7, 0x26, 0x34, 0x37, 0x25, 0x56, 0x6c, 0x2d, 0x61, 0x52, 0xba, 0xec, 0x85,
-	0x3f, 0x81, 0x54, 0x40, 0x42, 0xd1, 0x5d, 0x98, 0x91, 0xcb, 0x12, 0x59, 0xf2, 0x20, 0xc0, 0xef,
-	0x83, 0xdf, 0x40, 0xaa, 0xe4, 0x7a, 0xa4, 0xec, 0x50, 0x66, 0x38, 0x0d, 0x82, 0x6e, 0xc3, 0xbc,
-	0xa5, 0xfe, 0x5f, 0x1b, 0x9e, 0x31, 0xf8, 0x92, 0xb2, 0x89, 0x76, 0x60, 0x5a, 0x1e, 0x70, 0x31,
-	0xf3, 0xf9, 0x07, 0xcb, 0xbe, 0x96, 0x9f, 0x8a, 0xd6, 0x13, 0x66, 0xb0, 0x2e, 0xdd, 0x9b, 0xe2,
-	0x3b, 0x74, 0x4c, 0x57, 0x5d, 0xf1, 0x13, 0x58, 0x08, 0x2a, 0xa3, 0x68, 0x3b, 0xbc, 0x3b, 0xfb,
-	0x90, 0x60, 0x2f, 0x7f, 0x7b, 0xfe, 0x63, 0x12, 0xa6, 0x5f, 0x0a, 0x31, 0xba, 0x0e, 0x33, 0x3d,
-	0xe2, 0x51, 0xcb, 0x75, 0xc2, 0x06, 0xfa, 0xad, 0xe8, 0x11, 0xcc, 0xaa, 0x10, 0xe1, 0x1f, 0xbf,
-	0x25, 0x1f, 0xbd, 0x2b, 0xdb, 0x83, 0x87, 0xa7, 0xdf, 0x37, 0xee, 0xf4, 0x4e, 0xfc, 0xef, 0xa7,
-	0x77, 0xf2, 0xaa, 0xa7, 0x17, 0x7d, 0x0a, 0x29, 0xb5, 0x6f, 0xf8, 0xde, 0xf0, 0xb7, 0x00, 0x0a,
-	0x8f, 0xe4, 0xbb, 0x24, 0x38, 0x7a, 0xde, 0xec, 0x37, 0x53, 0x54, 0x82, 0x05, 0x45, 0x68, 0x89,
-	0x00, 0x90, 0x9b, 0x4e, 0x3c, 0xf7, 0x41, 0x86, 0x52, 0xab, 0x82, 0x46, 0x09, 0x16, 0xe4, 0x0e,
-	0xf5, 0x77, 0xd2, 0x4c, 0xe2, 0x4e, 0x0a, 0x41, 0x48, 0x70, 0x23, 0xfe, 0x1c, 0x32, 0x83, 0x40,
-	0x6b, 0x30, 0xa3, 0x6e, 0x50, 0x92, 0xdb, 0x50, 0x20, 0x2e, 0x29, 0x1c, 0x5b, 0x75, 0x69, 0xce,
-	0xbe, 0xc1, 0x8c, 0xbd, 0x34, 0x07, 0xcd, 0x07, 0x0e, 0x8e, 0xbe, 0xc4, 0x7b, 0xf1, 0x4e, 0x6a,
-	0x34, 0x7a, 0x05, 0xd9, 0x60, 0x68, 0xf6, 0xa1, 0x9b, 0x6a, 0x89, 0x04, 0x74, 0x97, 0xcb, 0x2e,
-	0xc4, 0x0a, 0xb3, 0x64, 0x37, 0x45, 0xc0, 0x7f, 0xd1, 0x20, 0x7d, 0x42, 0xec, 0xe6, 0x0b, 0x42,
-	0x99, 0x4e, 0x68, 0xc7, 0x75, 0x28, 0x41, 0x3f, 0x81, 0x69, 0x8f, 0xd0, 0xae, 0xcd, 0x54, 0x78,
-	0xb9, 0xe3, 0x4f, 0x7f, 0xb8, 0x67, 0xb0, 0xa1, 0x6b, 0x33, 0x5d, 0x0d, 0xc3, 0x55, 0x58, 0x0c,
-	0x4b, 0xd0, 0x3c, 0xcc, 0x9c, 0x9c, 0x96, 0x4a, 0x07, 0x27, 0x27, 0xe9, 0x31, 0xfe, 0xf1, 0x74,
-	0xb7, 0x7c, 0x74, 0xaa, 0x1f, 0xa4, 0x35, 0x94, 0x81, 0x85, 0xe7, 0x95, 0x17, 0xb5, 0x93, 0xd3,
-	0x6a, 0xb5, 0xa2, 0xbf, 0x38, 0xd8, 0x4f, 0x8f, 0xf3, 0xa6, 0xd3, 0xe7, 0xcf, 0x9e, 0x57, 0x5e,
-	0x3d, 0xaf, 0x1d, 0xe8, 0x7a, 0x45, 0x4f, 0x4f, 0xe0, 0x0a, 0x64, 0x2a, 0xcd, 0xdd, 0x16, 0x71,
-	0xd8, 0x49, 0xb7, 0x4e, 0x1b, 0x9e, 0x55, 0x27, 0x1e, 0x8f, 0x27, 0x6e, 0xd3, 0xe0, 0x8d, 0xfd,
-	0x13, 0xab, 0xcf, 0xa9, 0x96, 0xb2, 0xc9, 0x63, 0x91, 0xba, 0xdd, 0x2c, 0x53, 0x05, 0xb9, 0x59,
-	0xd9, 0x50, 0x36, 0xf1, 0x13, 0x80, 0x63, 0xd2, 0xae, 0x13, 0x8f, 0x9e, 0x59, 0x1d, 0x4e, 0x12,
-	0xbb, 0xa6, 0xe6, 0x18, 0x6d, 0xe2, 0x93, 0x44, 0xcb, 0x73, 0xa3, 0xcd, 0x23, 0xfe, 0x78, 0x1f,
-	0x31, 0x6e, 0x99, 0xf8, 0x00, 0x52, 0x4f, 0x6d, 0xf7, 0xed, 0x31, 0x61, 0x06, 0x5f, 0x0b, 0xf4,
-	0x31, 0x4c, 0xb7, 0x49, 0x20, 0xf2, 0x6c, 0x16, 0x82, 0x57, 0xb1, 0xdb, 0xec, 0xd4, 0x84, 0xb8,
-	0x26, 0x43, 0xbe, 0xae, 0x3a, 0x3f, 0xf8, 0x4f, 0x01, 0x16, 0xe4, 0xc1, 0x3e, 0x21, 0x1e, 0x5f,
-	0x24, 0xa4, 0xc3, 0xe2, 0x69, 0xc7, 0x34, 0x18, 0x39, 0x72, 0x5b, 0x47, 0xa4, 0x47, 0x6c, 0xb4,
-	0x54, 0x50, 0xa9, 0xc6, 0x91, 0xdb, 0x6a, 0x59, 0x4e, 0x2b, 0xbf, 0x5a, 0x90, 0x09, 0x4c, 0xc1,
-	0x4f, 0x60, 0x0a, 0x07, 0x3c, 0x81, 0xc1, 0x6b, 0x5f, 0xfe, 0xfd, 0x5f, 0x5f, 0x8f, 0x67, 0x70,
-	0x4a, 0xe4, 0x3d, 0xbd, 0xfb, 0x3c, 0xd5, 0xa0, 0x8f, 0xb5, 0x6d, 0x54, 0x85, 0xd4, 0x21, 0x61,
-	0x3e, 0x90, 0xa2, 0xdc, 0x10, 0xb1, 0xe4, 0xb6, 0x3b, 0xae, 0x43, 0x1c, 0x96, 0x4f, 0x0f, 0x49,
-	0x28, 0x5e, 0x16, 0xd0, 0x45, 0x14, 0x82, 0xa2, 0x57, 0xb0, 0x70, 0x48, 0x58, 0xc0, 0x7d, 0x09,
-	0x36, 0xe5, 0xfb, 0xe7, 0x77, 0xd0, 0x17, 0xe7, 0x05, 0x72, 0x19, 0x21, 0x1f, 0xd9, 0x1e, 0x70,
-	0x5e, 0x43, 0x5a, 0x4e, 0x3f, 0xc0, 0x8e, 0x61, 0x24, 0xfa, 0x60, 0x53, 0xb0, 0xd7, 0x70, 0x0c,
-	0x9b, 0x7b, 0x62, 0x1f, 0xe6, 0x0e, 0x09, 0x53, 0xa1, 0x34, 0xc9, 0xe6, 0x7e, 0xb4, 0x92, 0xfd,
-	0xf0, 0x92, 0x60, 0xce, 0xa1, 0x19, 0xc5, 0x44, 0xaf, 0x21, 0x73, 0x64, 0x51, 0x16, 0x8e, 0xe7,
-	0x49, 0xb4, 0x95, 0xb8, 0xc0, 0x4e, 0xf1, 0x35, 0x01, 0xcd, 0xa2, 0x8c, 0x6f, 0xa8, 0xd5, 0x27,
-	0x9d, 0xc0, 0xd2, 0x21, 0x09, 0xd1, 0x11, 0xf8, 0xeb, 0x52, 0xde, 0xcf, 0xc7, 0xde, 0x14, 0xf8,
-	0x3d, 0xc1, 0xcb, 0xa1, 0xd5, 0x08, 0xaf, 0xf8, 0xce, 0x32, 0xbf, 0x40, 0x3a, 0xa4, 0xb8, 0xcd,
-	0xbb, 0x7e, 0xb8, 0x4f, 0x32, 0x37, 0x3d, 0x74, 0x59, 0x50, 0x9c, 0x13, 0x64, 0x84, 0xd2, 0x3e,
-	0xb9, 0x7f, 0x65, 0x10, 0x40, 0x9c, 0x79, 0x14, 0x8e, 0xfe, 0x49, 0xe4, 0xd5, 0xd8, 0x7b, 0x84,
-	0xe2, 0xeb, 0x82, 0x7f, 0x0d, 0xad, 0x05, 0x76, 0x58, 0xf0, 0x1a, 0x42, 0xbf, 0x86, 0xb4, 0xdc,
-	0xbe, 0x83, 0x51, 0x21, 0x87, 0xc4, 0x5f, 0x50, 0xf8, 0x96, 0xe0, 0xbe, 0x87, 0x36, 0x12, 0xb8,
-	0xd2, 0x2f, 0x4d, 0x58, 0x8d, 0xcc, 0xa1, 0xea, 0x7a, 0x8c, 0xc6, 0xfb, 0x5c, 0xf5, 0x13, 0x3d,
-	0xf0, 0xb6, 0xd0, 0x70, 0x0b, 0xe1, 0x8b, 0x34, 0x14, 0x3b, 0x82, 0xf6, 0x39, 0x2c, 0x0f, 0x4f,
-	0x82, 0x43, 0xd0, 0x4a, 0x0c, 0xb9, 0x6c, 0xe6, 0xb3, 0x31, 0xcd, 0xf8, 0xa1, 0xd0, 0x57, 0x40,
-	0x1f, 0x5d, 0xae, 0xaf, 0xf8, 0x8e, 0xff, 0x53, 0xe3, 0x33, 0xfc, 0xbd, 0x06, 0x6b, 0x07, 0x22,
-	0x37, 0xbb, 0xb2, 0xf6, 0xa4, 0xd3, 0xf5, 0x44, 0x18, 0xf0, 0x31, 0xde, 0x19, 0xc5, 0x80, 0xa2,
-	0x4a, 0x0c, 0xbf, 0xd2, 0x20, 0xb7, 0x6f, 0xd1, 0xef, 0xc5, 0x90, 0x1f, 0x0b, 0x43, 0x1e, 0xe1,
-	0x87, 0x23, 0x19, 0x62, 0x4a, 0xed, 0xc8, 0x8c, 0x59, 0x73, 0x1e, 0xcd, 0xc3, 0x6b, 0x8e, 0x42,
-	0x21, 0x5c, 0xc8, 0xaf, 0xb8, 0xe2, 0x4d, 0xc1, 0xfa, 0xad, 0x06, 0x1b, 0xfd, 0x50, 0x1e, 0x56,
-	0xf4, 0x42, 0x98, 0xb1, 0x11, 0x51, 0x20, 0xda, 0xe5, 0x98, 0xc4, 0xa9, 0xdf, 0x15, 0x26, 0xdc,
-	0xc1, 0x57, 0x30, 0x81, 0x47, 0xbc, 0xdf, 0x69, 0xb0, 0x19, 0x63, 0xc5, 0x31, 0xbf, 0x7f, 0xa4,
-	0x19, 0xeb, 0x21, 0x33, 0x84, 0xe0, 0xd8, 0x35, 0x2f, 0xb1, 0xa2, 0x20, 0xac, 0xd8, 0xc2, 0xef,
-	0x5f, 0x68, 0x85, 0xbc, 0xe5, 0xb8, 0x19, 0x2d, 0x58, 0x8b, 0xb8, 0x5c, 0xa8, 0x0a, 0xfb, 0x3c,
-	0x1b, 0xb5, 0x85, 0xe2, 0x0f, 0x85, 0xae, 0x0f, 0xd0, 0x55, 0x74, 0x21, 0x06, 0xeb, 0xb1, 0x6b,
-	0xab, 0xd2, 0xbb, 0xa0, 0xb2, 0xb5, 0x88, 0xff, 0x65, 0x27, 0x7c, 0x4f, 0x28, 0xdc, 0x46, 0x5b,
-	0x97, 0xba, 0x58, 0x65, 0x9a, 0xe8, 0x6b, 0x0d, 0x6e, 0x26, 0xac, 0xb5, 0x60, 0x4a, 0x4f, 0xdf,
-	0x8c, 0x57, 0x78, 0x95, 0x55, 0xdf, 0x11, 0x26, 0xdd, 0xc5, 0x57, 0x36, 0x89, 0x3b, 0xbd, 0x02,
-	0xf3, 0xdc, 0x17, 0x97, 0x05, 0xe6, 0xa5, 0x70, 0x82, 0x4c, 0xfd, 0x44, 0x02, 0x2d, 0xf9, 0xca,
-	0xfc, 0x48, 0x5c, 0x81, 0x85, 0x01, 0xb0, 0x6c, 0x26, 0x23, 0xe7, 0x07, 0x6e, 0x8e, 0xb9, 0xea,
-	0x24, 0xce, 0x32, 0x29, 0x3a, 0x85, 0xb4, 0x4e, 0x1a, 0xae, 0xd3, 0xb0, 0x6c, 0xe2, 0x9b, 0x19,
-	0x1c, 0x9b, 0xe8, 0x8f, 0x0d, 0xc1, 0x5c, 0xc5, 0x51, 0x26, 0x9f, 0xf8, 0x81, 0xb8, 0xe6, 0x63,
-	0xae, 0x8a, 0xa1, 0x87, 0x88, 0x8f, 0x41, 0xcb, 0x43, 0x33, 0x95, 0x77, 0xc3, 0xcf, 0x20, 0x55,
-	0xf2, 0x88, 0xc1, 0x94, 0x69, 0x68, 0x68, 0x74, 0x84, 0xa6, 0x12, 0x1b, 0x3c, 0xec, 0x37, 0x6e,
-	0xd2, 0x2b, 0x48, 0xc9, 0x20, 0x1c, 0x63, 0x55, 0xd2, 0x24, 0xdf, 0x17, 0xbc, 0x4d, 0xbc, 0x1e,
-	0x67, 0x9d, 0x1f, 0x56, 0x7f, 0x09, 0x0b, 0x2a, 0xaa, 0x8e, 0x40, 0x56, 0x77, 0x23, 0xde, 0x88,
-	0x25, 0xfb, 0x71, 0xf2, 0x15, 0xa4, 0x74, 0x52, 0x77, 0x5d, 0xf6, 0xbd, 0xd9, 0xec, 0x09, 0x1c,
-	0x07, 0xef, 0x13, 0x9b, 0xb0, 0xef, 0xe0, 0x8c, 0xed, 0x78, 0xb0, 0x29, 0x70, 0xa8, 0x0b, 0x0b,
-	0xfb, 0xee, 0x5b, 0xc7, 0x76, 0x0d, 0xb3, 0xdc, 0x36, 0x5a, 0x64, 0x70, 0xaf, 0x88, 0x4f, 0x5f,
-	0x96, 0x5f, 0xf1, 0x15, 0x56, 0x3a, 0xc4, 0x13, 0xc5, 0x41, 0xfe, 0xa0, 0xc1, 0x8f, 0x84, 0x8e,
-	0x7b, 0xf8, 0xc3, 0x58, 0x1d, 0x16, 0x47, 0xd4, 0x4c, 0xc5, 0xa0, 0xc5, 0x77, 0xfc, 0xa9, 0xf0,
-	0x05, 0x5f, 0xdc, 0x2f, 0x35, 0x58, 0x3d, 0x24, 0x2c, 0xa4, 0x43, 0x96, 0x01, 0x92, 0x0d, 0x88,
-	0x6b, 0xc6, 0x8f, 0x85, 0x01, 0x0f, 0xd1, 0x83, 0x11, 0x0c, 0x28, 0x52, 0xa9, 0xa9, 0x2b, 0xd2,
-	0xa4, 0x10, 0x6f, 0x44, 0xed, 0x2a, 0xc8, 0xa0, 0x51, 0xa6, 0x8f, 0x9a, 0x32, 0x09, 0x0c, 0x91,
-	0xe8, 0xd0, 0x8a, 0xc6, 0x69, 0xa3, 0xf8, 0x23, 0xa1, 0xee, 0x36, 0xba, 0x75, 0x15, 0x75, 0xe8,
-	0x73, 0xc8, 0x96, 0x78, 0x3e, 0x6b, 0x5f, 0x71, 0x86, 0xb1, 0x0b, 0xac, 0x66, 0xb8, 0x3d, 0xd2,
-	0x0c, 0xff, 0xa8, 0x41, 0x76, 0xb7, 0xc1, 0xac, 0x9e, 0xc1, 0x88, 0xd0, 0x22, 0x63, 0xf5, 0x88,
-	0xaa, 0x4b, 0x42, 0xf5, 0x27, 0xf8, 0x87, 0xa3, 0x2c, 0xad, 0x6c, 0xee, 0x0a, 0x7d, 0x7c, 0xa3,
-	0xfd, 0x41, 0x83, 0x8c, 0x4e, 0x7a, 0xc4, 0x63, 0xff, 0x17, 0x43, 0x3c, 0xa1, 0x5a, 0x3e, 0x29,
-	0x97, 0x06, 0x37, 0x41, 0x34, 0x5f, 0x5e, 0xf0, 0x2d, 0x92, 0x89, 0x32, 0x16, 0x2a, 0x37, 0x50,
-	0x3e, 0x56, 0xa5, 0x4c, 0x90, 0x5f, 0x43, 0x36, 0x40, 0x6c, 0x97, 0xc4, 0x43, 0x39, 0x4c, 0xcd,
-	0xf4, 0xa9, 0xbe, 0x18, 0xdf, 0x11, 0xe4, 0x9b, 0xe8, 0x7a, 0x3c, 0xb9, 0xad, 0x1e, 0xdc, 0x14,
-	0x39, 0xb0, 0x22, 0xbd, 0x35, 0xac, 0x20, 0x0a, 0x4d, 0x0c, 0x41, 0x2a, 0xfb, 0xc3, 0x97, 0x29,
-	0xe3, 0x0e, 0x3a, 0x0d, 0x3a, 0xe8, 0x6a, 0xc9, 0xe5, 0xc5, 0x5e, 0x92, 0x49, 0x25, 0x81, 0xe5,
-	0x30, 0x76, 0x94, 0xbc, 0x66, 0x4b, 0x28, 0xc0, 0xe8, 0x46, 0xa2, 0x02, 0x3f, 0x9f, 0xf9, 0x2c,
-	0x68, 0xbd, 0xac, 0xae, 0x25, 0x5d, 0xf5, 0xd9, 0x68, 0x85, 0x8e, 0x26, 0xdd, 0xab, 0xb2, 0xb4,
-	0x87, 0x74, 0x51, 0x3d, 0x18, 0xf4, 0x1f, 0xf2, 0x4c, 0x84, 0x87, 0x6f, 0x0a, 0xdc, 0x3a, 0xba,
-	0x16, 0x87, 0x93, 0x77, 0x75, 0x0d, 0xd2, 0x03, 0x8b, 0x95, 0x53, 0x92, 0x4c, 0x5e, 0x8e, 0xa9,
-	0x08, 0x52, 0xbf, 0x74, 0x80, 0x56, 0x86, 0x94, 0x28, 0x97, 0x3c, 0x85, 0xf4, 0x09, 0xf3, 0x88,
-	0xd1, 0xae, 0x1a, 0x8d, 0x37, 0x84, 0xd1, 0x4a, 0x97, 0xa1, 0xd5, 0x90, 0xa7, 0xa5, 0xa0, 0xd2,
-	0x65, 0x89, 0x1b, 0x68, 0x6c, 0x4b, 0x43, 0x07, 0x22, 0xe5, 0x21, 0x56, 0x8f, 0x28, 0x50, 0xd9,
-	0xb9, 0xa0, 0x76, 0x10, 0xe5, 0x97, 0x1d, 0x3c, 0x76, 0x4f, 0x43, 0xcf, 0x20, 0xab, 0x30, 0xa5,
-	0x33, 0xc3, 0x69, 0x11, 0x51, 0x97, 0x4c, 0x9e, 0x72, 0x2e, 0x44, 0x0a, 0x0c, 0x11, 0xb0, 0x53,
-	0x58, 0xec, 0x2f, 0x88, 0xfc, 0x89, 0x27, 0x9c, 0x94, 0x47, 0xdd, 0x95, 0xb4, 0x59, 0x95, 0xb7,
-	0xfc, 0x35, 0xc9, 0xc8, 0xfc, 0x29, 0xf8, 0x73, 0x42, 0x5c, 0x25, 0x35, 0x1f, 0xd7, 0x88, 0x6f,
-	0x08, 0x15, 0x79, 0xdc, 0x5f, 0x90, 0x50, 0x61, 0x96, 0x1f, 0xb2, 0x97, 0xc2, 0xee, 0x20, 0x3d,
-	0xf6, 0xd1, 0x1e, 0xfc, 0x91, 0x20, 0x6a, 0x78, 0x88, 0x2a, 0x0d, 0x37, 0x21, 0x23, 0x83, 0xc5,
-	0x77, 0x33, 0xfc, 0x03, 0xa1, 0xe2, 0x7a, 0xfe, 0x02, 0x15, 0xdc, 0x7a, 0x13, 0x32, 0x32, 0x0b,
-	0xba, 0x54, 0x4b, 0xd2, 0x7e, 0x52, 0x73, 0xd9, 0xbe, 0x68, 0x2e, 0xea, 0x60, 0x84, 0x7e, 0x28,
-	0xb9, 0xf4, 0x60, 0x84, 0x3c, 0x16, 0x39, 0x18, 0x21, 0x2d, 0xe8, 0x48, 0x24, 0xdb, 0xe2, 0xea,
-	0xa1, 0xf1, 0xc9, 0xb6, 0x94, 0xf9, 0x19, 0x1c, 0x5a, 0x4f, 0xbe, 0x78, 0x28, 0xfa, 0x05, 0xcc,
-	0xfa, 0x85, 0xe3, 0x10, 0x2c, 0x97, 0x54, 0x81, 0xc6, 0xb7, 0x05, 0xf6, 0x06, 0x7e, 0x2f, 0x16,
-	0x4b, 0x89, 0xdd, 0xac, 0x31, 0x4e, 0x7b, 0x29, 0xf2, 0xa3, 0x50, 0xe1, 0x7d, 0xf8, 0xed, 0x19,
-	0xa9, 0xcc, 0x47, 0x23, 0x0f, 0x3f, 0x46, 0xbc, 0x9f, 0x7a, 0x74, 0x5a, 0x75, 0xf4, 0x19, 0xa0,
-	0x43, 0xc2, 0x86, 0x6a, 0xef, 0x43, 0x05, 0xaa, 0xb8, 0xf2, 0x7c, 0xd4, 0x1f, 0x61, 0xb6, 0xa8,
-	0xf4, 0x23, 0x0a, 0x0b, 0x27, 0x56, 0xbb, 0x6b, 0x1b, 0x8c, 0x88, 0xf1, 0x68, 0xa3, 0xef, 0x88,
-	0x60, 0xb3, 0x4e, 0x7e, 0xd3, 0x25, 0x94, 0x25, 0xdd, 0xf9, 0x91, 0xa2, 0x41, 0xd8, 0x47, 0x8a,
-	0x54, 0xe3, 0x24, 0xbe, 0x33, 0x4b, 0x30, 0xd7, 0x2f, 0xb2, 0xa3, 0x6b, 0xbe, 0xc2, 0x48, 0xf9,
-	0x3d, 0x9f, 0x2c, 0xc2, 0x63, 0xe8, 0x18, 0x40, 0xbe, 0x78, 0x44, 0x81, 0x27, 0x15, 0xcc, 0x08,
-	0x12, 0x37, 0xb4, 0x7a, 0x2a, 0xe2, 0x45, 0x6e, 0xe3, 0x60, 0xb4, 0x7a, 0xcc, 0xaa, 0x77, 0xce,
-	0x08, 0xbc, 0xc1, 0x8b, 0xac, 0x77, 0xbf, 0x18, 0x18, 0xfe, 0x58, 0xdb, 0xde, 0xb3, 0x21, 0xeb,
-	0x7a, 0x2d, 0x11, 0x17, 0x1b, 0xae, 0x67, 0x2a, 0xde, 0x5e, 0x4a, 0x56, 0x7d, 0xab, 0xe2, 0xe7,
-	0xf0, 0x5f, 0x15, 0x5a, 0x16, 0x3b, 0xeb, 0xd6, 0xb9, 0x57, 0x8b, 0x7e, 0x4f, 0xf5, 0x37, 0x07,
-	0x77, 0xfd, 0xbf, 0x40, 0xd8, 0x29, 0xb6, 0x5c, 0xd5, 0xf6, 0xb7, 0xf1, 0xd5, 0x8a, 0xcf, 0x7b,
-	0x19, 0x2c, 0x22, 0x57, 0xc7, 0xab, 0x13, 0xd5, 0xc9, 0xea, 0x54, 0x75, 0xba, 0x3a, 0x53, 0x9d,
-	0xad, 0x4f, 0x8b, 0xb1, 0x3b, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x70, 0x28, 0xbe, 0x4c, 0xcd,
-	0x20, 0x00, 0x00,
+	// 2488 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x4b, 0x73, 0xdb, 0xc8,
+	0xf1, 0x17, 0xf4, 0x56, 0x8b, 0x92, 0xc8, 0xa1, 0x1e, 0x34, 0x25, 0xf9, 0x31, 0xeb, 0xb5, 0xf5,
+	0xd7, 0xae, 0x49, 0xdb, 0xb2, 0x5d, 0xff, 0xd8, 0xd9, 0xca, 0xea, 0x65, 0x85, 0xb1, 0x65, 0x32,
+	0xa0, 0x65, 0xe7, 0xb1, 0x2e, 0x16, 0x48, 0x0c, 0x29, 0x94, 0x41, 0x82, 0x01, 0x86, 0xf2, 0xaa,
+	0x5c, 0x5b, 0xa9, 0xda, 0x3c, 0x36, 0xf7, 0xbd, 0xe7, 0x94, 0x54, 0xaa, 0xf2, 0x1d, 0xf2, 0x11,
+	0xf6, 0x94, 0x53, 0xae, 0xa9, 0x1c, 0xf2, 0x09, 0xf6, 0x9c, 0x9a, 0x9e, 0x01, 0x09, 0x10, 0x80,
+	0x1e, 0x9b, 0xad, 0xca, 0x49, 0xc2, 0x74, 0xcf, 0xef, 0xd7, 0xd3, 0x3d, 0xd3, 0xd3, 0x68, 0x10,
+	0xf2, 0x27, 0x8e, 0xcd, 0x8f, 0x8d, 0x5a, 0xd7, 0x75, 0xb8, 0xe3, 0x15, 0xe5, 0x53, 0x01, 0x9f,
+	0xc8, 0xa4, 0x7c, 0xca, 0xaf, 0xb5, 0x1c, 0xa7, 0x65, 0xb3, 0xa2, 0xd1, 0xb5, 0x8a, 0x46, 0xa7,
+	0xe3, 0x70, 0x83, 0x5b, 0x4e, 0xc7, 0x93, 0x5a, 0xf9, 0x55, 0x25, 0xc5, 0xa7, 0x7a, 0xaf, 0x59,
+	0x64, 0xed, 0x2e, 0x3f, 0x55, 0xc2, 0x5c, 0x18, 0xbe, 0xcd, 0xb8, 0x02, 0xcf, 0x0f, 0x11, 0x37,
+	0x9c, 0x76, 0xdb, 0xe9, 0xc4, 0xcb, 0x8e, 0x99, 0x61, 0xf3, 0x63, 0x25, 0xa3, 0x61, 0x99, 0xed,
+	0xb4, 0xac, 0x86, 0x61, 0xd7, 0x4c, 0x76, 0x62, 0x35, 0x58, 0xfc, 0xfc, 0x90, 0x6c, 0x35, 0x2c,
+	0x33, 0x4c, 0xa3, 0xcb, 0x99, 0xab, 0x84, 0xd7, 0xc2, 0x42, 0xa7, 0xcb, 0x3a, 0x4d, 0xdb, 0x79,
+	0x57, 0xbb, 0xb7, 0x95, 0xa0, 0xd0, 0x6e, 0x58, 0xb5, 0xb6, 0x55, 0xaf, 0x99, 0x75, 0xa5, 0x70,
+	0x23, 0x46, 0xc1, 0xb0, 0x0d, 0xb7, 0xdd, 0x57, 0xa1, 0x7f, 0xd2, 0x60, 0x76, 0x0f, 0x4d, 0x3a,
+	0x70, 0x9d, 0x5e, 0x97, 0x2c, 0xc1, 0xa8, 0x65, 0xe6, 0xb4, 0xeb, 0xda, 0xc6, 0xcc, 0xce, 0xc4,
+	0xbf, 0xbf, 0xfd, 0x66, 0x5d, 0xd3, 0x47, 0x2d, 0x93, 0x94, 0x60, 0x21, 0xbc, 0x38, 0x2f, 0x37,
+	0x7a, 0x7d, 0x6c, 0x63, 0xf6, 0xfe, 0x52, 0x41, 0x45, 0xe9, 0xb9, 0x14, 0x4b, 0xac, 0x9d, 0x99,
+	0x7f, 0x7e, 0xfb, 0xcd, 0xfa, 0xb8, 0xc0, 0xd2, 0xe7, 0xed, 0xa0, 0xc4, 0x23, 0x5b, 0x30, 0xe5,
+	0x43, 0x8c, 0x21, 0xc4, 0xbc, 0x0f, 0x11, 0x9d, 0xeb, 0x6b, 0xd2, 0x1f, 0x40, 0x2a, 0x60, 0xa5,
+	0x47, 0xfe, 0x0f, 0x26, 0x2c, 0xce, 0xda, 0x5e, 0x4e, 0x43, 0x88, 0x6c, 0x18, 0x02, 0x95, 0x74,
+	0xa9, 0x41, 0xff, 0xa8, 0x01, 0xd9, 0x3f, 0x61, 0x1d, 0xfe, 0xd4, 0xb2, 0x39, 0x73, 0xf5, 0x9e,
+	0xcd, 0x9e, 0xb1, 0x53, 0xfa, 0x95, 0x06, 0xd9, 0xa1, 0xe1, 0x97, 0xa7, 0x5d, 0x46, 0xe6, 0x01,
+	0x9a, 0x38, 0x52, 0x33, 0x6c, 0x3b, 0x3d, 0x42, 0x52, 0x30, 0xdd, 0x30, 0x38, 0x6b, 0x39, 0xee,
+	0x69, 0x5a, 0x23, 0x69, 0x48, 0x79, 0xbd, 0x7a, 0xad, 0x3f, 0x32, 0x4a, 0x08, 0xcc, 0xbf, 0xed,
+	0x5a, 0x35, 0x26, 0xa0, 0x6a, 0xfc, 0xb4, 0xcb, 0xd2, 0x63, 0x64, 0x09, 0x32, 0x0d, 0xa7, 0xd3,
+	0xb4, 0x5a, 0xc1, 0xe1, 0x71, 0x31, 0x2c, 0xd7, 0x13, 0x1c, 0x9e, 0xa0, 0x16, 0x2c, 0x0c, 0x19,
+	0x42, 0x3e, 0x85, 0xb1, 0xb7, 0xec, 0x14, 0xc3, 0x30, 0x7f, 0xbf, 0xe0, 0x2f, 0x2e, 0xba, 0x8a,
+	0x42, 0xcc, 0x0a, 0x74, 0x31, 0x95, 0x2c, 0xc2, 0xc4, 0x89, 0x61, 0xf7, 0x58, 0x6e, 0x54, 0x84,
+	0x52, 0x97, 0x0f, 0xf4, 0x2f, 0x1a, 0xcc, 0x06, 0xa6, 0x24, 0x45, 0x7b, 0x19, 0x26, 0x59, 0xc7,
+	0xa8, 0xdb, 0x72, 0xf6, 0xb4, 0xae, 0x9e, 0xc8, 0x2a, 0xcc, 0xa8, 0x05, 0x58, 0x66, 0x6e, 0x0c,
+	0x81, 0xa7, 0xe5, 0x40, 0xc9, 0x24, 0xeb, 0x00, 0x83, 0x65, 0xe5, 0xc6, 0x51, 0x3a, 0x83, 0x23,
+	0xe8, 0xd7, 0x3b, 0x30, 0xe1, 0xf6, 0x6c, 0xe6, 0xe5, 0x26, 0x30, 0x62, 0x2b, 0x09, 0x8b, 0xd2,
+	0xa5, 0x16, 0xfd, 0x04, 0x52, 0x01, 0x89, 0x47, 0xee, 0xc0, 0x94, 0x0c, 0x4b, 0x24, 0xe4, 0x41,
+	0x00, 0x5f, 0x87, 0xbe, 0x85, 0xd4, 0xae, 0xe3, 0xb2, 0x52, 0xc7, 0xe3, 0x46, 0xa7, 0xc1, 0xc8,
+	0x2d, 0x98, 0xb5, 0xd4, 0xff, 0xb5, 0xe1, 0x15, 0x83, 0x2f, 0x29, 0x99, 0x64, 0x0b, 0x26, 0xe5,
+	0x01, 0xc7, 0x95, 0xcf, 0xde, 0x5f, 0xf4, 0x59, 0x7e, 0x8c, 0xa3, 0x55, 0x6e, 0xf0, 0x9e, 0xb7,
+	0x33, 0x21, 0x76, 0xe8, 0x88, 0xae, 0x54, 0xe9, 0x13, 0x98, 0x0b, 0x92, 0x79, 0x64, 0x33, 0xbc,
+	0x3b, 0xfb, 0x20, 0x41, 0x2d, 0x7f, 0x7b, 0x3e, 0x84, 0x85, 0x72, 0xbb, 0x61, 0xbd, 0x64, 0x1e,
+	0xd7, 0xd9, 0xaf, 0x7a, 0xcc, 0xe3, 0x64, 0x7e, 0x10, 0x15, 0x0c, 0x07, 0x81, 0xf1, 0x5e, 0xcf,
+	0x32, 0x55, 0x28, 0xf1, 0x7f, 0xfa, 0x6b, 0x48, 0xc9, 0x29, 0x5e, 0xd7, 0xe9, 0x78, 0x8c, 0xfc,
+	0x08, 0x26, 0x5d, 0xe6, 0xf5, 0x6c, 0xae, 0x36, 0xcd, 0x6d, 0x9f, 0x33, 0xa8, 0x15, 0x7a, 0xd0,
+	0x51, 0x5d, 0x57, 0xd3, 0x68, 0x01, 0x48, 0x54, 0x4a, 0x66, 0x61, 0xaa, 0x7a, 0xb4, 0xbb, 0xbb,
+	0x5f, 0xad, 0xa6, 0x47, 0xc4, 0xc3, 0xd3, 0xed, 0xd2, 0xf3, 0x23, 0x7d, 0x3f, 0xad, 0xd1, 0x7f,
+	0x8c, 0xc3, 0xe4, 0x2b, 0xa4, 0x20, 0xd7, 0x60, 0xea, 0x84, 0xb9, 0x9e, 0xe5, 0x74, 0xc2, 0x8e,
+	0xf5, 0x47, 0xc9, 0x23, 0x98, 0x56, 0xa9, 0xcd, 0x4f, 0x1b, 0x0b, 0xbe, 0x79, 0xdb, 0x72, 0x3c,
+	0x78, 0xe8, 0xfb, 0xba, 0x71, 0x59, 0x67, 0xec, 0xbf, 0xcf, 0x3a, 0xe3, 0x17, 0xcd, 0x3a, 0xe4,
+	0x53, 0x48, 0xa9, 0xfd, 0x2e, 0xf6, 0xb4, 0xbf, 0x75, 0x49, 0x78, 0xa6, 0xd8, 0xdd, 0xc1, 0xd9,
+	0xb3, 0x66, 0x7f, 0xd8, 0x23, 0xbb, 0x30, 0xa7, 0x10, 0x5a, 0x98, 0xb8, 0x72, 0x93, 0x89, 0xf9,
+	0x2a, 0x88, 0xa1, 0x68, 0x55, 0xb2, 0xdb, 0x85, 0x39, 0x79, 0xb2, 0xfc, 0x13, 0x30, 0x95, 0x78,
+	0x02, 0x42, 0x20, 0x2c, 0x78, 0x80, 0x7e, 0x0a, 0x99, 0xc1, 0x05, 0x61, 0x70, 0xa3, 0x6e, 0x78,
+	0x2c, 0xb7, 0xa6, 0x80, 0x84, 0xa4, 0x70, 0x68, 0xd5, 0xa5, 0x39, 0x7b, 0x06, 0x37, 0x76, 0xd2,
+	0x02, 0x68, 0x36, 0x70, 0xe0, 0xf5, 0x05, 0xa1, 0x25, 0x94, 0xd4, 0x6c, 0xf2, 0x1a, 0xb2, 0xc1,
+	0x2b, 0xc5, 0x07, 0x5d, 0x57, 0x21, 0x42, 0xd0, 0x6d, 0x21, 0x3b, 0x13, 0x16, 0xcd, 0x92, 0x6a,
+	0x0a, 0x81, 0xfe, 0x59, 0x83, 0x74, 0x95, 0xd9, 0xcd, 0x8b, 0xed, 0xf0, 0x61, 0xcd, 0xe0, 0x40,
+	0x70, 0x87, 0x57, 0x60, 0x3e, 0x2c, 0x49, 0xde, 0xdd, 0x24, 0x03, 0x73, 0x2f, 0xca, 0x2f, 0x6b,
+	0xd5, 0xa3, 0x4a, 0xa5, 0xac, 0xbf, 0xdc, 0xdf, 0x4b, 0x8f, 0x8a, 0xa1, 0xa3, 0x17, 0xcf, 0x5e,
+	0x94, 0x5f, 0xbf, 0xa8, 0xed, 0xeb, 0x7a, 0x59, 0x4f, 0x8f, 0xd1, 0x32, 0x64, 0xca, 0xcd, 0xed,
+	0x16, 0xeb, 0xf0, 0x6a, 0xaf, 0xee, 0x35, 0x5c, 0xab, 0xce, 0x5c, 0x91, 0x07, 0x9d, 0xa6, 0x21,
+	0x06, 0xfb, 0x99, 0x46, 0x9f, 0x51, 0x23, 0x25, 0x53, 0xe4, 0x50, 0x75, 0x2b, 0xf7, 0x4f, 0xf4,
+	0xb4, 0x1c, 0x28, 0x99, 0xf4, 0x09, 0xc0, 0x21, 0x6b, 0xd7, 0x99, 0xeb, 0x1d, 0x5b, 0x5d, 0x81,
+	0x84, 0xbb, 0xa6, 0xd6, 0x31, 0xda, 0xcc, 0x47, 0xc2, 0x91, 0x17, 0x46, 0x9b, 0xa9, 0x34, 0x31,
+	0xea, 0xa7, 0x09, 0xba, 0x0f, 0xa9, 0xa7, 0xb6, 0xf3, 0xee, 0x90, 0x71, 0x43, 0xc4, 0x82, 0x3c,
+	0x84, 0xc9, 0x36, 0x0b, 0x64, 0xcc, 0xf5, 0x42, 0xb0, 0x84, 0x70, 0x9a, 0xdd, 0x1a, 0x8a, 0x6b,
+	0xf2, 0xaa, 0xd2, 0x95, 0xf2, 0xfd, 0xbf, 0x15, 0x60, 0x4e, 0x1e, 0xec, 0x2a, 0x73, 0x45, 0x90,
+	0xc8, 0x6b, 0x98, 0x3b, 0x60, 0x3c, 0x60, 0xd8, 0x72, 0x41, 0x96, 0x59, 0x05, 0xbf, 0xcc, 0x2a,
+	0xec, 0x8b, 0x32, 0x2b, 0xdf, 0x3f, 0x19, 0x03, 0x5d, 0x9a, 0xff, 0xf2, 0xef, 0xff, 0xfa, 0x7a,
+	0x74, 0x91, 0x10, 0xac, 0xd8, 0x4e, 0xee, 0x15, 0xdb, 0x03, 0x9c, 0x37, 0x90, 0x3e, 0xea, 0x9a,
+	0x06, 0x67, 0x01, 0xec, 0x18, 0x8c, 0x7c, 0x02, 0x1f, 0x5d, 0x47, 0xec, 0x15, 0x1a, 0x83, 0xfd,
+	0x58, 0xdb, 0x24, 0x7b, 0x30, 0x73, 0xc0, 0xb8, 0x4a, 0x52, 0x49, 0x36, 0xf7, 0xf3, 0x80, 0xd4,
+	0xa3, 0x0b, 0x88, 0x39, 0x43, 0xa6, 0x14, 0x26, 0x79, 0x03, 0x99, 0xe7, 0x96, 0xc7, 0xc3, 0x19,
+	0x3e, 0x09, 0x6d, 0x29, 0x2e, 0xd5, 0x7b, 0xf4, 0x0a, 0x82, 0x66, 0x49, 0xc6, 0x37, 0xd4, 0xea,
+	0x23, 0x55, 0x61, 0xe1, 0x80, 0x85, 0xd0, 0x09, 0x14, 0x54, 0x01, 0x5a, 0xda, 0xcb, 0xc7, 0xde,
+	0x1d, 0xf4, 0x2a, 0xe2, 0xe5, 0xc8, 0x72, 0x04, 0xaf, 0xf8, 0xde, 0x32, 0xbf, 0x20, 0x3a, 0xa4,
+	0x84, 0xcd, 0xdb, 0x7e, 0x22, 0x4d, 0x32, 0x37, 0x3d, 0x94, 0x86, 0x3d, 0x9a, 0x43, 0x64, 0x42,
+	0xd2, 0x3e, 0x72, 0x3f, 0x19, 0x33, 0x20, 0x02, 0xf3, 0x79, 0x38, 0xaf, 0x26, 0x21, 0x2f, 0xc7,
+	0x66, 0x68, 0x8f, 0x5e, 0x43, 0xfc, 0x2b, 0x64, 0xc5, 0xc7, 0x1f, 0x4a, 0xf0, 0xe4, 0x97, 0x90,
+	0x3e, 0x60, 0x61, 0x96, 0x90, 0x43, 0xe2, 0x53, 0x3f, 0xbd, 0x89, 0xb8, 0x57, 0xc9, 0x5a, 0x02,
+	0xae, 0xf4, 0x4b, 0x13, 0x96, 0x23, 0x6b, 0xa8, 0x38, 0x2e, 0xf7, 0xe2, 0x7d, 0xae, 0xf4, 0x50,
+	0x83, 0x6e, 0x22, 0xc3, 0x4d, 0x42, 0xcf, 0x62, 0x28, 0x76, 0x11, 0xed, 0x73, 0x58, 0x1c, 0x5e,
+	0x84, 0x00, 0x21, 0x4b, 0x31, 0xc8, 0x25, 0x33, 0x9f, 0x8d, 0x19, 0xa6, 0x0f, 0x90, 0xaf, 0x40,
+	0x3e, 0x3e, 0x9f, 0xaf, 0xf8, 0x5e, 0xfc, 0xa9, 0x89, 0x15, 0xfe, 0x4e, 0x83, 0x95, 0x7d, 0xac,
+	0xd6, 0x2e, 0xcc, 0x9e, 0x74, 0xba, 0x9e, 0xa0, 0x01, 0x0f, 0xe9, 0xd6, 0x65, 0x0c, 0x28, 0xaa,
+	0x52, 0xf1, 0x2b, 0x0d, 0x72, 0x7b, 0x96, 0xf7, 0xbd, 0x18, 0xf2, 0x43, 0x34, 0xe4, 0x11, 0x7d,
+	0x70, 0x29, 0x43, 0x4c, 0xc9, 0x4e, 0xcc, 0x98, 0x98, 0x8b, 0x3c, 0x19, 0x8e, 0x39, 0x09, 0x25,
+	0x47, 0x94, 0x5f, 0x30, 0xe2, 0x4d, 0xc4, 0xfa, 0x8d, 0x06, 0x6b, 0x32, 0x97, 0x45, 0x88, 0x5e,
+	0xa2, 0x19, 0x6b, 0x11, 0x02, 0x1c, 0x97, 0x73, 0x12, 0x97, 0x7e, 0x07, 0x4d, 0xb8, 0x4d, 0x2f,
+	0x60, 0x82, 0xc8, 0x78, 0xbf, 0xd5, 0x60, 0x3d, 0xc6, 0x8a, 0x43, 0x91, 0xd9, 0xa5, 0x19, 0xab,
+	0x21, 0x33, 0x50, 0x70, 0xe8, 0x98, 0xe7, 0x58, 0x51, 0x40, 0x2b, 0x36, 0xe8, 0x07, 0x67, 0x5a,
+	0x21, 0xef, 0x0f, 0x61, 0x46, 0x0b, 0x56, 0x22, 0x2e, 0x47, 0xaa, 0xb0, 0xcf, 0xb3, 0x51, 0x5b,
+	0x3c, 0xfa, 0x11, 0x72, 0x7d, 0x48, 0x2e, 0xc2, 0x45, 0x38, 0xac, 0xc6, 0xc6, 0x56, 0x15, 0x4e,
+	0x41, 0xb2, 0x95, 0x88, 0xff, 0xa5, 0x12, 0xbd, 0x8b, 0x84, 0x9b, 0x64, 0xe3, 0x5c, 0x17, 0xab,
+	0x1a, 0x8e, 0x7c, 0xad, 0xc1, 0x8d, 0x84, 0x58, 0x23, 0xa6, 0xf4, 0xf4, 0x8d, 0x78, 0xc2, 0x8b,
+	0x44, 0x7d, 0x0b, 0x4d, 0xba, 0x43, 0x2f, 0x6c, 0x92, 0x70, 0x7a, 0x19, 0x66, 0x85, 0x2f, 0xce,
+	0x4b, 0xcc, 0x0b, 0xe1, 0xd2, 0xd3, 0xa3, 0x2b, 0x48, 0x96, 0x21, 0x0b, 0x3e, 0x99, 0x9f, 0x89,
+	0xcb, 0x30, 0x37, 0x00, 0x2c, 0x99, 0xc9, 0x90, 0xb3, 0x03, 0x37, 0xc7, 0x5c, 0x75, 0x12, 0xce,
+	0x32, 0x3d, 0x72, 0x04, 0x69, 0x9d, 0x35, 0x9c, 0x4e, 0xc3, 0xb2, 0x99, 0x6f, 0x66, 0x70, 0x6e,
+	0xa2, 0x3f, 0xd6, 0x10, 0x73, 0x99, 0x46, 0x31, 0xc5, 0xc2, 0xf7, 0xf1, 0x9a, 0x8f, 0xb9, 0x2a,
+	0x86, 0x4a, 0x7c, 0x1f, 0x86, 0x2c, 0x0e, 0xad, 0x54, 0xde, 0x0d, 0x3f, 0x81, 0xd4, 0xae, 0xcb,
+	0x0c, 0xae, 0x4c, 0x23, 0x43, 0xb3, 0x23, 0x68, 0xaa, 0xb0, 0xa1, 0xc3, 0x7e, 0x13, 0x26, 0xbd,
+	0x86, 0x94, 0x4c, 0xc2, 0x31, 0x56, 0x25, 0x2d, 0xf2, 0x03, 0xc4, 0x5b, 0xa7, 0xab, 0x71, 0xd6,
+	0xf9, 0x69, 0xf5, 0xe7, 0x30, 0xa7, 0xb2, 0xea, 0x25, 0x90, 0xd5, 0xdd, 0x48, 0xd7, 0x62, 0x91,
+	0xfd, 0x3c, 0xf9, 0x1a, 0x52, 0x3a, 0xab, 0x3b, 0x0e, 0xff, 0xde, 0x6c, 0x76, 0x11, 0x4e, 0x00,
+	0xef, 0x31, 0x9b, 0xf1, 0xef, 0xe0, 0x8c, 0xcd, 0x78, 0x60, 0x13, 0xe1, 0x48, 0x0f, 0xe6, 0xf6,
+	0x9c, 0x77, 0x1d, 0xdb, 0x31, 0xcc, 0x52, 0xdb, 0x68, 0xb1, 0xc1, 0xbd, 0x82, 0x8f, 0xbe, 0x2c,
+	0xbf, 0xe4, 0x13, 0x96, 0xbb, 0xcc, 0xc5, 0x76, 0xa1, 0x78, 0x55, 0xa0, 0x8f, 0x90, 0xe3, 0x2e,
+	0xfd, 0x28, 0x96, 0xc3, 0x12, 0x10, 0x35, 0x53, 0x61, 0x78, 0xc5, 0xf7, 0xa2, 0x08, 0xff, 0x42,
+	0x04, 0xf7, 0x4b, 0x0d, 0x96, 0x0f, 0x18, 0x0f, 0x71, 0xc8, 0xc6, 0x40, 0xb2, 0x01, 0x71, 0xc3,
+	0xf4, 0x31, 0x1a, 0xf0, 0x80, 0xdc, 0xbf, 0x84, 0x01, 0x45, 0x4f, 0x32, 0xf5, 0xb0, 0x4c, 0x0a,
+	0xe1, 0x5d, 0x92, 0x5d, 0x25, 0x19, 0x72, 0x99, 0xe5, 0x93, 0xa6, 0x2c, 0x02, 0x43, 0x48, 0xde,
+	0x50, 0x44, 0xe3, 0xd8, 0x3c, 0xfa, 0x31, 0xd2, 0xdd, 0x22, 0x37, 0x2f, 0x42, 0x47, 0x3e, 0x87,
+	0xec, 0xae, 0xa8, 0x67, 0xed, 0x0b, 0xae, 0x30, 0x36, 0xc0, 0x6a, 0x85, 0x9b, 0x97, 0x5a, 0xe1,
+	0x1f, 0x34, 0xc8, 0x6e, 0x37, 0xb8, 0x75, 0x62, 0x70, 0x86, 0x2c, 0x32, 0x57, 0x5f, 0x92, 0x7a,
+	0x17, 0xa9, 0x3f, 0xa1, 0xff, 0x7f, 0x99, 0xd0, 0xca, 0xe1, 0x1e, 0xf2, 0x89, 0x8d, 0xf6, 0x7b,
+	0x0d, 0x32, 0x3a, 0x3b, 0x61, 0x2e, 0xff, 0x9f, 0x18, 0xe2, 0x22, 0xb5, 0x30, 0xa4, 0x02, 0x0b,
+	0x83, 0x9b, 0x20, 0x5a, 0x2f, 0xcf, 0xf9, 0x16, 0xc9, 0x42, 0x99, 0x22, 0xe5, 0x1a, 0xc9, 0xc7,
+	0x52, 0xca, 0x02, 0xf9, 0x0d, 0x64, 0x03, 0x88, 0xed, 0x5d, 0x7c, 0x05, 0x0d, 0xa3, 0x66, 0xfa,
+	0xa8, 0xbe, 0x98, 0xde, 0x46, 0xe4, 0x1b, 0xe4, 0x5a, 0x3c, 0x72, 0x5b, 0xbd, 0xca, 0x7a, 0xa4,
+	0x03, 0x4b, 0xd2, 0x5b, 0xc3, 0x04, 0x51, 0xd0, 0xc4, 0x14, 0xa4, 0xaa, 0x3f, 0x7a, 0x1e, 0x99,
+	0x70, 0xd0, 0x51, 0xd0, 0x41, 0x17, 0x2b, 0x2e, 0xcf, 0xf6, 0x92, 0x2c, 0x2a, 0x19, 0x2c, 0x86,
+	0x61, 0x2f, 0x53, 0xd7, 0x6c, 0x20, 0x01, 0x25, 0xd7, 0x13, 0x09, 0xfc, 0x7a, 0xe6, 0xb3, 0xa0,
+	0xf5, 0xb2, 0x6f, 0x95, 0x74, 0xd5, 0x67, 0xa3, 0xbd, 0x2f, 0x2f, 0xe9, 0x5e, 0x95, 0x4d, 0x33,
+	0xa2, 0x63, 0xf7, 0x60, 0xa0, 0x3f, 0xe4, 0x99, 0x08, 0x1e, 0xbd, 0x81, 0x70, 0xab, 0xe4, 0x4a,
+	0x1c, 0x9c, 0xbc, 0xab, 0x6b, 0x90, 0x1e, 0x58, 0xac, 0x9c, 0x92, 0x64, 0xf2, 0x62, 0x4c, 0xaf,
+	0xcd, 0xf3, 0x5b, 0x07, 0x64, 0x69, 0x88, 0x44, 0xb9, 0xe4, 0x29, 0xa4, 0xab, 0xdc, 0x65, 0x46,
+	0xbb, 0x62, 0x34, 0xde, 0x32, 0xee, 0x95, 0x7b, 0x9c, 0x2c, 0x87, 0x3c, 0x2d, 0x05, 0xe5, 0x1e,
+	0x4f, 0xdc, 0x40, 0x23, 0x1b, 0x1a, 0xd9, 0xc7, 0x92, 0x87, 0x59, 0x27, 0x4c, 0x01, 0x95, 0x3a,
+	0x67, 0xf4, 0x0e, 0xa2, 0xf8, 0xa5, 0x0e, 0x1d, 0xb9, 0xab, 0x91, 0x67, 0x90, 0x55, 0x30, 0xbb,
+	0xc7, 0x46, 0xa7, 0xc5, 0xb0, 0xe3, 0x97, 0xbc, 0xe4, 0x5c, 0x08, 0x29, 0x30, 0x05, 0xc1, 0x8e,
+	0x60, 0xbe, 0x1f, 0x10, 0xf9, 0xd1, 0x27, 0x5c, 0x94, 0x47, 0xdd, 0x95, 0xb4, 0x59, 0x95, 0xb7,
+	0xfc, 0x98, 0x64, 0x64, 0xfd, 0x14, 0xfc, 0xc0, 0x10, 0xd7, 0xa3, 0xcc, 0xc7, 0x0d, 0xd2, 0xeb,
+	0x48, 0x91, 0xa7, 0xfd, 0x80, 0x84, 0x5a, 0x9e, 0xe2, 0x90, 0xbd, 0x42, 0xbb, 0x83, 0xe8, 0xb1,
+	0x2f, 0xed, 0xc1, 0xcf, 0x06, 0x51, 0xc3, 0x43, 0xa8, 0xd2, 0x70, 0x13, 0x32, 0x32, 0x59, 0x7c,
+	0x37, 0xc3, 0x3f, 0x44, 0x8a, 0x6b, 0xf9, 0x33, 0x28, 0x84, 0xf5, 0x26, 0x64, 0x64, 0x15, 0x74,
+	0x2e, 0x4b, 0xd2, 0x7e, 0x52, 0x6b, 0xd9, 0x3c, 0x6b, 0x2d, 0xea, 0x60, 0x84, 0x3e, 0x9d, 0x9c,
+	0x7b, 0x30, 0x42, 0x1e, 0x8b, 0x1c, 0x8c, 0x10, 0x0b, 0x79, 0x8e, 0xc5, 0x36, 0x5e, 0x3d, 0x5e,
+	0x7c, 0xb1, 0x2d, 0x65, 0x7e, 0x05, 0x47, 0x56, 0x93, 0x2f, 0x1e, 0x8f, 0xfc, 0x0c, 0xa6, 0xfd,
+	0x96, 0x6c, 0x08, 0x2c, 0x97, 0xd4, 0xdb, 0xa5, 0xb7, 0x10, 0xf6, 0x3a, 0xbd, 0x1a, 0x0b, 0xeb,
+	0x31, 0xbb, 0x59, 0xe3, 0x02, 0xed, 0x15, 0xd6, 0x47, 0xa1, 0x96, 0xf6, 0xf0, 0xbb, 0x67, 0xa4,
+	0xe7, 0x1d, 0xcd, 0x3c, 0xe2, 0x18, 0x09, 0x3d, 0xf5, 0xd2, 0x69, 0xd5, 0xc9, 0x67, 0x40, 0x0e,
+	0x18, 0x1f, 0xea, 0x6a, 0x0f, 0x35, 0xa8, 0xe2, 0x1a, 0xdf, 0x51, 0x7f, 0x84, 0xb1, 0xb1, 0x87,
+	0x4e, 0x3c, 0x98, 0xab, 0x5a, 0xed, 0x9e, 0x6d, 0x70, 0x86, 0xf3, 0xc9, 0x5a, 0xdf, 0x11, 0xc1,
+	0x61, 0xf5, 0xa1, 0x28, 0xe9, 0xce, 0x8f, 0x34, 0x0d, 0xc2, 0x3e, 0x52, 0x48, 0x35, 0x81, 0x24,
+	0x76, 0xe6, 0x2e, 0xcc, 0xf4, 0xdb, 0xd7, 0xe4, 0x8a, 0x4f, 0x18, 0x69, 0x6c, 0xe7, 0x93, 0x45,
+	0x74, 0x84, 0x1c, 0x02, 0xc8, 0x37, 0x1e, 0x6c, 0xf0, 0xa4, 0x82, 0x15, 0x41, 0xe2, 0x86, 0x56,
+	0xaf, 0x8a, 0x74, 0x5e, 0xd8, 0x38, 0x98, 0xad, 0x5e, 0x66, 0xd5, 0x7b, 0xce, 0x25, 0xf0, 0x06,
+	0x6f, 0x64, 0x27, 0xf7, 0x8a, 0x81, 0xe9, 0x02, 0xf0, 0x18, 0xb2, 0x55, 0x6e, 0xb8, 0xdc, 0xff,
+	0xd6, 0x26, 0x4a, 0x3c, 0xa7, 0x43, 0xfa, 0x9f, 0x21, 0x87, 0xbe, 0xc1, 0x0d, 0x0e, 0x47, 0x68,
+	0xf7, 0xa9, 0x23, 0x48, 0xfb, 0xdd, 0x4b, 0x4f, 0x60, 0xd6, 0xf0, 0x2b, 0x88, 0xd8, 0x76, 0x8f,
+	0xb5, 0xcd, 0x1d, 0x1b, 0xb2, 0x8e, 0xdb, 0xc2, 0x0c, 0xdc, 0x70, 0x5c, 0x53, 0xe1, 0xec, 0xa4,
+	0x64, 0x7f, 0xb9, 0x82, 0x9f, 0xe2, 0x7f, 0x51, 0x68, 0x59, 0xfc, 0xb8, 0x57, 0x17, 0xf1, 0x2b,
+	0xfa, 0x9a, 0xea, 0xf7, 0x0e, 0x77, 0xfc, 0x5f, 0x3f, 0x6c, 0x15, 0x5b, 0x8e, 0x1a, 0xfb, 0xeb,
+	0xe8, 0x72, 0xd9, 0xc7, 0x7b, 0x15, 0x6c, 0x57, 0x57, 0x46, 0x2b, 0x63, 0x95, 0xf1, 0xca, 0x44,
+	0x65, 0xb2, 0x32, 0x55, 0x99, 0xae, 0x4f, 0xe2, 0xdc, 0xad, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff,
+	0x68, 0xe5, 0x85, 0x3e, 0x49, 0x21, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -2185,9 +2275,6 @@
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 type VolthaServiceClient interface {
-	// Get more information on a given physical device
-	UpdateLogLevel(ctx context.Context, in *common.Logging, opts ...grpc.CallOption) (*empty.Empty, error)
-	GetLogLevels(ctx context.Context, in *common.LoggingComponent, opts ...grpc.CallOption) (*common.Loggings, error)
 	// Get the membership group of a Voltha Core
 	GetMembership(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*Membership, error)
 	// Set the membership group of a Voltha Core
@@ -2314,6 +2401,8 @@
 	Subscribe(ctx context.Context, in *OfAgentSubscriber, opts ...grpc.CallOption) (*OfAgentSubscriber, error)
 	EnablePort(ctx context.Context, in *Port, opts ...grpc.CallOption) (*empty.Empty, error)
 	DisablePort(ctx context.Context, in *Port, opts ...grpc.CallOption) (*empty.Empty, error)
+	// omci start and stop cli implementation
+	StartOmciTestAction(ctx context.Context, in *OmciTestRequest, opts ...grpc.CallOption) (*TestResponse, error)
 }
 
 type volthaServiceClient struct {
@@ -2324,24 +2413,6 @@
 	return &volthaServiceClient{cc}
 }
 
-func (c *volthaServiceClient) UpdateLogLevel(ctx context.Context, in *common.Logging, opts ...grpc.CallOption) (*empty.Empty, error) {
-	out := new(empty.Empty)
-	err := c.cc.Invoke(ctx, "/voltha.VolthaService/UpdateLogLevel", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *volthaServiceClient) GetLogLevels(ctx context.Context, in *common.LoggingComponent, opts ...grpc.CallOption) (*common.Loggings, error) {
-	out := new(common.Loggings)
-	err := c.cc.Invoke(ctx, "/voltha.VolthaService/GetLogLevels", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
 func (c *volthaServiceClient) GetMembership(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*Membership, error) {
 	out := new(Membership)
 	err := c.cc.Invoke(ctx, "/voltha.VolthaService/GetMembership", in, out, opts...)
@@ -2944,11 +3015,17 @@
 	return out, nil
 }
 
+func (c *volthaServiceClient) StartOmciTestAction(ctx context.Context, in *OmciTestRequest, opts ...grpc.CallOption) (*TestResponse, error) {
+	out := new(TestResponse)
+	err := c.cc.Invoke(ctx, "/voltha.VolthaService/StartOmciTestAction", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // VolthaServiceServer is the server API for VolthaService service.
 type VolthaServiceServer interface {
-	// Get more information on a given physical device
-	UpdateLogLevel(context.Context, *common.Logging) (*empty.Empty, error)
-	GetLogLevels(context.Context, *common.LoggingComponent) (*common.Loggings, error)
 	// Get the membership group of a Voltha Core
 	GetMembership(context.Context, *empty.Empty) (*Membership, error)
 	// Set the membership group of a Voltha Core
@@ -3075,48 +3152,14 @@
 	Subscribe(context.Context, *OfAgentSubscriber) (*OfAgentSubscriber, error)
 	EnablePort(context.Context, *Port) (*empty.Empty, error)
 	DisablePort(context.Context, *Port) (*empty.Empty, error)
+	// omci start and stop cli implementation
+	StartOmciTestAction(context.Context, *OmciTestRequest) (*TestResponse, error)
 }
 
 func RegisterVolthaServiceServer(s *grpc.Server, srv VolthaServiceServer) {
 	s.RegisterService(&_VolthaService_serviceDesc, srv)
 }
 
-func _VolthaService_UpdateLogLevel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(common.Logging)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(VolthaServiceServer).UpdateLogLevel(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/voltha.VolthaService/UpdateLogLevel",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(VolthaServiceServer).UpdateLogLevel(ctx, req.(*common.Logging))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _VolthaService_GetLogLevels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(common.LoggingComponent)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(VolthaServiceServer).GetLogLevels(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/voltha.VolthaService/GetLogLevels",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(VolthaServiceServer).GetLogLevels(ctx, req.(*common.LoggingComponent))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
 func _VolthaService_GetMembership_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 	in := new(empty.Empty)
 	if err := dec(in); err != nil {
@@ -4193,19 +4236,29 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _VolthaService_StartOmciTestAction_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(OmciTestRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(VolthaServiceServer).StartOmciTestAction(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/voltha.VolthaService/StartOmciTestAction",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(VolthaServiceServer).StartOmciTestAction(ctx, req.(*OmciTestRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 var _VolthaService_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "voltha.VolthaService",
 	HandlerType: (*VolthaServiceServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
-			MethodName: "UpdateLogLevel",
-			Handler:    _VolthaService_UpdateLogLevel_Handler,
-		},
-		{
-			MethodName: "GetLogLevels",
-			Handler:    _VolthaService_GetLogLevels_Handler,
-		},
-		{
 			MethodName: "GetMembership",
 			Handler:    _VolthaService_GetMembership_Handler,
 		},
@@ -4429,6 +4482,10 @@
 			MethodName: "DisablePort",
 			Handler:    _VolthaService_DisablePort_Handler,
 		},
+		{
+			MethodName: "StartOmciTestAction",
+			Handler:    _VolthaService_StartOmciTestAction_Handler,
+		},
 	},
 	Streams: []grpc.StreamDesc{
 		{
diff --git a/vendor/gopkg.in/yaml.v2/.travis.yml b/vendor/gopkg.in/yaml.v2/.travis.yml
index 9f55693..055480b 100644
--- a/vendor/gopkg.in/yaml.v2/.travis.yml
+++ b/vendor/gopkg.in/yaml.v2/.travis.yml
@@ -1,12 +1,16 @@
 language: go
 
 go:
-    - 1.4
-    - 1.5
-    - 1.6
-    - 1.7
-    - 1.8
-    - 1.9
-    - tip
+    - "1.4.x"
+    - "1.5.x"
+    - "1.6.x"
+    - "1.7.x"
+    - "1.8.x"
+    - "1.9.x"
+    - "1.10.x"
+    - "1.11.x"
+    - "1.12.x"
+    - "1.13.x"
+    - "tip"
 
 go_import_path: gopkg.in/yaml.v2
diff --git a/vendor/gopkg.in/yaml.v2/decode.go b/vendor/gopkg.in/yaml.v2/decode.go
index e4e56e2..129bc2a 100644
--- a/vendor/gopkg.in/yaml.v2/decode.go
+++ b/vendor/gopkg.in/yaml.v2/decode.go
@@ -229,6 +229,10 @@
 	mapType reflect.Type
 	terrors []string
 	strict  bool
+
+	decodeCount int
+	aliasCount  int
+	aliasDepth  int
 }
 
 var (
@@ -314,7 +318,43 @@
 	return out, false, false
 }
 
+const (
+	// 400,000 decode operations is ~500kb of dense object declarations, or
+	// ~5kb of dense object declarations with 10000% alias expansion
+	alias_ratio_range_low = 400000
+
+	// 4,000,000 decode operations is ~5MB of dense object declarations, or
+	// ~4.5MB of dense object declarations with 10% alias expansion
+	alias_ratio_range_high = 4000000
+
+	// alias_ratio_range is the range over which we scale allowed alias ratios
+	alias_ratio_range = float64(alias_ratio_range_high - alias_ratio_range_low)
+)
+
+func allowedAliasRatio(decodeCount int) float64 {
+	switch {
+	case decodeCount <= alias_ratio_range_low:
+		// allow 99% to come from alias expansion for small-to-medium documents
+		return 0.99
+	case decodeCount >= alias_ratio_range_high:
+		// allow 10% to come from alias expansion for very large documents
+		return 0.10
+	default:
+		// scale smoothly from 99% down to 10% over the range.
+		// this maps to 396,000 - 400,000 allowed alias-driven decodes over the range.
+		// 400,000 decode operations is ~100MB of allocations in worst-case scenarios (single-item maps).
+		return 0.99 - 0.89*(float64(decodeCount-alias_ratio_range_low)/alias_ratio_range)
+	}
+}
+
 func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) {
+	d.decodeCount++
+	if d.aliasDepth > 0 {
+		d.aliasCount++
+	}
+	if d.aliasCount > 100 && d.decodeCount > 1000 && float64(d.aliasCount)/float64(d.decodeCount) > allowedAliasRatio(d.decodeCount) {
+		failf("document contains excessive aliasing")
+	}
 	switch n.kind {
 	case documentNode:
 		return d.document(n, out)
@@ -353,7 +393,9 @@
 		failf("anchor '%s' value contains itself", n.value)
 	}
 	d.aliases[n] = true
+	d.aliasDepth++
 	good = d.unmarshal(n.alias, out)
+	d.aliasDepth--
 	delete(d.aliases, n)
 	return good
 }
@@ -746,8 +788,7 @@
 	case mappingNode:
 		d.unmarshal(n, out)
 	case aliasNode:
-		an, ok := d.doc.anchors[n.value]
-		if ok && an.kind != mappingNode {
+		if n.alias != nil && n.alias.kind != mappingNode {
 			failWantMap()
 		}
 		d.unmarshal(n, out)
@@ -756,8 +797,7 @@
 		for i := len(n.children) - 1; i >= 0; i-- {
 			ni := n.children[i]
 			if ni.kind == aliasNode {
-				an, ok := d.doc.anchors[ni.value]
-				if ok && an.kind != mappingNode {
+				if ni.alias != nil && ni.alias.kind != mappingNode {
 					failWantMap()
 				}
 			} else if ni.kind != mappingNode {
diff --git a/vendor/gopkg.in/yaml.v2/resolve.go b/vendor/gopkg.in/yaml.v2/resolve.go
index 6c151db..4120e0c 100644
--- a/vendor/gopkg.in/yaml.v2/resolve.go
+++ b/vendor/gopkg.in/yaml.v2/resolve.go
@@ -81,7 +81,7 @@
 	return false
 }
 
-var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`)
+var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`)
 
 func resolve(tag string, in string) (rtag string, out interface{}) {
 	if !resolvableTag(tag) {
diff --git a/vendor/gopkg.in/yaml.v2/scannerc.go b/vendor/gopkg.in/yaml.v2/scannerc.go
index 077fd1d..0b9bb60 100644
--- a/vendor/gopkg.in/yaml.v2/scannerc.go
+++ b/vendor/gopkg.in/yaml.v2/scannerc.go
@@ -626,30 +626,17 @@
 func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool {
 	// While we need more tokens to fetch, do it.
 	for {
-		// Check if we really need to fetch more tokens.
-		need_more_tokens := false
-
-		if parser.tokens_head == len(parser.tokens) {
-			// Queue is empty.
-			need_more_tokens = true
-		} else {
-			// Check if any potential simple key may occupy the head position.
-			if !yaml_parser_stale_simple_keys(parser) {
+		if parser.tokens_head != len(parser.tokens) {
+			// If queue is non-empty, check if any potential simple key may
+			// occupy the head position.
+			head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed]
+			if !ok {
+				break
+			} else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok {
 				return false
+			} else if !valid {
+				break
 			}
-
-			for i := range parser.simple_keys {
-				simple_key := &parser.simple_keys[i]
-				if simple_key.possible && simple_key.token_number == parser.tokens_parsed {
-					need_more_tokens = true
-					break
-				}
-			}
-		}
-
-		// We are finished.
-		if !need_more_tokens {
-			break
 		}
 		// Fetch the next token.
 		if !yaml_parser_fetch_next_token(parser) {
@@ -678,11 +665,6 @@
 		return false
 	}
 
-	// Remove obsolete potential simple keys.
-	if !yaml_parser_stale_simple_keys(parser) {
-		return false
-	}
-
 	// Check the indentation level against the current column.
 	if !yaml_parser_unroll_indent(parser, parser.mark.column) {
 		return false
@@ -837,29 +819,30 @@
 		"found character that cannot start any token")
 }
 
-// Check the list of potential simple keys and remove the positions that
-// cannot contain simple keys anymore.
-func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool {
-	// Check for a potential simple key for each flow level.
-	for i := range parser.simple_keys {
-		simple_key := &parser.simple_keys[i]
-
-		// The specification requires that a simple key
-		//
-		//  - is limited to a single line,
-		//  - is shorter than 1024 characters.
-		if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) {
-
-			// Check if the potential simple key to be removed is required.
-			if simple_key.required {
-				return yaml_parser_set_scanner_error(parser,
-					"while scanning a simple key", simple_key.mark,
-					"could not find expected ':'")
-			}
-			simple_key.possible = false
-		}
+func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) {
+	if !simple_key.possible {
+		return false, true
 	}
-	return true
+
+	// The 1.2 specification says:
+	//
+	//     "If the ? indicator is omitted, parsing needs to see past the
+	//     implicit key to recognize it as such. To limit the amount of
+	//     lookahead required, the “:” indicator must appear at most 1024
+	//     Unicode characters beyond the start of the key. In addition, the key
+	//     is restricted to a single line."
+	//
+	if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index {
+		// Check if the potential simple key to be removed is required.
+		if simple_key.required {
+			return false, yaml_parser_set_scanner_error(parser,
+				"while scanning a simple key", simple_key.mark,
+				"could not find expected ':'")
+		}
+		simple_key.possible = false
+		return false, true
+	}
+	return true, true
 }
 
 // Check if a simple key may start at the current position and add it if
@@ -879,13 +862,14 @@
 			possible:     true,
 			required:     required,
 			token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
+			mark:         parser.mark,
 		}
-		simple_key.mark = parser.mark
 
 		if !yaml_parser_remove_simple_key(parser) {
 			return false
 		}
 		parser.simple_keys[len(parser.simple_keys)-1] = simple_key
+		parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1
 	}
 	return true
 }
@@ -900,19 +884,33 @@
 				"while scanning a simple key", parser.simple_keys[i].mark,
 				"could not find expected ':'")
 		}
+		// Remove the key from the stack.
+		parser.simple_keys[i].possible = false
+		delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number)
 	}
-	// Remove the key from the stack.
-	parser.simple_keys[i].possible = false
 	return true
 }
 
+// max_flow_level limits the flow_level
+const max_flow_level = 10000
+
 // Increase the flow level and resize the simple key list if needed.
 func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
 	// Reset the simple key on the next level.
-	parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
+	parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{
+		possible:     false,
+		required:     false,
+		token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
+		mark:         parser.mark,
+	})
 
 	// Increase the flow level.
 	parser.flow_level++
+	if parser.flow_level > max_flow_level {
+		return yaml_parser_set_scanner_error(parser,
+			"while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark,
+			fmt.Sprintf("exceeded max depth of %d", max_flow_level))
+	}
 	return true
 }
 
@@ -920,11 +918,16 @@
 func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool {
 	if parser.flow_level > 0 {
 		parser.flow_level--
-		parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1]
+		last := len(parser.simple_keys) - 1
+		delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number)
+		parser.simple_keys = parser.simple_keys[:last]
 	}
 	return true
 }
 
+// max_indents limits the indents stack size
+const max_indents = 10000
+
 // Push the current indentation level to the stack and set the new level
 // the current column is greater than the indentation level.  In this case,
 // append or insert the specified token into the token queue.
@@ -939,6 +942,11 @@
 		// indentation level.
 		parser.indents = append(parser.indents, parser.indent)
 		parser.indent = column
+		if len(parser.indents) > max_indents {
+			return yaml_parser_set_scanner_error(parser,
+				"while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark,
+				fmt.Sprintf("exceeded max depth of %d", max_indents))
+		}
 
 		// Create a token and insert it into the queue.
 		token := yaml_token_t{
@@ -989,6 +997,8 @@
 	// Initialize the simple key stack.
 	parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
 
+	parser.simple_keys_by_tok = make(map[int]int)
+
 	// A simple key is allowed at the beginning of the stream.
 	parser.simple_key_allowed = true
 
@@ -1270,7 +1280,11 @@
 	simple_key := &parser.simple_keys[len(parser.simple_keys)-1]
 
 	// Have we found a simple key?
-	if simple_key.possible {
+	if valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok {
+		return false
+
+	} else if valid {
+
 		// Create the KEY token and insert it into the queue.
 		token := yaml_token_t{
 			typ:        yaml_KEY_TOKEN,
@@ -1288,6 +1302,7 @@
 
 		// Remove the simple key.
 		simple_key.possible = false
+		delete(parser.simple_keys_by_tok, simple_key.token_number)
 
 		// A simple key cannot follow another simple key.
 		parser.simple_key_allowed = false
diff --git a/vendor/gopkg.in/yaml.v2/yaml.go b/vendor/gopkg.in/yaml.v2/yaml.go
index de85aa4..89650e2 100644
--- a/vendor/gopkg.in/yaml.v2/yaml.go
+++ b/vendor/gopkg.in/yaml.v2/yaml.go
@@ -89,7 +89,7 @@
 	return unmarshal(in, out, true)
 }
 
-// A Decorder reads and decodes YAML values from an input stream.
+// A Decoder reads and decodes YAML values from an input stream.
 type Decoder struct {
 	strict bool
 	parser *parser
diff --git a/vendor/gopkg.in/yaml.v2/yamlh.go b/vendor/gopkg.in/yaml.v2/yamlh.go
index e25cee5..f6a9c8e 100644
--- a/vendor/gopkg.in/yaml.v2/yamlh.go
+++ b/vendor/gopkg.in/yaml.v2/yamlh.go
@@ -579,6 +579,7 @@
 
 	simple_key_allowed bool                // May a simple key occur at the current position?
 	simple_keys        []yaml_simple_key_t // The stack of simple keys.
+	simple_keys_by_tok map[int]int         // possible simple_key indexes indexed by token_number
 
 	// Parser stuff
 
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 2f6c67b..8ddd284 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -9,6 +9,10 @@
 github.com/armon/go-metrics
 # github.com/bsm/sarama-cluster v2.1.15+incompatible
 github.com/bsm/sarama-cluster
+# github.com/buraksezer/consistent v0.0.0-20191006190839-693edf70fd72
+github.com/buraksezer/consistent
+# github.com/cespare/xxhash v1.1.0
+github.com/cespare/xxhash
 # github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a
 github.com/coreos/go-systemd/journal
 # github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea
@@ -68,15 +72,16 @@
 # github.com/opencord/omci-lib-go v0.13.1
 github.com/opencord/omci-lib-go
 github.com/opencord/omci-lib-go/generated
-# github.com/opencord/voltha-lib-go/v3 v3.0.8
+# github.com/opencord/voltha-lib-go/v3 v3.1.3
 github.com/opencord/voltha-lib-go/v3/pkg/adapters
 github.com/opencord/voltha-lib-go/v3/pkg/adapters/adapterif
 github.com/opencord/voltha-lib-go/v3/pkg/adapters/common
+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/kafka
 github.com/opencord/voltha-lib-go/v3/pkg/log
 github.com/opencord/voltha-lib-go/v3/pkg/probe
-# github.com/opencord/voltha-protos/v3 v3.2.2
+# github.com/opencord/voltha-protos/v3 v3.3.0
 github.com/opencord/voltha-protos/v3/go/common
 github.com/opencord/voltha-protos/v3/go/inter_container
 github.com/opencord/voltha-protos/v3/go/omci
@@ -87,8 +92,12 @@
 # github.com/pierrec/lz4 v2.3.0+incompatible
 github.com/pierrec/lz4
 github.com/pierrec/lz4/internal/xxh32
+# github.com/pmezard/go-difflib v1.0.0
+github.com/pmezard/go-difflib/difflib
 # github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563
 github.com/rcrowley/go-metrics
+# github.com/stretchr/testify v1.5.1
+github.com/stretchr/testify/assert
 # go.etcd.io/etcd v0.0.0-20190930204107-236ac2a90522
 go.etcd.io/etcd/auth/authpb
 go.etcd.io/etcd/clientv3
@@ -219,3 +228,5 @@
 # gopkg.in/jcmturner/rpc.v1 v1.1.0
 gopkg.in/jcmturner/rpc.v1/mstypes
 gopkg.in/jcmturner/rpc.v1/ndr
+# gopkg.in/yaml.v2 v2.2.8
+gopkg.in/yaml.v2