Merge pull request #1389 from Bluetegu/noprivate-describegraph-1037

Add --noprivate flag to describegraph rpc to filter out private channels
This commit is contained in:
Olaoluwa Osuntokun 2018-10-16 20:01:35 -07:00 committed by GitHub
commit 4c0ca37174
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 417 additions and 186 deletions

View File

@ -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)
}
}

View File

@ -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 {

View File

@ -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,

View File

@ -3401,6 +3401,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{} }
@ -3408,6 +3413,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
@ -7258,7 +7270,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,
@ -7487,176 +7499,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,
}

View File

@ -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

View File

@ -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.

View File

@ -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"
]

View File

@ -3136,9 +3136,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
@ -3179,8 +3180,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 {