Merge pull request #592 from wilmerpaulino/rest-close-channel

lnrpc: make ChannelPoint.funding_txid a protobuf oneof and change CloseChannel endpoint
This commit is contained in:
Olaoluwa Osuntokun 2018-01-31 12:38:03 -08:00 committed by GitHub
commit 1b15c30f7a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 665 additions and 384 deletions

@ -543,7 +543,25 @@ func openChannel(ctx *cli.Context) error {
case *lnrpc.OpenStatusUpdate_ChanOpen: case *lnrpc.OpenStatusUpdate_ChanOpen:
channelPoint := update.ChanOpen.ChannelPoint channelPoint := update.ChanOpen.ChannelPoint
txid, err := chainhash.NewHash(channelPoint.FundingTxid)
// A channel point's funding txid can be get/set as a
// byte slice or a string. In the case it is a string,
// decode it.
var txidHash []byte
switch channelPoint.GetFundingTxid().(type) {
case *lnrpc.ChannelPoint_FundingTxidBytes:
txidHash = channelPoint.GetFundingTxidBytes()
case *lnrpc.ChannelPoint_FundingTxidStr:
s := channelPoint.GetFundingTxidStr()
h, err := chainhash.NewHashFromStr(s)
if err != nil {
return err
}
txidHash = h[:]
}
txid, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
return err return err
} }
@ -653,11 +671,9 @@ func closeChannel(ctx *cli.Context) error {
return fmt.Errorf("funding txid argument missing") return fmt.Errorf("funding txid argument missing")
} }
txidhash, err := chainhash.NewHashFromStr(txid) req.ChannelPoint.FundingTxid = &lnrpc.ChannelPoint_FundingTxidStr{
if err != nil { FundingTxidStr: txid,
return err
} }
req.ChannelPoint.FundingTxid = txidhash[:]
switch { switch {
case ctx.IsSet("output_index"): case ctx.IsSet("output_index"):
@ -2147,17 +2163,15 @@ func updateChannelPolicy(ctx *cli.Context) error {
"txid:index") "txid:index")
} }
txHash, err := chainhash.NewHashFromStr(split[0])
if err != nil {
return err
}
index, err := strconv.ParseInt(split[1], 10, 32) index, err := strconv.ParseInt(split[1], 10, 32)
if err != nil { if err != nil {
return fmt.Errorf("unable to decode output index: %v", err) return fmt.Errorf("unable to decode output index: %v", err)
} }
chanPoint = &lnrpc.ChannelPoint{ chanPoint = &lnrpc.ChannelPoint{
FundingTxid: txHash[:], FundingTxid: &lnrpc.ChannelPoint_FundingTxidStr{
FundingTxidStr: split[0],
},
OutputIndex: uint32(index), OutputIndex: uint32(index),
} }
} }

@ -1436,7 +1436,9 @@ func (f *fundingManager) handleFundingSigned(fmsg *fundingSignedMsg) {
Update: &lnrpc.OpenStatusUpdate_ChanOpen{ Update: &lnrpc.OpenStatusUpdate_ChanOpen{
ChanOpen: &lnrpc.ChannelOpenUpdate{ ChanOpen: &lnrpc.ChannelOpenUpdate{
ChannelPoint: &lnrpc.ChannelPoint{ ChannelPoint: &lnrpc.ChannelPoint{
FundingTxid: fundingPoint.Hash[:], FundingTxid: &lnrpc.ChannelPoint_FundingTxidBytes{
FundingTxidBytes: fundingPoint.Hash[:],
},
OutputIndex: fundingPoint.Index, OutputIndex: fundingPoint.Index,
}, },
}, },

@ -165,7 +165,11 @@ func openChannelAndAssert(ctx context.Context, t *harnessTest,
if err != nil { if err != nil {
t.Fatalf("error while waiting for channel open: %v", err) t.Fatalf("error while waiting for channel open: %v", err)
} }
fundingTxID, err := chainhash.NewHash(fundingChanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(fundingChanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
fundingTxID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to create sha hash: %v", err) t.Fatalf("unable to create sha hash: %v", err)
} }
@ -202,7 +206,11 @@ func closeChannelAndAssert(ctx context.Context, t *harnessTest,
t.Fatalf("unable to close channel: %v", err) t.Fatalf("unable to close channel: %v", err)
} }
txid, err := chainhash.NewHash(fundingChanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(fundingChanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
txid, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to convert to chainhash: %v", err) t.Fatalf("unable to convert to chainhash: %v", err)
} }
@ -548,7 +556,11 @@ func testUpdateChannelPolicy(net *lntest.NetworkHarness, t *harnessTest) {
// txStr returns the string representation of the channel's // txStr returns the string representation of the channel's
// funding tx. // funding tx.
txStr := func(chanPoint *lnrpc.ChannelPoint) string { txStr := func(chanPoint *lnrpc.ChannelPoint) string {
fundingTxID, err := chainhash.NewHash(chanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(chanPoint)
if err != nil {
return ""
}
fundingTxID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
return "" return ""
} }
@ -852,7 +864,9 @@ func testOpenChannelAfterReorg(net *lntest.NetworkHarness, t *harnessTest) {
} }
chanPoint := &lnrpc.ChannelPoint{ chanPoint := &lnrpc.ChannelPoint{
FundingTxid: pendingUpdate.Txid, FundingTxid: &lnrpc.ChannelPoint_FundingTxidBytes{
FundingTxidBytes: pendingUpdate.Txid,
},
OutputIndex: pendingUpdate.OutputIndex, OutputIndex: pendingUpdate.OutputIndex,
} }
@ -1015,7 +1029,9 @@ func testDisconnectingTargetPeer(net *lntest.NetworkHarness, t *harnessTest) {
// block until the channel is closed and will additionally assert the // block until the channel is closed and will additionally assert the
// relevant channel closing post conditions. // relevant channel closing post conditions.
chanPoint := &lnrpc.ChannelPoint{ chanPoint := &lnrpc.ChannelPoint{
FundingTxid: pendingUpdate.Txid, FundingTxid: &lnrpc.ChannelPoint_FundingTxidBytes{
FundingTxidBytes: pendingUpdate.Txid,
},
OutputIndex: pendingUpdate.OutputIndex, OutputIndex: pendingUpdate.OutputIndex,
} }
@ -1196,7 +1212,9 @@ peersPoll:
// block until the channel is closed and will additionally assert the // block until the channel is closed and will additionally assert the
// relevant channel closing post conditions. // relevant channel closing post conditions.
chanPoint := &lnrpc.ChannelPoint{ chanPoint := &lnrpc.ChannelPoint{
FundingTxid: pendingUpdate.Txid, FundingTxid: &lnrpc.ChannelPoint_FundingTxidBytes{
FundingTxidBytes: pendingUpdate.Txid,
},
OutputIndex: pendingUpdate.OutputIndex, OutputIndex: pendingUpdate.OutputIndex,
} }
ctxt, _ = context.WithTimeout(ctxb, timeout) ctxt, _ = context.WithTimeout(ctxb, timeout)
@ -1516,7 +1534,14 @@ func testChannelForceClosure(net *lntest.NetworkHarness, t *harnessTest) {
// Compute the outpoint of the channel, which we will use repeatedly to // Compute the outpoint of the channel, which we will use repeatedly to
// locate the pending channel information in the rpc responses. // locate the pending channel information in the rpc responses.
txid, _ := chainhash.NewHash(chanPoint.FundingTxid[:]) txidHash, err := getChanPointFundingTxid(chanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
txid, err := chainhash.NewHash(txidHash)
if err != nil {
t.Fatalf("unable to create sha hash: %v", err)
}
op := wire.OutPoint{ op := wire.OutPoint{
Hash: *txid, Hash: *txid,
Index: chanPoint.OutputIndex, Index: chanPoint.OutputIndex,
@ -2298,7 +2323,11 @@ func testMultiHopPayments(net *lntest.NetworkHarness, t *harnessTest) {
net.Bob, chanAmt, 0) net.Bob, chanAmt, 0)
networkChans = append(networkChans, chanPointAlice) networkChans = append(networkChans, chanPointAlice)
aliceChanTXID, err := chainhash.NewHash(chanPointAlice.FundingTxid) txidHash, err := getChanPointFundingTxid(chanPointAlice)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
aliceChanTXID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to create sha hash: %v", err) t.Fatalf("unable to create sha hash: %v", err)
} }
@ -2329,7 +2358,11 @@ func testMultiHopPayments(net *lntest.NetworkHarness, t *harnessTest) {
chanPointDave := openChannelAndAssert(ctxt, t, net, dave, chanPointDave := openChannelAndAssert(ctxt, t, net, dave,
net.Alice, chanAmt, 0) net.Alice, chanAmt, 0)
networkChans = append(networkChans, chanPointDave) networkChans = append(networkChans, chanPointDave)
daveChanTXID, err := chainhash.NewHash(chanPointDave.FundingTxid) txidHash, err = getChanPointFundingTxid(chanPointDave)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
daveChanTXID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to create sha hash: %v", err) t.Fatalf("unable to create sha hash: %v", err)
} }
@ -2356,7 +2389,11 @@ func testMultiHopPayments(net *lntest.NetworkHarness, t *harnessTest) {
dave, chanAmt, 0) dave, chanAmt, 0)
networkChans = append(networkChans, chanPointCarol) networkChans = append(networkChans, chanPointCarol)
carolChanTXID, err := chainhash.NewHash(chanPointCarol.FundingTxid) txidHash, err = getChanPointFundingTxid(chanPointCarol)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
carolChanTXID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to create sha hash: %v", err) t.Fatalf("unable to create sha hash: %v", err)
} }
@ -2370,7 +2407,11 @@ func testMultiHopPayments(net *lntest.NetworkHarness, t *harnessTest) {
nodeNames := []string{"Alice", "Bob", "Carol", "Dave"} nodeNames := []string{"Alice", "Bob", "Carol", "Dave"}
for _, chanPoint := range networkChans { for _, chanPoint := range networkChans {
for i, node := range nodes { for i, node := range nodes {
txid, e := chainhash.NewHash(chanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(chanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
txid, e := chainhash.NewHash(txidHash)
if e != nil { if e != nil {
t.Fatalf("unable to create sha hash: %v", e) t.Fatalf("unable to create sha hash: %v", e)
} }
@ -2500,7 +2541,11 @@ func testPrivateChannels(net *lntest.NetworkHarness, t *harnessTest) {
net.Bob, chanAmt*2, 0) net.Bob, chanAmt*2, 0)
networkChans = append(networkChans, chanPointAlice) networkChans = append(networkChans, chanPointAlice)
aliceChanTXID, err := chainhash.NewHash(chanPointAlice.FundingTxid) txidHash, err := getChanPointFundingTxid(chanPointAlice)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
aliceChanTXID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to create sha hash: %v", err) t.Fatalf("unable to create sha hash: %v", err)
} }
@ -2525,7 +2570,11 @@ func testPrivateChannels(net *lntest.NetworkHarness, t *harnessTest) {
chanPointDave := openChannelAndAssert(ctxt, t, net, dave, chanPointDave := openChannelAndAssert(ctxt, t, net, dave,
net.Alice, chanAmt, 0) net.Alice, chanAmt, 0)
networkChans = append(networkChans, chanPointDave) networkChans = append(networkChans, chanPointDave)
daveChanTXID, err := chainhash.NewHash(chanPointDave.FundingTxid) txidHash, err = getChanPointFundingTxid(chanPointDave)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
daveChanTXID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to create sha hash: %v", err) t.Fatalf("unable to create sha hash: %v", err)
} }
@ -2552,7 +2601,11 @@ func testPrivateChannels(net *lntest.NetworkHarness, t *harnessTest) {
dave, chanAmt, 0) dave, chanAmt, 0)
networkChans = append(networkChans, chanPointCarol) networkChans = append(networkChans, chanPointCarol)
carolChanTXID, err := chainhash.NewHash(chanPointCarol.FundingTxid) txidHash, err = getChanPointFundingTxid(chanPointCarol)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
carolChanTXID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to create sha hash: %v", err) t.Fatalf("unable to create sha hash: %v", err)
} }
@ -2567,7 +2620,11 @@ func testPrivateChannels(net *lntest.NetworkHarness, t *harnessTest) {
nodeNames := []string{"Alice", "Bob", "Carol", "Dave"} nodeNames := []string{"Alice", "Bob", "Carol", "Dave"}
for _, chanPoint := range networkChans { for _, chanPoint := range networkChans {
for i, node := range nodes { for i, node := range nodes {
txid, e := chainhash.NewHash(chanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(chanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
txid, e := chainhash.NewHash(txidHash)
if e != nil { if e != nil {
t.Fatalf("unable to create sha hash: %v", e) t.Fatalf("unable to create sha hash: %v", e)
} }
@ -2603,7 +2660,11 @@ func testPrivateChannels(net *lntest.NetworkHarness, t *harnessTest) {
if err != nil { if err != nil {
t.Fatalf("error while waiting for channel open: %v", err) t.Fatalf("error while waiting for channel open: %v", err)
} }
fundingTxID, err := chainhash.NewHash(chanPointPrivate.FundingTxid) txidHash, err = getChanPointFundingTxid(chanPointPrivate)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
fundingTxID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to create sha hash: %v", err) t.Fatalf("unable to create sha hash: %v", err)
} }
@ -2979,7 +3040,11 @@ func testMaxPendingChannels(net *lntest.NetworkHarness, t *harnessTest) {
t.Fatalf("error while waiting for channel open: %v", err) t.Fatalf("error while waiting for channel open: %v", err)
} }
fundingTxID, err := chainhash.NewHash(fundingChanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(fundingChanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
fundingTxID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to create sha hash: %v", err) t.Fatalf("unable to create sha hash: %v", err)
} }
@ -4277,11 +4342,17 @@ func testGraphTopologyNotifications(net *lntest.NetworkHarness, t *harnessTest)
t.Fatalf("close heights of channel mismatch: expected "+ t.Fatalf("close heights of channel mismatch: expected "+
"%v, got %v", blockHeight+1, closedChan.ClosedHeight) "%v, got %v", blockHeight+1, closedChan.ClosedHeight)
} }
if !bytes.Equal(closedChan.ChanPoint.FundingTxid, chanPointTxid, err := getChanPointFundingTxid(chanPoint)
chanPoint.FundingTxid) { if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
closedChanTxid, err := getChanPointFundingTxid(closedChan.ChanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
if !bytes.Equal(closedChanTxid, chanPointTxid) {
t.Fatalf("channel point hash mismatch: expected %v, "+ t.Fatalf("channel point hash mismatch: expected %v, "+
"got %v", chanPoint.FundingTxid, "got %v", chanPointTxid, closedChanTxid)
closedChan.ChanPoint.FundingTxid)
} }
if closedChan.ChanPoint.OutputIndex != chanPoint.OutputIndex { if closedChan.ChanPoint.OutputIndex != chanPoint.OutputIndex {
t.Fatalf("output index mismatch: expected %v, got %v", t.Fatalf("output index mismatch: expected %v, got %v",
@ -5180,7 +5251,11 @@ func testMultiHopHtlcLocalTimeout(net *lntest.NetworkHarness, t *harnessTest) {
} }
// Bob's force close transaction should now be found in the mempool. // Bob's force close transaction should now be found in the mempool.
bobFundingTxid, err := chainhash.NewHash(bobChanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(bobChanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
bobFundingTxid, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
t.Fatalf("unable to create sha hash: %v", err) t.Fatalf("unable to create sha hash: %v", err)
} }
@ -5393,7 +5468,11 @@ func testMultiHopReceiverChainClaim(net *lntest.NetworkHarness, t *harnessTest)
if err != nil { if err != nil {
t.Fatalf("transactions not found in mempool: %v", err) t.Fatalf("transactions not found in mempool: %v", err)
} }
bobFundingTxid, err := chainhash.NewHash(bobChanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(bobChanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
bobFundingTxid, err := chainhash.NewHash(txidHash)
carolFundingPoint := wire.OutPoint{ carolFundingPoint := wire.OutPoint{
Hash: *bobFundingTxid, Hash: *bobFundingTxid,
Index: bobChanPoint.OutputIndex, Index: bobChanPoint.OutputIndex,
@ -6008,7 +6087,14 @@ func testMultiHopHtlcLocalChainClaim(net *lntest.NetworkHarness, t *harnessTest)
if err != nil { if err != nil {
t.Fatalf("transactions not found in mempool: %v", err) t.Fatalf("transactions not found in mempool: %v", err)
} }
bobFundingTxid, err := chainhash.NewHash(bobChanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(bobChanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
bobFundingTxid, err := chainhash.NewHash(txidHash)
if err != nil {
t.Fatalf("unable to create sha hash: %v", err)
}
carolFundingPoint := wire.OutPoint{ carolFundingPoint := wire.OutPoint{
Hash: *bobFundingTxid, Hash: *bobFundingTxid,
Index: bobChanPoint.OutputIndex, Index: bobChanPoint.OutputIndex,
@ -6218,7 +6304,14 @@ func testMultiHopHtlcRemoteChainClaim(net *lntest.NetworkHarness, t *harnessTest
if err != nil { if err != nil {
t.Fatalf("transactions not found in mempool: %v", err) t.Fatalf("transactions not found in mempool: %v", err)
} }
bobFundingTxid, err := chainhash.NewHash(bobChanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(bobChanPoint)
if err != nil {
t.Fatalf("unable to get txid: %v", err)
}
bobFundingTxid, err := chainhash.NewHash(txidHash)
if err != nil {
t.Fatalf("unable to create sha hash: %v", err)
}
carolFundingPoint := wire.OutPoint{ carolFundingPoint := wire.OutPoint{
Hash: *bobFundingTxid, Hash: *bobFundingTxid,
Index: bobChanPoint.OutputIndex, Index: bobChanPoint.OutputIndex,

@ -410,10 +410,10 @@ func (m *SendResponse) GetPaymentRoute() *Route {
} }
type ChannelPoint struct { type ChannelPoint struct {
// / Txid of the funding transaction // Types that are valid to be assigned to FundingTxid:
FundingTxid []byte `protobuf:"bytes,1,opt,name=funding_txid,proto3" json:"funding_txid,omitempty"` // *ChannelPoint_FundingTxidBytes
// / Hex-encoded string representing the funding transaction // *ChannelPoint_FundingTxidStr
FundingTxidStr string `protobuf:"bytes,2,opt,name=funding_txid_str" json:"funding_txid_str,omitempty"` FundingTxid isChannelPoint_FundingTxid `protobuf_oneof:"funding_txid"`
// / The index of the output of the funding transaction // / The index of the output of the funding transaction
OutputIndex uint32 `protobuf:"varint,3,opt,name=output_index" json:"output_index,omitempty"` OutputIndex uint32 `protobuf:"varint,3,opt,name=output_index" json:"output_index,omitempty"`
} }
@ -423,16 +423,37 @@ func (m *ChannelPoint) String() string { return proto.CompactTextStri
func (*ChannelPoint) ProtoMessage() {} func (*ChannelPoint) ProtoMessage() {}
func (*ChannelPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } func (*ChannelPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (m *ChannelPoint) GetFundingTxid() []byte { type isChannelPoint_FundingTxid interface {
isChannelPoint_FundingTxid()
}
type ChannelPoint_FundingTxidBytes struct {
FundingTxidBytes []byte `protobuf:"bytes,1,opt,name=funding_txid_bytes,proto3,oneof"`
}
type ChannelPoint_FundingTxidStr struct {
FundingTxidStr string `protobuf:"bytes,2,opt,name=funding_txid_str,oneof"`
}
func (*ChannelPoint_FundingTxidBytes) isChannelPoint_FundingTxid() {}
func (*ChannelPoint_FundingTxidStr) isChannelPoint_FundingTxid() {}
func (m *ChannelPoint) GetFundingTxid() isChannelPoint_FundingTxid {
if m != nil { if m != nil {
return m.FundingTxid return m.FundingTxid
} }
return nil return nil
} }
func (m *ChannelPoint) GetFundingTxidBytes() []byte {
if x, ok := m.GetFundingTxid().(*ChannelPoint_FundingTxidBytes); ok {
return x.FundingTxidBytes
}
return nil
}
func (m *ChannelPoint) GetFundingTxidStr() string { func (m *ChannelPoint) GetFundingTxidStr() string {
if m != nil { if x, ok := m.GetFundingTxid().(*ChannelPoint_FundingTxidStr); ok {
return m.FundingTxidStr return x.FundingTxidStr
} }
return "" return ""
} }
@ -444,6 +465,72 @@ func (m *ChannelPoint) GetOutputIndex() uint32 {
return 0 return 0
} }
// XXX_OneofFuncs is for the internal use of the proto package.
func (*ChannelPoint) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
return _ChannelPoint_OneofMarshaler, _ChannelPoint_OneofUnmarshaler, _ChannelPoint_OneofSizer, []interface{}{
(*ChannelPoint_FundingTxidBytes)(nil),
(*ChannelPoint_FundingTxidStr)(nil),
}
}
func _ChannelPoint_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
m := msg.(*ChannelPoint)
// funding_txid
switch x := m.FundingTxid.(type) {
case *ChannelPoint_FundingTxidBytes:
b.EncodeVarint(1<<3 | proto.WireBytes)
b.EncodeRawBytes(x.FundingTxidBytes)
case *ChannelPoint_FundingTxidStr:
b.EncodeVarint(2<<3 | proto.WireBytes)
b.EncodeStringBytes(x.FundingTxidStr)
case nil:
default:
return fmt.Errorf("ChannelPoint.FundingTxid has unexpected type %T", x)
}
return nil
}
func _ChannelPoint_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
m := msg.(*ChannelPoint)
switch tag {
case 1: // funding_txid.funding_txid_bytes
if wire != proto.WireBytes {
return true, proto.ErrInternalBadWireType
}
x, err := b.DecodeRawBytes(true)
m.FundingTxid = &ChannelPoint_FundingTxidBytes{x}
return true, err
case 2: // funding_txid.funding_txid_str
if wire != proto.WireBytes {
return true, proto.ErrInternalBadWireType
}
x, err := b.DecodeStringBytes()
m.FundingTxid = &ChannelPoint_FundingTxidStr{x}
return true, err
default:
return false, nil
}
}
func _ChannelPoint_OneofSizer(msg proto.Message) (n int) {
m := msg.(*ChannelPoint)
// funding_txid
switch x := m.FundingTxid.(type) {
case *ChannelPoint_FundingTxidBytes:
n += proto.SizeVarint(1<<3 | proto.WireBytes)
n += proto.SizeVarint(uint64(len(x.FundingTxidBytes)))
n += len(x.FundingTxidBytes)
case *ChannelPoint_FundingTxidStr:
n += proto.SizeVarint(2<<3 | proto.WireBytes)
n += proto.SizeVarint(uint64(len(x.FundingTxidStr)))
n += len(x.FundingTxidStr)
case nil:
default:
panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
}
return n
}
type LightningAddress struct { type LightningAddress struct {
// / The identity pubkey of the Lightning node // / The identity pubkey of the Lightning node
Pubkey string `protobuf:"bytes,1,opt,name=pubkey" json:"pubkey,omitempty"` Pubkey string `protobuf:"bytes,1,opt,name=pubkey" json:"pubkey,omitempty"`
@ -1335,7 +1422,7 @@ type CloseChannelRequest struct {
// / The target number of blocks that the closure transaction should be confirmed by. // / The target number of blocks that the closure transaction should be confirmed by.
TargetConf int32 `protobuf:"varint,3,opt,name=target_conf,json=targetConf" json:"target_conf,omitempty"` TargetConf int32 `protobuf:"varint,3,opt,name=target_conf,json=targetConf" json:"target_conf,omitempty"`
// / A manual fee rate set in sat/byte that should be used when crafting the closure transaction. // / A manual fee rate set in sat/byte that should be used when crafting the closure transaction.
SatPerByte int64 `protobuf:"varint,5,opt,name=sat_per_byte,json=satPerByte" json:"sat_per_byte,omitempty"` SatPerByte int64 `protobuf:"varint,4,opt,name=sat_per_byte,json=satPerByte" json:"sat_per_byte,omitempty"`
} }
func (m *CloseChannelRequest) Reset() { *m = CloseChannelRequest{} } func (m *CloseChannelRequest) Reset() { *m = CloseChannelRequest{} }
@ -5644,312 +5731,314 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) } func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 4904 bytes of a gzipped FileDescriptorProto // 4930 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3b, 0x4d, 0x8f, 0x1c, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7b, 0xcd, 0x8f, 0x1c, 0x49,
0x56, 0xce, 0xea, 0xaa, 0xee, 0xae, 0x57, 0x55, 0xfd, 0x11, 0xdd, 0xee, 0x2e, 0xd7, 0x78, 0xbd, 0x56, 0xb8, 0xb3, 0xba, 0xaa, 0xbb, 0xeb, 0xd5, 0x47, 0x77, 0x47, 0xb7, 0xbb, 0xcb, 0x35, 0x5e,
0x9e, 0x60, 0x34, 0xd3, 0x98, 0xc1, 0x6d, 0xf7, 0xb2, 0xc3, 0xec, 0x18, 0x18, 0xf9, 0xbb, 0x87, 0xaf, 0x27, 0x7e, 0xa3, 0x99, 0xfe, 0x99, 0xc1, 0x6d, 0xf7, 0xb2, 0xc3, 0xec, 0x18, 0x18, 0xd9,
0xf5, 0x78, 0x7a, 0xb3, 0xed, 0x1d, 0xd8, 0x11, 0x2a, 0xb2, 0xab, 0xa2, 0xab, 0x73, 0x9d, 0x95, 0x6e, 0x8f, 0x7b, 0x76, 0x7b, 0x3c, 0xbd, 0xd9, 0xf6, 0x0e, 0xec, 0x08, 0x15, 0xd9, 0x55, 0xd1,
0x99, 0x93, 0x19, 0xd5, 0xed, 0xda, 0xc1, 0x12, 0x2c, 0x08, 0x09, 0x09, 0xc4, 0x01, 0x04, 0xda, 0xd5, 0xb9, 0xce, 0xca, 0xac, 0xc9, 0x8c, 0xea, 0x76, 0xad, 0xb1, 0xc4, 0x97, 0x90, 0x90, 0x40,
0xc3, 0x72, 0xe1, 0x02, 0x07, 0x7e, 0xc1, 0x4a, 0xfc, 0x80, 0x95, 0x10, 0x87, 0x3d, 0x21, 0xb8, 0x1c, 0x40, 0x42, 0x8b, 0xb4, 0x1c, 0xe0, 0x02, 0x07, 0xfe, 0x82, 0x95, 0xf8, 0x03, 0x56, 0x42,
0x20, 0x38, 0xc1, 0x81, 0x13, 0x17, 0x4e, 0x28, 0x5e, 0x7c, 0x64, 0x44, 0x66, 0xb6, 0xed, 0x65, 0x1c, 0xf6, 0x84, 0xe0, 0x82, 0xe0, 0x04, 0x47, 0xc4, 0x85, 0x13, 0x8a, 0x17, 0x1f, 0x19, 0x91,
0x97, 0xbd, 0x55, 0xbc, 0x78, 0xf9, 0x22, 0xe2, 0xc5, 0x8b, 0xf7, 0x5d, 0xd0, 0xce, 0xd2, 0xd1, 0x99, 0x6d, 0x7b, 0x58, 0xe0, 0x56, 0xf1, 0xe2, 0xe5, 0x8b, 0x88, 0x17, 0x2f, 0xde, 0x77, 0x41,
0xf5, 0x34, 0x4b, 0x78, 0x42, 0x5a, 0x51, 0x9c, 0xa5, 0xa3, 0xc1, 0xe5, 0x49, 0x92, 0x4c, 0x22, 0x33, 0x9d, 0x0e, 0x6f, 0x4e, 0xd3, 0x84, 0x27, 0xa4, 0x11, 0xc5, 0xe9, 0x74, 0xd8, 0xbf, 0x3a,
0xb6, 0x1b, 0xa4, 0xe1, 0x6e, 0x10, 0xc7, 0x09, 0x0f, 0x78, 0x98, 0xc4, 0xb9, 0x44, 0xa2, 0x37, 0x4e, 0x92, 0x71, 0xc4, 0x76, 0x82, 0x69, 0xb8, 0x13, 0xc4, 0x71, 0xc2, 0x03, 0x1e, 0x26, 0x71,
0x61, 0xe3, 0x6e, 0xc6, 0x02, 0xce, 0x3e, 0x0d, 0xa2, 0x88, 0x71, 0x9f, 0x7d, 0x3e, 0x63, 0x39, 0x26, 0x91, 0xe8, 0x6d, 0x58, 0xbf, 0x9f, 0xb2, 0x80, 0xb3, 0xcf, 0x82, 0x28, 0x62, 0xdc, 0x67,
0x27, 0x03, 0x58, 0x4e, 0x83, 0x3c, 0x3f, 0x4b, 0xb2, 0x71, 0xdf, 0xbb, 0xea, 0xed, 0x74, 0x7d, 0x5f, 0xcc, 0x58, 0xc6, 0x49, 0x1f, 0x96, 0xa7, 0x41, 0x96, 0x9d, 0x27, 0xe9, 0xa8, 0xe7, 0x5d,
0x33, 0xa6, 0x5b, 0xb0, 0xe9, 0x7e, 0x92, 0xa7, 0x49, 0x9c, 0x33, 0x41, 0xea, 0x69, 0x1c, 0x25, 0xf7, 0xb6, 0xdb, 0xbe, 0x19, 0xd3, 0x4d, 0xd8, 0x70, 0x3f, 0xc9, 0xa6, 0x49, 0x9c, 0x31, 0x41,
0xa3, 0x67, 0x3f, 0x16, 0x29, 0xf7, 0x13, 0x45, 0xea, 0x7b, 0x0d, 0xe8, 0x3c, 0xc9, 0x82, 0x38, 0xea, 0x49, 0x1c, 0x25, 0xc3, 0xa7, 0x5f, 0x8a, 0x94, 0xfb, 0x89, 0x22, 0xf5, 0x83, 0x1a, 0xb4,
0x0f, 0x46, 0x62, 0xb3, 0xa4, 0x0f, 0x4b, 0xfc, 0xf9, 0xf0, 0x24, 0xc8, 0x4f, 0x90, 0x44, 0xdb, 0x1e, 0xa7, 0x41, 0x9c, 0x05, 0x43, 0xb1, 0x59, 0xd2, 0x83, 0x25, 0xfe, 0x6c, 0x70, 0x1a, 0x64,
0xd7, 0x43, 0xb2, 0x05, 0x8b, 0xc1, 0x34, 0x99, 0xc5, 0xbc, 0xdf, 0xb8, 0xea, 0xed, 0x2c, 0xf8, 0xa7, 0x48, 0xa2, 0xe9, 0xeb, 0x21, 0xd9, 0x84, 0xc5, 0x60, 0x92, 0xcc, 0x62, 0xde, 0xab, 0x5d,
0x6a, 0x44, 0xde, 0x85, 0xf5, 0x78, 0x36, 0x1d, 0x8e, 0x92, 0xf8, 0x38, 0xcc, 0xa6, 0xf2, 0xc8, 0xf7, 0xb6, 0x17, 0x7c, 0x35, 0x22, 0xef, 0xc2, 0x5a, 0x3c, 0x9b, 0x0c, 0x86, 0x49, 0x7c, 0x12,
0xfd, 0x85, 0xab, 0xde, 0x4e, 0xcb, 0xaf, 0x4e, 0x90, 0x2b, 0x00, 0x47, 0x62, 0x1b, 0x72, 0x89, 0xa6, 0x13, 0x79, 0xe4, 0xde, 0xc2, 0x75, 0x6f, 0xbb, 0xe1, 0x97, 0x27, 0xc8, 0x35, 0x80, 0x63,
0x26, 0x2e, 0x61, 0x41, 0x08, 0x85, 0xae, 0x1a, 0xb1, 0x70, 0x72, 0xc2, 0xfb, 0x2d, 0x24, 0xe4, 0xb1, 0x0d, 0xb9, 0x44, 0x1d, 0x97, 0xb0, 0x20, 0x84, 0x42, 0x5b, 0x8d, 0x58, 0x38, 0x3e, 0xe5,
0xc0, 0x04, 0x0d, 0x1e, 0x4e, 0xd9, 0x30, 0xe7, 0xc1, 0x34, 0xed, 0x2f, 0xe2, 0x6e, 0x2c, 0x08, 0xbd, 0x06, 0x12, 0x72, 0x60, 0x82, 0x06, 0x0f, 0x27, 0x6c, 0x90, 0xf1, 0x60, 0x32, 0xed, 0x2d,
0xce, 0x27, 0x3c, 0x88, 0x86, 0xc7, 0x8c, 0xe5, 0xfd, 0x25, 0x35, 0x6f, 0x20, 0xe4, 0x6d, 0x58, 0xe2, 0x6e, 0x2c, 0x08, 0xce, 0x27, 0x3c, 0x88, 0x06, 0x27, 0x8c, 0x65, 0xbd, 0x25, 0x35, 0x6f,
0x19, 0xb3, 0x9c, 0x0f, 0x83, 0xf1, 0x38, 0x63, 0x79, 0xce, 0xf2, 0xfe, 0xf2, 0xd5, 0x85, 0x9d, 0x20, 0xe4, 0x6d, 0xe8, 0x8e, 0x58, 0xc6, 0x07, 0xc1, 0x68, 0x94, 0xb2, 0x2c, 0x63, 0x59, 0x6f,
0xb6, 0x5f, 0x82, 0xd2, 0x3e, 0x6c, 0x3d, 0x64, 0xdc, 0xe2, 0x4e, 0xae, 0x38, 0x4d, 0x1f, 0x01, 0xf9, 0xfa, 0xc2, 0x76, 0xd3, 0x2f, 0x40, 0x69, 0x0f, 0x36, 0x1f, 0x32, 0x6e, 0x71, 0x27, 0x53,
0xb1, 0xc0, 0xf7, 0x18, 0x0f, 0xc2, 0x28, 0x27, 0xef, 0x41, 0x97, 0x5b, 0xc8, 0x7d, 0xef, 0xea, 0x9c, 0xa6, 0x07, 0x40, 0x2c, 0xf0, 0x1e, 0xe3, 0x41, 0x18, 0x65, 0xe4, 0x3d, 0x68, 0x73, 0x0b,
0xc2, 0x4e, 0x67, 0x8f, 0x5c, 0x47, 0xe9, 0xb8, 0x6e, 0x7d, 0xe0, 0x3b, 0x78, 0xf4, 0x7f, 0x3c, 0xb9, 0xe7, 0x5d, 0x5f, 0xd8, 0x6e, 0xed, 0x92, 0x9b, 0x28, 0x1d, 0x37, 0xad, 0x0f, 0x7c, 0x07,
0xe8, 0x1c, 0xb2, 0x78, 0xac, 0xef, 0x91, 0x40, 0x53, 0xec, 0x44, 0xdd, 0x21, 0xfe, 0x26, 0x5f, 0x8f, 0xfe, 0xa7, 0x07, 0xad, 0x23, 0x16, 0x8f, 0xf4, 0x3d, 0x12, 0xa8, 0x8b, 0x9d, 0xa8, 0x3b,
0x86, 0x0e, 0xee, 0x2e, 0xe7, 0x59, 0x18, 0x4f, 0xf0, 0x0a, 0xda, 0x3e, 0x08, 0xd0, 0x21, 0x42, 0xc4, 0xdf, 0xe4, 0xab, 0xd0, 0xc2, 0xdd, 0x65, 0x3c, 0x0d, 0xe3, 0x31, 0x5e, 0x41, 0xd3, 0x07,
0xc8, 0x1a, 0x2c, 0x04, 0x53, 0x8e, 0x8c, 0x5f, 0xf0, 0xc5, 0x4f, 0xf2, 0x26, 0x74, 0xd3, 0x60, 0x01, 0x3a, 0x42, 0x08, 0x59, 0x85, 0x85, 0x60, 0xc2, 0x91, 0xf1, 0x0b, 0xbe, 0xf8, 0x49, 0xde,
0x3e, 0x65, 0x31, 0x2f, 0x98, 0xdd, 0xf5, 0x3b, 0x0a, 0xb6, 0x2f, 0xb8, 0x7d, 0x1d, 0x36, 0x6c, 0x84, 0xf6, 0x34, 0x98, 0x4f, 0x58, 0xcc, 0x73, 0x66, 0xb7, 0xfd, 0x96, 0x82, 0xed, 0x0b, 0x6e,
0x14, 0x4d, 0xbd, 0x85, 0xd4, 0xd7, 0x2d, 0x4c, 0xb5, 0xc8, 0x3b, 0xb0, 0xaa, 0xf1, 0x33, 0xb9, 0xdf, 0x84, 0x75, 0x1b, 0x45, 0x53, 0x6f, 0x20, 0xf5, 0x35, 0x0b, 0x53, 0x2d, 0xf2, 0x0e, 0xac,
0x59, 0x64, 0x7f, 0xdb, 0x5f, 0x51, 0x60, 0x7d, 0x84, 0x1d, 0x58, 0x3b, 0x0e, 0xe3, 0x20, 0x1a, 0x68, 0xfc, 0x54, 0x6e, 0x16, 0xd9, 0xdf, 0xf4, 0xbb, 0x0a, 0xac, 0x8f, 0xb0, 0x0d, 0xab, 0x27,
0x8e, 0x22, 0x7e, 0x3a, 0x1c, 0xb3, 0x88, 0x07, 0x78, 0x11, 0x2d, 0x7f, 0x05, 0xe1, 0x77, 0x23, 0x61, 0x1c, 0x44, 0x83, 0x61, 0xc4, 0xcf, 0x06, 0x23, 0x16, 0xf1, 0x00, 0x2f, 0xa2, 0xe1, 0x77,
0x7e, 0x7a, 0x4f, 0x40, 0xe9, 0x9f, 0x7b, 0xd0, 0x95, 0x87, 0x97, 0x12, 0x49, 0xde, 0x82, 0x9e, 0x11, 0x7e, 0x3f, 0xe2, 0x67, 0x7b, 0x02, 0x4a, 0xff, 0xd8, 0x83, 0xb6, 0x3c, 0xbc, 0x94, 0x48,
0x5e, 0x83, 0x65, 0x59, 0x92, 0x29, 0x39, 0x74, 0x81, 0xe4, 0x1a, 0xac, 0x69, 0x40, 0x9a, 0xb1, 0xf2, 0x16, 0x74, 0xf4, 0x1a, 0x2c, 0x4d, 0x93, 0x54, 0xc9, 0xa1, 0x0b, 0x24, 0x37, 0x60, 0x55,
0x70, 0x1a, 0x4c, 0x18, 0x32, 0xa5, 0xeb, 0x57, 0xe0, 0x64, 0xaf, 0xa0, 0x98, 0x25, 0x33, 0xce, 0x03, 0xa6, 0x29, 0x0b, 0x27, 0xc1, 0x98, 0x21, 0x53, 0xda, 0x7e, 0x09, 0x4e, 0x76, 0x73, 0x8a,
0x90, 0x49, 0x9d, 0xbd, 0xae, 0xba, 0x18, 0x5f, 0xc0, 0x7c, 0x17, 0x85, 0x7e, 0xd7, 0x83, 0xee, 0x69, 0x32, 0xe3, 0x0c, 0x99, 0xd4, 0xda, 0x6d, 0xab, 0x8b, 0xf1, 0x05, 0xcc, 0x77, 0x51, 0xe8,
0xdd, 0x93, 0x20, 0x8e, 0x59, 0x74, 0x90, 0x84, 0x31, 0x17, 0x82, 0x79, 0x3c, 0x8b, 0xc7, 0x61, 0x9f, 0x7b, 0xd0, 0xbe, 0x7f, 0x1a, 0xc4, 0x31, 0x8b, 0x0e, 0x93, 0x30, 0xe6, 0xe4, 0x16, 0x90,
0x3c, 0x19, 0xf2, 0xe7, 0xa1, 0x7e, 0x60, 0x0e, 0x4c, 0x6c, 0xca, 0x1e, 0x0b, 0x76, 0xaa, 0x9b, 0x93, 0x59, 0x3c, 0x0a, 0xe3, 0xf1, 0x80, 0x3f, 0x0b, 0x47, 0x83, 0xe3, 0x39, 0x67, 0x99, 0xbc,
0xaa, 0xc0, 0x05, 0xbd, 0x64, 0xc6, 0xd3, 0x19, 0x1f, 0x86, 0xf1, 0x98, 0x3d, 0xc7, 0x3d, 0xf5, 0xa2, 0xfd, 0x4b, 0x7e, 0xc5, 0x1c, 0x79, 0x17, 0x56, 0x1d, 0x68, 0xc6, 0x53, 0x79, 0x6f, 0xfb,
0x7c, 0x07, 0x46, 0x7f, 0x0d, 0xd6, 0x1e, 0x09, 0x89, 0x8f, 0xc3, 0x78, 0x72, 0x5b, 0x8a, 0xa5, 0x97, 0xfc, 0xd2, 0x8c, 0x10, 0xfc, 0x64, 0xc6, 0xa7, 0x33, 0x3e, 0x08, 0xe3, 0x11, 0x7b, 0x86,
0x78, 0x86, 0xe9, 0xec, 0xe8, 0x19, 0x9b, 0x2b, 0xbe, 0xa8, 0x91, 0x10, 0x9a, 0x93, 0x24, 0xe7, 0x7b, 0xec, 0xf8, 0x0e, 0xec, 0x5e, 0x17, 0xda, 0xf6, 0x77, 0xf4, 0x97, 0x60, 0xf5, 0x40, 0xbc,
0x6a, 0x3d, 0xfc, 0x4d, 0xff, 0xcd, 0x83, 0x55, 0xc1, 0xdb, 0x8f, 0x83, 0x78, 0xae, 0x6f, 0xe6, 0x88, 0x38, 0x8c, 0xc7, 0x77, 0xa5, 0xd8, 0x8a, 0x67, 0x3a, 0x9d, 0x1d, 0x3f, 0x65, 0x73, 0xc5,
0x11, 0x74, 0x05, 0xa9, 0x27, 0xc9, 0x6d, 0xf9, 0x98, 0xa5, 0x90, 0xee, 0x28, 0x5e, 0x94, 0xb0, 0x37, 0x35, 0x12, 0x42, 0x75, 0x9a, 0x64, 0x5c, 0x49, 0x0e, 0xfe, 0xa6, 0xff, 0xec, 0xc1, 0x8a,
0xaf, 0xdb, 0xa8, 0xf7, 0x63, 0x9e, 0xcd, 0x7d, 0xe7, 0x6b, 0x21, 0x96, 0x3c, 0xc8, 0x26, 0x8c, 0xe0, 0xfd, 0x27, 0x41, 0x3c, 0xd7, 0x37, 0x77, 0x00, 0x6d, 0x41, 0xea, 0x71, 0x72, 0x57, 0x3e,
0xe3, 0x33, 0x57, 0xcf, 0x1e, 0x24, 0xe8, 0x6e, 0x12, 0x1f, 0x93, 0xab, 0xd0, 0xcd, 0x03, 0x3e, 0x76, 0x29, 0xc4, 0xdb, 0x8a, 0x57, 0x05, 0xec, 0x9b, 0x36, 0xea, 0x83, 0x98, 0xa7, 0x73, 0xdf,
0x4c, 0x59, 0x36, 0x3c, 0x9a, 0x73, 0x86, 0xa2, 0xb5, 0xe0, 0x43, 0x1e, 0xf0, 0x03, 0x96, 0xdd, 0xf9, 0x5a, 0x88, 0x2d, 0x0f, 0xd2, 0x31, 0xe3, 0xa8, 0x06, 0x94, 0x5a, 0x00, 0x09, 0xba, 0x9f,
0x99, 0x73, 0x36, 0xf8, 0x10, 0xd6, 0x2b, 0xab, 0x08, 0x69, 0x2e, 0x8e, 0x28, 0x7e, 0x92, 0x4d, 0xc4, 0x27, 0xe4, 0x3a, 0xb4, 0xb3, 0x80, 0x0f, 0xa6, 0x2c, 0x45, 0xae, 0xa1, 0xe8, 0x2d, 0xf8,
0x68, 0x9d, 0x06, 0xd1, 0x8c, 0x29, 0xed, 0x23, 0x07, 0x1f, 0x34, 0xde, 0xf7, 0xe8, 0xdb, 0xb0, 0x90, 0x05, 0xfc, 0x90, 0xa5, 0xf7, 0xe6, 0x9c, 0xf5, 0x3f, 0x84, 0xb5, 0xd2, 0x2a, 0x42, 0xda,
0x56, 0x6c, 0x5b, 0x09, 0x11, 0x81, 0xa6, 0xb9, 0xa5, 0xb6, 0x8f, 0xbf, 0xe9, 0xef, 0x79, 0x12, 0xf3, 0x23, 0x8a, 0x9f, 0x64, 0x03, 0x1a, 0x67, 0x41, 0x34, 0x63, 0x4a, 0x3b, 0xc9, 0xc1, 0x07,
0xf1, 0x6e, 0x12, 0x9a, 0x97, 0x2c, 0x10, 0xc5, 0x83, 0xd7, 0x88, 0xe2, 0xf7, 0xb9, 0x9a, 0xee, 0xb5, 0xf7, 0x3d, 0xfa, 0x36, 0xac, 0xe6, 0xdb, 0x56, 0x42, 0x46, 0xa0, 0x2e, 0x38, 0xa8, 0x08,
0x27, 0x3f, 0x2c, 0x7d, 0x07, 0xd6, 0xad, 0x2d, 0xbc, 0x64, 0xb3, 0x7f, 0xe5, 0xc1, 0xfa, 0x63, 0xe0, 0x6f, 0xfa, 0x9b, 0x9e, 0x44, 0xbc, 0x9f, 0x84, 0xe6, 0xa5, 0x0b, 0x44, 0xa1, 0x10, 0x34,
0x76, 0xa6, 0x6e, 0x5d, 0xef, 0xf6, 0x7d, 0x68, 0xf2, 0x79, 0xca, 0x10, 0x73, 0x65, 0xef, 0x2d, 0xa2, 0xf8, 0x7d, 0xa1, 0x26, 0xfc, 0xe9, 0x0f, 0x4b, 0xdf, 0x81, 0x35, 0x6b, 0x0b, 0x2f, 0xd9,
0x75, 0x69, 0x15, 0xbc, 0xeb, 0x6a, 0xf8, 0x64, 0x9e, 0x32, 0x1f, 0xbf, 0xa0, 0x9f, 0x40, 0xc7, 0xec, 0x9f, 0x79, 0xb0, 0xf6, 0x88, 0x9d, 0xab, 0x5b, 0xd7, 0xbb, 0x7d, 0x1f, 0xea, 0x7c, 0x3e,
0x02, 0x92, 0x6d, 0xd8, 0xf8, 0xf4, 0xa3, 0x27, 0x8f, 0xef, 0x1f, 0x1e, 0x0e, 0x0f, 0x9e, 0xde, 0x65, 0x88, 0xd9, 0xdd, 0x7d, 0x4b, 0x5d, 0x5a, 0x09, 0xef, 0xa6, 0x1a, 0x3e, 0x9e, 0x4f, 0x99,
0xf9, 0xfa, 0xfd, 0xdf, 0x1c, 0xee, 0xdf, 0x3e, 0xdc, 0x5f, 0xbb, 0x40, 0xb6, 0x80, 0x3c, 0xbe, 0x8f, 0x5f, 0xd0, 0x4f, 0xa1, 0x65, 0x01, 0xc9, 0x16, 0xac, 0x7f, 0xf6, 0xf1, 0xe3, 0x47, 0x0f,
0x7f, 0xf8, 0xe4, 0xfe, 0x3d, 0x07, 0xee, 0x91, 0x55, 0xe8, 0xd8, 0x80, 0x06, 0x1d, 0x40, 0xff, 0x8e, 0x8e, 0x06, 0x87, 0x4f, 0xee, 0x7d, 0xeb, 0xc1, 0xaf, 0x0c, 0xf6, 0xef, 0x1e, 0xed, 0xaf,
0x31, 0x3b, 0xfb, 0x34, 0xe4, 0x31, 0xcb, 0x73, 0x77, 0x79, 0x7a, 0x1d, 0x88, 0xbd, 0x27, 0x75, 0x5e, 0x22, 0x9b, 0x40, 0x1e, 0x3d, 0x38, 0x7a, 0xfc, 0x60, 0xcf, 0x81, 0x7b, 0x64, 0x05, 0x5a,
0xcc, 0x3e, 0x2c, 0x29, 0xdd, 0xaa, 0x4d, 0x8b, 0x1a, 0xd2, 0xb7, 0x81, 0x1c, 0x86, 0x93, 0xf8, 0x36, 0xa0, 0x46, 0xfb, 0xd0, 0x7b, 0xc4, 0xce, 0x3f, 0x0b, 0x79, 0xcc, 0xb2, 0xcc, 0x5d, 0x9e,
0x63, 0x96, 0xe7, 0xc1, 0x84, 0xe9, 0xc3, 0xae, 0xc1, 0xc2, 0x34, 0x9f, 0xa8, 0x87, 0x26, 0x7e, 0xde, 0x04, 0x62, 0xef, 0x49, 0x1d, 0xb3, 0x07, 0x4b, 0x4a, 0xf7, 0x6a, 0xd3, 0xa3, 0x86, 0xf4,
0xd2, 0xaf, 0xc0, 0x86, 0x83, 0xa7, 0x08, 0x5f, 0x86, 0x76, 0x1e, 0x4e, 0xe2, 0x80, 0xcf, 0x32, 0x6d, 0x20, 0x47, 0xe1, 0x38, 0xfe, 0x84, 0x65, 0x59, 0x30, 0x66, 0xfa, 0xb0, 0xab, 0xb0, 0x30,
0xa6, 0x48, 0x17, 0x00, 0xfa, 0x00, 0x36, 0xbf, 0xc9, 0xb2, 0xf0, 0x78, 0xfe, 0x2a, 0xf2, 0x2e, 0xc9, 0xc6, 0x4a, 0x4b, 0x8a, 0x9f, 0xf4, 0x6b, 0xb0, 0xee, 0xe0, 0x29, 0xc2, 0x57, 0xa1, 0x99,
0x9d, 0x46, 0x99, 0xce, 0x7d, 0xb8, 0x58, 0xa2, 0xa3, 0x96, 0x97, 0x92, 0xa9, 0xee, 0x6f, 0xd9, 0x85, 0xe3, 0x38, 0xe0, 0xb3, 0x94, 0x29, 0xd2, 0x39, 0x80, 0x7e, 0x04, 0x1b, 0xdf, 0x61, 0x69,
0x97, 0x03, 0xeb, 0x9d, 0x36, 0xec, 0x77, 0x4a, 0x9f, 0x02, 0xb9, 0x9b, 0xc4, 0x31, 0x1b, 0xf1, 0x78, 0x32, 0x7f, 0x15, 0x79, 0x97, 0x4e, 0xad, 0x48, 0xe7, 0x01, 0x5c, 0x2e, 0xd0, 0x51, 0xcb,
0x03, 0xc6, 0x32, 0xbd, 0x99, 0x5f, 0xb0, 0xc4, 0xb0, 0xb3, 0xb7, 0xad, 0x2e, 0xb6, 0xfc, 0xf8, 0x4b, 0xc9, 0x54, 0xf7, 0xb7, 0xec, 0xcb, 0x81, 0xf5, 0x4e, 0x6b, 0xf6, 0x3b, 0xa5, 0x4f, 0x80,
0x95, 0x7c, 0x12, 0x68, 0xa6, 0x2c, 0x9b, 0x22, 0xe1, 0x65, 0x1f, 0x7f, 0xd3, 0x5d, 0xd8, 0x70, 0xdc, 0x4f, 0xe2, 0x98, 0x0d, 0xf9, 0x21, 0x63, 0xa9, 0xde, 0xcc, 0xcf, 0x58, 0x62, 0xd8, 0xda,
0xc8, 0x16, 0x3c, 0x4f, 0x19, 0xcb, 0x86, 0x6a, 0x77, 0x2d, 0x5f, 0x0f, 0xe9, 0x4d, 0xb8, 0x78, 0xdd, 0x52, 0x17, 0x5b, 0x7c, 0xfc, 0x4a, 0x3e, 0x09, 0xd4, 0xa7, 0x2c, 0x9d, 0x20, 0xe1, 0x65,
0x2f, 0xcc, 0x47, 0xd5, 0xad, 0x88, 0x4f, 0x66, 0x47, 0xc3, 0xe2, 0xf9, 0xe9, 0xa1, 0xb0, 0x87, 0x1f, 0x7f, 0xd3, 0x1d, 0x58, 0x77, 0xc8, 0xe6, 0x3c, 0x9f, 0x32, 0x96, 0x0e, 0xd4, 0xee, 0x1a,
0xe5, 0x4f, 0x94, 0x17, 0xf1, 0x87, 0x1e, 0x34, 0xf7, 0x9f, 0x3c, 0xba, 0x2b, 0x5c, 0x90, 0x30, 0xbe, 0x1e, 0xd2, 0xdb, 0x70, 0x79, 0x2f, 0xcc, 0x86, 0xe5, 0xad, 0x88, 0x4f, 0x66, 0xc7, 0x83,
0x1e, 0x25, 0x53, 0x61, 0x45, 0x24, 0x3b, 0xcc, 0xf8, 0xdc, 0x67, 0x75, 0x19, 0xda, 0x68, 0x7c, 0xfc, 0xf9, 0xe9, 0xa1, 0xb0, 0x97, 0xc5, 0x4f, 0x94, 0x97, 0xf1, 0xbb, 0x1e, 0xd4, 0xf7, 0x1f,
0x84, 0x89, 0xc7, 0x47, 0xd5, 0xf5, 0x0b, 0x80, 0x70, 0x2f, 0xd8, 0xf3, 0x34, 0xcc, 0xd0, 0x7f, 0x1f, 0xdc, 0x17, 0x2e, 0x4a, 0x18, 0x0f, 0x93, 0x89, 0xb0, 0x32, 0x92, 0x1d, 0x66, 0x7c, 0xe1,
0xd0, 0x5e, 0x41, 0x13, 0x95, 0x65, 0x75, 0x82, 0xfe, 0x47, 0x13, 0x7a, 0xb7, 0x47, 0x3c, 0x3c, 0xb3, 0xba, 0x0a, 0x4d, 0x34, 0x4e, 0xc2, 0x05, 0xc0, 0x47, 0xd5, 0xf6, 0x73, 0x80, 0x70, 0x3f,
0x65, 0x4a, 0x79, 0xe3, 0xaa, 0x08, 0x50, 0xfb, 0x51, 0x23, 0x61, 0x66, 0x32, 0x36, 0x4d, 0x38, 0xd8, 0xb3, 0x69, 0x98, 0xa2, 0x7f, 0xa1, 0xbd, 0x86, 0x3a, 0x2a, 0xcf, 0xf2, 0x04, 0xfd, 0xd7,
0x1b, 0x3a, 0xd7, 0xe4, 0x02, 0x05, 0xd6, 0x48, 0x12, 0x1a, 0xa6, 0xc2, 0x0c, 0xe0, 0xfe, 0xda, 0x3a, 0x74, 0xee, 0x0e, 0x79, 0x78, 0xc6, 0x94, 0x72, 0xc7, 0x55, 0x11, 0xa0, 0xf6, 0xa3, 0x46,
0xbe, 0x0b, 0x14, 0x2c, 0x13, 0x00, 0xc1, 0x65, 0xb1, 0xb3, 0xa6, 0xaf, 0x87, 0x82, 0x1f, 0xa3, 0xc2, 0x0c, 0xa5, 0x6c, 0x92, 0x70, 0x36, 0x70, 0xae, 0xc9, 0x05, 0x0a, 0xac, 0xa1, 0x24, 0x34,
0x20, 0x0d, 0x46, 0x21, 0x9f, 0x2b, 0x6d, 0x60, 0xc6, 0x82, 0x76, 0x94, 0x8c, 0x82, 0x68, 0x78, 0x98, 0x0a, 0x33, 0x81, 0xfb, 0x6b, 0xfa, 0x2e, 0x50, 0xb0, 0x4c, 0x00, 0x04, 0x97, 0xc5, 0xce,
0x14, 0x44, 0x41, 0x3c, 0x62, 0xca, 0x93, 0x71, 0x81, 0xc2, 0x59, 0x51, 0x5b, 0xd2, 0x68, 0xd2, 0xea, 0xbe, 0x1e, 0x0a, 0x7e, 0x0c, 0x83, 0x69, 0x30, 0x0c, 0xf9, 0x5c, 0x69, 0x03, 0x33, 0x16,
0xa1, 0x29, 0x41, 0x85, 0xd3, 0x33, 0x4a, 0xa6, 0xd3, 0x90, 0x0b, 0x1f, 0xa7, 0xbf, 0x2c, 0x35, 0xb4, 0xa3, 0x64, 0x18, 0x44, 0x83, 0xe3, 0x20, 0x0a, 0xe2, 0x21, 0x53, 0x9e, 0x8e, 0x0b, 0x14,
0x4f, 0x01, 0xc1, 0x93, 0xc8, 0xd1, 0x99, 0xe4, 0x61, 0x5b, 0xae, 0xe6, 0x00, 0x05, 0x95, 0x63, 0xce, 0x8c, 0xda, 0x92, 0x46, 0x93, 0x0e, 0x4f, 0x01, 0x2a, 0x9c, 0xa2, 0x61, 0x32, 0x99, 0x84,
0xc6, 0x50, 0x83, 0x3d, 0x3b, 0xeb, 0x83, 0xa4, 0x52, 0x40, 0xc4, 0x6d, 0xcc, 0xe2, 0x9c, 0x71, 0x5c, 0xf8, 0x40, 0xbd, 0x65, 0xa9, 0x79, 0x72, 0x08, 0x9e, 0x44, 0x8e, 0xce, 0x25, 0x0f, 0x9b,
0x1e, 0xb1, 0xb1, 0xd9, 0x50, 0x07, 0xd1, 0xaa, 0x13, 0xe4, 0x06, 0x6c, 0x48, 0xb7, 0x2b, 0x0f, 0x72, 0x35, 0x07, 0x28, 0xa8, 0x9c, 0x30, 0x86, 0x1a, 0xec, 0xe9, 0x79, 0x0f, 0x24, 0x95, 0x1c,
0x78, 0x92, 0x9f, 0x84, 0xf9, 0x30, 0x67, 0x31, 0xef, 0x77, 0x11, 0xbf, 0x6e, 0x8a, 0xbc, 0x0f, 0x22, 0x6e, 0x63, 0x16, 0x67, 0x8c, 0xf3, 0x88, 0x8d, 0xcc, 0x86, 0x5a, 0x88, 0x56, 0x9e, 0x20,
0xdb, 0x25, 0x70, 0xc6, 0x46, 0x2c, 0x3c, 0x65, 0xe3, 0x7e, 0x0f, 0xbf, 0x3a, 0x6f, 0x9a, 0x5c, 0xb7, 0x60, 0x5d, 0xba, 0x65, 0x59, 0xc0, 0x93, 0xec, 0x34, 0xcc, 0x06, 0x19, 0x8b, 0x79, 0xaf,
0x85, 0x8e, 0xf0, 0x36, 0x67, 0xe9, 0x38, 0xe0, 0x2c, 0xef, 0xaf, 0xe0, 0x3d, 0xd8, 0x20, 0x72, 0x8d, 0xf8, 0x55, 0x53, 0xe4, 0x7d, 0xd8, 0x2a, 0x80, 0x53, 0x36, 0x64, 0xe1, 0x19, 0x1b, 0xf5,
0x13, 0x7a, 0x29, 0x93, 0x56, 0xf8, 0x84, 0x47, 0xa3, 0xbc, 0xbf, 0x8a, 0xa6, 0xaf, 0xa3, 0x1e, 0x3a, 0xf8, 0xd5, 0x45, 0xd3, 0xe4, 0x3a, 0xb4, 0x84, 0x37, 0x3a, 0x9b, 0x8e, 0x02, 0x61, 0xb8,
0x9b, 0x90, 0x5f, 0xdf, 0xc5, 0x10, 0xa2, 0x39, 0xca, 0xd1, 0x7f, 0x09, 0xe6, 0xfd, 0x35, 0x14, 0xbb, 0x78, 0x0f, 0x36, 0x88, 0xdc, 0x86, 0xce, 0x94, 0x49, 0xeb, 0x7a, 0xca, 0xa3, 0x61, 0xd6,
0xba, 0x02, 0x40, 0x2f, 0xc2, 0xc6, 0xa3, 0x30, 0xe7, 0x4a, 0xd2, 0x8c, 0xf6, 0xdb, 0x87, 0x4d, 0x5b, 0x41, 0xd3, 0xd7, 0x52, 0x8f, 0x4d, 0xc8, 0xaf, 0xef, 0x62, 0x08, 0xd1, 0x1c, 0x66, 0xe8,
0x17, 0xac, 0xde, 0xe2, 0x0d, 0x58, 0x56, 0x62, 0x93, 0xf7, 0x3b, 0xb8, 0xf4, 0xa6, 0x5a, 0xda, 0xdf, 0x04, 0xf3, 0xde, 0x2a, 0x0a, 0x5d, 0x0e, 0xa0, 0x97, 0x61, 0xfd, 0x20, 0xcc, 0xb8, 0x92,
0x91, 0x58, 0xdf, 0x60, 0xd1, 0x3f, 0x68, 0x40, 0x53, 0xbc, 0xb3, 0xf3, 0xdf, 0xa4, 0xfd, 0xc0, 0x34, 0xa3, 0xfd, 0xf6, 0x61, 0xc3, 0x05, 0xab, 0xb7, 0x78, 0x0b, 0x96, 0x95, 0xd8, 0x64, 0xbd,
0x1b, 0xce, 0x03, 0xb7, 0xd5, 0xed, 0x82, 0xa3, 0x6e, 0xd1, 0x07, 0x9f, 0x73, 0xa6, 0x6e, 0x43, 0x16, 0x2e, 0xbd, 0xa1, 0x96, 0x76, 0x24, 0xd6, 0x37, 0x58, 0xf4, 0x77, 0x6a, 0x50, 0x17, 0xef,
0x4a, 0xac, 0x05, 0x29, 0xe6, 0x33, 0x36, 0x3a, 0x45, 0xb1, 0x35, 0xf3, 0x02, 0x22, 0x84, 0x5a, 0xec, 0xe2, 0x37, 0x69, 0x3f, 0xf0, 0x9a, 0xf3, 0xc0, 0x6d, 0x75, 0xbb, 0xe0, 0xa8, 0x5b, 0xf4,
0x98, 0x39, 0xfc, 0x5a, 0xca, 0xac, 0x19, 0xeb, 0x39, 0xfc, 0x72, 0xa9, 0x98, 0xc3, 0xef, 0xfa, 0xd1, 0x85, 0x07, 0x23, 0x6f, 0x43, 0x4a, 0xac, 0x05, 0xc9, 0xe7, 0x53, 0x36, 0x3c, 0x43, 0xb1,
0xb0, 0x14, 0xc6, 0x47, 0xc9, 0x2c, 0x1e, 0xa3, 0x7c, 0x2e, 0xfb, 0x7a, 0x28, 0xf8, 0x9c, 0xa2, 0x35, 0xf3, 0x02, 0x22, 0x84, 0x5a, 0x98, 0x39, 0xfc, 0x5a, 0xca, 0xac, 0x19, 0xeb, 0x39, 0xfc,
0x77, 0x14, 0x4e, 0x99, 0x12, 0xcc, 0x02, 0x40, 0x89, 0x70, 0x83, 0x72, 0xd4, 0x38, 0x86, 0xc9, 0x72, 0x29, 0x9f, 0xc3, 0xef, 0x7a, 0xb0, 0x14, 0xc6, 0xc7, 0xc9, 0x2c, 0x1e, 0xa1, 0x7c, 0x2e,
0xef, 0xc1, 0xba, 0x05, 0x53, 0x1c, 0x7e, 0x13, 0x5a, 0xe2, 0xf4, 0xda, 0xf3, 0xd6, 0x37, 0x8b, 0xfb, 0x7a, 0x28, 0xf8, 0x3c, 0x45, 0xaf, 0x27, 0x9c, 0x30, 0x25, 0x98, 0x39, 0x80, 0x12, 0xe1,
0xaa, 0x4a, 0xce, 0xd0, 0x35, 0x58, 0x79, 0xc8, 0xf8, 0x47, 0xf1, 0x71, 0xa2, 0x29, 0xfd, 0xd1, 0x06, 0x65, 0xa8, 0x71, 0x0c, 0x93, 0xdf, 0x83, 0x35, 0x0b, 0xa6, 0x38, 0xfc, 0x26, 0x34, 0xc4,
0x02, 0xac, 0x1a, 0x90, 0x22, 0xb4, 0x03, 0xab, 0xe1, 0x98, 0xc5, 0x3c, 0xe4, 0xf3, 0xa1, 0xe3, 0xe9, 0xb5, 0x67, 0xae, 0x6f, 0x16, 0x55, 0x95, 0x9c, 0xa1, 0xab, 0xd0, 0x7d, 0xc8, 0xf8, 0xc7,
0x6d, 0x95, 0xc1, 0x42, 0xf9, 0x07, 0x51, 0x18, 0xe4, 0x4a, 0x7d, 0xc8, 0x01, 0xd9, 0x83, 0x4d, 0xf1, 0x49, 0xa2, 0x29, 0xfd, 0xde, 0x02, 0xac, 0x18, 0x90, 0x22, 0xb4, 0x0d, 0x2b, 0xe1, 0x88,
0x21, 0x79, 0x5a, 0x98, 0xcc, 0xb5, 0x4b, 0x27, 0xaf, 0x76, 0x4e, 0x3c, 0x16, 0x01, 0x97, 0xea, 0xc5, 0x3c, 0xe4, 0xf3, 0x81, 0xe3, 0x6d, 0x15, 0xc1, 0x42, 0xf9, 0x07, 0x51, 0x18, 0x64, 0x4a,
0xa9, 0xf8, 0x44, 0xaa, 0xba, 0xba, 0x29, 0xc1, 0x35, 0x49, 0x49, 0x1c, 0xb9, 0x25, 0xa5, 0xd3, 0x7d, 0xc8, 0x01, 0xd9, 0x85, 0x0d, 0x21, 0x79, 0x5a, 0x98, 0xcc, 0xb5, 0x4b, 0xa7, 0xaf, 0x72,
0x00, 0x2a, 0x91, 0xd4, 0xa2, 0x74, 0x30, 0xcb, 0x91, 0x94, 0x15, 0x8d, 0x2d, 0x57, 0xa2, 0xb1, 0x4e, 0x3c, 0x16, 0x01, 0x97, 0xea, 0x29, 0xff, 0x44, 0xaa, 0xba, 0xaa, 0x29, 0xc1, 0x35, 0x49,
0x1d, 0x58, 0xcd, 0xe7, 0xf1, 0x88, 0x8d, 0x87, 0x3c, 0x11, 0xeb, 0x86, 0x31, 0xde, 0xce, 0xb2, 0x49, 0x1c, 0xb9, 0x21, 0xa5, 0xd3, 0x00, 0x4a, 0x91, 0xd6, 0xa2, 0x74, 0x38, 0x8b, 0x91, 0x96,
0x5f, 0x06, 0x63, 0xdc, 0xc8, 0x72, 0x1e, 0x33, 0x8e, 0x5a, 0x63, 0xd9, 0xd7, 0x43, 0xa1, 0x80, 0x15, 0xad, 0x2d, 0x97, 0xa2, 0xb5, 0x6d, 0x58, 0xc9, 0xe6, 0xf1, 0x90, 0x8d, 0x06, 0x3c, 0x11,
0x11, 0x45, 0x0a, 0x7d, 0xdb, 0x57, 0x23, 0x61, 0xc5, 0x66, 0x59, 0x98, 0xf7, 0xbb, 0x08, 0xc5, 0xeb, 0x86, 0x31, 0xde, 0xce, 0xb2, 0x5f, 0x04, 0x63, 0x5c, 0xc9, 0x32, 0x1e, 0x33, 0x8e, 0x5a,
0xdf, 0xf4, 0x3b, 0x68, 0x1c, 0x4d, 0xb8, 0xf8, 0x14, 0x5f, 0x2e, 0x79, 0x03, 0xda, 0x72, 0x4f, 0x63, 0xd9, 0xd7, 0x43, 0xa1, 0x80, 0x11, 0x45, 0x0a, 0x7d, 0xd3, 0x57, 0x23, 0x61, 0xc5, 0x66,
0xf9, 0x49, 0xa0, 0x03, 0x5b, 0x04, 0x1c, 0x9e, 0x04, 0x22, 0xca, 0x71, 0x8e, 0x29, 0x5f, 0x41, 0x69, 0x98, 0xf5, 0xda, 0x08, 0xc5, 0xdf, 0xf4, 0xfb, 0x68, 0x1c, 0x4d, 0x38, 0xf9, 0x04, 0x5f,
0x07, 0x61, 0xfb, 0xf2, 0x94, 0x6f, 0xc1, 0x8a, 0x0e, 0x44, 0xf3, 0x61, 0xc4, 0x8e, 0xb9, 0x76, 0x2e, 0x79, 0x03, 0x9a, 0x72, 0x4f, 0xd9, 0x69, 0xa0, 0x03, 0x5f, 0x04, 0x1c, 0x9d, 0x06, 0x22,
0xb6, 0xe3, 0xd9, 0x54, 0x2c, 0x97, 0x3f, 0x62, 0xc7, 0x9c, 0x3e, 0x86, 0x75, 0xf5, 0x02, 0x3f, 0x0a, 0x72, 0x8e, 0x29, 0x5f, 0x41, 0x0b, 0x61, 0xfb, 0xf2, 0x94, 0x6f, 0x41, 0x57, 0x07, 0xaa,
0x49, 0x99, 0x5e, 0xfa, 0x6b, 0x65, 0xfd, 0x2f, 0x0d, 0xf4, 0x86, 0x92, 0x2c, 0x3b, 0x42, 0x28, 0xd9, 0x20, 0x62, 0x27, 0x5c, 0x3b, 0xdf, 0xf1, 0x6c, 0x22, 0x96, 0xcb, 0x0e, 0xd8, 0x09, 0xa7,
0x19, 0x05, 0xea, 0x03, 0x51, 0xd3, 0x77, 0xa3, 0x24, 0x67, 0x8a, 0x20, 0x85, 0xee, 0x28, 0x4a, 0x8f, 0x60, 0x4d, 0xbd, 0xc0, 0x4f, 0xa7, 0x4c, 0x2f, 0xfd, 0x8d, 0xa2, 0xfe, 0x97, 0x06, 0x7a,
0xf2, 0x72, 0x18, 0x61, 0xc3, 0x04, 0x2f, 0xf3, 0xd9, 0x68, 0x24, 0x5e, 0xae, 0x34, 0xf1, 0x7a, 0x5d, 0x49, 0x96, 0x1d, 0x41, 0x14, 0x8c, 0x02, 0xf5, 0x81, 0xa8, 0xe9, 0xfb, 0x51, 0x92, 0x31,
0x48, 0xff, 0xc6, 0x83, 0x0d, 0xa4, 0xa6, 0x75, 0x85, 0xf1, 0x0b, 0x5f, 0x7f, 0x9b, 0xdd, 0x91, 0x45, 0x90, 0x42, 0x7b, 0x18, 0x25, 0x99, 0x76, 0xf1, 0xd5, 0x71, 0x1c, 0x98, 0xe0, 0x65, 0x36,
0x1d, 0xd6, 0x6c, 0x42, 0xeb, 0x38, 0xc9, 0x46, 0x4c, 0xad, 0x24, 0x07, 0x3f, 0x0d, 0x4f, 0xf7, 0x1b, 0x0e, 0xc5, 0xcb, 0x95, 0x26, 0x5e, 0x0f, 0xe9, 0x5f, 0x7a, 0xb0, 0x8e, 0xd4, 0xb4, 0xae,
0x9f, 0x3c, 0x58, 0xc7, 0xad, 0x1e, 0xf2, 0x80, 0xcf, 0x72, 0x75, 0xfc, 0x5f, 0x81, 0x9e, 0x38, 0x30, 0x7e, 0xe1, 0xeb, 0x6f, 0xb3, 0x3d, 0xb4, 0xc3, 0x9e, 0x0d, 0x68, 0x9c, 0x24, 0xe9, 0x90,
0x2a, 0xd3, 0xe2, 0xaf, 0x36, 0xba, 0x69, 0x5e, 0x2a, 0x42, 0x25, 0xf2, 0xfe, 0x05, 0xdf, 0x45, 0xa9, 0x95, 0xe4, 0xe0, 0xcb, 0x7b, 0xba, 0xf5, 0x92, 0xa7, 0xfb, 0xf7, 0x1e, 0xac, 0xe1, 0x56,
0x26, 0x1f, 0x42, 0xd7, 0xce, 0x26, 0xe0, 0x9e, 0x3b, 0x7b, 0x97, 0xf4, 0x29, 0x2b, 0x92, 0xb3, 0x8f, 0x78, 0xc0, 0x67, 0x99, 0x3a, 0xfe, 0x2f, 0x40, 0x47, 0x1c, 0x95, 0x69, 0xf1, 0x57, 0x1b,
0x7f, 0xc1, 0x77, 0x3e, 0x20, 0xb7, 0x00, 0xd0, 0x32, 0x23, 0x59, 0x15, 0x06, 0x5e, 0x72, 0x99, 0xdd, 0x30, 0x2f, 0x15, 0xa1, 0x12, 0x79, 0xff, 0x92, 0xef, 0x22, 0x93, 0x0f, 0xa1, 0x6d, 0x67,
0x64, 0x5d, 0xd6, 0xfe, 0x05, 0xdf, 0x42, 0xbf, 0xb3, 0x0c, 0x8b, 0xd2, 0x94, 0xd0, 0x87, 0xd0, 0x1b, 0x70, 0xcf, 0xad, 0xdd, 0x2b, 0xfa, 0x94, 0x25, 0xc9, 0xd9, 0xbf, 0xe4, 0x3b, 0x1f, 0x90,
0x73, 0x76, 0xea, 0x78, 0xf0, 0x5d, 0xe9, 0xc1, 0x57, 0x02, 0xbc, 0x46, 0x4d, 0x80, 0xf7, 0xaf, 0x3b, 0x00, 0x68, 0x99, 0x91, 0xac, 0x0a, 0x13, 0xaf, 0xb8, 0x4c, 0xb2, 0x2e, 0x6b, 0xff, 0x92,
0x0d, 0x20, 0x42, 0xda, 0x4a, 0xd7, 0xf9, 0x36, 0xac, 0x28, 0xf6, 0xbb, 0xce, 0x5b, 0x09, 0x8a, 0x6f, 0xa1, 0xdf, 0x5b, 0x86, 0x45, 0x69, 0x4a, 0xe8, 0x43, 0xe8, 0x38, 0x3b, 0x75, 0x3c, 0xf8,
0x36, 0x2f, 0x19, 0x3b, 0x1e, 0x4c, 0xd7, 0xb7, 0x41, 0xe4, 0x3a, 0x10, 0x6b, 0xa8, 0xe3, 0x7b, 0xb6, 0xf4, 0xe0, 0x4b, 0x01, 0x5f, 0xad, 0x1c, 0xf0, 0xd1, 0x7f, 0xaa, 0x01, 0x11, 0xd2, 0x56,
0x69, 0x0f, 0x6a, 0x66, 0x84, 0xe2, 0x92, 0xee, 0x87, 0x8e, 0x57, 0x95, 0xc7, 0xd6, 0xc4, 0xfb, 0xb8, 0xce, 0xb7, 0xa1, 0xab, 0xd8, 0xef, 0x3a, 0x6f, 0x05, 0x28, 0xda, 0xbc, 0x64, 0xe4, 0x78,
0xad, 0x9d, 0xc3, 0xb4, 0xd3, 0x2c, 0x3f, 0x11, 0x36, 0x59, 0xfb, 0x38, 0x7a, 0x5c, 0x16, 0xa4, 0x30, 0x6d, 0xdf, 0x06, 0x91, 0x9b, 0x40, 0xac, 0xa1, 0x8e, 0xff, 0xa5, 0x3d, 0xa8, 0x98, 0x11,
0xc5, 0x57, 0x0a, 0xd2, 0x52, 0x59, 0x90, 0xd0, 0xc2, 0x65, 0xe1, 0x69, 0xc0, 0x99, 0xb6, 0x1a, 0x8a, 0x4b, 0xba, 0x1f, 0x3a, 0x0e, 0x55, 0x1e, 0x9b, 0xbc, 0xdf, 0xca, 0x39, 0x4c, 0x4b, 0xcd,
0x6a, 0x28, 0x5c, 0x9a, 0x69, 0x18, 0xa3, 0xa9, 0x1e, 0x4e, 0xc5, 0xea, 0xca, 0xa5, 0x71, 0x80, 0xb2, 0x53, 0x61, 0x93, 0xb5, 0x8f, 0xa3, 0xc7, 0x45, 0x41, 0x5a, 0x7c, 0xa5, 0x20, 0x2d, 0x15,
0xf4, 0x47, 0x1e, 0xac, 0x09, 0x1e, 0x3b, 0x72, 0xf8, 0x01, 0xe0, 0x33, 0x78, 0x4d, 0x31, 0x74, 0x05, 0x09, 0x2d, 0x5c, 0x1a, 0x9e, 0x05, 0x9c, 0x69, 0xab, 0xa1, 0x86, 0xc2, 0xa5, 0x99, 0x84,
0x70, 0x7f, 0x72, 0x29, 0x7c, 0x1f, 0xda, 0x48, 0x30, 0x49, 0x59, 0xac, 0x84, 0xb0, 0xef, 0x0a, 0x31, 0x9a, 0xea, 0xc1, 0x44, 0xac, 0xae, 0x5c, 0x1a, 0x07, 0x48, 0x7f, 0xe2, 0xc1, 0xaa, 0xe0,
0x61, 0xa1, 0x81, 0xf6, 0x2f, 0xf8, 0x05, 0xb2, 0x25, 0x82, 0xff, 0xe8, 0x41, 0x47, 0x6d, 0xf3, 0xb1, 0x23, 0x87, 0x1f, 0x00, 0x3e, 0x83, 0xd7, 0x14, 0x43, 0x07, 0xf7, 0xa7, 0x97, 0xc2, 0xf7,
0xff, 0xec, 0x78, 0x0f, 0x60, 0x59, 0x48, 0xa3, 0xe5, 0xd7, 0x9a, 0xb1, 0xd0, 0xfc, 0x53, 0x11, 0xa1, 0x89, 0x04, 0x93, 0x29, 0x8b, 0x95, 0x10, 0xf6, 0x5c, 0x21, 0xcc, 0x35, 0xd0, 0xfe, 0x25,
0xf7, 0x08, 0x53, 0xe7, 0x38, 0xdd, 0x65, 0xb0, 0xb0, 0x5b, 0xa8, 0x6c, 0xf3, 0x21, 0x0f, 0xa3, 0x3f, 0x47, 0xb6, 0x44, 0xf0, 0xef, 0x3c, 0x68, 0xa9, 0x6d, 0xfe, 0xb7, 0x1d, 0xef, 0x3e, 0x2c,
0xa1, 0x9e, 0x55, 0x89, 0xbb, 0xba, 0x29, 0xa1, 0x73, 0x72, 0x1e, 0x4c, 0x98, 0x32, 0x49, 0x72, 0x0b, 0x69, 0xb4, 0xfc, 0x5a, 0x33, 0x16, 0x9a, 0x7f, 0x22, 0xe2, 0x1e, 0x61, 0xea, 0x1c, 0xa7,
0x20, 0xa2, 0x0b, 0x75, 0xa0, 0xb2, 0x43, 0xf5, 0x43, 0x80, 0xed, 0xca, 0x94, 0x71, 0xaa, 0x94, 0xbb, 0x08, 0x16, 0x76, 0x0b, 0x95, 0x6d, 0x36, 0xe0, 0x61, 0x34, 0xd0, 0xb3, 0x2a, 0xb1, 0x57,
0x1f, 0x19, 0x85, 0xd3, 0xa3, 0xc4, 0xb8, 0xa4, 0x9e, 0xed, 0x62, 0x3a, 0x53, 0x64, 0x02, 0x17, 0x35, 0x25, 0x74, 0x4e, 0xc6, 0x83, 0x31, 0x53, 0x26, 0x49, 0x0e, 0x44, 0x74, 0xa1, 0x0e, 0x54,
0xb5, 0xed, 0x15, 0x3c, 0x2d, 0x2c, 0x6d, 0x03, 0x9d, 0x86, 0x9b, 0xae, 0x0c, 0x94, 0x17, 0xd4, 0x74, 0xa8, 0x7e, 0x0c, 0xb0, 0x55, 0x9a, 0x32, 0x4e, 0x95, 0xf2, 0x23, 0xa3, 0x70, 0x72, 0x9c,
0x70, 0xfb, 0xd5, 0xd6, 0xd3, 0x23, 0x27, 0xd0, 0x37, 0x46, 0x5e, 0xa9, 0x77, 0xcb, 0x11, 0x10, 0x18, 0x97, 0xd4, 0xb3, 0x5d, 0x4c, 0x67, 0x8a, 0x8c, 0xe1, 0xb2, 0xb6, 0xbd, 0x82, 0xa7, 0xb9,
0x6b, 0xbd, 0xfb, 0x8a, 0xb5, 0x50, 0x17, 0x8d, 0xf5, 0x32, 0xe7, 0x52, 0x23, 0x73, 0xb8, 0xa2, 0xa5, 0xad, 0xa1, 0xd3, 0x70, 0xdb, 0x95, 0x81, 0xe2, 0x82, 0x1a, 0x6e, 0xbf, 0xda, 0x6a, 0x7a,
0xe7, 0x50, 0x7f, 0x57, 0xd7, 0x6b, 0xbe, 0xd6, 0xd9, 0x1e, 0x88, 0x8f, 0xdd, 0x45, 0x5f, 0x41, 0xe4, 0x14, 0x7a, 0xc6, 0xc8, 0x2b, 0xf5, 0x6e, 0x39, 0x02, 0x62, 0xad, 0x77, 0x5f, 0xb1, 0x16,
0x78, 0xf0, 0x43, 0x0f, 0x56, 0x5c, 0x72, 0x42, 0x74, 0x54, 0x6c, 0xa2, 0x15, 0x8c, 0x76, 0x9e, 0xea, 0xa2, 0x91, 0x5e, 0xe6, 0x42, 0x6a, 0x64, 0x0e, 0xd7, 0xf4, 0x1c, 0xea, 0xef, 0xf2, 0x7a,
0x4a, 0xe0, 0x6a, 0x74, 0xd5, 0xa8, 0x8b, 0xae, 0xec, 0x18, 0x6a, 0xe1, 0x55, 0x31, 0x54, 0xf3, 0xf5, 0xd7, 0x3a, 0xdb, 0x47, 0xe2, 0x63, 0x77, 0xd1, 0x57, 0x10, 0xee, 0xff, 0xd8, 0x83, 0xae,
0xf5, 0x62, 0xa8, 0x56, 0x5d, 0x0c, 0x35, 0xf8, 0x6f, 0x0f, 0x48, 0xf5, 0x7e, 0xc9, 0x43, 0x19, 0x4b, 0x4e, 0x88, 0x8e, 0x8a, 0x4d, 0xb4, 0x82, 0xd1, 0xce, 0x53, 0x01, 0x5c, 0x8e, 0xae, 0x6a,
0xde, 0xc5, 0x2c, 0x52, 0x7a, 0xe2, 0x17, 0x5f, 0x4f, 0x46, 0x34, 0x0f, 0xf5, 0xd7, 0x42, 0x58, 0x55, 0xd1, 0x95, 0x1d, 0x43, 0x2d, 0xbc, 0x2a, 0x86, 0xaa, 0xbf, 0x5e, 0x0c, 0xd5, 0xa8, 0x8a,
0x6d, 0x45, 0x60, 0xbb, 0x2c, 0x3d, 0xbf, 0x6e, 0xaa, 0x14, 0xd5, 0x35, 0x5f, 0x1d, 0xd5, 0xb5, 0xa1, 0xfa, 0xff, 0xe1, 0x01, 0x29, 0xdf, 0x2f, 0x79, 0x28, 0xc3, 0xbb, 0x98, 0x45, 0x4a, 0x4f,
0x5e, 0x1d, 0xd5, 0x2d, 0x96, 0xa3, 0xba, 0xc1, 0xef, 0x40, 0xcf, 0xb9, 0xf5, 0x9f, 0xde, 0x89, 0xfc, 0xec, 0xeb, 0xc9, 0x88, 0xe6, 0xa1, 0xfe, 0x5a, 0x08, 0xab, 0xad, 0x08, 0x6c, 0x97, 0xa5,
0xcb, 0xee, 0x8e, 0xbc, 0x60, 0x07, 0x36, 0xf8, 0xcf, 0x06, 0x90, 0xaa, 0xe4, 0xfd, 0x4c, 0xf7, 0xe3, 0x57, 0x4d, 0x15, 0xa2, 0xba, 0xfa, 0xab, 0xa3, 0xba, 0xc6, 0xab, 0xa3, 0xba, 0xc5, 0x62,
0x80, 0x72, 0xe4, 0x28, 0x90, 0x05, 0x25, 0x47, 0x8e, 0xea, 0xf8, 0xff, 0x54, 0x8a, 0xef, 0xc2, 0x54, 0xd7, 0xff, 0x75, 0xe8, 0x38, 0xb7, 0xfe, 0x3f, 0x77, 0xe2, 0xa2, 0xbb, 0x23, 0x2f, 0xd8,
0x7a, 0xc6, 0x46, 0xc9, 0x29, 0xcb, 0xac, 0xc8, 0x5a, 0x5e, 0x55, 0x75, 0x42, 0x38, 0x7c, 0x6e, 0x81, 0xf5, 0xff, 0xad, 0x06, 0xa4, 0x2c, 0x79, 0xff, 0xa7, 0x7b, 0x40, 0x39, 0x72, 0x14, 0xc8,
0x2c, 0xbb, 0xec, 0xd4, 0x1a, 0x2c, 0xcb, 0x50, 0x0a, 0x69, 0xe9, 0xd7, 0x60, 0x53, 0x96, 0x80, 0x82, 0x92, 0x23, 0x47, 0x75, 0xfc, 0x6f, 0x2a, 0xc5, 0x77, 0x61, 0x2d, 0x65, 0xc3, 0xe4, 0x8c,
0xee, 0x48, 0x52, 0xda, 0xe7, 0x78, 0x13, 0xba, 0x67, 0x32, 0x99, 0x37, 0x4c, 0xe2, 0x68, 0xae, 0xa5, 0x56, 0x64, 0x2d, 0xaf, 0xaa, 0x3c, 0x21, 0x1c, 0x3e, 0x37, 0x96, 0x5d, 0x76, 0x6a, 0x11,
0x8c, 0x48, 0x47, 0xc1, 0x3e, 0x89, 0xa3, 0x39, 0xfd, 0xbe, 0x07, 0x17, 0x4b, 0xdf, 0x16, 0x39, 0x96, 0x65, 0x28, 0x84, 0xb4, 0xf4, 0x1b, 0xb0, 0x21, 0x4b, 0x44, 0xf7, 0x24, 0x29, 0xed, 0x73,
0x7b, 0xa9, 0x6a, 0x5d, 0xfd, 0xeb, 0x02, 0xc5, 0x11, 0x95, 0x8c, 0x5b, 0x47, 0x94, 0x26, 0xa9, 0xbc, 0x09, 0xed, 0x73, 0x99, 0xcc, 0x1b, 0x24, 0x71, 0x34, 0x57, 0x46, 0xa4, 0xa5, 0x60, 0x9f,
0x3a, 0x21, 0x58, 0x38, 0x8b, 0xab, 0xf8, 0xf2, 0x62, 0xea, 0xa6, 0xe8, 0x36, 0x5c, 0x54, 0x97, 0xc6, 0xd1, 0x9c, 0xfe, 0xd0, 0x83, 0xcb, 0x85, 0x6f, 0xf3, 0x9c, 0xbe, 0x54, 0xb5, 0xae, 0xfe,
0xef, 0x9e, 0x8d, 0xee, 0xc1, 0x56, 0x79, 0xa2, 0xc8, 0x8f, 0xb9, 0x5b, 0xd6, 0x43, 0xfa, 0x21, 0x75, 0x81, 0xe2, 0x88, 0x4a, 0xc6, 0xad, 0x23, 0x4a, 0x93, 0x54, 0x9e, 0x10, 0x2c, 0x9c, 0xc5,
0x90, 0x6f, 0xcc, 0x58, 0x36, 0xc7, 0xea, 0x80, 0x49, 0xc0, 0x6e, 0x97, 0x03, 0xf1, 0xc5, 0x74, 0x65, 0x7c, 0x79, 0x31, 0x55, 0x53, 0x74, 0x0b, 0x2e, 0xab, 0xcb, 0x77, 0xcf, 0x46, 0x77, 0x61,
0x76, 0xf4, 0x75, 0x36, 0xd7, 0xe5, 0x97, 0x86, 0x29, 0xbf, 0xd0, 0x5b, 0xb0, 0xe1, 0x10, 0x30, 0xb3, 0x38, 0x91, 0xe7, 0xc7, 0xdc, 0x2d, 0xeb, 0x21, 0xfd, 0x10, 0xc8, 0xb7, 0x67, 0x2c, 0x9d,
0xac, 0x5a, 0xc4, 0x0a, 0x83, 0x0e, 0x52, 0xdd, 0x2a, 0x84, 0x9a, 0xa3, 0x7f, 0xe9, 0xc1, 0xc2, 0x63, 0xf5, 0xc0, 0x24, 0x60, 0xb7, 0x8a, 0x81, 0xf8, 0xe2, 0x74, 0x76, 0xfc, 0x2d, 0x36, 0xd7,
0x7e, 0x92, 0xda, 0x99, 0x25, 0xcf, 0xcd, 0x2c, 0x29, 0xdd, 0x39, 0x34, 0xaa, 0xb1, 0xa1, 0x5e, 0xe5, 0x99, 0x9a, 0x29, 0xcf, 0xd0, 0x3b, 0xb0, 0xee, 0x10, 0x30, 0xac, 0x5a, 0xc4, 0x0a, 0x84,
0xbe, 0x0d, 0x14, 0x9a, 0x2f, 0x98, 0x72, 0x11, 0xa6, 0x1d, 0x27, 0xd9, 0x59, 0x90, 0x8d, 0x15, 0x0e, 0x52, 0xdd, 0x2a, 0x85, 0x9a, 0xa3, 0x7f, 0xe2, 0xc1, 0xc2, 0x7e, 0x32, 0xb5, 0x33, 0x4b,
0xff, 0x4a, 0x50, 0xb1, 0xfd, 0x42, 0xc1, 0x88, 0x9f, 0xc2, 0x69, 0xc0, 0xf4, 0xda, 0x5c, 0x45, 0x9e, 0x9b, 0x59, 0x52, 0xba, 0x73, 0x60, 0x54, 0x63, 0x4d, 0xbd, 0x7c, 0x1b, 0x28, 0x34, 0x5f,
0x96, 0x6a, 0x44, 0xff, 0xd4, 0x83, 0x16, 0xee, 0x55, 0xbc, 0x06, 0x79, 0xbf, 0x58, 0x7a, 0xc3, 0x30, 0xe1, 0x22, 0x4c, 0x3b, 0x49, 0xd2, 0xf3, 0x20, 0x1d, 0x29, 0xfe, 0x15, 0xa0, 0x62, 0xfb,
0xec, 0x9d, 0x27, 0x5f, 0x43, 0x09, 0x5c, 0x2a, 0xc8, 0x35, 0x2a, 0x05, 0xb9, 0xcb, 0xd0, 0x96, 0xb9, 0x82, 0x11, 0x3f, 0x85, 0xd3, 0x80, 0xe9, 0xb5, 0xb9, 0x8a, 0x2c, 0xd5, 0x88, 0xfe, 0xa1,
0xa3, 0xa2, 0x82, 0x55, 0x00, 0xc8, 0x15, 0x68, 0x9e, 0x24, 0xa9, 0xb6, 0x61, 0xa0, 0xd3, 0x35, 0x07, 0x0d, 0xdc, 0xab, 0x78, 0x0d, 0xf2, 0x7e, 0xb1, 0x34, 0x87, 0xd9, 0x3b, 0x4f, 0xbe, 0x86,
0x49, 0xea, 0x23, 0x9c, 0x5e, 0x83, 0xd5, 0xc7, 0xc9, 0x98, 0x59, 0x31, 0xfd, 0xb9, 0xd7, 0x44, 0x02, 0xb8, 0x50, 0xb0, 0xab, 0x95, 0x0a, 0x76, 0x57, 0xa1, 0x29, 0x47, 0x79, 0x85, 0x2b, 0x07,
0x7f, 0xd7, 0x83, 0x65, 0x8d, 0x4c, 0x76, 0xa0, 0x29, 0x4c, 0x51, 0xc9, 0xf9, 0x33, 0x49, 0x57, 0x90, 0x6b, 0x50, 0x3f, 0x4d, 0xa6, 0xda, 0x86, 0x81, 0x4e, 0xd7, 0x24, 0x53, 0x1f, 0xe1, 0xf4,
0x81, 0xe7, 0x23, 0x86, 0x50, 0x21, 0x18, 0x41, 0x16, 0xae, 0x82, 0x8e, 0x1f, 0x0b, 0x23, 0x2c, 0x06, 0xac, 0x3c, 0x4a, 0x46, 0xcc, 0x8a, 0xe9, 0x2f, 0xbc, 0x26, 0xfa, 0x1b, 0x1e, 0x2c, 0x6b,
0x9c, 0x76, 0xdc, 0x73, 0xc9, 0x58, 0x95, 0xa0, 0xf4, 0x6f, 0x3d, 0xe8, 0x39, 0x6b, 0x08, 0x37, 0x64, 0xb2, 0x0d, 0x75, 0x61, 0x8a, 0x0a, 0xce, 0x9f, 0x49, 0xba, 0x0a, 0x3c, 0x1f, 0x31, 0x84,
0x3e, 0x0a, 0x72, 0xae, 0x12, 0x55, 0x8a, 0x89, 0x36, 0xc8, 0xce, 0xff, 0x34, 0xdc, 0xfc, 0x8f, 0x0a, 0xc1, 0x08, 0x32, 0x77, 0x15, 0x74, 0xfc, 0x98, 0x1b, 0x61, 0xe1, 0xb4, 0xe3, 0x9e, 0x0b,
0xc9, 0x3f, 0x2c, 0xd8, 0xf9, 0x87, 0x1b, 0xd0, 0x2e, 0x8a, 0x9b, 0x4d, 0x47, 0x35, 0x88, 0x15, 0xc6, 0xaa, 0x00, 0xa5, 0x7f, 0xe5, 0x41, 0xc7, 0x59, 0x43, 0xb8, 0xf1, 0x51, 0x90, 0x71, 0x95,
0x75, 0x3a, 0xb9, 0x40, 0x12, 0x74, 0x46, 0x49, 0x94, 0x64, 0xaa, 0xf6, 0x27, 0x07, 0xf4, 0x16, 0xa8, 0x52, 0x4c, 0xb4, 0x41, 0x76, 0xfe, 0xa7, 0xe6, 0xe6, 0x7f, 0x4c, 0xfe, 0x61, 0xc1, 0xce,
0x74, 0x2c, 0x7c, 0xb1, 0x8d, 0x98, 0xf1, 0xb3, 0x24, 0x7b, 0xa6, 0xd3, 0x50, 0x6a, 0x68, 0xca, 0x3f, 0xdc, 0x82, 0x66, 0x5e, 0xfc, 0xac, 0x3b, 0xaa, 0x41, 0xac, 0xa8, 0xd3, 0xc9, 0x39, 0x92,
0x28, 0x8d, 0xa2, 0x8c, 0x42, 0xff, 0xce, 0x83, 0x9e, 0x90, 0x94, 0x30, 0x9e, 0x1c, 0x24, 0x51, 0xa0, 0x33, 0x4c, 0xa2, 0x24, 0x55, 0xb5, 0x41, 0x39, 0xa0, 0x77, 0xa0, 0x65, 0xe1, 0x8b, 0x6d,
0x38, 0x9a, 0xa3, 0xc4, 0x68, 0xa1, 0x50, 0x45, 0x41, 0x2d, 0x31, 0x2e, 0x58, 0xd8, 0x7c, 0xed, 0xc4, 0x8c, 0x9f, 0x27, 0xe9, 0x53, 0x9d, 0x86, 0x52, 0x43, 0x53, 0x46, 0xa9, 0xe5, 0x65, 0x14,
0xc5, 0x2b, 0x79, 0x31, 0x63, 0x21, 0xf9, 0xc2, 0x76, 0x1d, 0x05, 0x39, 0x93, 0x6e, 0xbf, 0xd2, 0xfa, 0xd7, 0x1e, 0x74, 0x84, 0xa4, 0x84, 0xf1, 0xf8, 0x30, 0x89, 0xc2, 0xe1, 0x1c, 0x25, 0x46,
0xd5, 0x0e, 0x50, 0xa8, 0x0f, 0x01, 0xc8, 0x02, 0xce, 0x86, 0xd3, 0x30, 0x8a, 0x42, 0x89, 0x2b, 0x0b, 0x85, 0x2a, 0x1a, 0x6a, 0x89, 0x71, 0xc1, 0xc2, 0xe6, 0x6b, 0x2f, 0x5e, 0xc9, 0x8b, 0x19,
0x25, 0xbc, 0x6e, 0x8a, 0xfe, 0xa0, 0x01, 0x1d, 0xa5, 0x26, 0xee, 0x8f, 0x27, 0x32, 0xa3, 0xaa, 0x0b, 0xc9, 0x17, 0xb6, 0xeb, 0x38, 0xc8, 0x98, 0x74, 0xfb, 0x95, 0xae, 0x76, 0x80, 0x42, 0x7d,
0x1c, 0x11, 0xf3, 0xfc, 0x2c, 0x88, 0x9e, 0x77, 0x5c, 0x17, 0x0b, 0x52, 0xbe, 0xd6, 0x85, 0xea, 0x08, 0x40, 0x1a, 0x70, 0x36, 0x98, 0x84, 0x51, 0x14, 0x4a, 0x5c, 0x29, 0xe1, 0x55, 0x53, 0xf4,
0xb5, 0x5e, 0x86, 0xb6, 0x10, 0xaf, 0x9b, 0xe8, 0x23, 0xc9, 0x5a, 0x78, 0x01, 0xd0, 0xb3, 0x7b, 0x47, 0x35, 0x68, 0x29, 0x35, 0xf1, 0x60, 0x34, 0x96, 0x19, 0x55, 0xe5, 0x88, 0x98, 0xe7, 0x67,
0x38, 0xdb, 0x2a, 0x66, 0x11, 0xe0, 0x78, 0x45, 0x8b, 0x25, 0xaf, 0xe8, 0x7d, 0xe8, 0x2a, 0x32, 0x41, 0xf4, 0xbc, 0xe3, 0xba, 0x58, 0x90, 0xe2, 0xb5, 0x2e, 0x94, 0xaf, 0xf5, 0x2a, 0x34, 0x85,
0xc8, 0x77, 0x0c, 0xaa, 0x0a, 0x01, 0x77, 0xee, 0xc4, 0x77, 0x30, 0xf5, 0x97, 0x7b, 0xfa, 0xcb, 0x78, 0xdd, 0x46, 0x1f, 0x49, 0xd6, 0xca, 0x73, 0x80, 0x9e, 0xdd, 0xc5, 0xd9, 0x46, 0x3e, 0x8b,
0xe5, 0x57, 0x7d, 0xa9, 0x31, 0xe9, 0x45, 0xd8, 0x50, 0xcc, 0x7b, 0x98, 0x05, 0xe9, 0x89, 0x56, 0x00, 0xc7, 0x2b, 0x5a, 0x2c, 0x78, 0x45, 0xef, 0x43, 0x5b, 0x91, 0x41, 0xbe, 0x63, 0x50, 0x95,
0xbd, 0x63, 0x53, 0x46, 0x45, 0x30, 0xb9, 0x06, 0x2d, 0xf1, 0x99, 0xd6, 0x7e, 0xf5, 0x8f, 0x4e, 0x0b, 0xb8, 0x73, 0x27, 0xbe, 0x83, 0xa9, 0xbf, 0xdc, 0xd5, 0x5f, 0x2e, 0xbf, 0xea, 0x4b, 0x8d,
0xa2, 0x90, 0x1d, 0x68, 0xb1, 0xf1, 0x84, 0x69, 0xcf, 0x9c, 0xb8, 0x31, 0x92, 0xb8, 0x23, 0x5f, 0x49, 0x2f, 0xc3, 0xba, 0x62, 0xde, 0xc3, 0x34, 0x98, 0x9e, 0x6a, 0xd5, 0x3b, 0x32, 0x65, 0x56,
0x22, 0x08, 0x15, 0x20, 0xa0, 0x25, 0x15, 0xe0, 0x6a, 0xce, 0x45, 0x31, 0xfc, 0x68, 0x4c, 0x37, 0x04, 0x93, 0x1b, 0xd0, 0x10, 0x9f, 0x69, 0xed, 0x57, 0xfd, 0xe8, 0x24, 0x0a, 0xd9, 0x86, 0x06,
0x81, 0x3c, 0x96, 0x52, 0x6b, 0x67, 0x01, 0x7f, 0x7f, 0x01, 0x3a, 0x16, 0x58, 0xbc, 0xe6, 0x89, 0x1b, 0x8d, 0x99, 0xf6, 0xcc, 0x89, 0x1b, 0x23, 0x89, 0x3b, 0xf2, 0x25, 0x82, 0x50, 0x01, 0x02,
0xd8, 0xf0, 0x70, 0x1c, 0x06, 0x53, 0xc6, 0x59, 0xa6, 0x24, 0xb5, 0x04, 0x45, 0x05, 0x7b, 0x3a, 0x5a, 0x50, 0x01, 0xae, 0xe6, 0x5c, 0x14, 0xc3, 0x8f, 0x47, 0x74, 0x03, 0xc8, 0x23, 0x29, 0xb5,
0x19, 0x26, 0x33, 0x3e, 0x1c, 0xb3, 0x49, 0xc6, 0xa4, 0x41, 0xf3, 0xfc, 0x12, 0x54, 0xe0, 0x4d, 0x76, 0x16, 0xf0, 0xb7, 0x17, 0xa0, 0x65, 0x81, 0xc5, 0x6b, 0x1e, 0x8b, 0x0d, 0x0f, 0x46, 0x61,
0x83, 0xe7, 0x36, 0x9e, 0x94, 0x87, 0x12, 0x54, 0xe7, 0xf4, 0x24, 0x8f, 0x9a, 0x45, 0x4e, 0x4f, 0x30, 0x61, 0x9c, 0xa5, 0x4a, 0x52, 0x0b, 0x50, 0x54, 0xb0, 0x67, 0xe3, 0x41, 0x32, 0xe3, 0x83,
0x72, 0xa4, 0xac, 0x87, 0x5a, 0x35, 0x7a, 0xe8, 0x3d, 0xd8, 0x92, 0x1a, 0x47, 0xbd, 0xcd, 0x61, 0x11, 0x1b, 0xa7, 0x4c, 0x1a, 0x34, 0xcf, 0x2f, 0x40, 0x05, 0xde, 0x24, 0x78, 0x66, 0xe3, 0x49,
0x49, 0x4c, 0xce, 0x99, 0x25, 0xd7, 0x60, 0x4d, 0xec, 0x59, 0x0b, 0x78, 0x1e, 0x7e, 0x47, 0x46, 0x79, 0x28, 0x40, 0x75, 0x4e, 0x4f, 0xf2, 0xa8, 0x9e, 0xe7, 0xf4, 0x24, 0x47, 0x8a, 0x7a, 0xa8,
0xe3, 0x9e, 0x5f, 0x81, 0x0b, 0x5c, 0xf1, 0x1c, 0x1d, 0x5c, 0x59, 0x72, 0xa8, 0xc0, 0x11, 0x37, 0x51, 0xa1, 0x87, 0xde, 0x83, 0x4d, 0xa9, 0x71, 0xd4, 0xdb, 0x1c, 0x14, 0xc4, 0xe4, 0x82, 0x59,
0x78, 0xee, 0xe2, 0xb6, 0x15, 0x6e, 0x09, 0x4e, 0x7b, 0xd0, 0x39, 0xe4, 0x49, 0xaa, 0x2f, 0x65, 0x72, 0x03, 0x56, 0xc5, 0x9e, 0xb5, 0x80, 0x67, 0xe1, 0xf7, 0x65, 0x34, 0xee, 0xf9, 0x25, 0xb8,
0x05, 0xba, 0x72, 0xa8, 0xca, 0x4c, 0x6f, 0xc0, 0x25, 0x94, 0xa2, 0x27, 0x49, 0x9a, 0x44, 0xc9, 0xc0, 0x15, 0xcf, 0xd1, 0xc1, 0x95, 0x25, 0x87, 0x12, 0x1c, 0x71, 0x83, 0x67, 0x2e, 0x6e, 0x53,
0x64, 0x7e, 0x38, 0x3b, 0xca, 0x47, 0x59, 0x98, 0x0a, 0x8f, 0x99, 0xfe, 0x83, 0x07, 0x1b, 0xce, 0xe1, 0x16, 0xe0, 0xb4, 0x03, 0xad, 0x23, 0x9e, 0x4c, 0xf5, 0xa5, 0x74, 0xa1, 0x2d, 0x87, 0xaa,
0xac, 0x0a, 0xf5, 0x7f, 0x49, 0x8a, 0xb4, 0xa9, 0x0c, 0x48, 0xc1, 0x5b, 0xb7, 0xd4, 0xa1, 0x44, 0xcc, 0xf4, 0x06, 0x5c, 0x41, 0x29, 0x7a, 0x9c, 0x4c, 0x93, 0x28, 0x19, 0xcf, 0x8f, 0x66, 0xc7,
0x94, 0x89, 0x93, 0xa7, 0xaa, 0x58, 0x70, 0x1b, 0x56, 0xf5, 0xce, 0xf4, 0x87, 0x52, 0x0a, 0xfb, 0xd9, 0x30, 0x0d, 0xa7, 0xc2, 0x63, 0xa6, 0x7f, 0xeb, 0xc1, 0xba, 0x33, 0xab, 0x42, 0xfd, 0x9f,
0x55, 0x29, 0x54, 0xdf, 0xaf, 0xa8, 0x0f, 0x34, 0x89, 0x5f, 0x95, 0x7e, 0x27, 0x1b, 0xe3, 0x19, 0x93, 0x22, 0x6d, 0x2a, 0x03, 0x52, 0xf0, 0xd6, 0x2c, 0x75, 0x28, 0x11, 0x65, 0xe2, 0xe4, 0x89,
0x75, 0xcc, 0x37, 0xd0, 0xdf, 0xdb, 0xce, 0xae, 0xde, 0xc1, 0xc8, 0x00, 0x73, 0xfa, 0xc7, 0x1e, 0x2a, 0x16, 0xdc, 0x85, 0x15, 0xbd, 0x33, 0xfd, 0xa1, 0x94, 0xc2, 0x5e, 0x59, 0x0a, 0xd5, 0xf7,
0x40, 0xb1, 0x3b, 0x21, 0x18, 0x85, 0x4a, 0xf7, 0x30, 0x67, 0x6a, 0xa9, 0xef, 0x37, 0xa1, 0x6b, 0x5d, 0xf5, 0x81, 0x26, 0xf1, 0x8b, 0xd2, 0xef, 0x64, 0x23, 0x3c, 0xa3, 0x8e, 0xf9, 0xfa, 0xfa,
0x32, 0xd3, 0x85, 0x95, 0xe8, 0x68, 0x98, 0xf0, 0x50, 0xde, 0x81, 0xd5, 0x49, 0x94, 0x1c, 0xa1, 0x7b, 0xdb, 0xd9, 0xd5, 0x3b, 0x18, 0x1a, 0x60, 0x46, 0x7f, 0xdf, 0x03, 0xc8, 0x77, 0x27, 0x04,
0xcd, 0xc5, 0x8a, 0x66, 0xae, 0x8a, 0x6d, 0x2b, 0x12, 0xfc, 0x40, 0x41, 0x0b, 0x93, 0xd2, 0xb4, 0x23, 0x57, 0xe9, 0x1e, 0xe6, 0x4c, 0x2d, 0xf5, 0xfd, 0x26, 0xb4, 0x4d, 0x66, 0x3a, 0xb7, 0x12,
0x4c, 0x0a, 0xfd, 0x93, 0x86, 0xc9, 0x8f, 0x16, 0x67, 0x3e, 0xf7, 0x95, 0x91, 0xbd, 0x8a, 0x72, 0x2d, 0x0d, 0x13, 0x1e, 0xca, 0x3b, 0xb0, 0x32, 0x8e, 0x92, 0x63, 0xb4, 0xb9, 0x58, 0xd1, 0xcc,
0x3c, 0x27, 0x1d, 0x89, 0xd9, 0x8d, 0x83, 0x57, 0x06, 0x7a, 0xb7, 0x60, 0x25, 0x93, 0xda, 0x47, 0x54, 0xb1, 0xad, 0x2b, 0xc1, 0x1f, 0x29, 0x68, 0x6e, 0x52, 0xea, 0x96, 0x49, 0xa1, 0x7f, 0x50,
0xab, 0xa6, 0xe6, 0x4b, 0x54, 0x53, 0x2f, 0x73, 0xec, 0xce, 0xcf, 0xc3, 0x5a, 0x30, 0x3e, 0x65, 0x33, 0xf9, 0xd1, 0xfc, 0xcc, 0x17, 0xbe, 0x32, 0xb2, 0x5b, 0x52, 0x8e, 0x17, 0xa4, 0x23, 0x31,
0x19, 0x0f, 0xd1, 0xe3, 0x47, 0xa3, 0x2f, 0x15, 0xea, 0xaa, 0x05, 0x47, 0x5b, 0xfc, 0x0e, 0xac, 0xbb, 0x71, 0xf8, 0xca, 0x40, 0xef, 0x0e, 0x74, 0x53, 0xa9, 0x7d, 0xb4, 0x6a, 0xaa, 0xbf, 0x44,
0xaa, 0x02, 0xa7, 0xc1, 0x54, 0x1d, 0x2e, 0x05, 0x58, 0x20, 0xd2, 0xbf, 0xd6, 0xa9, 0x58, 0xf7, 0x35, 0x75, 0x52, 0xc7, 0xee, 0xfc, 0x7f, 0x58, 0x0d, 0x46, 0x67, 0x2c, 0xe5, 0x21, 0x7a, 0xfc,
0x0e, 0xcf, 0xe7, 0x88, 0x7d, 0xba, 0x46, 0xe9, 0x74, 0x3f, 0xa7, 0xd2, 0xa2, 0x63, 0x1d, 0x56, 0x68, 0xf4, 0xa5, 0x42, 0x5d, 0xb1, 0xe0, 0x68, 0x8b, 0xdf, 0x81, 0x15, 0x55, 0xe0, 0x34, 0x98,
0xa8, 0x04, 0xb5, 0x04, 0xaa, 0x34, 0xb6, 0xcb, 0xd2, 0xe6, 0xeb, 0xb0, 0x94, 0x7e, 0x7f, 0x01, 0xaa, 0x03, 0x26, 0x07, 0x0b, 0x44, 0xfa, 0x17, 0x3a, 0x15, 0xeb, 0xde, 0xe1, 0xc5, 0x1c, 0xb1,
0x96, 0x3e, 0x8a, 0x4f, 0x93, 0x70, 0x84, 0x49, 0xca, 0x29, 0x9b, 0x26, 0xba, 0xcd, 0x40, 0xfc, 0x4f, 0x57, 0x2b, 0x9c, 0xee, 0xff, 0xa9, 0xb4, 0xe8, 0x48, 0x87, 0x15, 0x2a, 0x41, 0x2d, 0x81,
0x16, 0x16, 0x1d, 0x2b, 0x68, 0x29, 0x57, 0xd9, 0x43, 0x3d, 0x14, 0xd6, 0x2d, 0x2b, 0x5a, 0x6b, 0x2a, 0x8d, 0xed, 0xb2, 0xb4, 0xfe, 0x3a, 0x2c, 0xa5, 0x3f, 0x5c, 0x80, 0xa5, 0x8f, 0xe3, 0xb3,
0xa4, 0xa4, 0x58, 0x10, 0xe1, 0x1f, 0x66, 0x76, 0x5f, 0x91, 0x1a, 0x15, 0x7d, 0x1a, 0x2d, 0xab, 0x24, 0x1c, 0x62, 0x92, 0x72, 0xc2, 0x26, 0x89, 0x6e, 0x33, 0x10, 0xbf, 0x85, 0x45, 0xc7, 0x0a,
0x4f, 0x03, 0x53, 0xda, 0xb2, 0x38, 0x88, 0xec, 0x5c, 0xf6, 0xf5, 0x10, 0xfd, 0xd8, 0x8c, 0xc9, 0xda, 0x94, 0xab, 0xec, 0xa1, 0x1e, 0x0a, 0xeb, 0x96, 0xe6, 0xad, 0x37, 0x52, 0x52, 0x2c, 0x88,
0xa0, 0x17, 0xed, 0xe4, 0x92, 0xf2, 0x63, 0x6d, 0xa0, 0xb0, 0xa5, 0xf2, 0x03, 0x89, 0x23, 0x75, 0xf0, 0x0f, 0x53, 0xbb, 0xef, 0x48, 0x8d, 0xf2, 0x3e, 0x8d, 0x86, 0xd5, 0xa7, 0x81, 0x29, 0x6d,
0x8d, 0x0d, 0x12, 0xbe, 0x45, 0xb9, 0x35, 0xa9, 0x2d, 0xaf, 0xb8, 0x04, 0x16, 0x0a, 0x69, 0xcc, 0x59, 0x1c, 0x44, 0x76, 0x2e, 0xfb, 0x7a, 0x88, 0x7e, 0x6c, 0xca, 0x64, 0xd0, 0x8b, 0x76, 0x72,
0x8c, 0xde, 0x90, 0x67, 0x00, 0xd9, 0x3a, 0x54, 0x86, 0x5b, 0x5e, 0xb0, 0x2c, 0x72, 0xaa, 0x11, 0x49, 0xf9, 0xb1, 0x36, 0x50, 0xd8, 0x52, 0xf9, 0x81, 0xc4, 0x91, 0xba, 0xc6, 0x06, 0x09, 0xdf,
0xfa, 0x20, 0x41, 0x14, 0x1d, 0x05, 0xa3, 0x67, 0xd8, 0x30, 0x86, 0x35, 0xcd, 0xb6, 0xef, 0x02, 0xa2, 0xd8, 0xba, 0xd4, 0x94, 0x57, 0x5c, 0x00, 0x0b, 0x85, 0x34, 0x62, 0x46, 0x6f, 0xc8, 0x33,
0xc5, 0xae, 0xb1, 0xff, 0x49, 0x91, 0xe8, 0xc9, 0x9a, 0xa4, 0x05, 0xa2, 0xdf, 0x04, 0x72, 0x7b, 0x80, 0x6c, 0x2d, 0x2a, 0xc2, 0x2d, 0x2f, 0x58, 0x16, 0x39, 0xd5, 0x08, 0x7d, 0x90, 0x20, 0x8a,
0x3c, 0x56, 0x37, 0x64, 0x62, 0x84, 0x82, 0xb7, 0x9e, 0xc3, 0xdb, 0x9a, 0x33, 0x36, 0x6a, 0xcf, 0x8e, 0x83, 0xe1, 0x53, 0x6c, 0x28, 0xc3, 0x9a, 0x66, 0xd3, 0x77, 0x81, 0x62, 0xd7, 0xd8, 0x1f,
0x48, 0xef, 0x43, 0xe7, 0xc0, 0xea, 0xf3, 0xc2, 0xcb, 0xd4, 0x1d, 0x5e, 0x4a, 0x00, 0x2c, 0x88, 0xa5, 0x48, 0x74, 0x64, 0x4d, 0xd2, 0x02, 0xd1, 0xef, 0x00, 0xb9, 0x3b, 0x1a, 0xa9, 0x1b, 0x32,
0xb5, 0x60, 0xc3, 0x5e, 0x90, 0xfe, 0x32, 0x90, 0x47, 0x61, 0xce, 0xcd, 0xfe, 0x4c, 0xa8, 0x68, 0x31, 0x42, 0xce, 0x5b, 0xcf, 0xe1, 0x6d, 0xc5, 0x19, 0x6b, 0x95, 0x67, 0xa4, 0x0f, 0xa0, 0x75,
0x32, 0x5e, 0x56, 0xa8, 0xa8, 0x60, 0x18, 0x2a, 0xde, 0x96, 0xa5, 0xd1, 0xf2, 0xc1, 0xae, 0xc1, 0x68, 0xf5, 0x81, 0xe1, 0x65, 0xea, 0x0e, 0x30, 0x25, 0x00, 0x16, 0xc4, 0x5a, 0xb0, 0x66, 0x2f,
0x72, 0x28, 0x41, 0x5a, 0x0f, 0xaf, 0x28, 0x01, 0xd6, 0x98, 0x66, 0x5e, 0x38, 0x14, 0x0a, 0xe8, 0x48, 0x7f, 0x1e, 0xc8, 0x41, 0x98, 0x71, 0xb3, 0x3f, 0x13, 0x2a, 0x9a, 0x8c, 0x97, 0x15, 0x2a,
0xa8, 0xf9, 0x1f, 0x78, 0xb0, 0xa4, 0x8e, 0x26, 0xcc, 0xa1, 0xd3, 0xe1, 0x26, 0x0f, 0xe6, 0xc0, 0x2a, 0x18, 0x86, 0x8a, 0x77, 0x65, 0x69, 0xb4, 0x78, 0xb0, 0x1b, 0xb0, 0x1c, 0x4a, 0x90, 0xd6,
0xea, 0xfb, 0x86, 0xaa, 0x52, 0xb7, 0x50, 0x27, 0x75, 0x04, 0x9a, 0x69, 0xc0, 0x4f, 0xd0, 0x83, 0xc3, 0x5d, 0x25, 0xc0, 0x1a, 0xd3, 0xcc, 0x0b, 0x87, 0x42, 0x01, 0x1d, 0x35, 0xff, 0x23, 0x0f,
0x6e, 0xfb, 0xf8, 0x5b, 0x47, 0x4a, 0xad, 0x22, 0x52, 0xaa, 0x6b, 0x45, 0x93, 0x3a, 0xa3, 0x02, 0x96, 0xd4, 0xd1, 0x84, 0x39, 0x74, 0x3a, 0xe0, 0xe4, 0xc1, 0x1c, 0x58, 0x75, 0xdf, 0x50, 0x59,
0xd7, 0x25, 0x63, 0x75, 0x00, 0x93, 0xe1, 0xbc, 0x23, 0x4b, 0xc6, 0x05, 0xb8, 0xe0, 0x97, 0x22, 0xea, 0x16, 0xaa, 0xa4, 0x8e, 0x40, 0x7d, 0x1a, 0xf0, 0x53, 0xf4, 0xa0, 0x9b, 0x3e, 0xfe, 0xd6,
0x51, 0xe6, 0x97, 0x42, 0xf5, 0xcd, 0x3c, 0x1d, 0x40, 0xff, 0x1e, 0x8b, 0x18, 0x67, 0xb7, 0xa3, 0x91, 0x52, 0x23, 0x8f, 0x94, 0xaa, 0x5a, 0xd5, 0xa4, 0xce, 0x28, 0xc1, 0x75, 0xc9, 0x58, 0x1d,
0xa8, 0x4c, 0xff, 0x0d, 0xb8, 0x54, 0x33, 0xa7, 0xac, 0xea, 0x03, 0x58, 0xbf, 0xc7, 0x8e, 0x66, 0xc0, 0x64, 0x38, 0xef, 0xc9, 0x92, 0x71, 0x0e, 0xce, 0xf9, 0xa5, 0x48, 0x14, 0xf9, 0xa5, 0x50,
0x93, 0x47, 0xec, 0xb4, 0x28, 0x41, 0x10, 0x68, 0xe6, 0x27, 0xc9, 0x99, 0xba, 0x5b, 0xfc, 0x4d, 0x7d, 0x33, 0x4f, 0xfb, 0xd0, 0xdb, 0x63, 0x11, 0xe3, 0xec, 0x6e, 0x14, 0x15, 0xe9, 0xbf, 0x01,
0xbe, 0x04, 0x10, 0x09, 0x9c, 0x61, 0x9e, 0xb2, 0x91, 0x6e, 0x90, 0x41, 0xc8, 0x61, 0xca, 0x46, 0x57, 0x2a, 0xe6, 0x94, 0x55, 0xfd, 0x08, 0xd6, 0xf6, 0xd8, 0xf1, 0x6c, 0x7c, 0xc0, 0xce, 0xf2,
0xf4, 0x3d, 0x20, 0x36, 0x1d, 0x75, 0x04, 0xf1, 0x72, 0x67, 0x47, 0xc3, 0x7c, 0x9e, 0x73, 0x36, 0x12, 0x04, 0x81, 0x7a, 0x76, 0x9a, 0x9c, 0xab, 0xbb, 0xc5, 0xdf, 0xe4, 0x2b, 0x00, 0x91, 0xc0,
0xd5, 0x9d, 0x3f, 0x36, 0x88, 0xbe, 0x03, 0xdd, 0x83, 0x60, 0xee, 0xb3, 0xcf, 0x55, 0x93, 0xa1, 0x19, 0x64, 0x53, 0x36, 0xd4, 0x0d, 0x32, 0x08, 0x39, 0x9a, 0xb2, 0x21, 0x7d, 0x0f, 0x88, 0x4d,
0x08, 0xde, 0x82, 0xb9, 0x10, 0x65, 0x13, 0xbc, 0xe1, 0x34, 0xfd, 0xfb, 0x06, 0x2c, 0x4a, 0x4c, 0x47, 0x1d, 0x41, 0xbc, 0xdc, 0xd9, 0xf1, 0x20, 0x9b, 0x67, 0x9c, 0x4d, 0x74, 0xe7, 0x8f, 0x0d,
0x41, 0x75, 0xcc, 0x72, 0x1e, 0xc6, 0x32, 0x05, 0xaf, 0xa8, 0x5a, 0xa0, 0x8a, 0x6c, 0x34, 0x6a, 0xa2, 0xef, 0x40, 0xfb, 0x30, 0x98, 0xfb, 0xec, 0x0b, 0xd5, 0x84, 0x28, 0x82, 0xb7, 0x60, 0x2e,
0x64, 0x43, 0xb9, 0x53, 0xba, 0x99, 0x40, 0x09, 0x81, 0x03, 0xc3, 0xd8, 0x34, 0x9c, 0x32, 0xd9, 0x44, 0xd9, 0x04, 0x6f, 0x38, 0x4d, 0xff, 0xa6, 0x06, 0x8b, 0x12, 0x53, 0x50, 0x1d, 0xb1, 0x8c,
0x6b, 0xda, 0x54, 0xb1, 0xa9, 0x06, 0x94, 0xa2, 0xe4, 0x42, 0x3f, 0xc8, 0xfd, 0x69, 0xa1, 0x55, 0x87, 0xb1, 0x4c, 0xc1, 0x2b, 0xaa, 0x16, 0xa8, 0x24, 0x1b, 0xb5, 0x0a, 0xd9, 0x50, 0xee, 0x94,
0xe2, 0x60, 0x83, 0x6a, 0xb5, 0xd0, 0x92, 0x94, 0x9a, 0x8a, 0x16, 0xaa, 0x68, 0x9b, 0xe5, 0xd7, 0x6e, 0x26, 0x50, 0x42, 0xe0, 0xc0, 0x30, 0x36, 0x0d, 0x27, 0x4c, 0xf6, 0xa2, 0xd6, 0x55, 0x6c,
0xd0, 0x36, 0xd2, 0xc7, 0x72, 0xb4, 0x0d, 0x81, 0xb5, 0x07, 0x8c, 0xf9, 0x2c, 0x4d, 0x32, 0xdd, 0xaa, 0x01, 0x85, 0x28, 0x39, 0xd7, 0x0f, 0x72, 0x7f, 0x5a, 0x68, 0x95, 0x38, 0xd8, 0xa0, 0x4a,
0xa9, 0x49, 0xbf, 0xe7, 0xc1, 0x9a, 0xb2, 0x1e, 0x66, 0x8e, 0xbc, 0xe9, 0x98, 0x1a, 0xaf, 0x2e, 0x2d, 0xb4, 0x24, 0xa5, 0xa6, 0xa4, 0x85, 0x4a, 0xda, 0x66, 0xf9, 0x35, 0xb4, 0x8d, 0xf4, 0xb1,
0x2b, 0xfb, 0x16, 0xf4, 0x30, 0xd8, 0x12, 0x91, 0x14, 0x46, 0x56, 0x2a, 0xff, 0xe0, 0x00, 0xc5, 0x1c, 0x6d, 0x43, 0x60, 0xf5, 0x23, 0xc6, 0x7c, 0x36, 0x4d, 0x52, 0xdd, 0xc9, 0x49, 0x7f, 0xe0,
0x9e, 0x74, 0x9e, 0x71, 0x1a, 0x46, 0x8a, 0xc1, 0x36, 0x48, 0x98, 0x45, 0x1d, 0x8c, 0x21, 0x7b, 0xc1, 0xaa, 0xb2, 0x1e, 0x66, 0x8e, 0xbc, 0xe9, 0x98, 0x1a, 0xaf, 0x2a, 0x2b, 0xfb, 0x16, 0x74,
0x3d, 0xdf, 0x8c, 0xe9, 0x01, 0xac, 0x5b, 0xfb, 0x55, 0x02, 0x75, 0x0b, 0x74, 0x05, 0x53, 0xa6, 0x30, 0xd8, 0x12, 0x91, 0x14, 0x46, 0x56, 0x2a, 0xff, 0xe0, 0x00, 0xc5, 0x9e, 0x74, 0x9e, 0x71,
0x13, 0xe4, 0xbb, 0xd8, 0x76, 0x0d, 0x61, 0xf1, 0x99, 0x83, 0x4c, 0xff, 0xd9, 0x83, 0x0d, 0xe9, 0x12, 0x46, 0x8a, 0xc1, 0x36, 0x48, 0x98, 0x45, 0x1d, 0x8c, 0x21, 0x7b, 0x3d, 0xdf, 0x8c, 0xe9,
0x14, 0x28, 0x97, 0xcb, 0x34, 0x3d, 0x2d, 0x4a, 0x2f, 0x48, 0x0a, 0xfc, 0xfe, 0x05, 0x5f, 0x8d, 0x21, 0xac, 0x59, 0xfb, 0x55, 0x02, 0x75, 0x07, 0x74, 0x05, 0x53, 0xa6, 0x13, 0xe4, 0xbb, 0xd8,
0xc9, 0x57, 0x5f, 0xd3, 0x91, 0x31, 0xc5, 0xc2, 0x73, 0xd8, 0xb3, 0x50, 0xc7, 0x9e, 0x97, 0x1c, 0x72, 0x0d, 0x61, 0xfe, 0x99, 0x83, 0x4c, 0xff, 0xc1, 0x83, 0x75, 0xe9, 0x14, 0x28, 0x97, 0xcb,
0xbe, 0x2e, 0x58, 0x6e, 0xd5, 0x06, 0xcb, 0x77, 0x96, 0xa0, 0x95, 0x8f, 0x92, 0x94, 0xd1, 0x2d, 0x34, 0x3d, 0x2d, 0x4a, 0x2f, 0x48, 0x0a, 0xfc, 0xfe, 0x25, 0x5f, 0x8d, 0xc9, 0xd7, 0x5f, 0xd3,
0xd8, 0x74, 0x0f, 0x27, 0x59, 0xb6, 0xf7, 0x2f, 0x1e, 0xac, 0xc8, 0xc4, 0x9d, 0xec, 0x01, 0x67, 0x91, 0x31, 0xc5, 0xc2, 0x0b, 0xd8, 0xb3, 0x50, 0xc5, 0x9e, 0x97, 0x1c, 0xbe, 0x2a, 0x58, 0x6e,
0x19, 0x11, 0x71, 0x99, 0xd5, 0x5a, 0x4e, 0x8c, 0x5b, 0x5a, 0x6d, 0x51, 0x1f, 0xbc, 0x51, 0x3b, 0x54, 0x06, 0xcb, 0xf7, 0x96, 0xa0, 0x91, 0x0d, 0x93, 0x29, 0xa3, 0x9b, 0xb0, 0xe1, 0x1e, 0x4e,
0xa7, 0x7d, 0xf2, 0xef, 0xfe, 0xe8, 0xdf, 0xff, 0xac, 0x71, 0x91, 0xae, 0xed, 0x9e, 0xde, 0xdc, 0xb2, 0x6c, 0xf7, 0x1f, 0x3d, 0xe8, 0xca, 0xc4, 0x9d, 0xec, 0x11, 0x67, 0x29, 0x11, 0x71, 0x99,
0x45, 0xf5, 0xc9, 0xce, 0x10, 0xe3, 0x03, 0xef, 0x9a, 0x58, 0xc5, 0xee, 0x3a, 0x37, 0xab, 0xd4, 0xd5, 0x7a, 0x4e, 0x8c, 0x5b, 0x5a, 0x6e, 0x61, 0xef, 0xbf, 0x51, 0x39, 0xa7, 0x7d, 0xf2, 0xdf,
0x74, 0xaf, 0x9b, 0x55, 0x6a, 0xdb, 0xd4, 0x9d, 0x55, 0x66, 0x88, 0x61, 0x56, 0xd9, 0xfb, 0xaf, 0xfa, 0xc9, 0xbf, 0xfc, 0x51, 0xed, 0x32, 0x5d, 0xdd, 0x39, 0xbb, 0xbd, 0x83, 0xea, 0x93, 0x9d,
0x01, 0xb4, 0x4d, 0x00, 0x49, 0xbe, 0x0d, 0x3d, 0x27, 0x49, 0x49, 0x34, 0xe1, 0xba, 0xb4, 0xe7, 0x23, 0xc6, 0x07, 0xde, 0x0d, 0xb1, 0x8a, 0xdd, 0x95, 0x6e, 0x56, 0xa9, 0xe8, 0x6e, 0x37, 0xab,
0xe0, 0x72, 0xfd, 0xa4, 0x5a, 0xf6, 0x0a, 0x2e, 0xdb, 0x27, 0x5b, 0x62, 0x59, 0x95, 0x19, 0xdc, 0x54, 0xb6, 0xb1, 0x3b, 0xab, 0xcc, 0x10, 0xc3, 0xac, 0xb2, 0xfb, 0xef, 0x7d, 0x68, 0x9a, 0x00,
0xc5, 0xec, 0xad, 0xec, 0x7a, 0x78, 0x06, 0x2b, 0x6e, 0x62, 0x91, 0x5c, 0x76, 0x45, 0xa3, 0xb4, 0x92, 0x7c, 0x0f, 0x3a, 0x4e, 0x92, 0x92, 0x68, 0xc2, 0x55, 0x69, 0xcf, 0xfe, 0xd5, 0xea, 0x49,
0xda, 0x97, 0xce, 0x99, 0x55, 0xcb, 0x5d, 0xc6, 0xe5, 0xb6, 0xc8, 0xa6, 0xbd, 0x9c, 0x09, 0xec, 0xb5, 0xec, 0x35, 0x5c, 0xb6, 0x47, 0x36, 0xc5, 0xb2, 0x2a, 0x33, 0xb8, 0x83, 0xd9, 0x5b, 0xd9,
0x18, 0xf6, 0xa9, 0xd8, 0xed, 0xe8, 0x44, 0xd3, 0xab, 0x6f, 0x53, 0x1f, 0x5c, 0xaa, 0xb6, 0x9e, 0xf5, 0xf0, 0x14, 0xba, 0x6e, 0x62, 0x91, 0x5c, 0x75, 0x45, 0xa3, 0xb0, 0xda, 0x57, 0x2e, 0x98,
0xab, 0x5e, 0x75, 0xda, 0xc7, 0xa5, 0x08, 0x41, 0x86, 0xda, 0xdd, 0xe8, 0xe4, 0x33, 0x68, 0x9b, 0x55, 0xcb, 0x5d, 0xc5, 0xe5, 0x36, 0xc9, 0x86, 0xbd, 0x9c, 0x09, 0xec, 0x18, 0xf6, 0xa9, 0xd8,
0x16, 0x55, 0xb2, 0x6d, 0xf5, 0x05, 0xdb, 0x7d, 0xb3, 0x83, 0x7e, 0x75, 0xa2, 0xee, 0xaa, 0x6c, 0xed, 0xea, 0x44, 0xd3, 0xab, 0x6e, 0x63, 0xef, 0x5f, 0x29, 0xb7, 0xa6, 0xab, 0x5e, 0x76, 0xda,
0xca, 0x42, 0x20, 0x1e, 0xc1, 0x45, 0x65, 0xcd, 0x8f, 0xd8, 0x8f, 0x73, 0x92, 0x9a, 0x26, 0xfa, 0xc3, 0xa5, 0x08, 0x41, 0x86, 0xda, 0xdd, 0xea, 0xe4, 0x73, 0x68, 0x9a, 0x16, 0x55, 0xb2, 0x65,
0x1b, 0x1e, 0xb9, 0x05, 0xcb, 0xba, 0xf3, 0x97, 0x6c, 0xd5, 0x77, 0x30, 0x0f, 0xb6, 0x2b, 0x70, 0xf5, 0x05, 0xdb, 0x7d, 0xb3, 0xfd, 0x5e, 0x79, 0xa2, 0xea, 0xaa, 0x6c, 0xca, 0x42, 0x20, 0x0e,
0xa5, 0x47, 0x6e, 0x03, 0x14, 0x4d, 0xaa, 0xa4, 0x7f, 0x5e, 0x2f, 0xad, 0x61, 0x62, 0x4d, 0x47, 0xe0, 0xb2, 0xb2, 0xe6, 0xc7, 0xec, 0xcb, 0x9c, 0xa4, 0xa2, 0xc9, 0xfe, 0x96, 0x47, 0xee, 0xc0,
0xeb, 0x04, 0x7b, 0x74, 0xdd, 0x1e, 0x58, 0xf2, 0xe5, 0x02, 0xbf, 0xb6, 0x3b, 0xf6, 0x25, 0x04, 0xb2, 0xee, 0xfc, 0x25, 0x9b, 0xd5, 0x1d, 0xcc, 0xfd, 0xad, 0x12, 0x5c, 0xe9, 0x91, 0xbb, 0x00,
0xe9, 0x16, 0xf2, 0x6e, 0x8d, 0xac, 0x08, 0xde, 0xc5, 0xec, 0x4c, 0x77, 0x6c, 0xdd, 0x83, 0x8e, 0x79, 0x93, 0x2a, 0xe9, 0x5d, 0xd4, 0x4b, 0x6b, 0x98, 0x58, 0xd1, 0xd1, 0x3a, 0xc6, 0x1e, 0x5d,
0xd5, 0xf8, 0x4a, 0x34, 0x85, 0x6a, 0xd3, 0xec, 0x60, 0x50, 0x37, 0xa5, 0xb6, 0xfb, 0xeb, 0xd0, 0xb7, 0x07, 0x96, 0x7c, 0x35, 0xc7, 0xaf, 0xec, 0x8e, 0x7d, 0x09, 0x41, 0xba, 0x89, 0xbc, 0x5b,
0x73, 0x3a, 0x58, 0xcd, 0xcb, 0xa8, 0xeb, 0x8f, 0x35, 0x2f, 0xa3, 0xbe, 0xe9, 0xf5, 0x5b, 0xd0, 0x25, 0x5d, 0xc1, 0xbb, 0x98, 0x9d, 0xeb, 0x8e, 0xad, 0x3d, 0x68, 0x59, 0x8d, 0xaf, 0x44, 0x53,
0xb1, 0xfa, 0x4d, 0x89, 0x55, 0xfd, 0x2e, 0xf5, 0x93, 0x9a, 0x1d, 0xd5, 0xb4, 0xa7, 0xd2, 0x4d, 0x28, 0x37, 0xcd, 0xf6, 0xfb, 0x55, 0x53, 0x6a, 0xbb, 0xdf, 0x84, 0x8e, 0xd3, 0xc1, 0x6a, 0x5e,
0x3c, 0xef, 0x0a, 0x6d, 0x8b, 0xf3, 0x62, 0xdb, 0x92, 0x10, 0x92, 0x6f, 0xc3, 0x8a, 0xdb, 0x67, 0x46, 0x55, 0x7f, 0xac, 0x79, 0x19, 0xd5, 0x4d, 0xaf, 0xdf, 0x85, 0x96, 0xd5, 0x6f, 0x4a, 0xac,
0x6a, 0x5e, 0x55, 0x6d, 0xc7, 0xaa, 0x79, 0x55, 0xe7, 0x34, 0xa7, 0x2a, 0x81, 0xbc, 0xb6, 0x61, 0xea, 0x77, 0xa1, 0x9f, 0xd4, 0xec, 0xa8, 0xa2, 0x3d, 0x95, 0x6e, 0xe0, 0x79, 0xbb, 0xb4, 0x29,
0x16, 0xd9, 0xfd, 0x42, 0xa5, 0x4f, 0x5f, 0x90, 0x6f, 0x08, 0xd5, 0xa1, 0xfa, 0xc8, 0x48, 0xd1, 0xce, 0x8b, 0x6d, 0x4b, 0x42, 0x48, 0xbe, 0x07, 0x5d, 0xb7, 0xcf, 0xd4, 0xbc, 0xaa, 0xca, 0x8e,
0x77, 0xeb, 0x76, 0x9b, 0x19, 0x69, 0xaf, 0xb4, 0x9c, 0xd1, 0x75, 0x24, 0xde, 0x21, 0xc5, 0x09, 0x55, 0xf3, 0xaa, 0x2e, 0x68, 0x4e, 0x55, 0x02, 0x79, 0x63, 0xdd, 0x2c, 0xb2, 0xf3, 0x5c, 0xa5,
0xc8, 0xc7, 0xb0, 0xa4, 0xfa, 0xc9, 0xc8, 0xc5, 0x42, 0xaa, 0xad, 0x64, 0xd3, 0x60, 0xab, 0x0c, 0x4f, 0x5f, 0x90, 0x6f, 0x0b, 0xd5, 0xa1, 0xfa, 0xc8, 0x48, 0xde, 0x77, 0xeb, 0x76, 0x9b, 0x19,
0x56, 0xc4, 0x36, 0x90, 0x58, 0x8f, 0x74, 0x04, 0xb1, 0x09, 0xe3, 0xa1, 0xa0, 0x11, 0xc3, 0x6a, 0x69, 0x2f, 0xb5, 0x9c, 0xd1, 0x35, 0x24, 0xde, 0x22, 0xf9, 0x09, 0xc8, 0x27, 0xb0, 0xa4, 0xfa,
0xa9, 0xe2, 0x65, 0x1e, 0x4b, 0x7d, 0xbd, 0x7c, 0x70, 0xe5, 0xe5, 0x85, 0x32, 0x57, 0xcd, 0x68, 0xc9, 0xc8, 0xe5, 0x5c, 0xaa, 0xad, 0x64, 0x53, 0x7f, 0xb3, 0x08, 0x56, 0xc4, 0xd6, 0x91, 0x58,
0xf5, 0xb2, 0xab, 0xdb, 0x1b, 0x7e, 0x0b, 0xba, 0x76, 0xfb, 0xa2, 0xd1, 0xd9, 0x35, 0xad, 0x8e, 0x87, 0xb4, 0x04, 0xb1, 0x31, 0xe3, 0xa1, 0xa0, 0x11, 0xc3, 0x4a, 0xa1, 0xe2, 0x65, 0x1e, 0x4b,
0x46, 0x67, 0xd7, 0xf5, 0x3b, 0xea, 0xcb, 0x25, 0x5d, 0x7b, 0x19, 0xf2, 0x2d, 0x58, 0xb5, 0x6a, 0x75, 0xbd, 0xbc, 0x7f, 0xed, 0xe5, 0x85, 0x32, 0x57, 0xcd, 0x68, 0xf5, 0xb2, 0xa3, 0xdb, 0x1b,
0xab, 0x87, 0xf3, 0x78, 0x64, 0x84, 0xa7, 0xda, 0x09, 0x33, 0xa8, 0xb3, 0xb4, 0x74, 0x1b, 0x09, 0x7e, 0x15, 0xda, 0x76, 0xfb, 0xa2, 0xd1, 0xd9, 0x15, 0xad, 0x8e, 0x46, 0x67, 0x57, 0xf5, 0x3b,
0xaf, 0x53, 0x87, 0xb0, 0x10, 0x9c, 0xbb, 0xd0, 0xb1, 0xeb, 0xb6, 0x2f, 0xa1, 0xbb, 0x6d, 0x4d, 0xea, 0xcb, 0x25, 0x6d, 0x7b, 0x19, 0xf2, 0x5d, 0x58, 0xb1, 0x6a, 0xab, 0x47, 0xf3, 0x78, 0x68,
0xd9, 0x8d, 0x21, 0x37, 0x3c, 0xf2, 0x17, 0x1e, 0x74, 0xed, 0x1e, 0x2b, 0xe2, 0x64, 0x6c, 0x4a, 0x84, 0xa7, 0xdc, 0x09, 0xd3, 0xaf, 0xb2, 0xb4, 0x74, 0x0b, 0x09, 0xaf, 0x51, 0x87, 0xb0, 0x10,
0x74, 0xfa, 0xf6, 0x9c, 0x4d, 0x88, 0x3e, 0xc6, 0x4d, 0xee, 0x5f, 0x7b, 0xe0, 0x30, 0xf9, 0x0b, 0x9c, 0xfb, 0xd0, 0xb2, 0xeb, 0xb6, 0x2f, 0xa1, 0xbb, 0x65, 0x4d, 0xd9, 0x8d, 0x21, 0xb7, 0x3c,
0xc7, 0x89, 0xba, 0x6e, 0xff, 0x2b, 0xe4, 0x45, 0x79, 0xd2, 0xee, 0x14, 0x7a, 0x71, 0xc3, 0x23, 0xf2, 0xa7, 0x1e, 0xb4, 0xed, 0x1e, 0x2b, 0xe2, 0x64, 0x6c, 0x0a, 0x74, 0x7a, 0xf6, 0x9c, 0x4d,
0x1f, 0xc8, 0x7f, 0x09, 0xe9, 0xe0, 0x87, 0x58, 0x8a, 0xad, 0xcc, 0x2e, 0xfb, 0x0f, 0x35, 0x3b, 0x88, 0xfa, 0xb8, 0xc9, 0x83, 0x1b, 0xdf, 0x74, 0x98, 0xfc, 0xdc, 0x71, 0xa2, 0x6e, 0x16, 0xff,
0xde, 0x0d, 0x8f, 0xfc, 0xb6, 0xfc, 0x23, 0x88, 0xfa, 0x16, 0xb9, 0xfe, 0xba, 0xdf, 0xd3, 0xb7, 0x25, 0xf2, 0xa2, 0x88, 0x60, 0x77, 0x0b, 0xbd, 0xb8, 0xe5, 0x91, 0x0f, 0xe4, 0x3f, 0x89, 0x74,
0xf0, 0x24, 0x57, 0xe8, 0x25, 0xe7, 0x24, 0x65, 0xcd, 0x7e, 0x00, 0x50, 0x44, 0xb2, 0xa4, 0x14, 0x00, 0x44, 0x2c, 0xe5, 0x56, 0x64, 0x99, 0xfd, 0xa7, 0x9b, 0x6d, 0xef, 0x96, 0x47, 0x7e, 0x4d,
0xd6, 0x19, 0x9d, 0x57, 0x0d, 0x76, 0xdd, 0xdb, 0xd4, 0xd1, 0x9f, 0xa0, 0xf8, 0x99, 0x14, 0x44, 0xfe, 0x19, 0x44, 0x7d, 0x8b, 0x9c, 0x7f, 0xdd, 0xef, 0xe9, 0x5b, 0x78, 0x9a, 0x6b, 0xf4, 0x8a,
0x85, 0x9f, 0x9b, 0xeb, 0xac, 0x46, 0xa4, 0x83, 0x41, 0xdd, 0x54, 0x9d, 0x18, 0x6a, 0xfa, 0xe4, 0x73, 0x9a, 0xa2, 0x76, 0x3f, 0x04, 0xc8, 0xa3, 0x59, 0x52, 0x08, 0xed, 0x8c, 0xde, 0x2b, 0x07,
0x29, 0xf4, 0x1e, 0x25, 0xc9, 0xb3, 0x59, 0x6a, 0xb2, 0x23, 0x6e, 0x60, 0x25, 0xc2, 0xe6, 0x41, 0xbc, 0xee, 0x8d, 0xea, 0x08, 0x50, 0x50, 0xfc, 0x5c, 0x0a, 0xa3, 0xc2, 0xcf, 0xcc, 0x95, 0x96,
0xe9, 0x14, 0xf4, 0x2a, 0x92, 0x1a, 0x90, 0xbe, 0x45, 0x6a, 0xf7, 0x8b, 0x22, 0x8e, 0x7e, 0x41, 0xa3, 0xd2, 0x7e, 0xbf, 0x6a, 0xaa, 0x4a, 0x14, 0x35, 0x7d, 0xf2, 0x04, 0x3a, 0x07, 0x49, 0xf2,
0x02, 0x58, 0x37, 0xf6, 0xcd, 0x6c, 0x7c, 0xe0, 0x92, 0xb1, 0xc3, 0xd9, 0xca, 0x12, 0x8e, 0xc7, 0x74, 0x36, 0x35, 0x19, 0x12, 0x37, 0xb8, 0x12, 0xa1, 0x73, 0xbf, 0x70, 0x0a, 0x7a, 0x1d, 0x49,
0xa1, 0x77, 0xbb, 0x9b, 0x6b, 0x9a, 0x37, 0x3c, 0x72, 0x00, 0xdd, 0x7b, 0x6c, 0x94, 0x8c, 0x99, 0xf5, 0x49, 0xcf, 0x22, 0xb5, 0xf3, 0x3c, 0x8f, 0xa5, 0x5f, 0x90, 0x00, 0xd6, 0x8c, 0x8d, 0x33,
0x0a, 0x85, 0x36, 0x8a, 0x8d, 0x9b, 0x18, 0x6a, 0xd0, 0x73, 0x80, 0xee, 0x8b, 0x4f, 0x83, 0x79, 0x1b, 0xef, 0xbb, 0x64, 0xec, 0x90, 0xb6, 0xb4, 0x84, 0xe3, 0x75, 0xe8, 0xdd, 0xee, 0x64, 0x9a,
0xc6, 0x3e, 0xdf, 0xfd, 0x42, 0x05, 0x59, 0x2f, 0xf4, 0x8b, 0xd7, 0x81, 0xa1, 0xf3, 0xe2, 0x4b, 0xe6, 0x2d, 0x8f, 0x1c, 0x42, 0x7b, 0x8f, 0x0d, 0x93, 0x11, 0x53, 0xe1, 0xd0, 0x7a, 0xbe, 0x71,
0x91, 0xa4, 0xf3, 0xe2, 0x2b, 0x91, 0xa4, 0xc3, 0x6a, 0x1d, 0x98, 0x92, 0x48, 0xc4, 0x97, 0xa5, 0x13, 0x47, 0xf5, 0x3b, 0x0e, 0xd0, 0x7d, 0xf5, 0xd3, 0x60, 0x9e, 0xb2, 0x2f, 0x76, 0x9e, 0xab,
0xe0, 0xd3, 0x58, 0xc9, 0xf3, 0x42, 0xd6, 0xc1, 0xd5, 0xf3, 0x11, 0xdc, 0xd5, 0xae, 0xb9, 0xab, 0x40, 0xeb, 0x85, 0x7e, 0xf5, 0x3a, 0x38, 0x74, 0x5e, 0x7d, 0x21, 0x9a, 0x74, 0x5e, 0x7d, 0x29,
0x1d, 0x42, 0xef, 0x1e, 0x93, 0xcc, 0x92, 0x15, 0x87, 0x81, 0xab, 0x42, 0xec, 0xea, 0x44, 0x59, 0x9a, 0x74, 0x58, 0xad, 0x83, 0x53, 0x12, 0x89, 0x18, 0xb3, 0x10, 0x80, 0x1a, 0x4b, 0x79, 0x51,
0xbd, 0xe0, 0x9c, 0xab, 0xd2, 0x31, 0xdd, 0x4f, 0x3e, 0x83, 0xce, 0x43, 0xc6, 0x75, 0x89, 0xc1, 0xd8, 0xda, 0xbf, 0x7e, 0x31, 0x82, 0xbb, 0xda, 0x0d, 0x77, 0xb5, 0x23, 0xe8, 0xec, 0x31, 0xc9,
0xf8, 0x1a, 0xa5, 0x9a, 0xc3, 0xa0, 0xa6, 0x42, 0xe1, 0xca, 0x0c, 0x52, 0xdb, 0x65, 0xe3, 0x09, 0x2c, 0x59, 0x75, 0xe8, 0xbb, 0x6a, 0xc4, 0xae, 0x50, 0x14, 0x55, 0x0c, 0xce, 0xb9, 0x6a, 0x1d,
0x93, 0x8f, 0x7d, 0x18, 0x8e, 0x5f, 0x90, 0xdf, 0x40, 0xe2, 0xa6, 0x2a, 0xb9, 0x65, 0x65, 0xa6, 0x53, 0xfe, 0xe4, 0x73, 0x68, 0x3d, 0x64, 0x5c, 0x97, 0x19, 0x8c, 0xbf, 0x51, 0xa8, 0x3b, 0xf4,
0x6d, 0xe2, 0xab, 0x25, 0x78, 0x1d, 0xe5, 0x38, 0x19, 0x33, 0xcb, 0xb8, 0xc5, 0xd0, 0xb1, 0x4a, 0x2b, 0xaa, 0x14, 0xae, 0xcc, 0x20, 0xb5, 0x1d, 0x36, 0x1a, 0x33, 0xf9, 0xd8, 0x07, 0xe1, 0xe8,
0xd0, 0xe6, 0x01, 0x55, 0xeb, 0xda, 0xe6, 0x01, 0xd5, 0x54, 0xac, 0xe9, 0x0e, 0xae, 0x43, 0xc9, 0x05, 0xf9, 0x65, 0x24, 0x6e, 0x2a, 0x93, 0x9b, 0x56, 0x76, 0xda, 0x26, 0xbe, 0x52, 0x80, 0x57,
0xd5, 0x62, 0x1d, 0x59, 0xa5, 0x2e, 0x56, 0xda, 0xfd, 0x22, 0x98, 0xf2, 0x17, 0xe4, 0x53, 0x6c, 0x51, 0x8e, 0x93, 0x11, 0xb3, 0x0c, 0x5c, 0x0c, 0x2d, 0xab, 0x0c, 0x6d, 0x1e, 0x50, 0xb9, 0xb6,
0xae, 0xb6, 0xcb, 0x28, 0x85, 0xaf, 0x53, 0xae, 0xb8, 0x18, 0x66, 0x59, 0x53, 0xae, 0xff, 0x23, 0x6d, 0x1e, 0x50, 0x45, 0xd5, 0x9a, 0x6e, 0xe3, 0x3a, 0x94, 0x5c, 0xcf, 0xd7, 0x91, 0x95, 0xea,
0x97, 0x42, 0x1b, 0xf8, 0x55, 0x80, 0x43, 0x9e, 0xa4, 0xf7, 0x02, 0x36, 0x4d, 0xe2, 0x42, 0x73, 0x7c, 0xa5, 0x9d, 0xe7, 0xc1, 0x84, 0xbf, 0x20, 0x9f, 0x61, 0x83, 0xb5, 0x5d, 0x4a, 0xc9, 0xfd,
0x15, 0xa5, 0x82, 0x42, 0x73, 0x59, 0xf5, 0x02, 0xf2, 0xa9, 0xe5, 0x6d, 0x3a, 0x55, 0x28, 0x2d, 0x9d, 0x62, 0xd5, 0xc5, 0x30, 0xcb, 0x9a, 0x72, 0x7d, 0x20, 0xb9, 0x14, 0xda, 0xc1, 0xaf, 0x03,
0x5c, 0xe7, 0x56, 0x13, 0x0c, 0x43, 0x6a, 0x2a, 0x0a, 0x37, 0x3c, 0xe1, 0x3b, 0x16, 0xa9, 0x0e, 0x1c, 0xf1, 0x64, 0xba, 0x17, 0xb0, 0x49, 0x12, 0xe7, 0x9a, 0x2b, 0x2f, 0x17, 0xe4, 0x9a, 0xcb,
0xe3, 0x3b, 0x56, 0xb2, 0x28, 0x46, 0xed, 0xd5, 0xe4, 0x45, 0x0e, 0xa0, 0x5d, 0xc4, 0xdb, 0xda, 0xaa, 0x19, 0x90, 0xcf, 0x2c, 0x8f, 0xd3, 0xa9, 0x44, 0x69, 0xe1, 0xba, 0xb0, 0xa2, 0x60, 0x18,
0x1c, 0x95, 0xa3, 0x73, 0x63, 0x5f, 0x2a, 0x61, 0x30, 0x5d, 0x43, 0x56, 0x01, 0x59, 0x16, 0xac, 0x52, 0x51, 0x55, 0xb8, 0xe5, 0x09, 0xff, 0x31, 0x4f, 0x77, 0x18, 0xff, 0xb1, 0x94, 0x49, 0x31,
0xc2, 0x2a, 0x7a, 0x08, 0x1b, 0x72, 0x83, 0xc6, 0x58, 0x62, 0xf2, 0x5b, 0x9f, 0xa4, 0x26, 0xec, 0x6a, 0xaf, 0x22, 0x37, 0x72, 0x08, 0xcd, 0x3c, 0xe6, 0xd6, 0x26, 0xa9, 0x18, 0xa1, 0x1b, 0x1b,
0x35, 0xaf, 0xb9, 0x2e, 0x6a, 0xa4, 0x97, 0x70, 0x85, 0x0d, 0xba, 0xa2, 0xf5, 0xbe, 0x4c, 0xbc, 0x53, 0x0a, 0x85, 0xe9, 0x2a, 0xb2, 0x0a, 0xc8, 0xb2, 0x60, 0x15, 0x56, 0xd2, 0x43, 0x58, 0x97,
0x7f, 0xe0, 0x5d, 0x3b, 0x5a, 0xc4, 0xbf, 0x34, 0x7f, 0xe5, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x1b, 0x34, 0x06, 0x13, 0x13, 0xe0, 0xfa, 0x24, 0x15, 0xa1, 0xaf, 0x79, 0xcd, 0x55, 0x91, 0x23,
0x74, 0x60, 0x2b, 0x2e, 0x04, 0x3d, 0x00, 0x00, 0xbd, 0x82, 0x2b, 0xac, 0xd3, 0xae, 0xd6, 0xfb, 0x32, 0xf9, 0xfe, 0x81, 0x77, 0xe3, 0x78, 0x11,
0xff, 0xf6, 0xfc, 0xb5, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xbd, 0x0c, 0x03, 0x28, 0x3d,
0x00, 0x00,
} }

@ -201,7 +201,7 @@ func request_Lightning_OpenChannelSync_0(ctx context.Context, marshaler runtime.
} }
var ( var (
filter_Lightning_CloseChannel_0 = &utilities.DoubleArray{Encoding: map[string]int{"channel_point": 0, "funding_txid": 1, "output_index": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 2, 3, 4}} filter_Lightning_CloseChannel_0 = &utilities.DoubleArray{Encoding: map[string]int{"channel_point": 0, "funding_txid_str": 1, "output_index": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 2, 3, 4}}
) )
func request_Lightning_CloseChannel_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_CloseChannelClient, runtime.ServerMetadata, error) { func request_Lightning_CloseChannel_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_CloseChannelClient, runtime.ServerMetadata, error) {
@ -215,15 +215,15 @@ func request_Lightning_CloseChannel_0(ctx context.Context, marshaler runtime.Mar
_ = err _ = err
) )
val, ok = pathParams["channel_point.funding_txid"] val, ok = pathParams["channel_point.funding_txid_str"]
if !ok { if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_point.funding_txid") return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_point.funding_txid_str")
} }
err = runtime.PopulateFieldFromPath(&protoReq, "channel_point.funding_txid", val) err = runtime.PopulateFieldFromPath(&protoReq, "channel_point.funding_txid_str", val)
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_point.funding_txid", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_point.funding_txid_str", err)
} }
val, ok = pathParams["channel_point.output_index"] val, ok = pathParams["channel_point.output_index"]
@ -1499,7 +1499,7 @@ var (
pattern_Lightning_OpenChannelSync_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "channels"}, "")) pattern_Lightning_OpenChannelSync_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "channels"}, ""))
pattern_Lightning_CloseChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "channels", "channel_point.funding_txid", "channel_point.output_index"}, "")) pattern_Lightning_CloseChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "channels", "channel_point.funding_txid_str", "channel_point.output_index"}, ""))
pattern_Lightning_SendPaymentSync_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "transactions"}, "")) pattern_Lightning_SendPaymentSync_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "transactions"}, ""))

@ -251,7 +251,7 @@ service Lightning {
*/ */
rpc CloseChannel (CloseChannelRequest) returns (stream CloseStatusUpdate) { rpc CloseChannel (CloseChannelRequest) returns (stream CloseStatusUpdate) {
option (google.api.http) = { option (google.api.http) = {
delete: "/v1/channels/{channel_point.funding_txid}/{channel_point.output_index}" delete: "/v1/channels/{channel_point.funding_txid_str}/{channel_point.output_index}"
}; };
} }
@ -518,16 +518,16 @@ message SendResponse {
} }
message ChannelPoint { message ChannelPoint {
// TODO(roasbeef): make str vs bytes into a oneof oneof funding_txid {
/// Txid of the funding transaction
bytes funding_txid_bytes = 1 [json_name = "funding_txid_bytes"];
/// Txid of the funding transaction /// Hex-encoded string representing the funding transaction
bytes funding_txid = 1 [ json_name = "funding_txid" ]; string funding_txid_str = 2 [json_name = "funding_txid_str"];
}
/// Hex-encoded string representing the funding transaction
string funding_txid_str = 2 [ json_name = "funding_txid_str" ];
/// The index of the output of the funding transaction /// The index of the output of the funding transaction
uint32 output_index = 3 [ json_name = "output_index" ]; uint32 output_index = 3 [json_name = "output_index"];
} }
message LightningAddress { message LightningAddress {
@ -840,8 +840,9 @@ message CloseChannelRequest {
int32 target_conf = 3; int32 target_conf = 3;
/// A manual fee rate set in sat/byte that should be used when crafting the closure transaction. /// A manual fee rate set in sat/byte that should be used when crafting the closure transaction.
int64 sat_per_byte = 5; int64 sat_per_byte = 4;
} }
message CloseStatusUpdate { message CloseStatusUpdate {
oneof update { oneof update {
PendingUpdate close_pending = 1 [json_name = "close_pending"]; PendingUpdate close_pending = 1 [json_name = "close_pending"];

@ -145,7 +145,7 @@
] ]
} }
}, },
"/v1/channels/{channel_point.funding_txid}/{channel_point.output_index}": { "/v1/channels/{channel_point.funding_txid_str}/{channel_point.output_index}": {
"delete": { "delete": {
"summary": "* lncli: `closechannel`\nCloseChannel attempts to close an active channel identified by its channel\noutpoint (ChannelPoint). The actions of this method can additionally be\naugmented to attempt a force close after a timeout period in the case of an\ninactive peer. If a non-force close (cooperative closure) is requested,\nthen the user can specify either a target number of blocks until the\nclosure transaction is confirmed, or a manual fee rate. If neither are\nspecified, then a default lax, block confirmation target is used.", "summary": "* lncli: `closechannel`\nCloseChannel attempts to close an active channel identified by its channel\noutpoint (ChannelPoint). The actions of this method can additionally be\naugmented to attempt a force close after a timeout period in the case of an\ninactive peer. If a non-force close (cooperative closure) is requested,\nthen the user can specify either a target number of blocks until the\nclosure transaction is confirmed, or a manual fee rate. If neither are\nspecified, then a default lax, block confirmation target is used.",
"operationId": "CloseChannel", "operationId": "CloseChannel",
@ -159,11 +159,10 @@
}, },
"parameters": [ "parameters": [
{ {
"name": "channel_point.funding_txid", "name": "channel_point.funding_txid_str",
"in": "path", "in": "path",
"required": true, "required": true,
"type": "string", "type": "string"
"format": "byte"
}, },
{ {
"name": "channel_point.output_index", "name": "channel_point.output_index",
@ -1037,7 +1036,7 @@
"lnrpcChannelPoint": { "lnrpcChannelPoint": {
"type": "object", "type": "object",
"properties": { "properties": {
"funding_txid": { "funding_txid_bytes": {
"type": "string", "type": "string",
"format": "byte", "format": "byte",
"title": "/ Txid of the funding transaction" "title": "/ Txid of the funding transaction"

@ -633,7 +633,11 @@ func (n *NetworkHarness) CloseChannel(ctx context.Context,
// Create a channel outpoint that we can use to compare to channels // Create a channel outpoint that we can use to compare to channels
// from the ListChannelsResponse. // from the ListChannelsResponse.
fundingTxID, err := chainhash.NewHash(cp.FundingTxid) txidHash, err := getChanPointFundingTxid(cp)
if err != nil {
return nil, nil, err
}
fundingTxID, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }

@ -450,6 +450,29 @@ type chanWatchRequest struct {
eventChan chan struct{} eventChan chan struct{}
} }
// getChanPointFundingTxid returns the given channel point's funding txid in
// raw bytes.
func getChanPointFundingTxid(chanPoint *lnrpc.ChannelPoint) ([]byte, error) {
var txid []byte
// A channel point's funding txid can be get/set as a byte slice or a
// string. In the case it is a string, decode it.
switch chanPoint.GetFundingTxid().(type) {
case *lnrpc.ChannelPoint_FundingTxidBytes:
txid = chanPoint.GetFundingTxidBytes()
case *lnrpc.ChannelPoint_FundingTxidStr:
s := chanPoint.GetFundingTxidStr()
h, err := chainhash.NewHashFromStr(s)
if err != nil {
return nil, err
}
txid = h[:]
}
return txid, nil
}
// lightningNetworkWatcher is a goroutine which is able to dispatch // lightningNetworkWatcher is a goroutine which is able to dispatch
// notifications once it has been observed that a target channel has been // notifications once it has been observed that a target channel has been
// closed or opened within the network. In order to dispatch these // closed or opened within the network. In order to dispatch these
@ -510,7 +533,8 @@ func (hn *HarnessNode) lightningNetworkWatcher() {
// For each new channel, we'll increment the number of // For each new channel, we'll increment the number of
// edges seen by one. // edges seen by one.
for _, newChan := range graphUpdate.ChannelUpdates { for _, newChan := range graphUpdate.ChannelUpdates {
txid, _ := chainhash.NewHash(newChan.ChanPoint.FundingTxid) txidHash, _ := getChanPointFundingTxid(newChan.ChanPoint)
txid, _ := chainhash.NewHash(txidHash)
op := wire.OutPoint{ op := wire.OutPoint{
Hash: *txid, Hash: *txid,
Index: newChan.ChanPoint.OutputIndex, Index: newChan.ChanPoint.OutputIndex,
@ -536,7 +560,8 @@ func (hn *HarnessNode) lightningNetworkWatcher() {
// detected a channel closure while lnd was pruning the // detected a channel closure while lnd was pruning the
// channel graph. // channel graph.
for _, closedChan := range graphUpdate.ClosedChans { for _, closedChan := range graphUpdate.ClosedChans {
txid, _ := chainhash.NewHash(closedChan.ChanPoint.FundingTxid) txidHash, _ := getChanPointFundingTxid(closedChan.ChanPoint)
txid, _ := chainhash.NewHash(txidHash)
op := wire.OutPoint{ op := wire.OutPoint{
Hash: *txid, Hash: *txid,
Index: closedChan.ChanPoint.OutputIndex, Index: closedChan.ChanPoint.OutputIndex,
@ -603,7 +628,11 @@ func (hn *HarnessNode) WaitForNetworkChannelOpen(ctx context.Context,
eventChan := make(chan struct{}) eventChan := make(chan struct{})
txid, err := chainhash.NewHash(op.FundingTxid) txidHash, err := getChanPointFundingTxid(op)
if err != nil {
return err
}
txid, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
return err return err
} }
@ -634,7 +663,11 @@ func (hn *HarnessNode) WaitForNetworkChannelClose(ctx context.Context,
eventChan := make(chan struct{}) eventChan := make(chan struct{})
txid, err := chainhash.NewHash(op.FundingTxid) txidHash, err := getChanPointFundingTxid(op)
if err != nil {
return err
}
txid, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
return err return err
} }

@ -653,7 +653,15 @@ out:
switch update := fundingUpdate.Update.(type) { switch update := fundingUpdate.Update.(type) {
case *lnrpc.OpenStatusUpdate_ChanOpen: case *lnrpc.OpenStatusUpdate_ChanOpen:
chanPoint := update.ChanOpen.ChannelPoint chanPoint := update.ChanOpen.ChannelPoint
h, _ := chainhash.NewHash(chanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(chanPoint)
if err != nil {
return err
}
h, err := chainhash.NewHash(txidHash)
if err != nil {
return err
}
outpoint = wire.OutPoint{ outpoint = wire.OutPoint{
Hash: *h, Hash: *h,
Index: chanPoint.OutputIndex, Index: chanPoint.OutputIndex,
@ -772,14 +780,39 @@ func (r *rpcServer) OpenChannelSync(ctx context.Context,
chanUpdate := openUpdate.ChanPending chanUpdate := openUpdate.ChanPending
return &lnrpc.ChannelPoint{ return &lnrpc.ChannelPoint{
FundingTxid: chanUpdate.Txid, FundingTxid: &lnrpc.ChannelPoint_FundingTxidBytes{
FundingTxidBytes: chanUpdate.Txid,
},
}, nil }, nil
case <-r.quit: case <-r.quit:
return nil, nil return nil, nil
} }
} }
// CloseLink attempts to close an active channel identified by its channel // getChanPointFundingTxid returns the given channel point's funding txid in
// raw bytes.
func getChanPointFundingTxid(chanPoint *lnrpc.ChannelPoint) ([]byte, error) {
var txid []byte
// A channel point's funding txid can be get/set as a byte slice or a
// string. In the case it is a string, decode it.
switch chanPoint.GetFundingTxid().(type) {
case *lnrpc.ChannelPoint_FundingTxidBytes:
txid = chanPoint.GetFundingTxidBytes()
case *lnrpc.ChannelPoint_FundingTxidStr:
s := chanPoint.GetFundingTxidStr()
h, err := chainhash.NewHashFromStr(s)
if err != nil {
return nil, err
}
txid = h[:]
}
return txid, nil
}
// CloseChannel attempts to close an active channel identified by its channel
// point. The actions of this method can additionally be augmented to attempt // point. The actions of this method can additionally be augmented to attempt
// a force close after a timeout period in the case of an inactive peer. // a force close after a timeout period in the case of an inactive peer.
func (r *rpcServer) CloseChannel(in *lnrpc.CloseChannelRequest, func (r *rpcServer) CloseChannel(in *lnrpc.CloseChannelRequest,
@ -795,7 +828,12 @@ func (r *rpcServer) CloseChannel(in *lnrpc.CloseChannelRequest,
force := in.Force force := in.Force
index := in.ChannelPoint.OutputIndex index := in.ChannelPoint.OutputIndex
txid, err := chainhash.NewHash(in.ChannelPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(in.GetChannelPoint())
if err != nil {
rpcsLog.Errorf("[closechannel] unable to get funding txid: %v", err)
return err
}
txid, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
rpcsLog.Errorf("[closechannel] invalid txid: %v", err) rpcsLog.Errorf("[closechannel] invalid txid: %v", err)
return err return err
@ -2870,7 +2908,9 @@ func marshallTopologyChange(topChange *routing.TopologyChange) *lnrpc.GraphTopol
channelUpdates[i] = &lnrpc.ChannelEdgeUpdate{ channelUpdates[i] = &lnrpc.ChannelEdgeUpdate{
ChanId: channelUpdate.ChanID, ChanId: channelUpdate.ChanID,
ChanPoint: &lnrpc.ChannelPoint{ ChanPoint: &lnrpc.ChannelPoint{
FundingTxid: channelUpdate.ChanPoint.Hash[:], FundingTxid: &lnrpc.ChannelPoint_FundingTxidBytes{
FundingTxidBytes: channelUpdate.ChanPoint.Hash[:],
},
OutputIndex: channelUpdate.ChanPoint.Index, OutputIndex: channelUpdate.ChanPoint.Index,
}, },
Capacity: int64(channelUpdate.Capacity), Capacity: int64(channelUpdate.Capacity),
@ -2892,7 +2932,9 @@ func marshallTopologyChange(topChange *routing.TopologyChange) *lnrpc.GraphTopol
Capacity: int64(closedChan.Capacity), Capacity: int64(closedChan.Capacity),
ClosedHeight: closedChan.ClosedHeight, ClosedHeight: closedChan.ClosedHeight,
ChanPoint: &lnrpc.ChannelPoint{ ChanPoint: &lnrpc.ChannelPoint{
FundingTxid: closedChan.ChanPoint.Hash[:], FundingTxid: &lnrpc.ChannelPoint_FundingTxidBytes{
FundingTxidBytes: closedChan.ChanPoint.Hash[:],
},
OutputIndex: closedChan.ChanPoint.Index, OutputIndex: closedChan.ChanPoint.Index,
}, },
} }
@ -3148,7 +3190,11 @@ func (r *rpcServer) UpdateChannelPolicy(ctx context.Context,
// Otherwise, we're targeting an individual channel by its channel // Otherwise, we're targeting an individual channel by its channel
// point. // point.
case *lnrpc.PolicyUpdateRequest_ChanPoint: case *lnrpc.PolicyUpdateRequest_ChanPoint:
txid, err := chainhash.NewHash(scope.ChanPoint.FundingTxid) txidHash, err := getChanPointFundingTxid(scope.ChanPoint)
if err != nil {
return nil, err
}
txid, err := chainhash.NewHash(txidHash)
if err != nil { if err != nil {
return nil, err return nil, err
} }