TUN-5422: Define RPC to unregister session

This commit is contained in:
cthuang 2021-11-30 19:58:11 +00:00 committed by Arég Harutyunyan
parent 7e47667b08
commit b73c588254
6 changed files with 417 additions and 227 deletions

View File

@ -38,7 +38,6 @@ type QUICConnection struct {
logger *zerolog.Logger
httpProxy OriginProxy
sessionManager datagramsession.Manager
localIP net.IP
}
// NewQUICConnection returns a new instance of QUICConnection.
@ -75,17 +74,11 @@ func NewQUICConnection(
sessionManager := datagramsession.NewManager(datagramMuxer, observer.log)
localIP, err := getLocalIP()
if err != nil {
return nil, err
}
return &QUICConnection{
session: session,
httpProxy: httpProxy,
logger: observer.log,
sessionManager: sessionManager,
localIP: localIP,
}, nil
}
@ -197,7 +190,10 @@ func (q *QUICConnection) RegisterUdpSession(ctx context.Context, sessionID uuid.
return nil
}
// TODO: TUN-5422 Implement UnregisterUdpSession RPC
func (q *QUICConnection) UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID) error {
q.sessionManager.UnregisterSession(ctx, sessionID)
return nil
}
// streamReadWriteAcker is a light wrapper over QUIC streams with a callback to send response back to
// the client.
@ -292,26 +288,3 @@ func isTransferEncodingChunked(req *http.Request) bool {
// separated value as well.
return strings.Contains(strings.ToLower(transferEncodingVal), "chunked")
}
// TODO: TUN-5303: Find the local IP once in ingress package
// TODO: TUN-5421 allow user to specify which IP to bind to
func getLocalIP() (net.IP, error) {
addrs, err := net.InterfaceAddrs()
if err != nil {
return nil, err
}
for _, addr := range addrs {
// Find the IP that is not loop back
var ip net.IP
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
if !ip.IsLoopback() {
return ip, nil
}
}
return nil, fmt.Errorf("cannot determine IP to bind to")
}

View File

@ -247,6 +247,10 @@ func (rcs *RPCClientStream) RegisterUdpSession(ctx context.Context, sessionID uu
return resp.Err
}
func (rcs *RPCClientStream) UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID) error {
return rcs.client.UnregisterUdpSession(ctx, sessionID)
}
func (rcs *RPCClientStream) Close() {
_ = rcs.client.Close()
_ = rcs.transport.Close()

View File

@ -131,12 +131,15 @@ func TestRegisterUdpSession(t *testing.T) {
rpcClientStream, err := NewRPCClientStream(context.Background(), clientStream, &logger)
assert.NoError(t, err)
err = rpcClientStream.RegisterUdpSession(context.Background(), rpcServer.sessionID, rpcServer.dstIP, rpcServer.dstPort)
assert.NoError(t, err)
assert.NoError(t, rpcClientStream.RegisterUdpSession(context.Background(), rpcServer.sessionID, rpcServer.dstIP, rpcServer.dstPort))
// Different sessionID, the RPC server should reject the registraion
err = rpcClientStream.RegisterUdpSession(context.Background(), uuid.New(), rpcServer.dstIP, rpcServer.dstPort)
assert.Error(t, err)
assert.Error(t, rpcClientStream.RegisterUdpSession(context.Background(), uuid.New(), rpcServer.dstIP, rpcServer.dstPort))
assert.NoError(t, rpcClientStream.UnregisterUdpSession(context.Background(), rpcServer.sessionID))
// Different sessionID, the RPC server should reject the unregistraion
assert.Error(t, rpcClientStream.UnregisterUdpSession(context.Background(), uuid.New()))
rpcClientStream.Close()
<-sessionRegisteredChan
@ -161,6 +164,13 @@ func (s mockRPCServer) RegisterUdpSession(ctx context.Context, sessionID uuid.UU
return nil
}
func (s mockRPCServer) UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID) error {
if s.sessionID != sessionID {
return fmt.Errorf("expect session ID %s, got %s", s.sessionID, sessionID)
}
return nil
}
type mockRPCStream struct {
io.ReadCloser
io.WriteCloser

View File

@ -14,6 +14,7 @@ import (
type SessionManager interface {
RegisterUdpSession(ctx context.Context, sessionID uuid.UUID, dstIP net.IP, dstPort uint16) error
UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID) error
}
type SessionManager_PogsImpl struct {
@ -60,6 +61,21 @@ func (i SessionManager_PogsImpl) RegisterUdpSession(p tunnelrpc.SessionManager_r
return resp.Marshal(result)
}
func (i SessionManager_PogsImpl) UnregisterUdpSession(p tunnelrpc.SessionManager_unregisterUdpSession) error {
server.Ack(p.Options)
sessionIDRaw, err := p.Params.SessionId()
if err != nil {
return err
}
sessionID, err := uuid.FromBytes(sessionIDRaw)
if err != nil {
return err
}
return i.impl.UnregisterUdpSession(p.Ctx, sessionID)
}
type RegisterUdpSessionResponse struct {
Err error
}
@ -116,3 +132,15 @@ func (c SessionManager_PogsClient) RegisterUdpSession(ctx context.Context, sessi
}
return response, nil
}
func (c SessionManager_PogsClient) UnregisterUdpSession(ctx context.Context, sessionID uuid.UUID) error {
client := tunnelrpc.SessionManager{Client: c.Client}
promise := client.UnregisterUdpSession(ctx, func(p tunnelrpc.SessionManager_unregisterUdpSession_Params) error {
if err := p.SetSessionId(sessionID[:]); err != nil {
return err
}
return nil
})
_, err := promise.Struct()
return err
}

View File

@ -149,4 +149,5 @@ struct RegisterUdpSessionResponse {
interface SessionManager {
registerUdpSession @0 (sessionId :Data, dstIp :Data, dstPort: UInt16) -> (result :RegisterUdpSessionResponse);
unregisterUdpSession @1 (sessionId :Data) -> ();
}

View File

@ -3470,9 +3470,31 @@ func (c SessionManager) RegisterUdpSession(ctx context.Context, params func(Sess
}
return SessionManager_registerUdpSession_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}
func (c SessionManager) UnregisterUdpSession(ctx context.Context, params func(SessionManager_unregisterUdpSession_Params) error, opts ...capnp.CallOption) SessionManager_unregisterUdpSession_Results_Promise {
if c.Client == nil {
return SessionManager_unregisterUdpSession_Results_Promise{Pipeline: capnp.NewPipeline(capnp.ErrorAnswer(capnp.ErrNullClient))}
}
call := &capnp.Call{
Ctx: ctx,
Method: capnp.Method{
InterfaceID: 0x839445a59fb01686,
MethodID: 1,
InterfaceName: "tunnelrpc/tunnelrpc.capnp:SessionManager",
MethodName: "unregisterUdpSession",
},
Options: capnp.NewCallOptions(opts),
}
if params != nil {
call.ParamsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 1}
call.ParamsFunc = func(s capnp.Struct) error { return params(SessionManager_unregisterUdpSession_Params{Struct: s}) }
}
return SessionManager_unregisterUdpSession_Results_Promise{Pipeline: capnp.NewPipeline(c.Client.Call(call))}
}
type SessionManager_Server interface {
RegisterUdpSession(SessionManager_registerUdpSession) error
UnregisterUdpSession(SessionManager_unregisterUdpSession) error
}
func SessionManager_ServerToClient(s SessionManager_Server) SessionManager {
@ -3482,7 +3504,7 @@ func SessionManager_ServerToClient(s SessionManager_Server) SessionManager {
func SessionManager_Methods(methods []server.Method, s SessionManager_Server) []server.Method {
if cap(methods) == 0 {
methods = make([]server.Method, 0, 1)
methods = make([]server.Method, 0, 2)
}
methods = append(methods, server.Method{
@ -3499,6 +3521,20 @@ func SessionManager_Methods(methods []server.Method, s SessionManager_Server) []
ResultsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 1},
})
methods = append(methods, server.Method{
Method: capnp.Method{
InterfaceID: 0x839445a59fb01686,
MethodID: 1,
InterfaceName: "tunnelrpc/tunnelrpc.capnp:SessionManager",
MethodName: "unregisterUdpSession",
},
Impl: func(c context.Context, opts capnp.CallOptions, p, r capnp.Struct) error {
call := SessionManager_unregisterUdpSession{c, opts, SessionManager_unregisterUdpSession_Params{Struct: p}, SessionManager_unregisterUdpSession_Results{Struct: r}}
return s.UnregisterUdpSession(call)
},
ResultsSize: capnp.ObjectSize{DataSize: 0, PointerCount: 0},
})
return methods
}
@ -3510,6 +3546,14 @@ type SessionManager_registerUdpSession struct {
Results SessionManager_registerUdpSession_Results
}
// SessionManager_unregisterUdpSession holds the arguments for a server call to SessionManager.unregisterUdpSession.
type SessionManager_unregisterUdpSession struct {
Ctx context.Context
Options capnp.CallOptions
Params SessionManager_unregisterUdpSession_Params
Results SessionManager_unregisterUdpSession_Results
}
type SessionManager_registerUdpSession_Params struct{ capnp.Struct }
// SessionManager_registerUdpSession_Params_TypeID is the unique identifier for the type SessionManager_registerUdpSession_Params.
@ -3685,197 +3729,325 @@ func (p SessionManager_registerUdpSession_Results_Promise) Result() RegisterUdpS
return RegisterUdpSessionResponse_Promise{Pipeline: p.Pipeline.GetPipeline(0)}
}
const schema_db8274f9144abc7e = "x\xda\xccY{pT\xe5\x15?\xe7\xde\xdd\xdcM\xd8" +
"es{\x97\x98d\xa4)\x0c\x8c\x05\x0d\x0a)\x1d\xa4" +
"\xda$\x98\xa0\x89<rwI\xc7\x02:\xde\xec~\x84" +
"\x9b\xee\xde\xbb\xde{\x17\x09\x82<\x04\x11\xc7\x07\"\xf8" +
"\xa0R)\x8e\xed\x88\xdaB\xb5\xd3\xda\xb1Si\xeb\xa3" +
"\xe3\x13\x07;\xa88mE\xda\xca`m\x11\xc7\xb1U" +
"o\xe7\xdc\xdd\xfb\xc8&$A\xfaG\xff\xbb9{\xbe" +
"\xf3\x9d\xc7\xef<\xbe\x93\x8b0\xd2\xc2M\x0f\xf7F\x01" +
"\xe4\xad\xe1\x0a\x9bM}}\xd5\xee\xc9\xbf\xdb\x00r=" +
"\xa2}\xe3\xd3\x9d\x89O\xad\x0doC\x98\x17\x00\x9a\xea" +
"*V\xa1\xd4X!\x00HS*\xfe\x06h\xdf\\\xb3" +
"\xef\xc1\x87\xdb\xb7\xdf\x04b=\xef3\x036\xc5\x84N" +
"\x94&\x08\xc49^\xb8\\\x9aO_\xf6\x95\xe2\x85K" +
"\x12\xaf\xbdB\xdcA\xd1!\x12=S\x98\x8aR\xbbs" +
"\xa0U \xd1\x97\xe4^\xdd\xf3\xcd\x1d/n\x04\xb1\x9e" +
"\x1b \xba1\xb2\x0a\xa5\xd6\x08q^\x1aY\x08h\x7f" +
"\xb4\xbd\xf6\xd1\x1f\xbe\xf2\xc2&\x10\xcfC(i\xda\x1d" +
"y\x0b\x01%5\xf2S@\xfb\xe5\x8f\x97\x9cz\xf2\xb9" +
"\x997\x838\x85\x18\x90\x18*+'r\x80\xd2\x84\xca" +
"f@\xfb\xf8\x89\xffl\xbea\xca\x82\xad OA\xe2" +
"\xe0\x88\xa3\xb5\xb2\x9e8\xbe[I\"\x9a\xe7\xbe\xfcT" +
"}\xd3=\xdb\xcbTw\x18?\xae\x9c\x8aR\xb8\x8a\x14" +
"\xc2\xaa\xeb\x01\xed\x89+&_\xfb\xdbg\x9f\xb8\x17\xe4" +
"FD\xfbH\xcf\xf9o\xf0\xbb\xf6\xbe\x0d\xdd( \x07" +
"\xd0\xc4\xaa\xf6\x90n\x05\x87\xf7\xd5\x0b\x9e\xfe\xd5\xd6'" +
"6\x7f\x1f\xe4\xf3\xe8j\xc7\x17oV\xfd\x9b\x18>\xa8" +
"\"\xdd\xb6\x1f\xfe\xf5\x82\xdc];\xf7\x14\xads~\x1f" +
"7\x86\xe3 do\xec\xf8$\xd7\xfdP\xea\xa1\x92\xdd" +
"a\xc7\xac1'\x11\xb0i\xfc\x98\x06\x04\xb4g\xbeu" +
"l\xe1\xfc\x9f-\xfbq\xe0\xec\xc5\xd1Utv\xf3\xb2" +
"\x93\x07\xaa\x93\xb9G\xcb\xecq\\33\xba\x17\xa5\xf9" +
"Q\xb2\xa7#J*<\xfe\xd5++W\x1e\x9b\xbb\x0f" +
"\xc4FW\x8c\x1aM\x92\x98\xd0\xd5\xfc\x17\xca}\xbfy" +
"\xb2\x1c-\x8e_X\xb4\x07\xa5~\x92\xd3T\x88:\xfa" +
"\xdcz`\xe7\xf9\x91\x07?\xfa\xf9P^\xdc\x15\xebA" +
"i\x7f\x8cn}<F\x9e\x19\xd7\x81G\x9e\x99\x1e\xfa" +
"E0\xac\xb1\xb1\xc7\xc93\x13\xc6RL\xc6\x7f0'" +
"\xa6}\xb8\xe1\x992i\x0e\xe3\x81\xb1\x9d(\xbd1\x96" +
"\xa4\x1dt\x98;\x97\xdc\xbd-|\xec\xee\xe7I\xd3\x00" +
"\x9e\xc2\x84\xa3\xa6\\\xdc@i}\x9c>\xd7\xc4\xcf\xe1" +
"\x01\xed\xfa}\xdf\xfa\xc9\x9c\xcc\x9b/\x0e\xa1\xa9\xf4\xf9" +
"WNJ\x95\x12}\x85%R\xf4h\xe3\xfe\x1b\xde\xbf" +
"\xfd\xe0\xa1\x92\xa2\x8e\x0f\x15\xc9\x09aA\"\xffy\x08" +
"(\xf3\x92\xc3\xb9C\xeaC\xe9\x11G\xdc\xc3\x0e7w" +
"L\xa9[\xf7\xc7o\x1f\x09\x04\xed\x11\xe9]\x84\x90\xbd" +
"\xe0;K\xfa*\xd7\x1c=\x1a\xbch\x97\xe4xd\xbf" +
"s\xf4\x1f?:~\xe7\x89\\\xe6\xaf\x0e\xf0\\\x9f\x1d" +
"\x94f\x13\x8e\xdf\x97(\xab\xcei\x88\xb5O<\xdcu" +
"\xbc\x18\xca\xa2\x88g\x13s\x88\xe1\x9d\x04\x89\x98ym" +
"+[:\xeb\xaa\xe3\x832\xfa\xf3\xc4l\x94b\xe3\x1c" +
"\x90\x8d\xdb\x8c\xd2\x84\x9as\x00\xec;nl[x\xf1" +
"\xc4\x03'\x83*\x895\x84Air\x0d\xc9[6\xeb" +
"\xc4\xe5\x93\xefx\xee\xe4P@k\xaf\x99\x8aRw\x0d" +
"\x99.\x13\xf3\x87s\x7fp\xa8>^\x7f\xaa\xccM\x15" +
"\x0e\x82j\xfaP\xdaB\xbcM\x9bj\x9e'0\xdd\xfc" +
"\xf65+_\xbf\xe9\xa3\x8f\xcb#\xea\x88\xee\xafM\xa2" +
"t{-\x89\xdeRK\xf1\xbfw\xd1\xdf\xd7\x9e\xd8Q" +
"\xf3\xc9 \xbb\xa6\xd4\xf5\xa1ti\x1dq^\\\xb7Y" +
"\xba\x9f\xbe\xec\xd7\x84\x87\xa6\xb7\xad}\xf1\xd3\x00\xe2\xd7" +
"\xd7u\x12\xe2\xef\x11\x1e8\xba\xeeO\xd7|\x164x" +
"M\xdd\xbbd\xf0]ud\xf0\xea\x0f\xef\xbf\xe2\xce\xa5" +
"\x8f}\x11\x08\xdf\xfe\xba\x0dt\xd4*h\x1a\xcb\x1a\xf9" +
"P\xfaB\xf73=-\xad\xe4\xb5\xfc\xec\xd6\x82\xb5\x9c" +
"i\x96\x9aV,\x96d\xcdf^\xd7L\xd6\x85(W" +
"\xf3!\x80\x10\x02\x88J\x1f\x80|-\x8fr\x96C\x11" +
"1A\x01\x16U\".\xe7Q\xb68\x149.A\xf5" +
"E\xbcn\"\x80\x9c\xe5Q^\xc9!\xf2\x09\xe4\x01\xc4" +
"\xc26\x00y%\x8f\xf2F\x0e\xed<3r\x8a\xc64" +
"\x88[\xed\x86\x81Q\xe00\x0ah\x1b\xcc2\xfa\x95\x9e" +
",\xc4Y\x80,\xf4]oa\x0c8\x8c\x01\xda\xcb\xf5" +
"\x82avk\x16\xaa\xd9$[f0\x13\x97c\x05p" +
"X\x018\x9cy)f\x9a\xaa\xae\xcdW4\xa5\x97\x19" +
"\x00dY\x88\x0f\x03x\x95\x17\xdd\x1a-\x8a;\x81\x13" +
"c\x82m\xb0^\xd5\xb4\x98\x81\xdd\x99\xbcs\x9e\xd7\xb5" +
"\x16\xecB\xff\"~\xf0E\x97eU\xa6Y\xf1\x0em" +
"\x99^\xe6\xbd\xce\xa1\xbc\xd7Y\xf2\xde\xc6\x80\xf7\xd6\xcf" +
"\x01\x90W\xf3(\xdf\xc2\xa1\xc8\x97\xdc\xb7i*\x80\xbc" +
"\x8eG\xf96\x0e\xed\xb4sIG\x06\x00<\xc7,c" +
"\x8aU0\x98I\xb4\xb1\x80]<:\xfe\x1b\x0b\xb8v" +
"\x053\xc8x\xd7\x9fq\xc5H/\xf7|>\x8c\xd3\xda" +
"W\xaa\xa6\xa5j\xbd\x8b\x1czs\x97\x9eU\xd3\xfdd" +
"U\xd4\xd1s\xfcl\x00Dq\xdcb\x00\xe4Dq\x0e" +
"@\xb3\xda\xab\xe9\x06\xb33\xaa\x99\xd65\x8d\x01\x9f\xb6" +
"\xd6\xf6(YEK3\xef\xa2\x8a\xc1\x17\x15/H1" +
"c\x053\xa6)\x01$N\xeaR\x0c\x85\xcf\x99r\xd4" +
"\xf3c\xfbb\x00\xb9\x8dG\xb9+\xe0\xc7\xf9\xe4\xc7y" +
"<\xcaW\x05\xfc\xd8M~\xec\xe2Q^\xca\xa1\xad\x1b" +
"j\xaf\xaa]\xc6\x807\x82`2-M\xc91\xf2Y" +
"\xc9\x1fk\xf5\xbc\xa5\xea\x9a\x89\xd5~\xc1\x06\xc4\xea\x80" +
"\xa7\x84\x91\xe05\xcdE\x8e\x0b\x1c]\x9b\x94dfA" +
"\xc8Z\xa6\x1c\xf2,\x89\xcd\x06\x90#<\xca\x09\x0e\x9b" +
"\x0df\x16\xb2\x16V\xfb}\xf1\x7fq\xeb\x10\xeeK\x0e" +
"\xe5\xbe\x19\x00\xf2\x15<\xca\x8b8\xc4\x92\xf7\xe49\xbe" +
"Km\xb3(\xaf\x030\xe3:\xaf!cZ\x1dy\xf7" +
"\xaf\xb5\x19\xd3\xea\xd2\x0d\x0b\x05\xe0P\x80aS\xa4\x18" +
"\xed8U\x1c\x02S\xc4\xd3m\x0a\x85\xf6\xeb<\xca\xdf" +
"\x08\xe86\x9d\x0a\xccE<\xca\x97ph+\xe9\xb4^" +
"\xd0\xacE\xc0+\xbde\x08N1\x88\xa7\x0d\xe6\x07\xd7" +
"\xbd6<D\x92\x128\xd3\x14\xe7$+V\xbai\x06" +
"3\x85B\xd6\"m\xa2\xb6]T\x87\xbc2\x89G\xf9" +
"\"\x0ec\xf8\x85]\xd4\xa7q\x9b\xafO\x033\x0c\xdd" +
"\xc0j\xbf\x13\x94\x82\x96.]\x80\xba\xd6\xc6,E\xcd" +
"\"\x01\xca\x1b>\xcaB;RF\x1447\xb4E\xf2" +
"\xa4f\x8akn\x00\x96v\x02\xc8\xd5<\xca\xe7rh" +
"\xf7\x1aJ\x9au1\x03U=\xb3@\xd1\xf4\x14\xcf\xd2" +
"\x18\x06\x0e\xc3\x81K\xc7\x9e\xe9\xa5I\x07\xa1&x\xa7" +
"\x86?o\xb0\x92\x13J\xc7\xbb\x1a\x8a:'<\x9d\xd7" +
"L\xf4;\x82\x17\xee\xf5=~\x9d\xf32y\x0b\x01\xe3" +
"\x16\x1e\xe5\xed\x81\x8ax\x17\xe5\xfcV\x1e\xe5\x078\x14" +
"C\xa1\x04\x86\x00\xc4\xfb\x09\xb5\xdby\x94ws\x03\xfb" +
"\x06[\xc14\xabM\xed\x05\x81\x99>\x95TlS{" +
"\x19\xf0\xe6\xd9V\x85\xc8\x08\xfe\xd0{L=\xcb,\xd6" +
"\xc6\xd2Y\xc5P,u\x05+\xfe^\x02\xa3\x1b\xd4\xe1" +
"p\x9b\x1c\x94\xe1\x84\xdf\xb8\xdb\xaa\x03p\x98\xe8\x97\x16" +
"\x81\x05:\xec0\xda\x16\x85\x93f\xba6\x08\x03~\xc6" +
"\x94p\x80\xe6p\x9d\xc3g_\x98\xb7TA\xd7L\xd2" +
"/\x10\xfa\xd9C\x85\xde\xf0C\xefV\xa1-\x1b\x82\x91" +
"\xc7R\xe4w\xfaA\x16C\\1\xf2\xbb\xf6\x00\xc8\xbb" +
"y\x94\x1f\xe3\xb0\xb9\xd8 \xb1\xda\x7f\xf0\x95\xa2Ul" +
"\x03\xf3thH+Y\xbf|\xd9\x06\xcbg\x954k" +
"\xc7R\xcb\x03D\xe0\x10\x1d\x88\xe4\xf2\x063MTu" +
"M.(Y\x95\xb7\xfa\xbd\x89C+\xe4\xba\x0c\xb6B" +
"E\xbd`\xb6Z\x16\xcb\x09y\xcb\x1c\xcd<\xe2;\x88" +
"\xea\x83\xa0f\xcd\xb2R8\xd5\xaf=\x9e\x83\x1a\xa9\x14" +
"^\xc0\xa3<\x8b\xc3x\xa1\xa0z\xb5\xd8\xce\xeai'" +
"n\x10_\xa0\xe4\xd8\xa0hW\x8c\x98\xab\x032\xbdK" +
"\x89;\xa9\xfa\xff\xd4t\x87\x1fY\xc9tg\xa6\x0b\xa8" +
"L)\xd0\xc2\xa3</\xa0r\xc7\x8c\x80\x1d\xae\xca\xf3" +
"{|;\x84\xef\xb1~W\xab\x06\x96\xa3\xca\xed:\xb3" +
"dL+\x08W\xfa<\xc3\xe9\x17L\xa8\x85\xf9\x06\xc7" +
"B\xd2q\x96\xab\xa3\xd4\x8f\x9d\x00\xa9\x95\xc8cj#" +
"\xfajJ\xebq\x0e@j5\xd1oA_Si\x13" +
"\xd6\x03\xa4\xd6\x11\xfd6\xf4Fki\x0b\xee\x05H\xdd" +
"F\xe4\xfb\x88=\xc4;)!\xedp\xc4o'\xfan" +
"\xa2\x87C\x09\x0c\x03H\xbbp*@\xea>\xa2?I" +
"\xf4\x0a.\x81\x15\x00\xd2~\xec\x03H\xed#\xfa\xd3D" +
"\x17\xc2\x09z]HO\xa1\x01\x90\xfa%\xd1\x7fO\xf4" +
"Hm\x02#\x00\xd2\x01\x87\xfe\x0c\xd1_\"ze]" +
"\x02+\x01\xa4?\xe0\x06\x80\xd4\x0bD?D\xf4*L" +
"`\x15\xbd\x83q'@\xea\x10\xd1\xffL\xf41\x15\x09" +
"\x1c\x03 \xbd\xe3\xe8s\x98\xe8\xef\x11=\x1aJ`\x14" +
"@\xfa\x0b\xee\x01H\xbdG\xf4\x7f\x12=&$0\x06" +
" }\xe0\xd8u\x82\xe8\x11\xael\x1cv\x11U6\xf3" +
"\xf2\xba\xe9\x85\x8c\x95r\x1c\x8bp\xef\xd2\xe34\xd7b" +
"\xdc_\xf8\x00b\x1c\xd0\xce\xebzv\xc1@\xa4\xc6-" +
"\xa5\xd7t\xe7\xebj\xff\x91\x0eHD\xaf\xefC\\\xd7" +
":2^!(\xaf:\xae&\xaa\xd9Z\xb0\xf4B\x1e" +
"\x1a2\x8a\xc52^\xcd1\x0a\xda\\C\xcf-Bf" +
"\xe4TM\xc9\x8eP\x8d*\x81\xc3J(\x95\x04W\xf6" +
"\xf0\xa5\xe9\xf4\xaf\x05\x0f\xd1\\9\xa2\x1b\xf2\xb3\x17)" +
"\xbd\xa3\xa9S3\xfc9.\xae\x05\x0aR\xc3\x0a%[" +
"\xf82\xe5i\xe0(\x91l.\x8e\"#\xcd\xd2\xeek" +
"~\xe4R2p \x1c\xd8P1\xb0N\xa3{\xb8\x92" +
"\xfcQ\xab\xdf\xcb\xac\xe2\x17=\x0ai$\x17\x82m\xfe" +
"\xccN'\x99\x19\x1f\x8d\xe9\xfe\xd6c\xe4g\xc4\x10\x8d" +
"\x7f\x88\xb6\xef\xce\x9c\x81\x17-\xc5~)\x8f\xf2\xf2@" +
"\xec\x195\x85\x0c\x8fr\xdeo\xe2\xb9\xa4\xbf\x0e\x10y" +
"\xae\xb4\x0f\xa0F\x91\xe7Q^\xcda\x9c\xde|X\xed" +
"\xef8\x07(=\xf0\x9dKP\xe8\xd02\x0cp\xa5\x8b" +
"\xe6@\xfb\xf0\xd6\x81#Og\xa33\xdb\x9dzGt" +
"\xb8\xb7b+\xbb\xf9\xb4\x0f\xa0\xe6\xe2\xa5\x84\xb3Zg" +
"\x13\xe1\xae\x1b\xd1]i\x89\xfbW\x01'>\"\xa0\xbf" +
"\x92Cw\x03'\xee2\x80\x13w\x08\xc8y\x0b\\t" +
"\x17\xb5\xe2\x96[\x81\x137\x09\xc8{\xfbWt\x97B" +
"\xd3\xfb\xab\x108q\x8d\x80!om\x8d\xeeJI\xbc" +
"\xae\x0f8Q\x150\xec\xadv\xd1\xdd-\x8aWo\x00" +
"N\xec\xf6\xd7\"\xd0\\\xb4\xa3\x05m\x17\xa3\xd0\xe0\xa0" +
"\xb4\x05mwrDw\xa8\x00hA\xdb\x9d\x81\xf9\xd3" +
"\x0d\xc1\x0e\x97\xbb\x00\x80xZ\xb1X\x0b\x0dg\xc5\xfc" +
"\xc7R\x01\x80\x16\x94C\x18\xd8\xa8\x01|\xd9Q'\xc9" +
"\x1a\xce\xa6\x94\xf0C=\xca\xe9\x1eo\x01\x14\x90K\xd3" +
"[\x94G\xb9\x96\x1bq`\x0b\x9d\xce\x0a\x17\xb4q:" +
"L\xf2\xbf\xe6\xc9?H\x03\xcfK<\xca\x87\x03\xe9\xf8" +
"\x06\x11_\xe3Q>\x12\x18x\xde\xa4\x1c=\xcc\xa3|" +
"\xca_\xcf\xfd\xebV\x00\xf9\x14\x8f\xc9\xc0\x00!~N" +
"\x8c\x9fQ\x9bu\xc6\x07,\x8e\x0fa\xdc\x06\x90\x8aP" +
"\xfbM8\xe3C\xa88>\x88\xd8\x03\x90\xaa&\xfa\xb9" +
"\xc1\xf1\xa1\x0e\x17\x03\xa4j\x89>\x09\x07\xbeG\x84\x82" +
"\xe1\x0fXY\xbdw\x9e\xaa\x0d\xd9\x93\xdc}!Zs" +
"\x155[0\x18\xf8-\xb1T$\xda\x02]\xba\xb8H" +
"l]F\xf0K\x11x2hz\x9b\x893x\x09\x8e" +
"\xaac\xb4\x1b\x86\x8eF\xd9\xf09\xc3\x1f>\xbd\xd9s" +
"\xb1\xbfd\x11\xb9\x96\xd2\x96\xa5\xc7\x1f\x97\x1b\xd2J\xc1" +
"d\x83l\x00\x9e\x19\xde\xeb\xdd\\\xae\x17\xb2\x99$\x03" +
"\xc12\xfa\xcb\\0\xe2\x10\x9abq\xb7\xe2D\x9c\x8a" +
"\xe3n\xeb\xd1]\xca\x8b\xd3w\x02'6R\xc5q\x17" +
"\xd0\xe8\xfe\xefE\x9c\xb0\x178q|`/\xea\xfa\xc0" +
"\xd9\x8b\x06S\xbe\xf8\x83\x83\xd1\x81\x0b\xd3\xb3xv\x16" +
"\xdb\xcf\x19d\xfa\x80=\xe2\xa8\xd7o\xde\x7f\x1f\xcb2" +
"\xbd\xf2l\x9f\xf7n#\xf9o\x00\x00\x00\xff\xff2s" +
"\xeb\xfe"
type SessionManager_unregisterUdpSession_Params struct{ capnp.Struct }
// SessionManager_unregisterUdpSession_Params_TypeID is the unique identifier for the type SessionManager_unregisterUdpSession_Params.
const SessionManager_unregisterUdpSession_Params_TypeID = 0x96b74375ce9b0ef6
func NewSessionManager_unregisterUdpSession_Params(s *capnp.Segment) (SessionManager_unregisterUdpSession_Params, error) {
st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
return SessionManager_unregisterUdpSession_Params{st}, err
}
func NewRootSessionManager_unregisterUdpSession_Params(s *capnp.Segment) (SessionManager_unregisterUdpSession_Params, error) {
st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1})
return SessionManager_unregisterUdpSession_Params{st}, err
}
func ReadRootSessionManager_unregisterUdpSession_Params(msg *capnp.Message) (SessionManager_unregisterUdpSession_Params, error) {
root, err := msg.RootPtr()
return SessionManager_unregisterUdpSession_Params{root.Struct()}, err
}
func (s SessionManager_unregisterUdpSession_Params) String() string {
str, _ := text.Marshal(0x96b74375ce9b0ef6, s.Struct)
return str
}
func (s SessionManager_unregisterUdpSession_Params) SessionId() ([]byte, error) {
p, err := s.Struct.Ptr(0)
return []byte(p.Data()), err
}
func (s SessionManager_unregisterUdpSession_Params) HasSessionId() bool {
p, err := s.Struct.Ptr(0)
return p.IsValid() || err != nil
}
func (s SessionManager_unregisterUdpSession_Params) SetSessionId(v []byte) error {
return s.Struct.SetData(0, v)
}
// SessionManager_unregisterUdpSession_Params_List is a list of SessionManager_unregisterUdpSession_Params.
type SessionManager_unregisterUdpSession_Params_List struct{ capnp.List }
// NewSessionManager_unregisterUdpSession_Params creates a new list of SessionManager_unregisterUdpSession_Params.
func NewSessionManager_unregisterUdpSession_Params_List(s *capnp.Segment, sz int32) (SessionManager_unregisterUdpSession_Params_List, error) {
l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}, sz)
return SessionManager_unregisterUdpSession_Params_List{l}, err
}
func (s SessionManager_unregisterUdpSession_Params_List) At(i int) SessionManager_unregisterUdpSession_Params {
return SessionManager_unregisterUdpSession_Params{s.List.Struct(i)}
}
func (s SessionManager_unregisterUdpSession_Params_List) Set(i int, v SessionManager_unregisterUdpSession_Params) error {
return s.List.SetStruct(i, v.Struct)
}
func (s SessionManager_unregisterUdpSession_Params_List) String() string {
str, _ := text.MarshalList(0x96b74375ce9b0ef6, s.List)
return str
}
// SessionManager_unregisterUdpSession_Params_Promise is a wrapper for a SessionManager_unregisterUdpSession_Params promised by a client call.
type SessionManager_unregisterUdpSession_Params_Promise struct{ *capnp.Pipeline }
func (p SessionManager_unregisterUdpSession_Params_Promise) Struct() (SessionManager_unregisterUdpSession_Params, error) {
s, err := p.Pipeline.Struct()
return SessionManager_unregisterUdpSession_Params{s}, err
}
type SessionManager_unregisterUdpSession_Results struct{ capnp.Struct }
// SessionManager_unregisterUdpSession_Results_TypeID is the unique identifier for the type SessionManager_unregisterUdpSession_Results.
const SessionManager_unregisterUdpSession_Results_TypeID = 0xf24ec4ab5891b676
func NewSessionManager_unregisterUdpSession_Results(s *capnp.Segment) (SessionManager_unregisterUdpSession_Results, error) {
st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 0})
return SessionManager_unregisterUdpSession_Results{st}, err
}
func NewRootSessionManager_unregisterUdpSession_Results(s *capnp.Segment) (SessionManager_unregisterUdpSession_Results, error) {
st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 0})
return SessionManager_unregisterUdpSession_Results{st}, err
}
func ReadRootSessionManager_unregisterUdpSession_Results(msg *capnp.Message) (SessionManager_unregisterUdpSession_Results, error) {
root, err := msg.RootPtr()
return SessionManager_unregisterUdpSession_Results{root.Struct()}, err
}
func (s SessionManager_unregisterUdpSession_Results) String() string {
str, _ := text.Marshal(0xf24ec4ab5891b676, s.Struct)
return str
}
// SessionManager_unregisterUdpSession_Results_List is a list of SessionManager_unregisterUdpSession_Results.
type SessionManager_unregisterUdpSession_Results_List struct{ capnp.List }
// NewSessionManager_unregisterUdpSession_Results creates a new list of SessionManager_unregisterUdpSession_Results.
func NewSessionManager_unregisterUdpSession_Results_List(s *capnp.Segment, sz int32) (SessionManager_unregisterUdpSession_Results_List, error) {
l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 0}, sz)
return SessionManager_unregisterUdpSession_Results_List{l}, err
}
func (s SessionManager_unregisterUdpSession_Results_List) At(i int) SessionManager_unregisterUdpSession_Results {
return SessionManager_unregisterUdpSession_Results{s.List.Struct(i)}
}
func (s SessionManager_unregisterUdpSession_Results_List) Set(i int, v SessionManager_unregisterUdpSession_Results) error {
return s.List.SetStruct(i, v.Struct)
}
func (s SessionManager_unregisterUdpSession_Results_List) String() string {
str, _ := text.MarshalList(0xf24ec4ab5891b676, s.List)
return str
}
// SessionManager_unregisterUdpSession_Results_Promise is a wrapper for a SessionManager_unregisterUdpSession_Results promised by a client call.
type SessionManager_unregisterUdpSession_Results_Promise struct{ *capnp.Pipeline }
func (p SessionManager_unregisterUdpSession_Results_Promise) Struct() (SessionManager_unregisterUdpSession_Results, error) {
s, err := p.Pipeline.Struct()
return SessionManager_unregisterUdpSession_Results{s}, err
}
const schema_db8274f9144abc7e = "x\xda\xccY}p\x15\xe5\xd5?g\xf7\xdelB>" +
"nv\xf6BHF\xdf\xbc/\x03\xe3K\x14\x14(\x1d" +
"\xa0\xda\x04L\xa8\x89|d\xef\x85\x8e\x05t\xdc\xdc\xfb" +
"\x106\xbdw\xf7\xb2\xbb7\x12\x04\xf9\x10D\x1c\xbf@" +
"PD\xa9\x88\xd3vDm\xa1j\xad\x1d\x9dJ\xeb\xe7" +
"(*\x0etPqZD\xfa\xc1`\xad\x88uh\xd5" +
"\xed\x9c\xdd\xbb\x1f\xb9\x09I\x90\xfe\xd1\xff\x92\xb3\xcfs" +
"\x9es~\xe7\xf7\x9cs\x9es/\x9bY\xda\xc4M\x88" +
"\xd6T\x02\xc8\xdb\xa2%6kxg\xf9\xce1\xbf[" +
"\x0br\x1d\xa2}\xd3sm\xf13\xd6\xda\xf7!\xca\x0b" +
"\x00\x93\x96\x96,Gi}\x89\x00 \xad)\xf93\xa0" +
"}\xcb\x88=\x0f\xfd\xb8e\xcb\xcd \xd6\xf1\xc1b\xc0" +
"ILhC\xa9G\xa0\x95ya\x83t\x88\xfe\xb2\xaf" +
"\x16/]\x18\x7f\xfbMZ\x1dV\x1d!\xd5\xcf\x0b\x0d" +
"(\xedw6\xbc&\x90\xea\xcb\xb3o\xed\xfa\xf6\xd6\xd7" +
"\xd7\x81X\xc7\xf5R\xfdt\xe9r\x94^+\xa5\x95/" +
"\x95\xce\x05\xb4?\xdb2\xf2\xb1\x87\xdf|u=\x88\x17" +
"!\x14,\xfd\xa0\xf4=\x04\x94>-\xfd9\xa0\xbd\xff" +
"\xf3\x85\xa7\x9fzy\xf2- \x8e\xa5\x05H\x0b6\x95" +
"\x8d\xe2\x00\xa5G\xcb\x1a\x01\xed\x13'\xff\xb5\xe1\xc6\xb1" +
"s\xee\x06y,\xd2\x0a\x8eV\xbcVVG+\x8e\x96" +
"\x91\x8a\xc6\x99\xfb\x9f\xad\x9bt\xef\x96\"\xd3\x9d\x85+" +
"\x875\xa0t\xc702h\xe3\xb0\x1b\x00\xed\x7fT=" +
"\xf0f\xfe\xcag\xee\x0d\x9f\xf7\xf1\xb0\x06\xd2\x16-\xa7" +
"\xf3Fu\x8f\xb9\xfe\xb7/=y\x1f\xc8\xe3\x10\xed#" +
"\x1d\x17\x1f\xe2w\xec~\x1f\xe6\xa3\x80\x1c\xc0\xa4\xb1\xe5" +
"\xbb\xc8\xf8\xa9\xe5\xa4\xec\xadK\x9e\xfb\xf5\xddOnx" +
"\x00\xe4\x8b\xc86\x07\xac\x1d\xe5\xff\xa4\x05{\x1de[" +
"\x0e??'\xbbi\xfb.\xd7}\xe7\xfb\xbb\xe5\x1c\x07" +
"\x11{]\xeb\x17\xd9\xf9\x8f$\x1f)\x00\x13\xa5O\xfb" +
"\xcbO!\xe0\xa4\xa3\xe5\xf5\x08hO~\xef\xf8\xdc\xd9" +
"\xbfX\xfc\xd3\xd0\xde\xaf*\x96\xd3\xde\x0d\x8bO\xed\xab" +
"Nd\x1f+r\xd8\xf1\xe5L\xc5n\x94\xc4Jr\xb8" +
"\xb2\x92Lx\xe2\x7f\xae.[v|\xe6\x1e\x10\xc7y" +
"j\xc6U&HM\xe4Z\xfeke\xdbo\x9e*\xa6" +
"\x93\x03\xdc\xd8\xca\x0e\x94\xae =\x93\xa6V:\xf6\xdc" +
"\xb6o\xfb\xc5\xa5\x0f}\xf6t\x7f0+U\x1d(\xe5" +
"\xab\xe8\xd4\xa5U\x84\xcc\xf0V<\xf2\xc2\x84\xc83\xe1" +
"\xb8\x1f\xa8:A\xc8\x1c\xaf\xa2\xa0]\xf8\xf1\x8cJ\xed" +
"\x93\xb5/\x14is\x16\xae\x8f\xb5\xa1t\x7f\x8c\xb4m" +
"\x8d\xd1\xe2\xb6\x85\xf7l\x8e\x1e\xbf\xe7\x15\xb24D\xb8" +
"(\x11m\xd2\x84j\x03\xa5\x96j\xfaszu\x0d\x0f" +
"h\xd7\xed\xf9\xce\xcff\xa4\xdf}\xbd\x1fK\xa5}\xd2" +
")i\xbf\xe4PY\"C\x8f\x8d\xdb{\xe3_\xef8" +
"p\xb0`\xa8\x83\xe1\x98\xb8\x13\xc2\xa9q\xc2\xcfg@" +
"\x11J\xce\xca\x1f\xc4\xbbP\xca\xc6I\x9d\xea\xac\xe6\x8e" +
"+\xb5\xab\x7f\xff\xdd#\xa1\xa0e\xe3\x1f\"D\xec9" +
"\xdf_\xd8U\xb6\xf2\xd8\xb1\xf0AJ\xdcA$\xefl" +
"\xfd\xdbON\xdcu2\x9b\xfe\x93C<\x0f\xb3\xad\xf1" +
"iD\xcd'\xe2t\xedj\xea+[F\x1dn?\xe1" +
"\x86\xd2U\xb1q\xf8\x0cZ\xf0\xf0pR1\xf9\xfa\xe9" +
"l\xd1\x94kN\xf4\xb9\xf2\xfb\x86OC\xe9\xc0p\x87" +
"d\xc37\xa0t|D\x0d\x80\xdd\xfd\xcbM\xd7<\xf6" +
"\xe2\x9cS\xee]p\x8c=4b\"Q\xe3\xce\x9b\x9a" +
"\xe7N\x1d\xb5\xefT\xd8\xd8\xfd#\x88\x9d\xd2\xd1\x11t" +
"\xd2\xe2)'\xbf7\xe6\xce\x97O\xf5GA\xaci@" +
"I\xacq(X\xd3\x08\xf8\xc9\xcc\x1f\x1d\xac\x8b\xd5\x9d" +
".\x02\xb0\xc4\x09^M\x17J-5N\xf0j^!" +
"\x9a\xdd\xf2\xfeu\xcb\xde\xb9\xf9\xb3\xcf\x8bc\xed\xa8\x9e" +
"\\\x9b@\xa9\xb5\x96T\xb7\xd4\x123\xee\x9b\xf7\x97U" +
"'\xb7\x8e\xf8\xa2\x8f\xc7\xc7k\xbbP:\xe3\xac\xfc\xbc" +
"v\x834\xbf\x8e\x92\xdc\xdb\xc2#\x13\x9aW\xbd~&" +
"t\x17\xae\xa8k#\x87\xef\x15\x1e<\xb6\xfa\x0f\xd7}" +
"\x19vxj\xdd\x87\xe4\xf0\xec:rx\xc5'\xf7_" +
"u\xd7\xa2\xc7\xbf\x0e\x07\xb6n-m\xb5\xf2\x9a\xc62" +
"F.\x92\xba\xd4\xfb35>\xa5\xe4\xb4\xdc\xb4\xe9y" +
"k\x09\xd3,5\xa5X,\xc1\x1a\xcd\x9c\xae\x99\xac\x1d" +
"Q\xae\xe6#\x00\x11\x04\x10\x95.\x00\xf9z\x1e\xe5\x0c" +
"\x87\"b\x9cB/\xaa$\\\xc2\xa3lq(r\\" +
"\x9c2\x8f\xb8t\x14\x80\x9c\xe1Q^\xc6!\xf2q\xe4" +
"\x01\xc4\xfcf\x00y\x19\x8f\xf2:\x0e\xed\x1c3\xb2\x8a" +
"\xc64\x88Y-\x86\x81\x15\xc0a\x05\xa0m0\xcb\xe8" +
"Q:2\x10c!\xb1\xd0u\x83\x85\x95\xc0a%\xa0" +
"\xbdD\xcf\x1b\xe6|\xcdB5\x93`\x8b\x0df\xe2\x12" +
",\x01\x0eK\x00\x07r/\xc9LS\xd5\xb5\xd9\x8a\xa6" +
"t2\x03\x80<+\xe5\xa3\x00~\xd2F/\xbd\x8b\x13" +
"\xb6\x03'\x8e\x130\xc8\xc0\xe8\xd1O\xfc\xbf\xdd\xc0\x89" +
"\x17\x0a\xb6\xc1:U\xd3b\x06\xceO\xe7\x1c\xdd\xbc\xae" +
"5\xa1\x9d\xd7\xdc\x0f\xc8\x0c\xf7C\x8cNm\xc2v\x0c" +
"\xac\xe3\xfbZweFe\x9a\x15k\xd5\x16\xebE\x90" +
"\xb7\xf5\x07y[\x01\xf2u!\xc8\xd7\xcc\x00\x90W\xf0" +
"(\xdf\xca\xa1\xc8\x170_\xdf\x00 \xaf\xe6Q\xbe\x9d" +
"C;\xe5\x1c\xd2\x9a\x06\x00\x1f\xcd\xc5L\xb1\xf2\x063" +
"IV\x05\xd8\xce\xa3\x03z\x15\xe0\xaanf\x90\xed^" +
"\x10b\x8a\x91Z\xe2\x07j\x00\xa4[\x96\xa9\xa6\xa5j" +
"\x9d\xf3\x1cyc\xbb\x9eQS=\xe4U\x85c\xe7\x85" +
"\xd3\x00\x10\xc5\xe1\x0b\x00\x90\x13\xc5\x19\x00\x8dj\xa7\xa6" +
"\x1b\xccN\xabfJ\xd74\x06|\xcaZ\xd5\xa1d\x14" +
"-\xc5\xfc\x83J\xfa\x1e\xe4\x1e\x90dF73\xc6+" +
"!\xfa\x8enW\x0c\x85\xcf\x9ar\x85\x8fc\xcb\x02\x00" +
"\xb9\x99G\xb9=\x84\xe3l\xc2q\x16\x8f\xf25!\x1c" +
"\xe7\x13\x8e\xed<\xca\x8b8\xb4uC\xedT\xb5+\x19" +
"\xf0F\x98\x81\xa6\xa5)YF\x98\x15\xf0X\xa5\xe7," +
"U\xd7L\xac\x0e\xf2? V\x87\x90\x12\x06\xe3\xe4x" +
"\x8fR\x1e\xa3tmt\x82\x99y!c\x99r\xc4\xf7" +
"\xa4r\x1a\x80\\\xca\xa3\x1c\xe7\xb0\xd1`f>ca" +
"uPf\xff\x13\xa7\xf6\x03_\xa2?\xf8&\x02\xc8W" +
"\xf1(\xcf\xe3\x10\x0b\xe8\xc93\x02Hm\xd3\xd5\xd7\x0a" +
"\x98\xf6\xc0\xabO\x9bVk\xce\xfboU\xda\xb4\xdau" +
"\xc3B\x018\x14`\xc0+\xe2F;Fi\xca\xbd\xbb" +
"\x9emc)\xb4\xff\xcf\xa3\xfc\xad\x90m\x13(+]" +
"\xc6\xa3|9\x87\xb6\x92J\xe9y\xcd\x9a\x07\xbc\xd2Y" +
"\xc4\xe0$\x83X\xca`Ap\x87\x0e\x9cw\xd5\x8b\xa0" +
"\x8b\x19J\xb6W\xbc\x08\xba\x0a\x1e\xe5\x91\xfd#\xe2\x9f" +
"\x18\xed'-\xd0uH\x11\xb3\x12\xccM\xc8\xe3\x0df" +
"\x0a\xf9\x8cE\xfeW\xd8\xb6\x0b\x00\xc5a4\x8f\xf2e" +
"\x1cV\xe2\xd7\xb6\x8b\xc0\xb8\xcd\x01\x02\xf5\xcc0t\x03" +
"\xab\x83\x82U\xa0I\xaap\x00\xeaZ3\xb3\x145\x83" +
"Da\xbf{*\"\xd3`w0@\xc4\x15\x8fn$" +
"&\xf5Fc;\x80\\\xcd\xa3|\x01\x87v\xa7\xa1\xa4" +
"X;3P\xd5\xd3s\x14MO\xf2,\x85Q\xe00" +
"\x1a:\xb4\xea\\\x0fM8w\xc2\x04\x7f\xd7\xc0\xfb\x0d" +
"V\x00\xa1\xb0\xbd\xbd\xde\xb59\xee\xdb\xbcrTP\xb8" +
"|\x82\xad\xe9\x082\xab\x9f;6\x12\x15o\xe5Q\xde" +
"\x12\xca\xc1\x9b(\xcb\xdc\xcd\xa3\xfc \x87b$\x12\xc7" +
"\x08\x80x?\xdd\x93-<\xca;\xb9\xde\xe5\x8du3" +
"\xcdjV;A`f %\x13\x9b\xd5N\x06\xbcy" +
"\xbey\xa8t\x10<\xf4\x0eS\xcf0\x8b5\xb3TF" +
"1\x14K\xedf\xee\xf7\x02\x19\xbd\xa0\x0e\xc4\xdbD\x9f" +
"\x8bA\xfc\x8dy\x1dE\x88\x0e\xa3\x82d&\xb0P#" +
"0\x80\xb5\xaer\xb2L\xd7\xfap \xb81\x05\x1e\xa0" +
"9P\xad\x0a\x96\xcf\xcdY\xaa\xa0k&\xd9\x17\x0a\xfd" +
"\xb4\xfeBo\x04\xa1\xf7\xf2\xde\xc6\xb5\xe1\xc8c!\xf2" +
"\xdb\x83 \x8b\x11\xce\x8d\xfc\x8e]\x00\xf2N\x1e\xe5\xc7" +
"9ltK2V\x07O\xdaB\xb4\xdc\xc23K\x87" +
"\xfa\x94\x92\x09\x12\xa6m\xb0\\FI\xb1\x16,\x14Y" +
"@\x04\x0e\xd1\xa1H6g0\xd3DU\xd7\xe4\xbc\x92" +
"Qy\xab\xc7o\x8c\xb4|\xb6\xdd`\xdd*\xeays" +
"\xbae\xb1\xac\x90\xb3\xcc\xa1\xb4M\x01@\x94\x1f\x045" +
"c\x16%\xdf\x86 \xf7\xf8\x00\x8d\xa3\xe4{\x09\x8f\xf2" +
"\x14\x0ec\xf9\xbc\x1a\xe4\xba\x8c\x9er\xe2\x06\xb19J" +
"\x96\xf5\x89v\xc9\xa0w\xb5\xd7M\xf7\x92\xed\x7fS\x99" +
"\x1f\xb8\xb3&\xd7\x9d\xd63d2]\x81&\x1e\xe5Y" +
"!\x93['\x86\xfc\xf0L\x9e\xdd\x11\xf8!\xfc\x90\xf5" +
"xV\xd5\xb3,en\x0f\xcc\x823\xd3A\xb8:X" +
"3\x90}\xe1\x0b57W\xefxH6N\xf1l\x94" +
"z\xb0\x0d \xb9\x0cyL\xae\xc3\xc0Li\x0d\xce\x00" +
"H\xae \xf9\xad\x18X*\xad\xc7:\x80\xe4j\x92\xdf" +
"\x8e\xfe\x0b@\xda\x88\xbb\x01\x92\xb7\x93x\x1b-\x8f\xf0" +
"\xce\x95\x90\xb6:\xea\xb7\x90|'\xc9\xa3\x918F\x01" +
"\xa4\x1d\xd8\x00\x90\xdcF\xf2\xa7H^\xc2\xc5\xb1\x04@" +
"\xda\x8b]\x00\xc9=$\x7f\x8e\xe4B4N\x8f \xe9" +
"Y4\x00\x92\xbf\"\xf9\x8b$/\x1d\x19\xc7RzG" +
";\xf2\x17H\xfe\x06\xc9\xcbj\xe3XF\xafj\\\x0b" +
"\x90|\x95\xe4\x07I>\x0c\xe38\x0c@:\x80\xdb\x01" +
"\x92\x07I\xfeG\x92\x97\x97\xc4\xb1\x1c@\xfa\xc0\xb1\xe7" +
"0\xc9?\"yE$\x8e\x15\x00\xd2Q\xdc\x05\x90\xfc" +
"\x88\xe4\x7f'y\xa5\x10\xc7J\x00\xe9c\xc7\xaf\x93$" +
"/\xe5\x8a\x1ap\x8fQE]6\xaf\x9b~\xc8X\xe1" +
"\x8e\xa3K\xf7v=F\x9d4\xc6\x82\x91\x16 \xc6\x00" +
"\xed\x9c\xaeg\xe6\xf4fj\xccR:M\xaf\xa3\xaf\x0e" +
"\xa6\x0c\x80$\xf4\xeb>\xc4t\xad5\xed'\x82\xe2\xac" +
"\xe3Y\xa2\x9a\xd3\xf3\x96\x9e\xcfA}Z\xb1X\xda\xcf" +
"9F^\x9bi\xe8\xd9y\xc8\x8c\xac\xaa)\x99A\xb2" +
"Q\x19pX\x06\x85\x94\xe0\xe9\x1e85\x9d\xfd}\xe2" +
"3\x9a+ft}n\xda<\xa5s(yjb\xd0" +
"9\xc6\xb4PB\xaa\xefV2\xf9o\x92\x9ez\xb7\x12" +
"\x89F\xb7\x15\x19\xac{\xf7\x86\x0e\x83\xa7\x92\xde\x0da" +
"\xef\x82\x8a\xa1y \x9d\xc3\x15\xf4\x0f\xd9\xfcNf\xb9" +
"\x7f\xd13\x94\x1e\x01B\xb8\xcc\x9f\xdb\xee\x043cC" +
"q=\x18\xce\x0c\xfep\xe9\xa7\xf0\xf7S\xf6\xbd\x9e3" +
"\xf4\x86\xa6\xd8/\xe2Q^\x12\x8a=\xa3\xa2\x90\xe6Q" +
"\xce\x05E<\x9b\x08\xa6\x16\"\xcf\x15\xc6\x16T(r" +
"<\xca+8\x8c\xd1+\x13\xab\x83)n/\xa3{\xbf" +
"\xac\x89\x0a\xadZ\x9a\x01.\xf3\xd8\x1c*\x1f\xfe<s" +
"\xf0\xeelhn{]\xef\xa0\x80\xfb3\xc2\xa2\x93\xcf" +
"\xfa\xe4jt\x0f%\x9e\x8dt\x06&\xde\xbc\x14\xbd\xc9" +
"\x9b\xb8w9p\xe2\xa3\x02\x063E\xf4F\x88\xe2\x0e" +
"\x038q\xab\x80\x9c?\x81Fo\xd2,n\xbc\x0d8" +
"q\xbd\x80\xbc?@Fov5\xa1g\x18\x02'\xae" +
"\x140\xe2\x0f\xe6\xd1\x9b|\x89K\xbb\x80\x13U\x01\xa3" +
"\xfel\x1a\xbd\xe1\xa8x\xedZ\xe0\xc4\xf9\xc1\x84\x06\x1a" +
"]?\x9a\xd0\xf68\x0a\xf5\x0eK{\xcfk\xdcU\x00" +
"Mh{=0\x7f\xb6&\xd8Y\xe5\x8d\x1c \x96R" +
",\xd6D\xcd\x99{\xff\xb1\x90\x00\xa0\x09\xe5\x08\x86\x06" +
"\x7f\x00\xe7\xfb\xbeL\xb0z'\xce\xdf\xb4e\xf2\xf6\x7f" +
"\xc3\x94\xc4\xf7g5\x9d\xe3\x8f\xaeBz\xbbB\x0f\xdf" +
"A\x1a\xbf\xc8\xd9\xbc\xf0\xc8\x1f\xa3\xcd\xa4\xff\x7f}\xfd" +
"\x07\xa8qz\x83G\xf9p\xe8Z\x1f\"\xe1\xdb<\xca" +
"GB\x8d\xd3\xbbt\xd7\x0f\xf3(\x9f\x0e\xa6\x91\x9f\xde" +
"\x06 \x9f\xe61\x11jD\xc4\xafh\xe1\x97T\xae\x9d" +
"6\x04\xdd6$\x8a\x9b\x01\x92\xa5T\xc6\xe3N\x1b\x12" +
"q\xdb\x10\x11;\x00\x92\xd5$\xbf \xdc\x86\xd4\xe2\x02" +
"\x80\xe4H\x92\x8f\xc6\xde\xef\x1a!o\x04\x8dZF\xef" +
"\x9c\xa5j\xfd\xd66o<\x8a\xd6LE\xcd\xe4\x0d\x06" +
"Ai-$\x9b\xe6P\xb5w\xe7\xa6\xd3\x17\x13\x8d\x93" +
"D\xc24\x9a\xfeL\xe5\x1c^\x94C\xaa<-\x86\xa1" +
"\xa3Q\xd4\xc4N\x0c\x9aX\xbf\x87]\x10\x8c\x87D\xae" +
"\xa90\x1f\xea\x08\xda\xee\xfa\x94\x927Y\x1f\x1f\x80g" +
"\x86?\x050\x97\xe8\xf9L:\xc1@\xb0\x8c\x9e\"\x08" +
"\x06mf\x93,\xe6e.w\xd4\xeb\xfdl\x81\xde\xaf" +
"\x13\xa1Q\xaf7oG\xefG\xa8\xbe\xa3^\x0f\x83>" +
"\xa3^\xf7\x83\xc3\xd1\xde\xa3\xde\xf3x\xbe\xbae,\x94" +
"1\xcei\x02:\xe4\xc1\xa1\xff;m\xd1M/;\xdf" +
"1\x81W\x90\xfe\x1d\x00\x00\xff\xff#\xafZ\xc1"
func init() {
schemas.Register(schema_db8274f9144abc7e,
@ -3887,6 +4059,7 @@ func init() {
0x8635c6b4f45bf5cd,
0x904e297b87fbecea,
0x9496331ab9cd463f,
0x96b74375ce9b0ef6,
0x97b3c5c260257622,
0x9b87b390babc2ccf,
0xa29a916d4ebdd894,
@ -3907,6 +4080,7 @@ func init() {
0xe6646dec8feaa6ee,
0xea50d822450d1f17,
0xea58385c65416035,
0xf24ec4ab5891b676,
0xf2c122394f447e8e,
0xf2c68e2547ec3866,
0xf41a0f001ad49e46,