From 755f7ff3725fa9dd6767bd001d2bb2d2867e7906 Mon Sep 17 00:00:00 2001 From: bluetegu Date: Wed, 26 Sep 2018 11:26:04 -0400 Subject: [PATCH 1/4] Add IncludeUnannounced property to ChannelGraphRequest rpc. --- lnrpc/rpc.pb.go | 359 +++++++++++++++++++++-------------------- lnrpc/rpc.pb.gw.go | 8 + lnrpc/rpc.proto | 6 + lnrpc/rpc.swagger.json | 10 ++ 4 files changed, 210 insertions(+), 173 deletions(-) diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index dc30fa3f..0eaa23b0 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -3393,6 +3393,11 @@ func (m *ChannelEdge) GetNode2Policy() *RoutingPolicy { } type ChannelGraphRequest struct { + // * + // Whether unannounced channels are included in the response or not. If set, + // unannounced channels are included. Unannounced channels are both private + // channels, and public channels that are not yet announced to the network. + IncludeUnannounced bool `protobuf:"varint,1,opt,name=include_unannounced" json:"include_unannounced,omitempty"` } func (m *ChannelGraphRequest) Reset() { *m = ChannelGraphRequest{} } @@ -3400,6 +3405,13 @@ func (m *ChannelGraphRequest) String() string { return proto.CompactT func (*ChannelGraphRequest) ProtoMessage() {} func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} } +func (m *ChannelGraphRequest) GetIncludeUnannounced() bool { + if m != nil { + return m.IncludeUnannounced + } + return false +} + // / Returns a new instance of the directed channel graph. type ChannelGraph struct { // / The list of `LightningNode`s in this channel graph @@ -7248,7 +7260,7 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 6385 bytes of a gzipped FileDescriptorProto + // 6408 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7c, 0xdf, 0x6f, 0x24, 0xd9, 0x55, 0xff, 0x54, 0xbb, 0xdb, 0x76, 0x9f, 0x6e, 0xdb, 0xed, 0xeb, 0x5f, 0x3d, 0xbd, 0xb3, 0xb3, 0xb3, 0x95, 0xd5, 0xce, 0xc4, 0xdf, 0xfd, 0xce, 0xcc, 0x3a, 0xc9, 0x6a, 0xb3, 0x0b, 0x09, 0x1e, @@ -7477,176 +7489,177 @@ var fileDescriptor0 = []byte{ 0xbd, 0xe5, 0x96, 0x1a, 0x48, 0x7e, 0xcb, 0x67, 0x8a, 0x5b, 0x7e, 0x0d, 0xea, 0xc8, 0x7a, 0x6f, 0x92, 0xff, 0x2b, 0x6e, 0x5b, 0x32, 0x40, 0xd5, 0x6e, 0x51, 0x6d, 0x2d, 0xab, 0x25, 0xe0, 0xb9, 0xf7, 0x2b, 0x6f, 0x43, 0x53, 0x36, 0x43, 0x7b, 0x42, 0x9a, 0x23, 0x63, 0x7e, 0x6b, 0xbf, 0x3c, - 0x8b, 0x52, 0x7d, 0xb9, 0xa5, 0xbe, 0x9c, 0xbf, 0xec, 0x4b, 0x45, 0x49, 0x77, 0xe1, 0x62, 0x6d, - 0x1e, 0xc4, 0xfe, 0xf8, 0x54, 0x99, 0xbc, 0xbe, 0x4e, 0xe2, 0x21, 0x98, 0x6d, 0x42, 0x0d, 0x3f, - 0x53, 0x9a, 0xbc, 0x5c, 0x20, 0x05, 0x09, 0xbb, 0x05, 0x35, 0xde, 0x1f, 0x70, 0x75, 0xc2, 0x63, - 0xf6, 0x59, 0x1b, 0xf7, 0xc8, 0x13, 0x04, 0xa8, 0x1e, 0x10, 0xcd, 0xa9, 0x07, 0xdb, 0x0a, 0xcc, - 0x62, 0xf1, 0x61, 0xdf, 0x5d, 0x05, 0xf6, 0x48, 0x70, 0xb4, 0x19, 0xbf, 0xfe, 0xf6, 0x0c, 0x34, - 0x0c, 0x18, 0x25, 0x7d, 0x80, 0x03, 0xee, 0xf6, 0x03, 0x7f, 0xc4, 0x53, 0x1e, 0x4b, 0x2e, 0xce, - 0xa1, 0x48, 0xe7, 0x9f, 0x0d, 0xba, 0xd1, 0x24, 0xed, 0xf6, 0xf9, 0x20, 0xe6, 0xc2, 0x30, 0xa3, - 0xa1, 0xb0, 0x50, 0xa4, 0x1b, 0xf9, 0x1f, 0x9a, 0x74, 0x82, 0x1f, 0x72, 0xa8, 0x8a, 0x46, 0x8b, - 0x35, 0xaa, 0x66, 0xd1, 0x68, 0xb1, 0x22, 0x79, 0x1d, 0x55, 0x2b, 0xd1, 0x51, 0x6f, 0xc1, 0xba, - 0xd0, 0x46, 0x52, 0x6e, 0xbb, 0x39, 0x36, 0xb9, 0xa0, 0x96, 0x6d, 0x42, 0x0b, 0xc7, 0xac, 0x18, - 0x3c, 0x09, 0xbe, 0x25, 0xe2, 0x43, 0x8e, 0x57, 0xc0, 0x91, 0x96, 0x02, 0x35, 0x26, 0xad, 0xb8, - 0x9d, 0x2b, 0xe0, 0x44, 0xeb, 0x7f, 0x68, 0xd3, 0xd6, 0x25, 0x6d, 0x0e, 0x77, 0x17, 0xa0, 0x71, - 0x94, 0x46, 0x63, 0xb5, 0x29, 0x8b, 0xd0, 0x14, 0x45, 0x99, 0x0b, 0xf1, 0x12, 0x5c, 0x25, 0x2e, - 0x7a, 0x12, 0x8d, 0xa3, 0x61, 0x34, 0x98, 0x1e, 0x4d, 0x8e, 0x93, 0x5e, 0x1c, 0x8c, 0xf1, 0x34, - 0xe4, 0xfe, 0xbd, 0x03, 0x2b, 0x56, 0xad, 0x0c, 0x19, 0x7d, 0x5a, 0xb0, 0xb4, 0xbe, 0xc4, 0x16, - 0x8c, 0xb7, 0x6c, 0xa8, 0x4a, 0x41, 0x28, 0x42, 0x79, 0xef, 0xcb, 0x7b, 0xed, 0x6d, 0x58, 0x52, - 0x23, 0x53, 0x1f, 0x0a, 0x2e, 0x6c, 0x17, 0xb9, 0x50, 0x7e, 0xbf, 0x28, 0x3f, 0x50, 0x4d, 0xfc, - 0xbc, 0xbc, 0xe5, 0xec, 0xd3, 0x1c, 0x55, 0xec, 0x40, 0xdf, 0x4c, 0x99, 0x27, 0x08, 0x35, 0x82, - 0x9e, 0x06, 0x13, 0xf7, 0xb7, 0x1d, 0x80, 0x6c, 0x74, 0x74, 0x37, 0xa6, 0xd5, 0xbd, 0x48, 0xae, - 0x36, 0x54, 0xfb, 0xab, 0xd0, 0xd4, 0x77, 0x2a, 0x99, 0x05, 0x69, 0x28, 0x0c, 0x9d, 0xbc, 0x9b, - 0xb0, 0x34, 0x18, 0x46, 0xc7, 0x64, 0x7e, 0x29, 0xb9, 0x26, 0x91, 0x19, 0x21, 0x8b, 0x02, 0xbe, - 0x2f, 0xd1, 0xcc, 0xdc, 0x54, 0x0d, 0x73, 0xe3, 0x7e, 0xa7, 0xa2, 0x23, 0xf1, 0xd9, 0x9c, 0x2f, - 0x94, 0x32, 0xb6, 0x55, 0x50, 0x8e, 0x17, 0x04, 0xbe, 0x29, 0x4a, 0x76, 0x78, 0xe9, 0x21, 0xfe, - 0x5d, 0x58, 0x8c, 0x85, 0xf6, 0x51, 0xaa, 0xa9, 0xfa, 0x1c, 0xd5, 0xb4, 0x10, 0x5b, 0x36, 0xe9, - 0x93, 0xd0, 0xf2, 0xfb, 0x67, 0x3c, 0x4e, 0x03, 0x3a, 0x46, 0x91, 0x43, 0x20, 0x14, 0xea, 0x92, - 0x81, 0x93, 0x9d, 0xbe, 0x09, 0x4b, 0x32, 0x0b, 0x47, 0x53, 0xca, 0xec, 0xd0, 0x0c, 0x46, 0x42, - 0xf7, 0x4f, 0x55, 0xd0, 0xdf, 0xde, 0xc3, 0x8b, 0x57, 0xc4, 0x9c, 0x5d, 0x25, 0x37, 0xbb, 0x4f, - 0xc8, 0x00, 0x7c, 0x5f, 0x9d, 0xd5, 0x66, 0x8c, 0x1b, 0xf1, 0xbe, 0xbc, 0x30, 0xb1, 0x97, 0xb4, - 0xfa, 0x22, 0x4b, 0xea, 0x7e, 0xec, 0xc0, 0xdc, 0x7e, 0x34, 0xde, 0x97, 0xb9, 0x01, 0x24, 0x08, - 0x3a, 0x8f, 0x4d, 0x15, 0x9f, 0x93, 0x35, 0x50, 0x6a, 0x87, 0x17, 0xf2, 0x76, 0xf8, 0x17, 0xe0, - 0x25, 0x8a, 0x14, 0xc4, 0xd1, 0x38, 0x8a, 0x51, 0x18, 0xfd, 0xa1, 0x30, 0xba, 0x51, 0x98, 0x9e, - 0x2a, 0x35, 0xf6, 0x3c, 0x12, 0x3a, 0x92, 0xe1, 0x51, 0x42, 0x38, 0xca, 0xd2, 0x6f, 0x10, 0xda, - 0xad, 0x58, 0xe1, 0x7e, 0x16, 0xea, 0xe4, 0xf8, 0xd2, 0xb4, 0xde, 0x80, 0xfa, 0x69, 0x34, 0xee, - 0x9e, 0x06, 0x61, 0xaa, 0x84, 0x7b, 0x31, 0xf3, 0x48, 0xf7, 0x69, 0x41, 0x34, 0x81, 0xfb, 0x07, - 0x35, 0x98, 0x7b, 0x18, 0x9e, 0x45, 0x41, 0x8f, 0xee, 0x07, 0x46, 0x7c, 0x14, 0xa9, 0xac, 0x3e, - 0xfc, 0x8d, 0x4b, 0x41, 0xd9, 0x2f, 0xe3, 0x54, 0x06, 0xf8, 0x55, 0x11, 0xcd, 0x7d, 0x9c, 0x65, - 0xde, 0x0a, 0xd1, 0x31, 0x10, 0x74, 0xfa, 0x63, 0x33, 0x49, 0x59, 0x96, 0xb2, 0xb4, 0xc8, 0x9a, - 0x91, 0x16, 0x49, 0xb7, 0x49, 0x22, 0x8f, 0x41, 0x5e, 0x74, 0xab, 0x22, 0x1d, 0x52, 0x62, 0x2e, - 0x22, 0x3c, 0xe4, 0x38, 0xcc, 0xc9, 0x43, 0x8a, 0x09, 0xa2, 0x73, 0x21, 0x3e, 0x10, 0x34, 0x42, - 0xf9, 0x9a, 0x10, 0x3a, 0x62, 0xf9, 0x3c, 0xe7, 0xba, 0xe0, 0xf9, 0x1c, 0x8c, 0x1a, 0xba, 0xcf, - 0xb5, 0x22, 0x15, 0x73, 0x00, 0x91, 0x59, 0x9c, 0xc7, 0x8d, 0xa3, 0x8d, 0x48, 0x50, 0x52, 0x47, - 0x1b, 0x64, 0x14, 0x7f, 0x38, 0x3c, 0xf6, 0x7b, 0x4f, 0x29, 0x8d, 0x9d, 0xf2, 0x91, 0xea, 0x9e, - 0x0d, 0x52, 0x26, 0x42, 0xb6, 0x9b, 0x74, 0x1f, 0x59, 0xf5, 0x4c, 0x88, 0x6d, 0x41, 0x83, 0x8e, - 0x73, 0x72, 0x3f, 0x17, 0x69, 0x3f, 0x5b, 0xe6, 0x79, 0x8f, 0x76, 0xd4, 0x24, 0x32, 0xef, 0x2c, - 0x96, 0xec, 0x3b, 0x0b, 0xa1, 0x34, 0xe5, 0x55, 0x4f, 0x8b, 0x7a, 0xcb, 0x00, 0xb4, 0xa6, 0x72, - 0xc1, 0x04, 0xc1, 0x32, 0x11, 0x58, 0x18, 0xbb, 0x0e, 0xf3, 0x78, 0x08, 0x19, 0xfb, 0x41, 0xbf, - 0xcd, 0xf4, 0x59, 0x48, 0x63, 0xd8, 0x86, 0xfa, 0x4d, 0x57, 0x32, 0x2b, 0xb4, 0x2a, 0x16, 0x86, - 0x6b, 0xa3, 0xcb, 0x24, 0x44, 0xab, 0x62, 0x47, 0x2d, 0xd0, 0x4d, 0x81, 0x6d, 0xf7, 0xfb, 0x92, - 0x37, 0xf5, 0xd1, 0x37, 0xe3, 0x2a, 0xc7, 0xe2, 0xaa, 0x92, 0xdd, 0xad, 0x94, 0xef, 0xee, 0x73, - 0xd7, 0xc0, 0xdd, 0x83, 0xc6, 0xa1, 0x91, 0xca, 0x4d, 0x4c, 0xae, 0x92, 0xb8, 0xa5, 0x60, 0x18, - 0x88, 0x31, 0x9c, 0x8a, 0x39, 0x1c, 0xf7, 0xcf, 0x1c, 0x60, 0x07, 0x41, 0x92, 0xea, 0xe1, 0x8b, - 0xbe, 0x5d, 0x68, 0xea, 0x00, 0x45, 0x96, 0x9b, 0x65, 0x61, 0x48, 0x43, 0x43, 0xe9, 0x46, 0x27, - 0x27, 0x09, 0x57, 0x99, 0x14, 0x16, 0x86, 0x1c, 0x8a, 0x3e, 0x0e, 0xfa, 0x0b, 0x81, 0xe8, 0x21, - 0x91, 0x19, 0x15, 0x05, 0x1c, 0xf5, 0x6c, 0xcc, 0xcf, 0x78, 0x9c, 0x68, 0xd1, 0xd2, 0x65, 0x9d, - 0x42, 0x96, 0x5f, 0xe5, 0x4d, 0x98, 0xd7, 0xed, 0xda, 0x2a, 0x44, 0x51, 0xea, 0x7a, 0x54, 0x55, - 0xe4, 0xc3, 0x5b, 0x83, 0x16, 0x6a, 0xb3, 0x58, 0xc1, 0x6e, 0x03, 0x3b, 0x09, 0xe2, 0x3c, 0xf9, - 0x0c, 0x91, 0x97, 0xd4, 0xb8, 0x1f, 0xc0, 0x8a, 0xec, 0xd2, 0x74, 0x6e, 0xec, 0x4d, 0x74, 0x2e, - 0x63, 0xe4, 0x4a, 0x91, 0x91, 0xdd, 0xff, 0x76, 0x60, 0x4e, 0xee, 0x34, 0x6d, 0x4b, 0x3e, 0xa7, - 0xbf, 0xee, 0x59, 0x18, 0x6b, 0x5b, 0xd9, 0xdc, 0xc4, 0xf5, 0x52, 0x75, 0x15, 0x14, 0xd4, 0x4c, - 0x99, 0x82, 0x62, 0x50, 0x1d, 0xfb, 0xe9, 0x29, 0x9d, 0x4c, 0xeb, 0x1e, 0xfd, 0x66, 0x2d, 0x11, - 0x2d, 0x11, 0x8a, 0x90, 0x22, 0x25, 0x65, 0x8f, 0x1a, 0x84, 0xbd, 0x2d, 0x3e, 0x6a, 0xb8, 0x06, - 0x75, 0x1a, 0x40, 0x37, 0x0b, 0x86, 0x64, 0x00, 0x72, 0xae, 0x28, 0x90, 0x84, 0xc9, 0x54, 0xcd, - 0x0c, 0xc1, 0xf3, 0x09, 0xa5, 0xba, 0x88, 0x56, 0xf5, 0x1d, 0x95, 0x4c, 0xd9, 0xcb, 0xe0, 0x8c, - 0x23, 0xe4, 0x00, 0xf2, 0x1c, 0x21, 0x49, 0x3d, 0x5d, 0xef, 0x76, 0xa0, 0xbd, 0xcb, 0x87, 0x3c, - 0xe5, 0xdb, 0xc3, 0x61, 0xbe, 0xfd, 0x97, 0xe0, 0x6a, 0x49, 0x9d, 0xf4, 0x67, 0xbf, 0x04, 0x6b, - 0xdb, 0x22, 0xbd, 0xe9, 0xa7, 0x95, 0x39, 0xe0, 0xb6, 0x61, 0x3d, 0xdf, 0xa4, 0xec, 0xec, 0x3e, - 0x2c, 0xef, 0xf2, 0xe3, 0xc9, 0xe0, 0x80, 0x9f, 0x65, 0x1d, 0x31, 0xa8, 0x26, 0xa7, 0xd1, 0xb9, - 0x14, 0x4c, 0xfa, 0xcd, 0x5e, 0x06, 0x18, 0x22, 0x4d, 0x37, 0x19, 0xf3, 0x9e, 0x4a, 0xc9, 0x26, - 0xe4, 0x68, 0xcc, 0x7b, 0xee, 0x5b, 0xc0, 0xcc, 0x76, 0xe4, 0x7a, 0xa1, 0x3d, 0x9a, 0x1c, 0x77, - 0x93, 0x69, 0x92, 0xf2, 0x91, 0xca, 0x35, 0x37, 0x21, 0xf7, 0x26, 0x34, 0x0f, 0xfd, 0xa9, 0xc7, - 0xbf, 0x29, 0x5f, 0x81, 0x6c, 0xc0, 0xdc, 0xd8, 0x9f, 0xa2, 0x9a, 0xd2, 0xf1, 0x1b, 0xaa, 0x76, - 0xff, 0xb3, 0x02, 0xb3, 0x82, 0x12, 0x5b, 0xed, 0xf3, 0x24, 0x0d, 0x42, 0x71, 0x63, 0x2b, 0x5b, - 0x35, 0xa0, 0x02, 0x2b, 0x57, 0x4a, 0x58, 0x59, 0x9e, 0x9a, 0x54, 0x7a, 0xab, 0xe4, 0x57, 0x0b, - 0x43, 0xe6, 0xca, 0xf2, 0x64, 0x44, 0x00, 0x21, 0x03, 0x72, 0x01, 0xbd, 0xcc, 0xea, 0x89, 0xf1, - 0x29, 0x29, 0x95, 0x9c, 0x6b, 0x42, 0xa5, 0xb6, 0x75, 0x4e, 0x30, 0x78, 0xc1, 0xb6, 0x16, 0x6c, - 0xe8, 0xfc, 0x0b, 0xd8, 0x50, 0x71, 0x94, 0x7a, 0x9e, 0x0d, 0x85, 0x17, 0xb0, 0xa1, 0x2e, 0x83, - 0xd6, 0x7d, 0xce, 0x3d, 0x8e, 0xde, 0x99, 0xe2, 0xdd, 0xef, 0x3a, 0xd0, 0x92, 0x5c, 0xa4, 0xeb, - 0xd8, 0xab, 0x96, 0x17, 0x5a, 0x9a, 0x84, 0xfa, 0x1a, 0x2c, 0x90, 0x6f, 0xa8, 0x23, 0x97, 0x32, - 0xcc, 0x6a, 0x81, 0x38, 0x0f, 0x75, 0xbd, 0x34, 0x0a, 0x86, 0x72, 0x53, 0x4c, 0x48, 0x05, 0x3f, - 0x63, 0x5f, 0xa6, 0xb2, 0x38, 0x9e, 0x2e, 0xbb, 0x7f, 0xe5, 0xc0, 0xb2, 0x31, 0x60, 0xc9, 0x85, - 0xef, 0x82, 0x92, 0x06, 0x11, 0xe0, 0x14, 0x92, 0xbb, 0x61, 0x8b, 0x4d, 0xf6, 0x99, 0x45, 0x4c, - 0x9b, 0xe9, 0x4f, 0x69, 0x80, 0xc9, 0x64, 0x24, 0x95, 0xa8, 0x09, 0x21, 0x23, 0x9d, 0x73, 0xfe, - 0x54, 0x93, 0x08, 0x35, 0x6e, 0x61, 0x94, 0x26, 0x81, 0x3e, 0xad, 0x26, 0x12, 0xf6, 0xcc, 0x06, - 0xdd, 0x7f, 0x74, 0x60, 0x45, 0x1c, 0x4e, 0xe4, 0xd1, 0x4f, 0xbf, 0x10, 0x98, 0x15, 0xa7, 0x31, - 0x21, 0x91, 0xfb, 0x57, 0x3c, 0x59, 0x66, 0x9f, 0x79, 0xc1, 0x03, 0x95, 0x4e, 0x8f, 0xb9, 0x60, - 0x2f, 0x66, 0xca, 0xf6, 0xe2, 0x39, 0x2b, 0x5d, 0x16, 0xd0, 0xab, 0x95, 0x06, 0xf4, 0xee, 0xcd, - 0x41, 0x2d, 0xe9, 0x45, 0x63, 0xee, 0xae, 0xc3, 0xaa, 0x3d, 0x39, 0xa9, 0x82, 0xbe, 0xe7, 0x40, - 0xfb, 0xbe, 0x08, 0x6f, 0x07, 0xe1, 0x60, 0x3f, 0x48, 0xd2, 0x28, 0xd6, 0xcf, 0x9e, 0xae, 0x03, - 0x24, 0xa9, 0x1f, 0xa7, 0x22, 0x7d, 0x51, 0x86, 0xdb, 0x32, 0x04, 0xc7, 0xc8, 0xc3, 0xbe, 0xa8, - 0x15, 0x7b, 0xa3, 0xcb, 0x05, 0x1f, 0x42, 0x1e, 0x9f, 0x2c, 0x4b, 0xfc, 0xba, 0xc8, 0x37, 0x43, - 0x5f, 0x81, 0x9f, 0x91, 0x5e, 0x17, 0xe7, 0x92, 0x1c, 0xea, 0xfe, 0x85, 0x03, 0x4b, 0xd9, 0x20, - 0xf7, 0x10, 0xb4, 0xb5, 0x83, 0x34, 0xbf, 0x99, 0x76, 0x50, 0x81, 0xc0, 0x00, 0xed, 0xb1, 0x1c, - 0x9b, 0x81, 0x90, 0xc4, 0xca, 0x52, 0x34, 0x51, 0x0e, 0x8e, 0x09, 0x89, 0x4c, 0x0f, 0xf4, 0x04, - 0xa4, 0x57, 0x23, 0x4b, 0x94, 0x7d, 0x3a, 0x4a, 0xe9, 0xab, 0x59, 0x71, 0x30, 0x93, 0x45, 0x65, - 0x4a, 0xe7, 0x08, 0xc5, 0x9f, 0xee, 0xef, 0x38, 0x70, 0xb5, 0x64, 0x71, 0xa5, 0x64, 0xec, 0xc2, - 0xf2, 0x89, 0xae, 0x54, 0x0b, 0x20, 0xc4, 0x63, 0x5d, 0xdd, 0xc7, 0xd8, 0x93, 0xf6, 0x8a, 0x1f, - 0x68, 0xdf, 0x47, 0x2c, 0xa9, 0x95, 0x42, 0x55, 0xac, 0xd8, 0xfa, 0xdd, 0x19, 0x58, 0x14, 0xf7, - 0x74, 0xe2, 0x01, 0x32, 0x8f, 0xd9, 0x7b, 0x30, 0x27, 0x1f, 0x90, 0xb3, 0x35, 0xd9, 0xad, 0xfd, - 0x64, 0xbd, 0xb3, 0x9e, 0x87, 0x25, 0xef, 0xac, 0xfc, 0xfa, 0xc7, 0xff, 0xf2, 0x7b, 0x95, 0x05, - 0xd6, 0xb8, 0x73, 0xf6, 0xe6, 0x9d, 0x01, 0x0f, 0x13, 0x6c, 0xe3, 0x97, 0x00, 0xb2, 0xa7, 0xd5, - 0xac, 0xad, 0x7d, 0xb6, 0xdc, 0x9b, 0xf1, 0xce, 0xd5, 0x92, 0x1a, 0xd9, 0xee, 0x55, 0x6a, 0x77, - 0xc5, 0x5d, 0xc4, 0x76, 0x83, 0x30, 0x48, 0xc5, 0x3b, 0xeb, 0x77, 0x9c, 0x4d, 0xd6, 0x87, 0xa6, - 0xf9, 0x72, 0x9a, 0xa9, 0xd0, 0x4d, 0xc9, 0xbb, 0xed, 0xce, 0x4b, 0xa5, 0x75, 0x2a, 0x6e, 0x45, - 0x7d, 0xac, 0xb9, 0x2d, 0xec, 0x63, 0x42, 0x14, 0x59, 0x2f, 0x43, 0x58, 0xb4, 0x1f, 0x48, 0xb3, - 0x6b, 0x86, 0x58, 0x17, 0x9e, 0x67, 0x77, 0x5e, 0xbe, 0xa0, 0x56, 0xf6, 0xf5, 0x32, 0xf5, 0xb5, - 0xe1, 0x32, 0xec, 0xab, 0x47, 0x34, 0xea, 0x79, 0xf6, 0x3b, 0xce, 0xe6, 0xd6, 0xc7, 0xd7, 0xa1, - 0xae, 0x83, 0xad, 0xec, 0x1b, 0xb0, 0x60, 0x5d, 0xa4, 0x32, 0x35, 0x8d, 0xb2, 0x7b, 0xd7, 0xce, - 0xb5, 0xf2, 0x4a, 0xd9, 0xf1, 0x75, 0xea, 0xb8, 0xcd, 0xd6, 0xb1, 0x63, 0x79, 0x13, 0x79, 0x87, - 0xae, 0x8f, 0x45, 0x6e, 0xeb, 0x53, 0x31, 0xcf, 0xec, 0xf2, 0xd3, 0x9a, 0x67, 0xe1, 0xb2, 0xd4, - 0x9a, 0x67, 0xf1, 0xc6, 0xd4, 0xbd, 0x46, 0xdd, 0xad, 0xb3, 0x55, 0xb3, 0x3b, 0x1d, 0x04, 0xe5, - 0x94, 0x8d, 0x6c, 0xbe, 0x9f, 0x66, 0x2f, 0x6b, 0xc6, 0x2a, 0x7b, 0x57, 0xad, 0x59, 0xa4, 0xf8, - 0xb8, 0xda, 0x6d, 0x53, 0x57, 0x8c, 0xd1, 0xf6, 0x99, 0xcf, 0xa7, 0xd9, 0xd7, 0xa0, 0xae, 0x1f, - 0x0b, 0xb2, 0x0d, 0xe3, 0x85, 0xa6, 0xf9, 0x82, 0xb1, 0xd3, 0x2e, 0x56, 0x94, 0x31, 0x86, 0xd9, - 0x32, 0x32, 0xc6, 0x01, 0xac, 0xc9, 0x33, 0xc0, 0x31, 0xff, 0x51, 0x66, 0x52, 0xf2, 0xea, 0xfb, - 0xae, 0xc3, 0xde, 0x85, 0x79, 0xf5, 0x06, 0x93, 0xad, 0x97, 0xbf, 0x25, 0xed, 0x6c, 0x14, 0x70, - 0xa9, 0x3d, 0xbe, 0x02, 0x90, 0xbd, 0x2d, 0xd4, 0x72, 0x56, 0x78, 0xd5, 0xa8, 0x17, 0xb1, 0xf8, - 0x10, 0xd1, 0x5d, 0xa7, 0xa9, 0xb6, 0x18, 0xc9, 0x59, 0xc8, 0xcf, 0x55, 0x1a, 0xfd, 0x2e, 0x34, - 0x8c, 0xe7, 0x85, 0x4c, 0xb5, 0x50, 0x7c, 0x9a, 0xd8, 0xe9, 0x94, 0x55, 0xc9, 0x01, 0x7e, 0x01, - 0x16, 0xac, 0x77, 0x82, 0x9a, 0x91, 0xcb, 0x5e, 0x21, 0x6a, 0x46, 0x2e, 0x7f, 0x5a, 0xf8, 0x55, - 0x68, 0x18, 0xaf, 0xfa, 0x98, 0x91, 0x20, 0x98, 0x7b, 0xcf, 0xa7, 0x47, 0x54, 0xf6, 0x08, 0x70, - 0x95, 0xe6, 0xbb, 0xe8, 0xd6, 0x71, 0xbe, 0x94, 0x4b, 0x8e, 0x7b, 0xfa, 0x0d, 0x58, 0xb4, 0xdf, - 0xf9, 0x69, 0x21, 0x28, 0x7d, 0x31, 0xa8, 0x85, 0xe0, 0x82, 0xc7, 0x81, 0x92, 0x7f, 0x36, 0x57, - 0x74, 0x27, 0x77, 0x3e, 0x92, 0xb7, 0x86, 0xcf, 0xd8, 0x97, 0x50, 0xd2, 0x65, 0x72, 0x3f, 0xcb, - 0x5e, 0x37, 0xda, 0x4f, 0x00, 0x34, 0x73, 0x16, 0xde, 0x01, 0xb8, 0xcb, 0xd4, 0x78, 0x83, 0x65, - 0x33, 0x10, 0xea, 0x9b, 0x92, 0xfc, 0x0d, 0xf5, 0x6d, 0xbe, 0x03, 0x30, 0xd4, 0xb7, 0xf5, 0x16, - 0x20, 0xaf, 0xbe, 0xd3, 0x00, 0xdb, 0x08, 0x61, 0x29, 0x97, 0x21, 0xa3, 0x79, 0xbb, 0x3c, 0xa5, - 0xb0, 0x73, 0xfd, 0xf9, 0x89, 0x35, 0xb6, 0x56, 0x50, 0xda, 0xe0, 0x8e, 0xca, 0x00, 0xfd, 0x65, - 0x68, 0x9a, 0xef, 0xb3, 0xb4, 0x42, 0x2f, 0x79, 0x55, 0xa6, 0x15, 0x7a, 0xd9, 0x83, 0x2e, 0xb5, - 0xb9, 0xac, 0x69, 0x76, 0x83, 0x9b, 0x6b, 0x3f, 0x50, 0xc9, 0x34, 0x5c, 0xd9, 0xbb, 0x9c, 0x4c, - 0xc3, 0x95, 0xbe, 0x6a, 0x51, 0x9b, 0xcb, 0x56, 0xac, 0xb9, 0x88, 0x90, 0x30, 0xfb, 0x2a, 0x2c, - 0x19, 0xe9, 0x67, 0x47, 0xd3, 0xb0, 0xa7, 0x19, 0xb5, 0x98, 0xba, 0xdc, 0x29, 0x73, 0x14, 0xdd, - 0x0d, 0x6a, 0x7f, 0xd9, 0xb5, 0x26, 0x81, 0x4c, 0xba, 0x03, 0x0d, 0x33, 0xb5, 0xed, 0x39, 0xed, - 0x6e, 0x18, 0x55, 0x66, 0x9e, 0xee, 0x5d, 0x87, 0xfd, 0xa1, 0x03, 0x4d, 0x2b, 0x51, 0xcc, 0xba, - 0xf8, 0xc8, 0xb5, 0xd3, 0x36, 0xeb, 0xcc, 0x86, 0x5c, 0x8f, 0x06, 0x79, 0xb0, 0xf9, 0x05, 0x6b, - 0x11, 0x3e, 0xb2, 0x0e, 0x1c, 0xb7, 0xf3, 0x4f, 0xf9, 0x9f, 0xe5, 0x09, 0xcc, 0xf4, 0xee, 0x67, - 0x77, 0x1d, 0xf6, 0x27, 0x0e, 0x2c, 0xda, 0xc7, 0x64, 0xbd, 0x55, 0xa5, 0x07, 0x72, 0xbd, 0x55, - 0x17, 0x9c, 0xad, 0x7f, 0x06, 0xa3, 0x64, 0xef, 0x88, 0x3f, 0xd4, 0x50, 0x31, 0x1b, 0x66, 0xe8, - 0xe6, 0xfc, 0xb6, 0x9a, 0xff, 0x26, 0x71, 0xcb, 0xb9, 0xeb, 0xb0, 0xaf, 0x8b, 0x7f, 0x15, 0x90, - 0xdf, 0x12, 0x77, 0xbc, 0xe8, 0xf7, 0xee, 0x6b, 0x34, 0x97, 0xeb, 0xee, 0x55, 0x6b, 0x2e, 0x79, - 0xe3, 0xb4, 0x2d, 0x46, 0x27, 0xff, 0x2c, 0x22, 0x53, 0xdb, 0x85, 0x3f, 0x90, 0xb8, 0x78, 0x90, - 0x23, 0x31, 0x48, 0x49, 0x6e, 0xb1, 0xf0, 0x0b, 0x36, 0xe3, 0x6e, 0xd2, 0x58, 0x5f, 0x73, 0x5f, - 0xb9, 0x70, 0xac, 0x77, 0xe8, 0x90, 0x8b, 0x23, 0x3e, 0x04, 0xc8, 0xe2, 0xab, 0x2c, 0x17, 0xdf, - 0xd3, 0x96, 0xab, 0x18, 0x82, 0xb5, 0xe5, 0x44, 0x85, 0x01, 0xb1, 0xc5, 0xaf, 0x09, 0x75, 0xf2, - 0x50, 0x45, 0x06, 0xaf, 0x1a, 0x2a, 0xc3, 0x0e, 0x84, 0x76, 0x3a, 0x65, 0x55, 0x65, 0xca, 0x44, - 0x87, 0x19, 0xdf, 0x87, 0x85, 0x83, 0x28, 0x7a, 0x3a, 0x19, 0xeb, 0xdb, 0x0a, 0x3b, 0xfe, 0xb4, - 0xef, 0x27, 0xa7, 0x9d, 0xdc, 0x2c, 0xdc, 0x1b, 0xd4, 0x54, 0x87, 0xb5, 0x8d, 0xa6, 0xee, 0x7c, - 0x94, 0xc5, 0x6f, 0x9f, 0x31, 0x1f, 0x96, 0xb5, 0x53, 0xa1, 0x07, 0xde, 0xb1, 0x9b, 0x31, 0x23, - 0x8f, 0x85, 0x2e, 0x2c, 0x37, 0x4f, 0x8d, 0xf6, 0x4e, 0xa2, 0xda, 0xbc, 0xeb, 0xb0, 0x43, 0x68, - 0xee, 0xf2, 0x5e, 0xd4, 0xe7, 0x32, 0x88, 0xb3, 0x92, 0x0d, 0x5c, 0x47, 0x7f, 0x3a, 0x0b, 0x16, - 0x68, 0xeb, 0xed, 0xb1, 0x3f, 0x8d, 0xf9, 0x37, 0xef, 0x7c, 0x24, 0xc3, 0x43, 0xcf, 0x94, 0xde, - 0x56, 0xf1, 0x33, 0x4b, 0x6f, 0xe7, 0x02, 0x6e, 0x96, 0xde, 0x2e, 0x04, 0xdc, 0xac, 0xa5, 0x56, - 0xf1, 0x3b, 0x36, 0x84, 0xe5, 0x42, 0x8c, 0x8e, 0xbd, 0xa2, 0x2c, 0xef, 0x05, 0x91, 0xbd, 0xce, - 0x8d, 0x8b, 0x09, 0xec, 0xde, 0x36, 0xed, 0xde, 0x8e, 0x60, 0x61, 0x97, 0x8b, 0xc5, 0x12, 0x29, - 0x11, 0xb9, 0xb7, 0x8a, 0x66, 0xfa, 0x44, 0x5e, 0x71, 0x53, 0x9d, 0x6d, 0x98, 0x29, 0x1f, 0x81, - 0x7d, 0x0d, 0x1a, 0x0f, 0x78, 0xaa, 0x72, 0x20, 0xb4, 0x83, 0x97, 0x4b, 0x8a, 0xe8, 0x94, 0xa4, - 0x50, 0xd8, 0x3c, 0x43, 0xad, 0xdd, 0xe1, 0xfd, 0x01, 0x17, 0xca, 0xa9, 0x1b, 0xf4, 0x9f, 0xb1, - 0x5f, 0xa4, 0xc6, 0x75, 0x4a, 0xd5, 0xba, 0x71, 0x75, 0x6e, 0x36, 0xbe, 0x94, 0xc3, 0xcb, 0x5a, - 0x0e, 0xa3, 0x3e, 0x37, 0x5c, 0x94, 0x10, 0x1a, 0x46, 0xbe, 0x9f, 0x16, 0xa0, 0x62, 0xee, 0xa2, - 0x16, 0xa0, 0x92, 0xf4, 0x40, 0xf7, 0x16, 0xf5, 0xe3, 0xb2, 0x1b, 0x59, 0x3f, 0x22, 0x25, 0x30, - 0xeb, 0xe9, 0xce, 0x47, 0xfe, 0x28, 0x7d, 0xc6, 0x3e, 0xa0, 0x77, 0x8b, 0x66, 0x9e, 0x47, 0xe6, - 0xb1, 0xe6, 0x53, 0x42, 0xf4, 0x62, 0x19, 0x55, 0xb6, 0x17, 0x2b, 0xba, 0x22, 0x4f, 0xe6, 0x33, - 0x00, 0x47, 0x69, 0x34, 0xde, 0xf5, 0xf9, 0x28, 0x0a, 0x33, 0x5d, 0x9b, 0xe5, 0x32, 0x64, 0xfa, - 0xcb, 0x48, 0x68, 0x60, 0x1f, 0x18, 0x2e, 0xbe, 0x95, 0x26, 0xa3, 0x98, 0xeb, 0xc2, 0x74, 0x07, - 0xbd, 0x20, 0x25, 0x29, 0x0f, 0x77, 0x1d, 0xb6, 0x0d, 0x90, 0x05, 0x69, 0xb5, 0xc3, 0x5e, 0x88, - 0xff, 0x6a, 0xb5, 0x57, 0x12, 0xd1, 0x3d, 0x84, 0x7a, 0x16, 0xf5, 0xdb, 0xc8, 0x72, 0x36, 0xad, - 0x18, 0xa1, 0xb6, 0xdc, 0x85, 0x58, 0x9c, 0xdb, 0xa2, 0xa5, 0x02, 0x36, 0x8f, 0x4b, 0x45, 0x01, - 0xb6, 0x00, 0x56, 0xc4, 0x00, 0xb5, 0x1b, 0x42, 0xb7, 0xf3, 0x6a, 0x26, 0x25, 0xf1, 0x30, 0x2d, - 0xcd, 0xa5, 0xe1, 0x24, 0xeb, 0xe8, 0x8e, 0xdc, 0x2a, 0x32, 0x03, 0x50, 0x35, 0x8f, 0x60, 0xb9, - 0x10, 0x0b, 0xd1, 0x22, 0x7d, 0x51, 0x08, 0x4a, 0x8b, 0xf4, 0x85, 0x61, 0x14, 0x77, 0x8d, 0xba, - 0x5c, 0x72, 0x01, 0xbb, 0x4c, 0xce, 0x83, 0xb4, 0x77, 0xfa, 0x8e, 0xb3, 0x79, 0x3c, 0x4b, 0x7f, - 0xc0, 0xf7, 0xa9, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x63, 0x24, 0x7e, 0xd9, 0xb2, 0x4f, 0x00, - 0x00, + 0x8b, 0x52, 0x7d, 0xb9, 0xa5, 0xbe, 0x9c, 0xbf, 0xec, 0x4b, 0x45, 0xe9, 0x3e, 0xd0, 0xd7, 0x56, + 0x0f, 0x62, 0x7f, 0x7c, 0xaa, 0xa4, 0xf4, 0x2e, 0xac, 0x04, 0x61, 0x6f, 0x38, 0xe9, 0xf3, 0xee, + 0x24, 0xf4, 0xc3, 0x30, 0x9a, 0x84, 0x3d, 0xae, 0x6e, 0xed, 0xcb, 0xaa, 0xdc, 0xbe, 0x4e, 0xfb, + 0xa1, 0x86, 0xd8, 0x26, 0xd4, 0xb0, 0x23, 0xa5, 0xfb, 0xcb, 0x45, 0x58, 0x90, 0xb0, 0x5b, 0x50, + 0xe3, 0xfd, 0x01, 0x57, 0x67, 0x42, 0x66, 0x9f, 0xce, 0x71, 0x57, 0x3d, 0x41, 0x80, 0x0a, 0x05, + 0xd1, 0x9c, 0x42, 0xb1, 0xed, 0xc6, 0x2c, 0x16, 0x1f, 0xf6, 0xdd, 0x55, 0x60, 0x8f, 0x84, 0x0c, + 0x98, 0x11, 0xef, 0x6f, 0xcf, 0x40, 0xc3, 0x80, 0x51, 0x37, 0x0c, 0x70, 0xc0, 0xdd, 0x7e, 0xe0, + 0x8f, 0x78, 0xca, 0x63, 0xc9, 0xf7, 0x39, 0x14, 0xe9, 0xfc, 0xb3, 0x41, 0x37, 0x9a, 0xa4, 0xdd, + 0x3e, 0x1f, 0xc4, 0x5c, 0x98, 0x72, 0x34, 0x2d, 0x16, 0x8a, 0x74, 0x23, 0xff, 0x43, 0x93, 0x4e, + 0x70, 0x50, 0x0e, 0x55, 0xf1, 0x6b, 0xb1, 0x46, 0xd5, 0x2c, 0x7e, 0x2d, 0x56, 0x24, 0xaf, 0xd5, + 0x6a, 0x25, 0x5a, 0xed, 0x2d, 0x58, 0x17, 0xfa, 0x4b, 0x4a, 0x7a, 0x37, 0xc7, 0x58, 0x17, 0xd4, + 0xb2, 0x4d, 0x68, 0xe1, 0x98, 0x95, 0x48, 0x24, 0xc1, 0xb7, 0x44, 0x44, 0xc9, 0xf1, 0x0a, 0x38, + 0xd2, 0x52, 0x68, 0xc7, 0xa4, 0x15, 0xf7, 0x79, 0x05, 0x9c, 0x68, 0xfd, 0x0f, 0x6d, 0xda, 0xba, + 0xa4, 0xcd, 0xe1, 0xee, 0x02, 0x34, 0x8e, 0xd2, 0x68, 0xac, 0x36, 0x65, 0x11, 0x9a, 0xa2, 0x28, + 0xb3, 0x27, 0x5e, 0x82, 0xab, 0xc4, 0x45, 0x4f, 0xa2, 0x71, 0x34, 0x8c, 0x06, 0xd3, 0xa3, 0xc9, + 0x71, 0xd2, 0x8b, 0x83, 0x31, 0x9e, 0x9f, 0xdc, 0xbf, 0x77, 0x60, 0xc5, 0xaa, 0x95, 0x41, 0xa6, + 0x4f, 0x0b, 0x21, 0xd0, 0xd7, 0xde, 0x82, 0xf1, 0x96, 0x0d, 0xe5, 0x2a, 0x08, 0x45, 0xf0, 0xef, + 0x7d, 0x79, 0x13, 0xbe, 0x0d, 0x4b, 0x6a, 0x64, 0xea, 0x43, 0xc1, 0x85, 0xed, 0x22, 0x17, 0xca, + 0xef, 0x17, 0xe5, 0x07, 0xaa, 0x89, 0x9f, 0x97, 0xf7, 0xa2, 0x7d, 0x9a, 0xa3, 0x8a, 0x36, 0xe8, + 0xbb, 0x2c, 0xf3, 0xcc, 0xa1, 0x46, 0xd0, 0xd3, 0x60, 0xe2, 0xfe, 0xb6, 0x03, 0x90, 0x8d, 0x8e, + 0x6e, 0xd3, 0xb4, 0x81, 0x10, 0xe9, 0xd8, 0x86, 0x31, 0x78, 0x15, 0x9a, 0xfa, 0x16, 0x26, 0xb3, + 0x39, 0x0d, 0x85, 0xa1, 0x5b, 0x78, 0x13, 0x96, 0x06, 0xc3, 0xe8, 0x98, 0x0c, 0x36, 0xa5, 0xe3, + 0x24, 0x32, 0x87, 0x64, 0x51, 0xc0, 0xf7, 0x25, 0x9a, 0x19, 0xa8, 0xaa, 0x61, 0xa0, 0xdc, 0xef, + 0x54, 0x74, 0xec, 0x3e, 0x9b, 0xf3, 0x85, 0x52, 0xc6, 0xb6, 0x0a, 0xea, 0xf4, 0x82, 0x50, 0x39, + 0xc5, 0xd5, 0x0e, 0x2f, 0x3d, 0xf6, 0xbf, 0x0b, 0x8b, 0xb1, 0xd0, 0x57, 0x4a, 0x99, 0x55, 0x9f, + 0xa3, 0xcc, 0x16, 0x62, 0xcb, 0x8a, 0x7d, 0x12, 0x5a, 0x7e, 0xff, 0x8c, 0xc7, 0x69, 0x40, 0x07, + 0x2f, 0x72, 0x21, 0x84, 0x0a, 0x5e, 0x32, 0x70, 0xb2, 0xec, 0x37, 0x61, 0x49, 0xe6, 0xed, 0x68, + 0x4a, 0x99, 0x4f, 0x9a, 0xc1, 0x48, 0xe8, 0xfe, 0xa9, 0xba, 0x26, 0xb0, 0xf7, 0xf0, 0xe2, 0x15, + 0x31, 0x67, 0x57, 0xc9, 0xcd, 0xee, 0x13, 0x32, 0x64, 0xdf, 0x57, 0xa7, 0xbb, 0x19, 0xe3, 0x0e, + 0xbd, 0x2f, 0xaf, 0x58, 0xec, 0x25, 0xad, 0xbe, 0xc8, 0x92, 0xba, 0x1f, 0x3b, 0x30, 0xb7, 0x1f, + 0x8d, 0xf7, 0x65, 0x36, 0x01, 0x09, 0x82, 0xce, 0x7c, 0x53, 0xc5, 0xe7, 0xe4, 0x19, 0x94, 0x5a, + 0xee, 0x85, 0xbc, 0xe5, 0xfe, 0x05, 0x78, 0x89, 0x62, 0x0b, 0x71, 0x34, 0x8e, 0x62, 0x14, 0x46, + 0x7f, 0x28, 0xcc, 0x74, 0x14, 0xa6, 0xa7, 0x4a, 0x8d, 0x3d, 0x8f, 0x84, 0x0e, 0x71, 0x78, 0xf8, + 0x10, 0xae, 0xb5, 0xf4, 0x34, 0x84, 0x76, 0x2b, 0x56, 0xb8, 0x9f, 0x85, 0x3a, 0xb9, 0xca, 0x34, + 0xad, 0x37, 0xa0, 0x7e, 0x1a, 0x8d, 0xbb, 0xa7, 0x41, 0x98, 0x2a, 0xe1, 0x5e, 0xcc, 0x7c, 0xd8, + 0x7d, 0x5a, 0x10, 0x4d, 0xe0, 0xfe, 0x41, 0x0d, 0xe6, 0x1e, 0x86, 0x67, 0x51, 0xd0, 0xa3, 0x1b, + 0x85, 0x11, 0x1f, 0x45, 0x2a, 0x0f, 0x10, 0x7f, 0xe3, 0x52, 0x50, 0xbe, 0xcc, 0x38, 0x95, 0x57, + 0x02, 0xaa, 0x88, 0x0e, 0x42, 0x9c, 0xe5, 0xea, 0x0a, 0xd1, 0x31, 0x10, 0x3c, 0x26, 0xc4, 0x66, + 0x5a, 0xb3, 0x2c, 0x65, 0x89, 0x94, 0x35, 0x23, 0x91, 0x92, 0xee, 0x9f, 0x44, 0xe6, 0x83, 0xbc, + 0x1a, 0x57, 0x45, 0x3a, 0xd6, 0xc4, 0x5c, 0xc4, 0x84, 0xc8, 0xd5, 0x98, 0x93, 0xc7, 0x1a, 0x13, + 0x44, 0x77, 0x44, 0x7c, 0x20, 0x68, 0x84, 0xf2, 0x35, 0x21, 0x74, 0xdd, 0xf2, 0x99, 0xd1, 0x75, + 0xc1, 0xf3, 0x39, 0x18, 0x35, 0x74, 0x9f, 0x6b, 0x45, 0x2a, 0xe6, 0x00, 0x22, 0x17, 0x39, 0x8f, + 0x1b, 0x87, 0x21, 0x91, 0xd2, 0xa4, 0x0e, 0x43, 0xc8, 0x28, 0xfe, 0x70, 0x78, 0xec, 0xf7, 0x9e, + 0x52, 0xe2, 0x3b, 0x65, 0x30, 0xd5, 0x3d, 0x1b, 0xa4, 0xdc, 0x85, 0x6c, 0x37, 0xe9, 0x06, 0xb3, + 0xea, 0x99, 0x10, 0xdb, 0x82, 0x06, 0x1d, 0x00, 0xe5, 0x7e, 0x2e, 0xd2, 0x7e, 0xb6, 0xcc, 0x13, + 0x22, 0xed, 0xa8, 0x49, 0x64, 0xde, 0x72, 0x2c, 0xd9, 0xb7, 0x1c, 0x42, 0x69, 0xca, 0xcb, 0xa1, + 0x16, 0xf5, 0x96, 0x01, 0x68, 0x4d, 0xe5, 0x82, 0x09, 0x82, 0x65, 0x22, 0xb0, 0x30, 0x76, 0x1d, + 0xe6, 0xf1, 0xd8, 0x32, 0xf6, 0x83, 0x7e, 0x9b, 0xe9, 0xd3, 0x93, 0xc6, 0xb0, 0x0d, 0xf5, 0x9b, + 0x2e, 0x71, 0x56, 0x68, 0x55, 0x2c, 0x0c, 0xd7, 0x46, 0x97, 0x49, 0x88, 0x56, 0xc5, 0x8e, 0x5a, + 0xa0, 0x9b, 0x02, 0xdb, 0xee, 0xf7, 0x25, 0x6f, 0xea, 0xc3, 0x72, 0xc6, 0x55, 0x8e, 0xc5, 0x55, + 0x25, 0xbb, 0x5b, 0x29, 0xdf, 0xdd, 0xe7, 0xae, 0x81, 0xbb, 0x07, 0x8d, 0x43, 0x23, 0xf9, 0x9b, + 0x98, 0x5c, 0xa5, 0x7d, 0x4b, 0xc1, 0x30, 0x10, 0x63, 0x38, 0x15, 0x73, 0x38, 0xee, 0x9f, 0x39, + 0xc0, 0x0e, 0x82, 0x24, 0xd5, 0xc3, 0x17, 0x7d, 0xbb, 0xd0, 0xd4, 0x21, 0x8d, 0x2c, 0x9b, 0xcb, + 0xc2, 0x90, 0x86, 0x86, 0xd2, 0x8d, 0x4e, 0x4e, 0x12, 0xae, 0x72, 0x2f, 0x2c, 0x0c, 0x39, 0x14, + 0x7d, 0x1c, 0xf4, 0x17, 0x02, 0xd1, 0x43, 0x22, 0x73, 0x30, 0x0a, 0x38, 0xea, 0xd9, 0x98, 0x9f, + 0xf1, 0x38, 0xd1, 0xa2, 0xa5, 0xcb, 0x3a, 0xe9, 0x2c, 0xbf, 0xca, 0x9b, 0x30, 0xaf, 0xdb, 0xb5, + 0x55, 0x88, 0xa2, 0xd4, 0xf5, 0xa8, 0xaa, 0xc8, 0xeb, 0xb7, 0x06, 0x2d, 0xd4, 0x66, 0xb1, 0x82, + 0xdd, 0x06, 0x76, 0x12, 0xc4, 0x79, 0xf2, 0x19, 0x22, 0x2f, 0xa9, 0x71, 0x3f, 0x80, 0x15, 0xd9, + 0xa5, 0xe9, 0xdc, 0xd8, 0x9b, 0xe8, 0x5c, 0xc6, 0xc8, 0x95, 0x22, 0x23, 0xbb, 0xff, 0xed, 0xc0, + 0x9c, 0xdc, 0x69, 0xda, 0x96, 0xfc, 0x2b, 0x80, 0xba, 0x67, 0x61, 0xac, 0x6d, 0xe5, 0x7f, 0x13, + 0xd7, 0x4b, 0xd5, 0x55, 0x50, 0x50, 0x33, 0x65, 0x0a, 0x8a, 0x41, 0x75, 0xec, 0xa7, 0xa7, 0x74, + 0x96, 0xad, 0x7b, 0xf4, 0x9b, 0xb5, 0x44, 0x7c, 0x45, 0x28, 0x42, 0x8a, 0xad, 0x94, 0x3d, 0x83, + 0x10, 0xf6, 0xb6, 0xf8, 0x0c, 0xe2, 0x1a, 0xd4, 0x69, 0x00, 0xdd, 0x2c, 0x7c, 0x92, 0x01, 0xc8, + 0xb9, 0xa2, 0x40, 0x12, 0x26, 0x93, 0x3b, 0x33, 0xc4, 0x5d, 0x13, 0x3b, 0x2f, 0x97, 0x40, 0xdf, + 0x6a, 0xc9, 0x24, 0xbf, 0x0c, 0xce, 0x38, 0x42, 0x0e, 0x20, 0xcf, 0x11, 0x92, 0xd4, 0xd3, 0xf5, + 0x6e, 0x07, 0xda, 0xbb, 0x7c, 0xc8, 0x53, 0xbe, 0x3d, 0x1c, 0xe6, 0xdb, 0x7f, 0x09, 0xae, 0x96, + 0xd4, 0x49, 0x7f, 0xf6, 0x4b, 0xb0, 0xb6, 0x2d, 0x12, 0xa2, 0x7e, 0x5a, 0xb9, 0x06, 0x6e, 0x1b, + 0xd6, 0xf3, 0x4d, 0xca, 0xce, 0xee, 0xc3, 0xf2, 0x2e, 0x3f, 0x9e, 0x0c, 0x0e, 0xf8, 0x59, 0xd6, + 0x11, 0x83, 0x6a, 0x72, 0x1a, 0x9d, 0x4b, 0xc1, 0xa4, 0xdf, 0xec, 0x65, 0x80, 0x21, 0xd2, 0x74, + 0x93, 0x31, 0xef, 0xa9, 0x24, 0x6e, 0x42, 0x8e, 0xc6, 0xbc, 0xe7, 0xbe, 0x05, 0xcc, 0x6c, 0x47, + 0xae, 0x17, 0xda, 0xa3, 0xc9, 0x71, 0x37, 0x99, 0x26, 0x29, 0x1f, 0xa9, 0xec, 0x74, 0x13, 0x72, + 0x6f, 0x42, 0xf3, 0xd0, 0x9f, 0x7a, 0xfc, 0x9b, 0xf2, 0xdd, 0xc8, 0x06, 0xcc, 0x8d, 0xfd, 0x29, + 0xaa, 0x29, 0x1d, 0xf1, 0xa1, 0x6a, 0xf7, 0x3f, 0x2b, 0x30, 0x2b, 0x28, 0xb1, 0xd5, 0x3e, 0x4f, + 0xd2, 0x20, 0x14, 0x77, 0xbc, 0xb2, 0x55, 0x03, 0x2a, 0xb0, 0x72, 0xa5, 0x84, 0x95, 0xe5, 0xa9, + 0x49, 0x25, 0xc4, 0x4a, 0x7e, 0xb5, 0x30, 0x64, 0xae, 0x2c, 0xb3, 0x46, 0x84, 0x1c, 0x32, 0x20, + 0x17, 0x02, 0xcc, 0xac, 0x9e, 0x18, 0x9f, 0x92, 0x52, 0xc9, 0xb9, 0x26, 0x54, 0x6a, 0x5b, 0xe7, + 0x04, 0x83, 0x17, 0x6c, 0x6b, 0xc1, 0x86, 0xce, 0xbf, 0x80, 0x0d, 0x15, 0x47, 0xa9, 0xe7, 0xd9, + 0x50, 0x78, 0x01, 0x1b, 0xea, 0x32, 0x68, 0xdd, 0xe7, 0xdc, 0xe3, 0xe8, 0x9d, 0x29, 0xde, 0xfd, + 0xae, 0x03, 0x2d, 0xc9, 0x45, 0xba, 0x8e, 0xbd, 0x6a, 0x79, 0xa1, 0xa5, 0x69, 0xab, 0xaf, 0xc1, + 0x02, 0xf9, 0x86, 0x3a, 0xd6, 0x29, 0x03, 0xb3, 0x16, 0x88, 0xf3, 0x50, 0x17, 0x52, 0xa3, 0x60, + 0x28, 0x37, 0xc5, 0x84, 0x54, 0xb8, 0x34, 0xf6, 0x65, 0xf2, 0x8b, 0xe3, 0xe9, 0xb2, 0xfb, 0x57, + 0x0e, 0x2c, 0x1b, 0x03, 0x96, 0x5c, 0xf8, 0x2e, 0x28, 0x69, 0x10, 0x21, 0x51, 0x21, 0xb9, 0x1b, + 0xb6, 0xd8, 0x64, 0x9f, 0x59, 0xc4, 0xb4, 0x99, 0xfe, 0x94, 0x06, 0x98, 0x4c, 0x46, 0x52, 0x89, + 0x9a, 0x10, 0x32, 0xd2, 0x39, 0xe7, 0x4f, 0x35, 0x89, 0x50, 0xe3, 0x16, 0x46, 0x89, 0x15, 0xe8, + 0xd3, 0x6a, 0x22, 0x61, 0xcf, 0x6c, 0xd0, 0xfd, 0x47, 0x07, 0x56, 0xc4, 0xe1, 0x44, 0x1e, 0xfd, + 0xf4, 0x9b, 0x82, 0x59, 0x71, 0x1a, 0x13, 0x12, 0xb9, 0x7f, 0xc5, 0x93, 0x65, 0xf6, 0x99, 0x17, + 0x3c, 0x50, 0xe9, 0x84, 0x9a, 0x0b, 0xf6, 0x62, 0xa6, 0x6c, 0x2f, 0x9e, 0xb3, 0xd2, 0x65, 0x21, + 0xc0, 0x5a, 0x69, 0x08, 0xf0, 0xde, 0x1c, 0xd4, 0x92, 0x5e, 0x34, 0xe6, 0xee, 0x3a, 0xac, 0xda, + 0x93, 0x93, 0x2a, 0xe8, 0x7b, 0x0e, 0xb4, 0xef, 0x8b, 0x80, 0x78, 0x10, 0x0e, 0xf6, 0x83, 0x24, + 0x8d, 0x62, 0xfd, 0x50, 0xea, 0x3a, 0x40, 0x92, 0xfa, 0x71, 0x2a, 0x12, 0x1e, 0x65, 0x80, 0x2e, + 0x43, 0x70, 0x8c, 0x3c, 0xec, 0x8b, 0x5a, 0xb1, 0x37, 0xba, 0x5c, 0xf0, 0x21, 0xe4, 0xf1, 0xc9, + 0xb2, 0xc4, 0xaf, 0x8b, 0x0c, 0x35, 0xf4, 0x15, 0xf8, 0x19, 0xe9, 0x75, 0x71, 0x2e, 0xc9, 0xa1, + 0xee, 0x5f, 0x38, 0xb0, 0x94, 0x0d, 0x72, 0x0f, 0x41, 0x5b, 0x3b, 0x48, 0xf3, 0x9b, 0x69, 0x07, + 0x15, 0x3a, 0x0c, 0xd0, 0x1e, 0xcb, 0xb1, 0x19, 0x08, 0x49, 0xac, 0x2c, 0x45, 0x13, 0xe5, 0xe0, + 0x98, 0x90, 0xc8, 0x0d, 0x41, 0x4f, 0x40, 0x7a, 0x35, 0xb2, 0x44, 0xf9, 0xaa, 0xa3, 0x94, 0xbe, + 0x9a, 0x15, 0x07, 0x33, 0x59, 0x54, 0xa6, 0x74, 0x8e, 0x50, 0xfc, 0xe9, 0xfe, 0x8e, 0x03, 0x57, + 0x4b, 0x16, 0x57, 0x4a, 0xc6, 0x2e, 0x2c, 0x9f, 0xe8, 0x4a, 0xb5, 0x00, 0x42, 0x3c, 0xd6, 0xd5, + 0x0d, 0x8e, 0x3d, 0x69, 0xaf, 0xf8, 0x81, 0xf6, 0x7d, 0xc4, 0x92, 0x5a, 0x49, 0x57, 0xc5, 0x8a, + 0xad, 0xdf, 0x9d, 0x81, 0x45, 0x71, 0xb3, 0x27, 0x9e, 0x2c, 0xf3, 0x98, 0xbd, 0x07, 0x73, 0xf2, + 0xc9, 0x39, 0x5b, 0x93, 0xdd, 0xda, 0x8f, 0xdc, 0x3b, 0xeb, 0x79, 0x58, 0xf2, 0xce, 0xca, 0xaf, + 0x7f, 0xfc, 0x2f, 0xbf, 0x57, 0x59, 0x60, 0x8d, 0x3b, 0x67, 0x6f, 0xde, 0x19, 0xf0, 0x30, 0xc1, + 0x36, 0x7e, 0x09, 0x20, 0x7b, 0x8c, 0xcd, 0xda, 0xda, 0x67, 0xcb, 0xbd, 0x32, 0xef, 0x5c, 0x2d, + 0xa9, 0x91, 0xed, 0x5e, 0xa5, 0x76, 0x57, 0xdc, 0x45, 0x6c, 0x37, 0x08, 0x83, 0x54, 0xbc, 0xcc, + 0x7e, 0xc7, 0xd9, 0x64, 0x7d, 0x68, 0x9a, 0x6f, 0xad, 0x99, 0x0a, 0xdd, 0x94, 0xbc, 0xf4, 0xee, + 0xbc, 0x54, 0x5a, 0xa7, 0xe2, 0x56, 0xd4, 0xc7, 0x9a, 0xdb, 0xc2, 0x3e, 0x26, 0x44, 0x91, 0xf5, + 0x32, 0x84, 0x45, 0xfb, 0x49, 0x35, 0xbb, 0x66, 0x88, 0x75, 0xe1, 0x41, 0x77, 0xe7, 0xe5, 0x0b, + 0x6a, 0x65, 0x5f, 0x2f, 0x53, 0x5f, 0x1b, 0x2e, 0xc3, 0xbe, 0x7a, 0x44, 0xa3, 0x1e, 0x74, 0xbf, + 0xe3, 0x6c, 0x6e, 0x7d, 0x7c, 0x1d, 0xea, 0x3a, 0xd8, 0xca, 0xbe, 0x01, 0x0b, 0xd6, 0xd5, 0x2b, + 0x53, 0xd3, 0x28, 0xbb, 0xa9, 0xed, 0x5c, 0x2b, 0xaf, 0x94, 0x1d, 0x5f, 0xa7, 0x8e, 0xdb, 0x6c, + 0x1d, 0x3b, 0x96, 0x77, 0x97, 0x77, 0xe8, 0xc2, 0x59, 0x64, 0xc3, 0x3e, 0x15, 0xf3, 0xcc, 0xae, + 0x4b, 0xad, 0x79, 0x16, 0xae, 0x57, 0xad, 0x79, 0x16, 0xef, 0x58, 0xdd, 0x6b, 0xd4, 0xdd, 0x3a, + 0x5b, 0x35, 0xbb, 0xd3, 0x41, 0x50, 0x4e, 0xf9, 0xcb, 0xe6, 0x8b, 0x6b, 0xf6, 0xb2, 0x66, 0xac, + 0xb2, 0x97, 0xd8, 0x9a, 0x45, 0x8a, 0xcf, 0xb1, 0xdd, 0x36, 0x75, 0xc5, 0x18, 0x6d, 0x9f, 0xf9, + 0xe0, 0x9a, 0x7d, 0x0d, 0xea, 0xfa, 0x79, 0x21, 0xdb, 0x30, 0xde, 0x74, 0x9a, 0x6f, 0x1e, 0x3b, + 0xed, 0x62, 0x45, 0x19, 0x63, 0x98, 0x2d, 0x23, 0x63, 0x1c, 0xc0, 0x9a, 0x3c, 0x03, 0x1c, 0xf3, + 0x1f, 0x65, 0x26, 0x25, 0xef, 0xc4, 0xef, 0x3a, 0xec, 0x5d, 0x98, 0x57, 0xaf, 0x36, 0xd9, 0x7a, + 0xf9, 0xeb, 0xd3, 0xce, 0x46, 0x01, 0x97, 0xda, 0xe3, 0x2b, 0x00, 0xd9, 0x6b, 0x44, 0x2d, 0x67, + 0x85, 0x77, 0x90, 0x7a, 0x11, 0x8b, 0x4f, 0x17, 0xdd, 0x75, 0x9a, 0x6a, 0x8b, 0x91, 0x9c, 0x85, + 0xfc, 0x5c, 0x25, 0xde, 0xef, 0x42, 0xc3, 0x78, 0x90, 0xc8, 0x54, 0x0b, 0xc5, 0xc7, 0x8c, 0x9d, + 0x4e, 0x59, 0x95, 0x1c, 0xe0, 0x17, 0x60, 0xc1, 0x7a, 0x59, 0xa8, 0x19, 0xb9, 0xec, 0xdd, 0xa2, + 0x66, 0xe4, 0xf2, 0xc7, 0x88, 0x5f, 0x85, 0x86, 0xf1, 0x0e, 0x90, 0x19, 0x29, 0x85, 0xb9, 0x17, + 0x80, 0x7a, 0x44, 0x65, 0xcf, 0x06, 0x57, 0x69, 0xbe, 0x8b, 0x6e, 0x1d, 0xe7, 0x4b, 0xd9, 0xe7, + 0xb8, 0xa7, 0xdf, 0x80, 0x45, 0xfb, 0x65, 0xa0, 0x16, 0x82, 0xd2, 0x37, 0x86, 0x5a, 0x08, 0x2e, + 0x78, 0x4e, 0x28, 0xf9, 0x67, 0x73, 0x45, 0x77, 0x72, 0xe7, 0x23, 0x79, 0xcf, 0xf8, 0x8c, 0x7d, + 0x09, 0x25, 0x5d, 0x3e, 0x07, 0x60, 0xd9, 0x7b, 0x48, 0xfb, 0xd1, 0x80, 0x66, 0xce, 0xc2, 0xcb, + 0x01, 0x77, 0x99, 0x1a, 0x6f, 0xb0, 0x6c, 0x06, 0x42, 0x7d, 0xd3, 0xb3, 0x00, 0x43, 0x7d, 0x9b, + 0x2f, 0x07, 0x0c, 0xf5, 0x6d, 0xbd, 0x1e, 0xc8, 0xab, 0xef, 0x34, 0xc0, 0x36, 0x42, 0x58, 0xca, + 0xe5, 0xd4, 0x68, 0xde, 0x2e, 0x4f, 0x42, 0xec, 0x5c, 0x7f, 0x7e, 0x2a, 0x8e, 0xad, 0x15, 0x94, + 0x36, 0xb8, 0xa3, 0x72, 0x46, 0x7f, 0x19, 0x9a, 0xe6, 0x8b, 0x2e, 0xad, 0xd0, 0x4b, 0xde, 0xa1, + 0x69, 0x85, 0x5e, 0xf6, 0x04, 0x4c, 0x6d, 0x2e, 0x6b, 0x9a, 0xdd, 0xe0, 0xe6, 0xda, 0x4f, 0x5a, + 0x32, 0x0d, 0x57, 0xf6, 0x92, 0x27, 0xd3, 0x70, 0xa5, 0xef, 0x60, 0xd4, 0xe6, 0xb2, 0x15, 0x6b, + 0x2e, 0x22, 0x24, 0xcc, 0xbe, 0x0a, 0x4b, 0x46, 0xc2, 0xda, 0xd1, 0x34, 0xec, 0x69, 0x46, 0x2d, + 0x26, 0x3b, 0x77, 0xca, 0x1c, 0x45, 0x77, 0x83, 0xda, 0x5f, 0x76, 0xad, 0x49, 0x20, 0x93, 0xee, + 0x40, 0xc3, 0x4c, 0x86, 0x7b, 0x4e, 0xbb, 0x1b, 0x46, 0x95, 0x99, 0xd9, 0x7b, 0xd7, 0x61, 0x7f, + 0xe8, 0x40, 0xd3, 0x4a, 0x2d, 0xb3, 0x2e, 0x3e, 0x72, 0xed, 0xb4, 0xcd, 0x3a, 0xb3, 0x21, 0xd7, + 0xa3, 0x41, 0x1e, 0x6c, 0x7e, 0xc1, 0x5a, 0x84, 0x8f, 0xac, 0x03, 0xc7, 0xed, 0xfc, 0xe3, 0xff, + 0x67, 0x79, 0x02, 0x33, 0x21, 0xfc, 0xd9, 0x5d, 0x87, 0xfd, 0x89, 0x03, 0x8b, 0xf6, 0x31, 0x59, + 0x6f, 0x55, 0xe9, 0x81, 0x5c, 0x6f, 0xd5, 0x05, 0x67, 0xeb, 0x9f, 0xc1, 0x28, 0xd9, 0x3b, 0xe2, + 0x2f, 0x38, 0x54, 0xcc, 0x86, 0x19, 0xba, 0x39, 0xbf, 0xad, 0xe6, 0xff, 0x4f, 0xdc, 0x72, 0xee, + 0x3a, 0xec, 0xeb, 0xe2, 0x7f, 0x08, 0xe4, 0xb7, 0xc4, 0x1d, 0x2f, 0xfa, 0xbd, 0xfb, 0x1a, 0xcd, + 0xe5, 0xba, 0x7b, 0xd5, 0x9a, 0x4b, 0xde, 0x38, 0x6d, 0x8b, 0xd1, 0xc9, 0xbf, 0x97, 0xc8, 0xd4, + 0x76, 0xe1, 0x2f, 0x27, 0x2e, 0x1e, 0xe4, 0x48, 0x0c, 0x52, 0x92, 0x5b, 0x2c, 0xfc, 0x82, 0xcd, + 0xb8, 0x9b, 0x34, 0xd6, 0xd7, 0xdc, 0x57, 0x2e, 0x1c, 0xeb, 0x1d, 0x3a, 0xe4, 0xe2, 0x88, 0x0f, + 0x01, 0xb2, 0xf8, 0x2a, 0xcb, 0xc5, 0xf7, 0xb4, 0xe5, 0x2a, 0x86, 0x60, 0x6d, 0x39, 0x51, 0x61, + 0x40, 0x6c, 0xf1, 0x6b, 0x42, 0x9d, 0x3c, 0x54, 0x91, 0xc1, 0xab, 0x86, 0xca, 0xb0, 0x03, 0xa1, + 0x9d, 0x4e, 0x59, 0x55, 0x99, 0x32, 0xd1, 0x61, 0xc6, 0xf7, 0x61, 0xe1, 0x20, 0x8a, 0x9e, 0x4e, + 0xc6, 0xfa, 0xb6, 0xc2, 0x8e, 0x3f, 0xed, 0xfb, 0xc9, 0x69, 0x27, 0x37, 0x0b, 0xf7, 0x06, 0x35, + 0xd5, 0x61, 0x6d, 0xa3, 0xa9, 0x3b, 0x1f, 0x65, 0xf1, 0xdb, 0x67, 0xcc, 0x87, 0x65, 0xed, 0x54, + 0xe8, 0x81, 0x77, 0xec, 0x66, 0xcc, 0xc8, 0x63, 0xa1, 0x0b, 0xcb, 0xcd, 0x53, 0xa3, 0xbd, 0x93, + 0xa8, 0x36, 0xef, 0x3a, 0xec, 0x10, 0x9a, 0xbb, 0xbc, 0x17, 0xf5, 0xb9, 0x0c, 0xe2, 0xac, 0x64, + 0x03, 0xd7, 0xd1, 0x9f, 0xce, 0x82, 0x05, 0xda, 0x7a, 0x7b, 0xec, 0x4f, 0x63, 0xfe, 0xcd, 0x3b, + 0x1f, 0xc9, 0xf0, 0xd0, 0x33, 0xa5, 0xb7, 0x55, 0xfc, 0xcc, 0xd2, 0xdb, 0xb9, 0x80, 0x9b, 0xa5, + 0xb7, 0x0b, 0x01, 0x37, 0x6b, 0xa9, 0x55, 0xfc, 0x8e, 0x0d, 0x61, 0xb9, 0x10, 0xa3, 0x63, 0xaf, + 0x28, 0xcb, 0x7b, 0x41, 0x64, 0xaf, 0x73, 0xe3, 0x62, 0x02, 0xbb, 0xb7, 0x4d, 0xbb, 0xb7, 0x23, + 0x58, 0xd8, 0xe5, 0x62, 0xb1, 0x44, 0x4a, 0x44, 0xee, 0x75, 0xa3, 0x99, 0x70, 0x91, 0x57, 0xdc, + 0x54, 0x67, 0x1b, 0x66, 0xca, 0x47, 0x60, 0x5f, 0x83, 0xc6, 0x03, 0x9e, 0xaa, 0x1c, 0x08, 0xed, + 0xe0, 0xe5, 0x92, 0x22, 0x3a, 0x25, 0x29, 0x14, 0x36, 0xcf, 0x50, 0x6b, 0x77, 0x78, 0x7f, 0xc0, + 0x85, 0x72, 0xea, 0x06, 0xfd, 0x67, 0xec, 0x17, 0xa9, 0x71, 0x9d, 0x84, 0xb5, 0x6e, 0x5c, 0x9d, + 0x9b, 0x8d, 0x2f, 0xe5, 0xf0, 0xb2, 0x96, 0xc3, 0xa8, 0xcf, 0x0d, 0x17, 0x25, 0x84, 0x86, 0x91, + 0x21, 0xa8, 0x05, 0xa8, 0x98, 0xed, 0xa8, 0x05, 0xa8, 0x24, 0xa1, 0xd0, 0xbd, 0x45, 0xfd, 0xb8, + 0xec, 0x46, 0xd6, 0x8f, 0x48, 0x22, 0xcc, 0x7a, 0xba, 0xf3, 0x91, 0x3f, 0x4a, 0x9f, 0xb1, 0x0f, + 0xe8, 0xa5, 0xa3, 0x99, 0xe7, 0x91, 0x79, 0xac, 0xf9, 0x94, 0x10, 0xbd, 0x58, 0x46, 0x95, 0xed, + 0xc5, 0x8a, 0xae, 0xc8, 0x93, 0xf9, 0x0c, 0xc0, 0x51, 0x1a, 0x8d, 0x77, 0x7d, 0x3e, 0x8a, 0xc2, + 0x4c, 0xd7, 0x66, 0xb9, 0x0c, 0x99, 0xfe, 0x32, 0x12, 0x1a, 0xd8, 0x07, 0x86, 0x8b, 0x6f, 0xa5, + 0xc9, 0x28, 0xe6, 0xba, 0x30, 0xdd, 0x41, 0x2f, 0x48, 0x49, 0xca, 0xc3, 0x5d, 0x87, 0x6d, 0x03, + 0x64, 0x41, 0x5a, 0xed, 0xb0, 0x17, 0xe2, 0xbf, 0x5a, 0xed, 0x95, 0x44, 0x74, 0x0f, 0xa1, 0x9e, + 0x45, 0xfd, 0x36, 0xb2, 0x2c, 0x4f, 0x2b, 0x46, 0xa8, 0x2d, 0x77, 0x21, 0x16, 0xe7, 0xb6, 0x68, + 0xa9, 0x80, 0xcd, 0xe3, 0x52, 0x51, 0x80, 0x2d, 0x80, 0x15, 0x31, 0x40, 0xed, 0x86, 0xd0, 0xed, + 0xbc, 0x9a, 0x49, 0x49, 0x3c, 0x4c, 0x4b, 0x73, 0x69, 0x38, 0xc9, 0x3a, 0xba, 0x23, 0xb7, 0x8a, + 0xcc, 0x00, 0x54, 0xcd, 0x23, 0x58, 0x2e, 0xc4, 0x42, 0xb4, 0x48, 0x5f, 0x14, 0x82, 0xd2, 0x22, + 0x7d, 0x61, 0x18, 0xc5, 0x5d, 0xa3, 0x2e, 0x97, 0x5c, 0xc0, 0x2e, 0x93, 0xf3, 0x20, 0xed, 0x9d, + 0xbe, 0xe3, 0x6c, 0x1e, 0xcf, 0xd2, 0x5f, 0xf6, 0x7d, 0xea, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, + 0x17, 0xaf, 0x2f, 0x13, 0xe4, 0x4f, 0x00, 0x00, } diff --git a/lnrpc/rpc.pb.gw.go b/lnrpc/rpc.pb.gw.go index 73b4d9e6..cdb24e6b 100644 --- a/lnrpc/rpc.pb.gw.go +++ b/lnrpc/rpc.pb.gw.go @@ -516,10 +516,18 @@ func request_Lightning_DeleteAllPayments_0(ctx context.Context, marshaler runtim } +var ( + filter_Lightning_DescribeGraph_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + func request_Lightning_DescribeGraph_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ChannelGraphRequest var metadata runtime.ServerMetadata + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_DescribeGraph_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.DescribeGraph(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index 373d7831..6d5bae44 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -1488,6 +1488,12 @@ message ChannelEdge { } message ChannelGraphRequest { + /** + Whether unannounced channels are included in the response or not. If set, + unannounced channels are included. Unannounced channels are both private + channels, and public channels that are not yet announced to the network. + */ + bool include_unannounced = 1 [json_name = "include_unannounced"]; } /// Returns a new instance of the directed channel graph. diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 3893a8a5..62bb4a7b 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -421,6 +421,16 @@ } } }, + "parameters": [ + { + "name": "include_unannounced", + "description": "*\nWhether unannounced channels are included in the response or not. If set,\nunannounced channels are included. Unannounced channels are both private\nchannels, and public channels that are not yet announced to the network.", + "in": "query", + "required": false, + "type": "boolean", + "format": "boolean" + } + ], "tags": [ "Lightning" ] From bd75a56855bca14863329ae32476aba2f6dcea66 Mon Sep 17 00:00:00 2001 From: bluetegu Date: Wed, 26 Sep 2018 11:27:30 -0400 Subject: [PATCH 2/4] Add unit test for db Wipe. --- channeldb/db_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/channeldb/db_test.go b/channeldb/db_test.go index f3e3c96e..872e6307 100644 --- a/channeldb/db_test.go +++ b/channeldb/db_test.go @@ -33,3 +33,41 @@ func TestOpenWithCreate(t *testing.T) { t.Fatalf("channeldb failed to create data directory") } } + +// TestWipe tests that the database wipe operation completes successfully +// and that the buckets are deleted. It also checks that attempts to fetch +// information while the buckets are not set return the correct errors. +func TestWipe(t *testing.T) { + t.Parallel() + + // First, create a temporary directory to be used for the duration of + // this test. + tempDirName, err := ioutil.TempDir("", "channeldb") + if err != nil { + t.Fatalf("unable to create temp dir: %v", err) + } + defer os.RemoveAll(tempDirName) + + // Next, open thereby creating channeldb for the first time. + dbPath := filepath.Join(tempDirName, "cdb") + cdb, err := Open(dbPath) + if err != nil { + t.Fatalf("unable to create channeldb: %v", err) + } + defer cdb.Close() + + if err := cdb.Wipe(); err != nil { + t.Fatalf("unable to wipe channeldb: %v", err) + } + // Check correct errors are returned + _, err = cdb.FetchAllOpenChannels() + if err != ErrNoActiveChannels { + t.Fatalf("fetching open channels: expected '%v' instead got '%v'", + ErrNoActiveChannels, err) + } + _, err = cdb.FetchClosedChannels(false) + if err != ErrNoClosedChannels { + t.Fatalf("fetching closed channels: expected '%v' instead got '%v'", + ErrNoClosedChannels, err) + } +} From d942bb58c305388ba3c45c32650f997143ac05c0 Mon Sep 17 00:00:00 2001 From: bluetegu Date: Wed, 26 Sep 2018 11:30:09 -0400 Subject: [PATCH 3/4] Add support for IncludeUnannounced property of ChannelGraphRequest in DescribeGraph rpc server method. --- lnd_test.go | 156 +++++++++++++++++++++++++++++++++++++++++++++++---- rpcserver.go | 12 +++- 2 files changed, 157 insertions(+), 11 deletions(-) diff --git a/lnd_test.go b/lnd_test.go index b4cc67a2..57fc0f34 100644 --- a/lnd_test.go +++ b/lnd_test.go @@ -870,7 +870,9 @@ func assertChannelPolicy(t *harnessTest, node *lntest.HarnessNode, advertisingNode string, expectedPolicy *lnrpc.RoutingPolicy, chanPoints ...*lnrpc.ChannelPoint) { - descReq := &lnrpc.ChannelGraphRequest{} + descReq := &lnrpc.ChannelGraphRequest{ + IncludeUnannounced: true, + } chanGraph, err := node.DescribeGraph(context.Background(), descReq) if err != nil { t.Fatalf("unable to query for alice's graph: %v", err) @@ -1496,7 +1498,9 @@ func testOpenChannelAfterReorg(net *lntest.NetworkHarness, t *harnessTest) { } // Alice should now have 1 edge in her graph. - req := &lnrpc.ChannelGraphRequest{} + req := &lnrpc.ChannelGraphRequest{ + IncludeUnannounced: true, + } chanGraph, err := net.Alice.DescribeGraph(ctxb, req) if err != nil { t.Fatalf("unable to query for alice's routing table: %v", err) @@ -1538,7 +1542,9 @@ func testOpenChannelAfterReorg(net *lntest.NetworkHarness, t *harnessTest) { // Since the fundingtx was reorged out, Alice should now have no edges // in her graph. - req = &lnrpc.ChannelGraphRequest{} + req = &lnrpc.ChannelGraphRequest{ + IncludeUnannounced: true, + } chanGraph, err = net.Alice.DescribeGraph(ctxb, req) if err != nil { t.Fatalf("unable to query for alice's routing table: %v", err) @@ -4122,6 +4128,116 @@ func testSendToRouteErrorPropagation(net *lntest.NetworkHarness, t *harnessTest) closeChannelAndAssert(ctxt, t, net, carol, chanPointCarol, false) } +// testUnannouncedChannels checks unannounced channels are not returned by +// describeGraph RPC request unless explicity asked for. +func testUnannouncedChannels(net *lntest.NetworkHarness, t *harnessTest) { + timeout := time.Duration(time.Second * 5) + ctb := context.Background() + amount := maxBtcFundingAmount + + // Open a channel between Alice and Bob, ensuring the + // channel has been opened properly. + ctx, _ := context.WithTimeout(ctb, timeout) + chanOpenUpdate, err := net.OpenChannel( + ctx, net.Alice, net.Bob, + lntest.OpenChannelParams{ + Amt: amount, + }, + ) + if err != nil { + t.Fatalf("unable to open channel: %v", err) + } + + // Mine 2 blocks, and check that the channel is opened but not yet + // announced to the network. + mineBlocks(t, net, 2) + + // One block is enough to make the channel ready for use, since the + // nodes have defaultNumConfs=1 set. + ctx, _ = context.WithTimeout(ctb, timeout) + fundingChanPoint, err := net.WaitForChannelOpen(ctx, chanOpenUpdate) + if err != nil { + t.Fatalf("error while waiting for channel open: %v", err) + } + + // Alice should have 1 edge in her graph. + req := &lnrpc.ChannelGraphRequest{ + IncludeUnannounced: true, + } + ctx, _ = context.WithTimeout(ctb, timeout) + chanGraph, err := net.Alice.DescribeGraph(ctx, req) + if err != nil { + t.Fatalf("unable to query alice's graph: %v", err) + } + + numEdges := len(chanGraph.Edges) + if numEdges != 1 { + t.Fatalf("expected to find 1 edge in the graph, found %d", numEdges) + } + + // Channels should not be announced yet, hence Alice should have no + // announced edges in her graph. + req.IncludeUnannounced = false + ctx, _ = context.WithTimeout(ctb, timeout) + chanGraph, err = net.Alice.DescribeGraph(ctx, req) + if err != nil { + t.Fatalf("unable to query alice's graph: %v", err) + } + + numEdges = len(chanGraph.Edges) + if numEdges != 0 { + t.Fatalf("expected to find 0 announced edges in the graph, found %d", + numEdges) + } + + // Mine 4 more blocks, and check that the channel is now announced. + mineBlocks(t, net, 4) + + // Give the network a chance to learn that auth proof is confirmed. + var predErr error + err = lntest.WaitPredicate(func() bool { + // The channel should now be announced. Check that Alice has 1 + // announced edge. + req.IncludeUnannounced = false + ctx, _ = context.WithTimeout(ctb, timeout) + chanGraph, err = net.Alice.DescribeGraph(ctx, req) + if err != nil { + predErr = fmt.Errorf("unable to query alice's graph: %v", err) + return false + } + + numEdges = len(chanGraph.Edges) + if numEdges != 1 { + predErr = fmt.Errorf("expected to find 1 announced edge in "+ + "the graph, found %d", numEdges) + return false + } + return true + }, time.Second*15) + if err != nil { + t.Fatalf("%v", predErr) + } + + // The channel should now be announced. Check that Alice has 1 announced + // edge. + req.IncludeUnannounced = false + ctx, _ = context.WithTimeout(ctb, timeout) + chanGraph, err = net.Alice.DescribeGraph(ctx, req) + if err != nil { + t.Fatalf("unable to query alice's graph: %v", err) + } + + numEdges = len(chanGraph.Edges) + if numEdges != 1 { + t.Fatalf("expected to find 1 announced edge in the graph, found %d", + numEdges) + } + + // Close the channel used during the test. + ctx, _ = context.WithTimeout(ctb, timeout) + closeChannelAndAssert(ctx, t, net, net.Alice, fundingChanPoint, false) +} + // testPrivateChannels tests that a private channel can be used for // routing by the two endpoints of the channel, but is not known by // the rest of the nodes in the graph. @@ -4432,8 +4548,10 @@ func testPrivateChannels(net *lntest.NetworkHarness, t *harnessTest) { // nodes know about. Carol and Alice should know about 4, while // Bob and Dave should only know about 3, since one channel is // private. - numChannels := func(node *lntest.HarnessNode) int { - req := &lnrpc.ChannelGraphRequest{} + numChannels := func(node *lntest.HarnessNode, includeUnannounced bool) int { + req := &lnrpc.ChannelGraphRequest{ + IncludeUnannounced: includeUnannounced, + } ctxt, _ := context.WithTimeout(ctxb, timeout) chanGraph, err := node.DescribeGraph(ctxt, req) if err != nil { @@ -4444,25 +4562,37 @@ func testPrivateChannels(net *lntest.NetworkHarness, t *harnessTest) { var predErr error err = lntest.WaitPredicate(func() bool { - aliceChans := numChannels(net.Alice) + aliceChans := numChannels(net.Alice, true) if aliceChans != 4 { predErr = fmt.Errorf("expected Alice to know 4 edges, "+ "had %v", aliceChans) return false } - bobChans := numChannels(net.Bob) + alicePubChans := numChannels(net.Alice, false) + if alicePubChans != 3 { + predErr = fmt.Errorf("expected Alice to know 3 public edges, "+ + "had %v", alicePubChans) + return false + } + bobChans := numChannels(net.Bob, true) if bobChans != 3 { predErr = fmt.Errorf("expected Bob to know 3 edges, "+ "had %v", bobChans) return false } - carolChans := numChannels(carol) + carolChans := numChannels(carol, true) if carolChans != 4 { predErr = fmt.Errorf("expected Carol to know 4 edges, "+ "had %v", carolChans) return false } - daveChans := numChannels(dave) + carolPubChans := numChannels(carol, false) + if carolPubChans != 3 { + predErr = fmt.Errorf("expected Carol to know 3 public edges, "+ + "had %v", carolPubChans) + return false + } + daveChans := numChannels(dave, true) if daveChans != 3 { predErr = fmt.Errorf("expected Dave to know 3 edges, "+ "had %v", daveChans) @@ -5781,7 +5911,9 @@ func testGarbageCollectLinkNodes(net *lntest.NetworkHarness, t *harnessTest) { // Finally, we'll ensure that Bob and Carol no longer show in Alice's // channel graph. - describeGraphReq := &lnrpc.ChannelGraphRequest{} + describeGraphReq := &lnrpc.ChannelGraphRequest{ + IncludeUnannounced: true, + } channelGraph, err := net.Alice.DescribeGraph(ctxb, describeGraphReq) if err != nil { t.Fatalf("unable to query for alice's channel graph: %v", err) @@ -12184,6 +12316,10 @@ var testsCases = []*testCase{ name: "send to route error propagation", test: testSendToRouteErrorPropagation, }, + { + name: "unannounced channels", + test: testUnannouncedChannels, + }, { name: "private channels", test: testPrivateChannels, diff --git a/rpcserver.go b/rpcserver.go index 949a76ac..2188c1ac 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -3095,9 +3095,10 @@ func (r *rpcServer) GetTransactions(ctx context.Context, // specific routing policy which includes: the time lock delta, fee // information, etc. func (r *rpcServer) DescribeGraph(ctx context.Context, - _ *lnrpc.ChannelGraphRequest) (*lnrpc.ChannelGraph, error) { + req *lnrpc.ChannelGraphRequest) (*lnrpc.ChannelGraph, error) { resp := &lnrpc.ChannelGraph{} + includeUnannounced := req.IncludeUnannounced // Obtain the pointer to the global singleton channel graph, this will // provide a consistent view of the graph due to bolt db's @@ -3138,8 +3139,17 @@ func (r *rpcServer) DescribeGraph(ctx context.Context, err = graph.ForEachChannel(func(edgeInfo *channeldb.ChannelEdgeInfo, c1, c2 *channeldb.ChannelEdgePolicy) error { + // Do not include unannounced channels unless specifically + // requested. Unannounced channels include both private channels as + // well as public channels whose authentication proof were not + // confirmed yet, hence were not announced. + if !includeUnannounced && edgeInfo.AuthProof == nil { + return nil + } + edge := marshalDbEdge(edgeInfo, c1, c2) resp.Edges = append(resp.Edges, edge) + return nil }) if err != nil && err != channeldb.ErrGraphNoEdgesFound { From 2f3e2f930898fa715ff314aa5edd0a8e1f64b33d Mon Sep 17 00:00:00 2001 From: bluetegu Date: Thu, 27 Sep 2018 02:45:04 -0400 Subject: [PATCH 4/4] Add --include_unannounced flag to describegraph lncli command. Private and public channels which weren't announced yet are returned only if the flag is set. Note: this changes the default output of describegraph which used to return all channels known to node. --- cmd/lncli/commands.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/cmd/lncli/commands.go b/cmd/lncli/commands.go index 30967dc9..1fd7a1bf 100644 --- a/cmd/lncli/commands.go +++ b/cmd/lncli/commands.go @@ -2467,7 +2467,15 @@ var describeGraphCommand = cli.Command{ Category: "Peers", Description: "Prints a human readable version of the known channel " + "graph from the PoV of the node", - Usage: "Describe the network graph.", + Usage: "Describe the network graph.", + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "include_unannounced", + Usage: "If set, unannounced channels will be included in the " + + "graph. Unannounced channels are both private channels, and " + + "public channels that are not yet announced to the network.", + }, + }, Action: actionDecorator(describeGraph), } @@ -2475,7 +2483,9 @@ func describeGraph(ctx *cli.Context) error { client, cleanUp := getClient(ctx) defer cleanUp() - req := &lnrpc.ChannelGraphRequest{} + req := &lnrpc.ChannelGraphRequest{ + IncludeUnannounced: ctx.Bool("include_unannounced"), + } graph, err := client.DescribeGraph(context.Background(), req) if err != nil {