// This file was auto-generated by the veyron vdl tool.
// Source: wire.vdl

package server

import (
	"veyron.io/veyron/veyron2/security"

	// The non-user imports are prefixed with "__" to prevent collisions.
	__veyron2 "veyron.io/veyron/veyron2"
	__context "veyron.io/veyron/veyron2/context"
	__ipc "veyron.io/veyron/veyron2/ipc"
	__vdlutil "veyron.io/veyron/veyron2/vdl/vdlutil"
	__wiretype "veyron.io/veyron/veyron2/wiretype"
)

// TODO(toddw): Remove this line once the new signature support is done.
// It corrects a bug where __wiretype is unused in VDL pacakges where only
// bootstrap types are used on interfaces.
const _ = __wiretype.TypeIDInvalid

// AgentClientMethods is the client interface
// containing Agent methods.
type AgentClientMethods interface {
	Bless(ctx __context.T, key []byte, wit security.WireBlessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat, opts ...__ipc.CallOpt) (security.WireBlessings, error)
	BlessSelf(ctx __context.T, name string, caveats []security.Caveat, opts ...__ipc.CallOpt) (security.WireBlessings, error)
	Sign(ctx __context.T, message []byte, opts ...__ipc.CallOpt) (security.Signature, error)
	MintDischarge(ctx __context.T, tp __vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat, opts ...__ipc.CallOpt) (__vdlutil.Any, error)
	PublicKey(__context.T, ...__ipc.CallOpt) ([]byte, error)
	BlessingsByName(ctx __context.T, name security.BlessingPattern, opts ...__ipc.CallOpt) ([]security.WireBlessings, error)
	BlessingsInfo(ctx __context.T, blessings security.WireBlessings, opts ...__ipc.CallOpt) ([]string, error)
	AddToRoots(ctx __context.T, blessing security.WireBlessings, opts ...__ipc.CallOpt) error
	BlessingStoreSet(ctx __context.T, blessings security.WireBlessings, forPeers security.BlessingPattern, opts ...__ipc.CallOpt) (security.WireBlessings, error)
	BlessingStoreForPeer(ctx __context.T, peerBlessings []string, opts ...__ipc.CallOpt) (security.WireBlessings, error)
	BlessingStoreSetDefault(ctx __context.T, blessings security.WireBlessings, opts ...__ipc.CallOpt) error
	BlessingStoreDefault(__context.T, ...__ipc.CallOpt) (security.WireBlessings, error)
	BlessingStorePeerBlessings(__context.T, ...__ipc.CallOpt) (map[security.BlessingPattern]security.WireBlessings, error)
	BlessingStoreDebugString(__context.T, ...__ipc.CallOpt) (string, error)
	BlessingRootsAdd(ctx __context.T, root []byte, pattern security.BlessingPattern, opts ...__ipc.CallOpt) error
	BlessingRootsRecognized(ctx __context.T, root []byte, blessing string, opts ...__ipc.CallOpt) error
	BlessingRootsDebugString(__context.T, ...__ipc.CallOpt) (string, error)
}

// AgentClientStub adds universal methods to AgentClientMethods.
type AgentClientStub interface {
	AgentClientMethods
	__ipc.UniversalServiceMethods
}

// AgentClient returns a client stub for Agent.
func AgentClient(name string, opts ...__ipc.BindOpt) AgentClientStub {
	var client __ipc.Client
	for _, opt := range opts {
		if clientOpt, ok := opt.(__ipc.Client); ok {
			client = clientOpt
		}
	}
	return implAgentClientStub{name, client}
}

type implAgentClientStub struct {
	name   string
	client __ipc.Client
}

func (c implAgentClientStub) c(ctx __context.T) __ipc.Client {
	if c.client != nil {
		return c.client
	}
	return __veyron2.RuntimeFromContext(ctx).Client()
}

func (c implAgentClientStub) Bless(ctx __context.T, i0 []byte, i1 security.WireBlessings, i2 string, i3 security.Caveat, i4 []security.Caveat, opts ...__ipc.CallOpt) (o0 security.WireBlessings, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "Bless", []interface{}{i0, i1, i2, i3, i4}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessSelf(ctx __context.T, i0 string, i1 []security.Caveat, opts ...__ipc.CallOpt) (o0 security.WireBlessings, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessSelf", []interface{}{i0, i1}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) Sign(ctx __context.T, i0 []byte, opts ...__ipc.CallOpt) (o0 security.Signature, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "Sign", []interface{}{i0}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) MintDischarge(ctx __context.T, i0 __vdlutil.Any, i1 security.Caveat, i2 []security.Caveat, opts ...__ipc.CallOpt) (o0 __vdlutil.Any, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "MintDischarge", []interface{}{i0, i1, i2}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) PublicKey(ctx __context.T, opts ...__ipc.CallOpt) (o0 []byte, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "PublicKey", nil, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingsByName(ctx __context.T, i0 security.BlessingPattern, opts ...__ipc.CallOpt) (o0 []security.WireBlessings, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingsByName", []interface{}{i0}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingsInfo(ctx __context.T, i0 security.WireBlessings, opts ...__ipc.CallOpt) (o0 []string, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingsInfo", []interface{}{i0}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) AddToRoots(ctx __context.T, i0 security.WireBlessings, opts ...__ipc.CallOpt) (err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "AddToRoots", []interface{}{i0}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingStoreSet(ctx __context.T, i0 security.WireBlessings, i1 security.BlessingPattern, opts ...__ipc.CallOpt) (o0 security.WireBlessings, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingStoreSet", []interface{}{i0, i1}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingStoreForPeer(ctx __context.T, i0 []string, opts ...__ipc.CallOpt) (o0 security.WireBlessings, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingStoreForPeer", []interface{}{i0}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingStoreSetDefault(ctx __context.T, i0 security.WireBlessings, opts ...__ipc.CallOpt) (err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingStoreSetDefault", []interface{}{i0}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingStoreDefault(ctx __context.T, opts ...__ipc.CallOpt) (o0 security.WireBlessings, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingStoreDefault", nil, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingStorePeerBlessings(ctx __context.T, opts ...__ipc.CallOpt) (o0 map[security.BlessingPattern]security.WireBlessings, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingStorePeerBlessings", nil, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingStoreDebugString(ctx __context.T, opts ...__ipc.CallOpt) (o0 string, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingStoreDebugString", nil, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingRootsAdd(ctx __context.T, i0 []byte, i1 security.BlessingPattern, opts ...__ipc.CallOpt) (err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingRootsAdd", []interface{}{i0, i1}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingRootsRecognized(ctx __context.T, i0 []byte, i1 string, opts ...__ipc.CallOpt) (err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingRootsRecognized", []interface{}{i0, i1}, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) BlessingRootsDebugString(ctx __context.T, opts ...__ipc.CallOpt) (o0 string, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingRootsDebugString", nil, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

func (c implAgentClientStub) Signature(ctx __context.T, opts ...__ipc.CallOpt) (o0 __ipc.ServiceSignature, err error) {
	var call __ipc.Call
	if call, err = c.c(ctx).StartCall(ctx, c.name, "Signature", nil, opts...); err != nil {
		return
	}
	if ierr := call.Finish(&o0, &err); ierr != nil {
		err = ierr
	}
	return
}

// AgentServerMethods is the interface a server writer
// implements for Agent.
type AgentServerMethods interface {
	Bless(ctx __ipc.ServerContext, key []byte, wit security.WireBlessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.WireBlessings, error)
	BlessSelf(ctx __ipc.ServerContext, name string, caveats []security.Caveat) (security.WireBlessings, error)
	Sign(ctx __ipc.ServerContext, message []byte) (security.Signature, error)
	MintDischarge(ctx __ipc.ServerContext, tp __vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat) (__vdlutil.Any, error)
	PublicKey(__ipc.ServerContext) ([]byte, error)
	BlessingsByName(ctx __ipc.ServerContext, name security.BlessingPattern) ([]security.WireBlessings, error)
	BlessingsInfo(ctx __ipc.ServerContext, blessings security.WireBlessings) ([]string, error)
	AddToRoots(ctx __ipc.ServerContext, blessing security.WireBlessings) error
	BlessingStoreSet(ctx __ipc.ServerContext, blessings security.WireBlessings, forPeers security.BlessingPattern) (security.WireBlessings, error)
	BlessingStoreForPeer(ctx __ipc.ServerContext, peerBlessings []string) (security.WireBlessings, error)
	BlessingStoreSetDefault(ctx __ipc.ServerContext, blessings security.WireBlessings) error
	BlessingStoreDefault(__ipc.ServerContext) (security.WireBlessings, error)
	BlessingStorePeerBlessings(__ipc.ServerContext) (map[security.BlessingPattern]security.WireBlessings, error)
	BlessingStoreDebugString(__ipc.ServerContext) (string, error)
	BlessingRootsAdd(ctx __ipc.ServerContext, root []byte, pattern security.BlessingPattern) error
	BlessingRootsRecognized(ctx __ipc.ServerContext, root []byte, blessing string) error
	BlessingRootsDebugString(__ipc.ServerContext) (string, error)
}

// AgentServerStubMethods is the server interface containing
// Agent methods, as expected by ipc.Server.
// There is no difference between this interface and AgentServerMethods
// since there are no streaming methods.
type AgentServerStubMethods AgentServerMethods

// AgentServerStub adds universal methods to AgentServerStubMethods.
type AgentServerStub interface {
	AgentServerStubMethods
	// Describe the Agent interfaces.
	Describe__() []__ipc.InterfaceDesc
	// Signature will be replaced with Describe__.
	Signature(ctx __ipc.ServerContext) (__ipc.ServiceSignature, error)
}

// AgentServer returns a server stub for Agent.
// It converts an implementation of AgentServerMethods into
// an object that may be used by ipc.Server.
func AgentServer(impl AgentServerMethods) AgentServerStub {
	stub := implAgentServerStub{
		impl: impl,
	}
	// Initialize GlobState; always check the stub itself first, to handle the
	// case where the user has the Glob method defined in their VDL source.
	if gs := __ipc.NewGlobState(stub); gs != nil {
		stub.gs = gs
	} else if gs := __ipc.NewGlobState(impl); gs != nil {
		stub.gs = gs
	}
	return stub
}

type implAgentServerStub struct {
	impl AgentServerMethods
	gs   *__ipc.GlobState
}

func (s implAgentServerStub) Bless(ctx __ipc.ServerContext, i0 []byte, i1 security.WireBlessings, i2 string, i3 security.Caveat, i4 []security.Caveat) (security.WireBlessings, error) {
	return s.impl.Bless(ctx, i0, i1, i2, i3, i4)
}

func (s implAgentServerStub) BlessSelf(ctx __ipc.ServerContext, i0 string, i1 []security.Caveat) (security.WireBlessings, error) {
	return s.impl.BlessSelf(ctx, i0, i1)
}

func (s implAgentServerStub) Sign(ctx __ipc.ServerContext, i0 []byte) (security.Signature, error) {
	return s.impl.Sign(ctx, i0)
}

func (s implAgentServerStub) MintDischarge(ctx __ipc.ServerContext, i0 __vdlutil.Any, i1 security.Caveat, i2 []security.Caveat) (__vdlutil.Any, error) {
	return s.impl.MintDischarge(ctx, i0, i1, i2)
}

func (s implAgentServerStub) PublicKey(ctx __ipc.ServerContext) ([]byte, error) {
	return s.impl.PublicKey(ctx)
}

func (s implAgentServerStub) BlessingsByName(ctx __ipc.ServerContext, i0 security.BlessingPattern) ([]security.WireBlessings, error) {
	return s.impl.BlessingsByName(ctx, i0)
}

func (s implAgentServerStub) BlessingsInfo(ctx __ipc.ServerContext, i0 security.WireBlessings) ([]string, error) {
	return s.impl.BlessingsInfo(ctx, i0)
}

func (s implAgentServerStub) AddToRoots(ctx __ipc.ServerContext, i0 security.WireBlessings) error {
	return s.impl.AddToRoots(ctx, i0)
}

func (s implAgentServerStub) BlessingStoreSet(ctx __ipc.ServerContext, i0 security.WireBlessings, i1 security.BlessingPattern) (security.WireBlessings, error) {
	return s.impl.BlessingStoreSet(ctx, i0, i1)
}

func (s implAgentServerStub) BlessingStoreForPeer(ctx __ipc.ServerContext, i0 []string) (security.WireBlessings, error) {
	return s.impl.BlessingStoreForPeer(ctx, i0)
}

func (s implAgentServerStub) BlessingStoreSetDefault(ctx __ipc.ServerContext, i0 security.WireBlessings) error {
	return s.impl.BlessingStoreSetDefault(ctx, i0)
}

func (s implAgentServerStub) BlessingStoreDefault(ctx __ipc.ServerContext) (security.WireBlessings, error) {
	return s.impl.BlessingStoreDefault(ctx)
}

func (s implAgentServerStub) BlessingStorePeerBlessings(ctx __ipc.ServerContext) (map[security.BlessingPattern]security.WireBlessings, error) {
	return s.impl.BlessingStorePeerBlessings(ctx)
}

func (s implAgentServerStub) BlessingStoreDebugString(ctx __ipc.ServerContext) (string, error) {
	return s.impl.BlessingStoreDebugString(ctx)
}

func (s implAgentServerStub) BlessingRootsAdd(ctx __ipc.ServerContext, i0 []byte, i1 security.BlessingPattern) error {
	return s.impl.BlessingRootsAdd(ctx, i0, i1)
}

func (s implAgentServerStub) BlessingRootsRecognized(ctx __ipc.ServerContext, i0 []byte, i1 string) error {
	return s.impl.BlessingRootsRecognized(ctx, i0, i1)
}

func (s implAgentServerStub) BlessingRootsDebugString(ctx __ipc.ServerContext) (string, error) {
	return s.impl.BlessingRootsDebugString(ctx)
}

func (s implAgentServerStub) Globber() *__ipc.GlobState {
	return s.gs
}

func (s implAgentServerStub) Describe__() []__ipc.InterfaceDesc {
	return []__ipc.InterfaceDesc{AgentDesc}
}

// AgentDesc describes the Agent interface.
var AgentDesc __ipc.InterfaceDesc = descAgent

// descAgent hides the desc to keep godoc clean.
var descAgent = __ipc.InterfaceDesc{
	Name:    "Agent",
	PkgPath: "veyron.io/veyron/veyron/security/agent/server",
	Methods: []__ipc.MethodDesc{
		{
			Name: "Bless",
			InArgs: []__ipc.ArgDesc{
				{"key", ``},               // []byte
				{"wit", ``},               // security.WireBlessings
				{"extension", ``},         // string
				{"caveat", ``},            // security.Caveat
				{"additionalCaveats", ``}, // []security.Caveat
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // security.WireBlessings
				{"", ``}, // error
			},
		},
		{
			Name: "BlessSelf",
			InArgs: []__ipc.ArgDesc{
				{"name", ``},    // string
				{"caveats", ``}, // []security.Caveat
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // security.WireBlessings
				{"", ``}, // error
			},
		},
		{
			Name: "Sign",
			InArgs: []__ipc.ArgDesc{
				{"message", ``}, // []byte
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // security.Signature
				{"", ``}, // error
			},
		},
		{
			Name: "MintDischarge",
			InArgs: []__ipc.ArgDesc{
				{"tp", ``},                // __vdlutil.Any
				{"caveat", ``},            // security.Caveat
				{"additionalCaveats", ``}, // []security.Caveat
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // __vdlutil.Any
				{"", ``}, // error
			},
		},
		{
			Name: "PublicKey",
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // []byte
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingsByName",
			InArgs: []__ipc.ArgDesc{
				{"name", ``}, // security.BlessingPattern
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // []security.WireBlessings
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingsInfo",
			InArgs: []__ipc.ArgDesc{
				{"blessings", ``}, // security.WireBlessings
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // []string
				{"", ``}, // error
			},
		},
		{
			Name: "AddToRoots",
			InArgs: []__ipc.ArgDesc{
				{"blessing", ``}, // security.WireBlessings
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingStoreSet",
			InArgs: []__ipc.ArgDesc{
				{"blessings", ``}, // security.WireBlessings
				{"forPeers", ``},  // security.BlessingPattern
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // security.WireBlessings
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingStoreForPeer",
			InArgs: []__ipc.ArgDesc{
				{"peerBlessings", ``}, // []string
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // security.WireBlessings
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingStoreSetDefault",
			InArgs: []__ipc.ArgDesc{
				{"blessings", ``}, // security.WireBlessings
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingStoreDefault",
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // security.WireBlessings
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingStorePeerBlessings",
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // map[security.BlessingPattern]security.WireBlessings
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingStoreDebugString",
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // string
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingRootsAdd",
			InArgs: []__ipc.ArgDesc{
				{"root", ``},    // []byte
				{"pattern", ``}, // security.BlessingPattern
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingRootsRecognized",
			InArgs: []__ipc.ArgDesc{
				{"root", ``},     // []byte
				{"blessing", ``}, // string
			},
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // error
			},
		},
		{
			Name: "BlessingRootsDebugString",
			OutArgs: []__ipc.ArgDesc{
				{"", ``}, // string
				{"", ``}, // error
			},
		},
	},
}

func (s implAgentServerStub) Signature(ctx __ipc.ServerContext) (__ipc.ServiceSignature, error) {
	// TODO(toddw): Replace with new Describe__ implementation.
	result := __ipc.ServiceSignature{Methods: make(map[string]__ipc.MethodSignature)}
	result.Methods["AddToRoots"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "blessing", Type: 74},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 75},
		},
	}
	result.Methods["Bless"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "key", Type: 66},
			{Name: "wit", Type: 74},
			{Name: "extension", Type: 3},
			{Name: "caveat", Type: 67},
			{Name: "additionalCaveats", Type: 68},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 74},
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessSelf"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "name", Type: 3},
			{Name: "caveats", Type: 68},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 74},
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingRootsAdd"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "root", Type: 66},
			{Name: "pattern", Type: 77},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingRootsDebugString"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 3},
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingRootsRecognized"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "root", Type: 66},
			{Name: "blessing", Type: 3},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingStoreDebugString"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 3},
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingStoreDefault"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 74},
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingStoreForPeer"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "peerBlessings", Type: 61},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 74},
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingStorePeerBlessings"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 79},
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingStoreSet"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "blessings", Type: 74},
			{Name: "forPeers", Type: 77},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 74},
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingStoreSetDefault"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "blessings", Type: 74},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingsByName"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "name", Type: 77},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 78},
			{Name: "", Type: 75},
		},
	}
	result.Methods["BlessingsInfo"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "blessings", Type: 74},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 61},
			{Name: "", Type: 75},
		},
	}
	result.Methods["MintDischarge"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "tp", Type: 76},
			{Name: "caveat", Type: 67},
			{Name: "additionalCaveats", Type: 68},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 76},
			{Name: "", Type: 75},
		},
	}
	result.Methods["PublicKey"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 66},
			{Name: "", Type: 75},
		},
	}
	result.Methods["Sign"] = __ipc.MethodSignature{
		InArgs: []__ipc.MethodArgument{
			{Name: "message", Type: 66},
		},
		OutArgs: []__ipc.MethodArgument{
			{Name: "", Type: 70},
			{Name: "", Type: 75},
		},
	}

	result.TypeDefs = []__vdlutil.Any{
		__wiretype.NamedPrimitiveType{Type: 0x32, Name: "byte", Tags: []string(nil)}, __wiretype.SliceType{Elem: 0x41, Name: "", Tags: []string(nil)}, __wiretype.StructType{
			[]__wiretype.FieldType{
				__wiretype.FieldType{Type: 0x42, Name: "ValidatorVOM"},
			},
			"veyron.io/veyron/veyron2/security.Caveat", []string(nil)},
		__wiretype.SliceType{Elem: 0x43, Name: "", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron.io/veyron/veyron2/security.Hash", Tags: []string(nil)}, __wiretype.StructType{
			[]__wiretype.FieldType{
				__wiretype.FieldType{Type: 0x42, Name: "Purpose"},
				__wiretype.FieldType{Type: 0x45, Name: "Hash"},
				__wiretype.FieldType{Type: 0x42, Name: "R"},
				__wiretype.FieldType{Type: 0x42, Name: "S"},
			},
			"veyron.io/veyron/veyron2/security.Signature", []string(nil)},
		__wiretype.StructType{
			[]__wiretype.FieldType{
				__wiretype.FieldType{Type: 0x3, Name: "Extension"},
				__wiretype.FieldType{Type: 0x42, Name: "PublicKey"},
				__wiretype.FieldType{Type: 0x44, Name: "Caveats"},
				__wiretype.FieldType{Type: 0x46, Name: "Signature"},
			},
			"veyron.io/veyron/veyron2/security.Certificate", []string(nil)},
		__wiretype.SliceType{Elem: 0x47, Name: "", Tags: []string(nil)}, __wiretype.SliceType{Elem: 0x48, Name: "", Tags: []string(nil)}, __wiretype.StructType{
			[]__wiretype.FieldType{
				__wiretype.FieldType{Type: 0x49, Name: "CertificateChains"},
			},
			"veyron.io/veyron/veyron2/security.WireBlessings", []string(nil)},
		__wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x1, Name: "anydata", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron.io/veyron/veyron2/security.BlessingPattern", Tags: []string(nil)}, __wiretype.SliceType{Elem: 0x4a, Name: "", Tags: []string(nil)}, __wiretype.MapType{Key: 0x4d, Elem: 0x4a, Name: "", Tags: []string(nil)}}

	return result, nil
}
