rpc: add disconnect peer service and req/res messages

Issue: 139

This commit contains rpc service and messages for disconnecting
remote peers identified dy public key
This commit is contained in:
afederigo 2017-04-12 00:49:39 +03:00 committed by Olaoluwa Osuntokun
parent 533cd69c7b
commit cf4da784f0
5 changed files with 661 additions and 481 deletions

@ -39,6 +39,8 @@ description):
nested-pay-to-witness-key-hash (np2wkh).
* ConnectPeer
* Connects to a peer identified by a public key and host.
* DisconnectPeer
* Disconnects a peer identified by a public key.
* ListPeers
* Lists all available connected peers.
* GetInfo

@ -25,6 +25,8 @@ It has these top-level messages:
NewAddressResponse
ConnectPeerRequest
ConnectPeerResponse
DisconnectPeerRequest
DisconnectPeerResponse
HTLC
ActiveChannel
ListChannelsRequest
@ -512,6 +514,30 @@ func (m *ConnectPeerResponse) GetPeerId() int32 {
return 0
}
type DisconnectPeerRequest struct {
PubKey string `protobuf:"bytes,1,opt,name=pub_key" json:"pub_key,omitempty"`
}
func (m *DisconnectPeerRequest) Reset() { *m = DisconnectPeerRequest{} }
func (m *DisconnectPeerRequest) String() string { return proto.CompactTextString(m) }
func (*DisconnectPeerRequest) ProtoMessage() {}
func (*DisconnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (m *DisconnectPeerRequest) GetPubKey() string {
if m != nil {
return m.PubKey
}
return ""
}
type DisconnectPeerResponse struct {
}
func (m *DisconnectPeerResponse) Reset() { *m = DisconnectPeerResponse{} }
func (m *DisconnectPeerResponse) String() string { return proto.CompactTextString(m) }
func (*DisconnectPeerResponse) ProtoMessage() {}
func (*DisconnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
type HTLC struct {
Incoming bool `protobuf:"varint,1,opt,name=incoming" json:"incoming,omitempty"`
Amount int64 `protobuf:"varint,2,opt,name=amount" json:"amount,omitempty"`
@ -523,7 +549,7 @@ type HTLC struct {
func (m *HTLC) Reset() { *m = HTLC{} }
func (m *HTLC) String() string { return proto.CompactTextString(m) }
func (*HTLC) ProtoMessage() {}
func (*HTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (*HTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (m *HTLC) GetIncoming() bool {
if m != nil {
@ -578,7 +604,7 @@ type ActiveChannel struct {
func (m *ActiveChannel) Reset() { *m = ActiveChannel{} }
func (m *ActiveChannel) String() string { return proto.CompactTextString(m) }
func (*ActiveChannel) ProtoMessage() {}
func (*ActiveChannel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (*ActiveChannel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *ActiveChannel) GetActive() bool {
if m != nil {
@ -670,7 +696,7 @@ type ListChannelsRequest struct {
func (m *ListChannelsRequest) Reset() { *m = ListChannelsRequest{} }
func (m *ListChannelsRequest) String() string { return proto.CompactTextString(m) }
func (*ListChannelsRequest) ProtoMessage() {}
func (*ListChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (*ListChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
type ListChannelsResponse struct {
Channels []*ActiveChannel `protobuf:"bytes,11,rep,name=channels" json:"channels,omitempty"`
@ -679,7 +705,7 @@ type ListChannelsResponse struct {
func (m *ListChannelsResponse) Reset() { *m = ListChannelsResponse{} }
func (m *ListChannelsResponse) String() string { return proto.CompactTextString(m) }
func (*ListChannelsResponse) ProtoMessage() {}
func (*ListChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (*ListChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (m *ListChannelsResponse) GetChannels() []*ActiveChannel {
if m != nil {
@ -703,7 +729,7 @@ type Peer struct {
func (m *Peer) Reset() { *m = Peer{} }
func (m *Peer) String() string { return proto.CompactTextString(m) }
func (*Peer) ProtoMessage() {}
func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (m *Peer) GetPubKey() string {
if m != nil {
@ -774,7 +800,7 @@ type ListPeersRequest struct {
func (m *ListPeersRequest) Reset() { *m = ListPeersRequest{} }
func (m *ListPeersRequest) String() string { return proto.CompactTextString(m) }
func (*ListPeersRequest) ProtoMessage() {}
func (*ListPeersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (*ListPeersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
type ListPeersResponse struct {
Peers []*Peer `protobuf:"bytes,1,rep,name=peers" json:"peers,omitempty"`
@ -783,7 +809,7 @@ type ListPeersResponse struct {
func (m *ListPeersResponse) Reset() { *m = ListPeersResponse{} }
func (m *ListPeersResponse) String() string { return proto.CompactTextString(m) }
func (*ListPeersResponse) ProtoMessage() {}
func (*ListPeersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (*ListPeersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
func (m *ListPeersResponse) GetPeers() []*Peer {
if m != nil {
@ -798,7 +824,7 @@ type GetInfoRequest struct {
func (m *GetInfoRequest) Reset() { *m = GetInfoRequest{} }
func (m *GetInfoRequest) String() string { return proto.CompactTextString(m) }
func (*GetInfoRequest) ProtoMessage() {}
func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
type GetInfoResponse struct {
IdentityPubkey string `protobuf:"bytes,1,opt,name=identity_pubkey" json:"identity_pubkey,omitempty"`
@ -816,7 +842,7 @@ type GetInfoResponse struct {
func (m *GetInfoResponse) Reset() { *m = GetInfoResponse{} }
func (m *GetInfoResponse) String() string { return proto.CompactTextString(m) }
func (*GetInfoResponse) ProtoMessage() {}
func (*GetInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
func (*GetInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
func (m *GetInfoResponse) GetIdentityPubkey() string {
if m != nil {
@ -897,7 +923,7 @@ type ConfirmationUpdate struct {
func (m *ConfirmationUpdate) Reset() { *m = ConfirmationUpdate{} }
func (m *ConfirmationUpdate) String() string { return proto.CompactTextString(m) }
func (*ConfirmationUpdate) ProtoMessage() {}
func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
func (m *ConfirmationUpdate) GetBlockSha() []byte {
if m != nil {
@ -927,7 +953,7 @@ type ChannelOpenUpdate struct {
func (m *ChannelOpenUpdate) Reset() { *m = ChannelOpenUpdate{} }
func (m *ChannelOpenUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelOpenUpdate) ProtoMessage() {}
func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
func (m *ChannelOpenUpdate) GetChannelPoint() *ChannelPoint {
if m != nil {
@ -944,7 +970,7 @@ type ChannelCloseUpdate struct {
func (m *ChannelCloseUpdate) Reset() { *m = ChannelCloseUpdate{} }
func (m *ChannelCloseUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelCloseUpdate) ProtoMessage() {}
func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
func (m *ChannelCloseUpdate) GetClosingTxid() []byte {
if m != nil {
@ -969,7 +995,7 @@ type CloseChannelRequest struct {
func (m *CloseChannelRequest) Reset() { *m = CloseChannelRequest{} }
func (m *CloseChannelRequest) String() string { return proto.CompactTextString(m) }
func (*CloseChannelRequest) ProtoMessage() {}
func (*CloseChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
func (*CloseChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
func (m *CloseChannelRequest) GetChannelPoint() *ChannelPoint {
if m != nil {
@ -1003,7 +1029,7 @@ type CloseStatusUpdate struct {
func (m *CloseStatusUpdate) Reset() { *m = CloseStatusUpdate{} }
func (m *CloseStatusUpdate) String() string { return proto.CompactTextString(m) }
func (*CloseStatusUpdate) ProtoMessage() {}
func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
type isCloseStatusUpdate_Update interface {
isCloseStatusUpdate_Update()
@ -1152,7 +1178,7 @@ type PendingUpdate struct {
func (m *PendingUpdate) Reset() { *m = PendingUpdate{} }
func (m *PendingUpdate) String() string { return proto.CompactTextString(m) }
func (*PendingUpdate) ProtoMessage() {}
func (*PendingUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
func (*PendingUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
func (m *PendingUpdate) GetTxid() []byte {
if m != nil {
@ -1180,7 +1206,7 @@ type OpenChannelRequest struct {
func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} }
func (m *OpenChannelRequest) String() string { return proto.CompactTextString(m) }
func (*OpenChannelRequest) ProtoMessage() {}
func (*OpenChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
func (*OpenChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
func (m *OpenChannelRequest) GetTargetPeerId() int32 {
if m != nil {
@ -1235,7 +1261,7 @@ type OpenStatusUpdate struct {
func (m *OpenStatusUpdate) Reset() { *m = OpenStatusUpdate{} }
func (m *OpenStatusUpdate) String() string { return proto.CompactTextString(m) }
func (*OpenStatusUpdate) ProtoMessage() {}
func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
type isOpenStatusUpdate_Update interface {
isOpenStatusUpdate_Update()
@ -1382,7 +1408,7 @@ type PendingChannelRequest struct {
func (m *PendingChannelRequest) Reset() { *m = PendingChannelRequest{} }
func (m *PendingChannelRequest) String() string { return proto.CompactTextString(m) }
func (*PendingChannelRequest) ProtoMessage() {}
func (*PendingChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
func (*PendingChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
type PendingChannelResponse struct {
TotalLimboBalance int64 `protobuf:"varint,1,opt,name=total_limbo_balance" json:"total_limbo_balance,omitempty"`
@ -1394,7 +1420,7 @@ type PendingChannelResponse struct {
func (m *PendingChannelResponse) Reset() { *m = PendingChannelResponse{} }
func (m *PendingChannelResponse) String() string { return proto.CompactTextString(m) }
func (*PendingChannelResponse) ProtoMessage() {}
func (*PendingChannelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
func (*PendingChannelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
func (m *PendingChannelResponse) GetTotalLimboBalance() int64 {
if m != nil {
@ -1436,7 +1462,7 @@ func (m *PendingChannelResponse_PendingChannel) Reset() { *m = PendingCh
func (m *PendingChannelResponse_PendingChannel) String() string { return proto.CompactTextString(m) }
func (*PendingChannelResponse_PendingChannel) ProtoMessage() {}
func (*PendingChannelResponse_PendingChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{34, 0}
return fileDescriptor0, []int{36, 0}
}
func (m *PendingChannelResponse_PendingChannel) GetRemoteNodePub() string {
@ -1486,7 +1512,7 @@ func (m *PendingChannelResponse_PendingOpenChannel) Reset() {
func (m *PendingChannelResponse_PendingOpenChannel) String() string { return proto.CompactTextString(m) }
func (*PendingChannelResponse_PendingOpenChannel) ProtoMessage() {}
func (*PendingChannelResponse_PendingOpenChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{34, 1}
return fileDescriptor0, []int{36, 1}
}
func (m *PendingChannelResponse_PendingOpenChannel) GetChannel() *PendingChannelResponse_PendingChannel {
@ -1519,7 +1545,7 @@ func (m *PendingChannelResponse_ClosedChannel) Reset() { *m = PendingCha
func (m *PendingChannelResponse_ClosedChannel) String() string { return proto.CompactTextString(m) }
func (*PendingChannelResponse_ClosedChannel) ProtoMessage() {}
func (*PendingChannelResponse_ClosedChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{34, 2}
return fileDescriptor0, []int{36, 2}
}
func (m *PendingChannelResponse_ClosedChannel) GetChannel() *PendingChannelResponse_PendingChannel {
@ -1550,7 +1576,7 @@ func (m *PendingChannelResponse_ForceClosedChannel) Reset() {
func (m *PendingChannelResponse_ForceClosedChannel) String() string { return proto.CompactTextString(m) }
func (*PendingChannelResponse_ForceClosedChannel) ProtoMessage() {}
func (*PendingChannelResponse_ForceClosedChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{34, 3}
return fileDescriptor0, []int{36, 3}
}
func (m *PendingChannelResponse_ForceClosedChannel) GetChannel() *PendingChannelResponse_PendingChannel {
@ -1595,7 +1621,7 @@ type WalletBalanceRequest struct {
func (m *WalletBalanceRequest) Reset() { *m = WalletBalanceRequest{} }
func (m *WalletBalanceRequest) String() string { return proto.CompactTextString(m) }
func (*WalletBalanceRequest) ProtoMessage() {}
func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
func (m *WalletBalanceRequest) GetWitnessOnly() bool {
if m != nil {
@ -1611,7 +1637,7 @@ type WalletBalanceResponse struct {
func (m *WalletBalanceResponse) Reset() { *m = WalletBalanceResponse{} }
func (m *WalletBalanceResponse) String() string { return proto.CompactTextString(m) }
func (*WalletBalanceResponse) ProtoMessage() {}
func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
func (m *WalletBalanceResponse) GetBalance() float64 {
if m != nil {
@ -1626,7 +1652,7 @@ type ChannelBalanceRequest struct {
func (m *ChannelBalanceRequest) Reset() { *m = ChannelBalanceRequest{} }
func (m *ChannelBalanceRequest) String() string { return proto.CompactTextString(m) }
func (*ChannelBalanceRequest) ProtoMessage() {}
func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
type ChannelBalanceResponse struct {
Balance int64 `protobuf:"varint,1,opt,name=balance" json:"balance,omitempty"`
@ -1635,7 +1661,7 @@ type ChannelBalanceResponse struct {
func (m *ChannelBalanceResponse) Reset() { *m = ChannelBalanceResponse{} }
func (m *ChannelBalanceResponse) String() string { return proto.CompactTextString(m) }
func (*ChannelBalanceResponse) ProtoMessage() {}
func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
func (m *ChannelBalanceResponse) GetBalance() int64 {
if m != nil {
@ -1652,7 +1678,7 @@ type QueryRoutesRequest struct {
func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} }
func (m *QueryRoutesRequest) String() string { return proto.CompactTextString(m) }
func (*QueryRoutesRequest) ProtoMessage() {}
func (*QueryRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
func (*QueryRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
func (m *QueryRoutesRequest) GetPubKey() string {
if m != nil {
@ -1675,7 +1701,7 @@ type QueryRoutesResponse struct {
func (m *QueryRoutesResponse) Reset() { *m = QueryRoutesResponse{} }
func (m *QueryRoutesResponse) String() string { return proto.CompactTextString(m) }
func (*QueryRoutesResponse) ProtoMessage() {}
func (*QueryRoutesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
func (*QueryRoutesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
func (m *QueryRoutesResponse) GetRoutes() []*Route {
if m != nil {
@ -1694,7 +1720,7 @@ type Hop struct {
func (m *Hop) Reset() { *m = Hop{} }
func (m *Hop) String() string { return proto.CompactTextString(m) }
func (*Hop) ProtoMessage() {}
func (*Hop) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
func (*Hop) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
func (m *Hop) GetChanId() uint64 {
if m != nil {
@ -1734,7 +1760,7 @@ type Route struct {
func (m *Route) Reset() { *m = Route{} }
func (m *Route) String() string { return proto.CompactTextString(m) }
func (*Route) ProtoMessage() {}
func (*Route) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
func (*Route) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
func (m *Route) GetTotalTimeLock() uint32 {
if m != nil {
@ -1771,7 +1797,7 @@ type NodeInfoRequest struct {
func (m *NodeInfoRequest) Reset() { *m = NodeInfoRequest{} }
func (m *NodeInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NodeInfoRequest) ProtoMessage() {}
func (*NodeInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
func (*NodeInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
func (m *NodeInfoRequest) GetPubKey() string {
if m != nil {
@ -1789,7 +1815,7 @@ type NodeInfo struct {
func (m *NodeInfo) Reset() { *m = NodeInfo{} }
func (m *NodeInfo) String() string { return proto.CompactTextString(m) }
func (*NodeInfo) ProtoMessage() {}
func (*NodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
func (*NodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
func (m *NodeInfo) GetNode() *LightningNode {
if m != nil {
@ -1822,7 +1848,7 @@ type LightningNode struct {
func (m *LightningNode) Reset() { *m = LightningNode{} }
func (m *LightningNode) String() string { return proto.CompactTextString(m) }
func (*LightningNode) ProtoMessage() {}
func (*LightningNode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
func (*LightningNode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
func (m *LightningNode) GetLastUpdate() uint32 {
if m != nil {
@ -1860,7 +1886,7 @@ type NodeAddress struct {
func (m *NodeAddress) Reset() { *m = NodeAddress{} }
func (m *NodeAddress) String() string { return proto.CompactTextString(m) }
func (*NodeAddress) ProtoMessage() {}
func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
func (m *NodeAddress) GetNetwork() string {
if m != nil {
@ -1886,7 +1912,7 @@ type RoutingPolicy struct {
func (m *RoutingPolicy) Reset() { *m = RoutingPolicy{} }
func (m *RoutingPolicy) String() string { return proto.CompactTextString(m) }
func (*RoutingPolicy) ProtoMessage() {}
func (*RoutingPolicy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
func (*RoutingPolicy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }
func (m *RoutingPolicy) GetTimeLockDelta() uint32 {
if m != nil {
@ -1930,7 +1956,7 @@ type ChannelEdge struct {
func (m *ChannelEdge) Reset() { *m = ChannelEdge{} }
func (m *ChannelEdge) String() string { return proto.CompactTextString(m) }
func (*ChannelEdge) ProtoMessage() {}
func (*ChannelEdge) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
func (*ChannelEdge) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
func (m *ChannelEdge) GetChannelId() uint64 {
if m != nil {
@ -1994,7 +2020,7 @@ type ChannelGraphRequest struct {
func (m *ChannelGraphRequest) Reset() { *m = ChannelGraphRequest{} }
func (m *ChannelGraphRequest) String() string { return proto.CompactTextString(m) }
func (*ChannelGraphRequest) ProtoMessage() {}
func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }
func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }
type ChannelGraph struct {
Nodes []*LightningNode `protobuf:"bytes,1,rep,name=nodes" json:"nodes,omitempty"`
@ -2004,7 +2030,7 @@ type ChannelGraph struct {
func (m *ChannelGraph) Reset() { *m = ChannelGraph{} }
func (m *ChannelGraph) String() string { return proto.CompactTextString(m) }
func (*ChannelGraph) ProtoMessage() {}
func (*ChannelGraph) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
func (*ChannelGraph) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
func (m *ChannelGraph) GetNodes() []*LightningNode {
if m != nil {
@ -2027,7 +2053,7 @@ type ChanInfoRequest struct {
func (m *ChanInfoRequest) Reset() { *m = ChanInfoRequest{} }
func (m *ChanInfoRequest) String() string { return proto.CompactTextString(m) }
func (*ChanInfoRequest) ProtoMessage() {}
func (*ChanInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }
func (*ChanInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }
func (m *ChanInfoRequest) GetChanId() uint64 {
if m != nil {
@ -2042,7 +2068,7 @@ type NetworkInfoRequest struct {
func (m *NetworkInfoRequest) Reset() { *m = NetworkInfoRequest{} }
func (m *NetworkInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NetworkInfoRequest) ProtoMessage() {}
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }
type NetworkInfo struct {
GraphDiameter uint32 `protobuf:"varint,1,opt,name=graph_diameter" json:"graph_diameter,omitempty"`
@ -2059,7 +2085,7 @@ type NetworkInfo struct {
func (m *NetworkInfo) Reset() { *m = NetworkInfo{} }
func (m *NetworkInfo) String() string { return proto.CompactTextString(m) }
func (*NetworkInfo) ProtoMessage() {}
func (*NetworkInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }
func (*NetworkInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} }
func (m *NetworkInfo) GetGraphDiameter() uint32 {
if m != nil {
@ -2130,7 +2156,7 @@ type GraphTopologySubscription struct {
func (m *GraphTopologySubscription) Reset() { *m = GraphTopologySubscription{} }
func (m *GraphTopologySubscription) String() string { return proto.CompactTextString(m) }
func (*GraphTopologySubscription) ProtoMessage() {}
func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }
func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} }
type GraphTopologyUpdate struct {
NodeUpdates []*NodeUpdate `protobuf:"bytes,1,rep,name=node_updates,json=nodeUpdates" json:"node_updates,omitempty"`
@ -2141,7 +2167,7 @@ type GraphTopologyUpdate struct {
func (m *GraphTopologyUpdate) Reset() { *m = GraphTopologyUpdate{} }
func (m *GraphTopologyUpdate) String() string { return proto.CompactTextString(m) }
func (*GraphTopologyUpdate) ProtoMessage() {}
func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} }
func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} }
func (m *GraphTopologyUpdate) GetNodeUpdates() []*NodeUpdate {
if m != nil {
@ -2174,7 +2200,7 @@ type NodeUpdate struct {
func (m *NodeUpdate) Reset() { *m = NodeUpdate{} }
func (m *NodeUpdate) String() string { return proto.CompactTextString(m) }
func (*NodeUpdate) ProtoMessage() {}
func (*NodeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} }
func (*NodeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }
func (m *NodeUpdate) GetAddresses() []string {
if m != nil {
@ -2216,7 +2242,7 @@ type ChannelEdgeUpdate struct {
func (m *ChannelEdgeUpdate) Reset() { *m = ChannelEdgeUpdate{} }
func (m *ChannelEdgeUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelEdgeUpdate) ProtoMessage() {}
func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} }
func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
func (m *ChannelEdgeUpdate) GetChanId() uint64 {
if m != nil {
@ -2270,7 +2296,7 @@ type ClosedChannelUpdate struct {
func (m *ClosedChannelUpdate) Reset() { *m = ClosedChannelUpdate{} }
func (m *ClosedChannelUpdate) String() string { return proto.CompactTextString(m) }
func (*ClosedChannelUpdate) ProtoMessage() {}
func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }
func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} }
func (m *ClosedChannelUpdate) GetChanId() uint64 {
if m != nil {
@ -2307,7 +2333,7 @@ type SetAliasRequest struct {
func (m *SetAliasRequest) Reset() { *m = SetAliasRequest{} }
func (m *SetAliasRequest) String() string { return proto.CompactTextString(m) }
func (*SetAliasRequest) ProtoMessage() {}
func (*SetAliasRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
func (*SetAliasRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} }
func (m *SetAliasRequest) GetNewAlias() string {
if m != nil {
@ -2322,7 +2348,7 @@ type SetAliasResponse struct {
func (m *SetAliasResponse) Reset() { *m = SetAliasResponse{} }
func (m *SetAliasResponse) String() string { return proto.CompactTextString(m) }
func (*SetAliasResponse) ProtoMessage() {}
func (*SetAliasResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} }
func (*SetAliasResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} }
type Invoice struct {
Memo string `protobuf:"bytes,1,opt,name=memo" json:"memo,omitempty"`
@ -2339,7 +2365,7 @@ type Invoice struct {
func (m *Invoice) Reset() { *m = Invoice{} }
func (m *Invoice) String() string { return proto.CompactTextString(m) }
func (*Invoice) ProtoMessage() {}
func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} }
func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} }
func (m *Invoice) GetMemo() string {
if m != nil {
@ -2412,7 +2438,7 @@ type AddInvoiceResponse struct {
func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} }
func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*AddInvoiceResponse) ProtoMessage() {}
func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} }
func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} }
func (m *AddInvoiceResponse) GetRHash() []byte {
if m != nil {
@ -2436,7 +2462,7 @@ type PaymentHash struct {
func (m *PaymentHash) Reset() { *m = PaymentHash{} }
func (m *PaymentHash) String() string { return proto.CompactTextString(m) }
func (*PaymentHash) ProtoMessage() {}
func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} }
func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} }
func (m *PaymentHash) GetRHashStr() string {
if m != nil {
@ -2459,7 +2485,7 @@ type ListInvoiceRequest struct {
func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} }
func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceRequest) ProtoMessage() {}
func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} }
func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} }
func (m *ListInvoiceRequest) GetPendingOnly() bool {
if m != nil {
@ -2475,7 +2501,7 @@ type ListInvoiceResponse struct {
func (m *ListInvoiceResponse) Reset() { *m = ListInvoiceResponse{} }
func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceResponse) ProtoMessage() {}
func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} }
func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} }
func (m *ListInvoiceResponse) GetInvoices() []*Invoice {
if m != nil {
@ -2490,7 +2516,7 @@ type InvoiceSubscription struct {
func (m *InvoiceSubscription) Reset() { *m = InvoiceSubscription{} }
func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) }
func (*InvoiceSubscription) ProtoMessage() {}
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} }
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} }
type Payment struct {
PaymentHash string `protobuf:"bytes,1,opt,name=payment_hash" json:"payment_hash,omitempty"`
@ -2503,7 +2529,7 @@ type Payment struct {
func (m *Payment) Reset() { *m = Payment{} }
func (m *Payment) String() string { return proto.CompactTextString(m) }
func (*Payment) ProtoMessage() {}
func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} }
func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} }
func (m *Payment) GetPaymentHash() string {
if m != nil {
@ -2546,7 +2572,7 @@ type ListPaymentsRequest struct {
func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} }
func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsRequest) ProtoMessage() {}
func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} }
func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} }
type ListPaymentsResponse struct {
Payments []*Payment `protobuf:"bytes,1,rep,name=payments" json:"payments,omitempty"`
@ -2555,7 +2581,7 @@ type ListPaymentsResponse struct {
func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} }
func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsResponse) ProtoMessage() {}
func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} }
func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} }
func (m *ListPaymentsResponse) GetPayments() []*Payment {
if m != nil {
@ -2570,7 +2596,7 @@ type DeleteAllPaymentsRequest struct {
func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsRequest{} }
func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsRequest) ProtoMessage() {}
func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} }
func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} }
type DeleteAllPaymentsResponse struct {
}
@ -2578,7 +2604,7 @@ type DeleteAllPaymentsResponse struct {
func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResponse{} }
func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsResponse) ProtoMessage() {}
func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} }
func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} }
type DebugLevelRequest struct {
Show bool `protobuf:"varint,1,opt,name=show" json:"show,omitempty"`
@ -2588,7 +2614,7 @@ type DebugLevelRequest struct {
func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} }
func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) }
func (*DebugLevelRequest) ProtoMessage() {}
func (*DebugLevelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} }
func (*DebugLevelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} }
func (m *DebugLevelRequest) GetShow() bool {
if m != nil {
@ -2611,7 +2637,7 @@ type DebugLevelResponse struct {
func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} }
func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) }
func (*DebugLevelResponse) ProtoMessage() {}
func (*DebugLevelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} }
func (*DebugLevelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} }
func (m *DebugLevelResponse) GetSubSystems() string {
if m != nil {
@ -2627,7 +2653,7 @@ type PayReqString struct {
func (m *PayReqString) Reset() { *m = PayReqString{} }
func (m *PayReqString) String() string { return proto.CompactTextString(m) }
func (*PayReqString) ProtoMessage() {}
func (*PayReqString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} }
func (*PayReqString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} }
func (m *PayReqString) GetPayReq() string {
if m != nil {
@ -2645,7 +2671,7 @@ type PayReq struct {
func (m *PayReq) Reset() { *m = PayReq{} }
func (m *PayReq) String() string { return proto.CompactTextString(m) }
func (*PayReq) ProtoMessage() {}
func (*PayReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} }
func (*PayReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} }
func (m *PayReq) GetDestination() string {
if m != nil {
@ -2685,6 +2711,8 @@ func init() {
proto.RegisterType((*NewAddressResponse)(nil), "lnrpc.NewAddressResponse")
proto.RegisterType((*ConnectPeerRequest)(nil), "lnrpc.ConnectPeerRequest")
proto.RegisterType((*ConnectPeerResponse)(nil), "lnrpc.ConnectPeerResponse")
proto.RegisterType((*DisconnectPeerRequest)(nil), "lnrpc.DisconnectPeerRequest")
proto.RegisterType((*DisconnectPeerResponse)(nil), "lnrpc.DisconnectPeerResponse")
proto.RegisterType((*HTLC)(nil), "lnrpc.HTLC")
proto.RegisterType((*ActiveChannel)(nil), "lnrpc.ActiveChannel")
proto.RegisterType((*ListChannelsRequest)(nil), "lnrpc.ListChannelsRequest")
@ -2772,6 +2800,7 @@ type LightningClient interface {
NewAddress(ctx context.Context, in *NewAddressRequest, opts ...grpc.CallOption) (*NewAddressResponse, error)
NewWitnessAddress(ctx context.Context, in *NewWitnessAddressRequest, opts ...grpc.CallOption) (*NewAddressResponse, error)
ConnectPeer(ctx context.Context, in *ConnectPeerRequest, opts ...grpc.CallOption) (*ConnectPeerResponse, error)
DisconnectPeer(ctx context.Context, in *DisconnectPeerRequest, opts ...grpc.CallOption) (*DisconnectPeerResponse, error)
ListPeers(ctx context.Context, in *ListPeersRequest, opts ...grpc.CallOption) (*ListPeersResponse, error)
GetInfo(ctx context.Context, in *GetInfoRequest, opts ...grpc.CallOption) (*GetInfoResponse, error)
// TODO(roasbeef): merge with below with bool?
@ -2911,6 +2940,15 @@ func (c *lightningClient) ConnectPeer(ctx context.Context, in *ConnectPeerReques
return out, nil
}
func (c *lightningClient) DisconnectPeer(ctx context.Context, in *DisconnectPeerRequest, opts ...grpc.CallOption) (*DisconnectPeerResponse, error) {
out := new(DisconnectPeerResponse)
err := grpc.Invoke(ctx, "/lnrpc.Lightning/DisconnectPeer", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *lightningClient) ListPeers(ctx context.Context, in *ListPeersRequest, opts ...grpc.CallOption) (*ListPeersResponse, error) {
out := new(ListPeersResponse)
err := grpc.Invoke(ctx, "/lnrpc.Lightning/ListPeers", in, out, c.cc, opts...)
@ -3253,6 +3291,7 @@ type LightningServer interface {
NewAddress(context.Context, *NewAddressRequest) (*NewAddressResponse, error)
NewWitnessAddress(context.Context, *NewWitnessAddressRequest) (*NewAddressResponse, error)
ConnectPeer(context.Context, *ConnectPeerRequest) (*ConnectPeerResponse, error)
DisconnectPeer(context.Context, *DisconnectPeerRequest) (*DisconnectPeerResponse, error)
ListPeers(context.Context, *ListPeersRequest) (*ListPeersResponse, error)
GetInfo(context.Context, *GetInfoRequest) (*GetInfoResponse, error)
// TODO(roasbeef): merge with below with bool?
@ -3449,6 +3488,24 @@ func _Lightning_ConnectPeer_Handler(srv interface{}, ctx context.Context, dec fu
return interceptor(ctx, in, info, handler)
}
func _Lightning_DisconnectPeer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DisconnectPeerRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LightningServer).DisconnectPeer(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/lnrpc.Lightning/DisconnectPeer",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LightningServer).DisconnectPeer(ctx, req.(*DisconnectPeerRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Lightning_ListPeers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListPeersRequest)
if err := dec(in); err != nil {
@ -3937,6 +3994,10 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
MethodName: "ConnectPeer",
Handler: _Lightning_ConnectPeer_Handler,
},
{
MethodName: "DisconnectPeer",
Handler: _Lightning_DisconnectPeer_Handler,
},
{
MethodName: "ListPeers",
Handler: _Lightning_ListPeers_Handler,
@ -4053,262 +4114,264 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 4098 bytes of a gzipped FileDescriptorProto
// 4140 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7b, 0xcf, 0x6f, 0x1c, 0xc9,
0x75, 0xbf, 0x7a, 0x38, 0x24, 0x67, 0xde, 0xcc, 0xf0, 0x47, 0x91, 0x22, 0x47, 0x43, 0xad, 0xac,
0x2d, 0x0b, 0x2b, 0x7e, 0x65, 0x83, 0xe4, 0xf2, 0x1b, 0x6c, 0xe4, 0x55, 0x92, 0x05, 0x57, 0xd2,
0x8a, 0x0b, 0xd3, 0x5a, 0xba, 0xa9, 0x5d, 0x25, 0x36, 0x82, 0x49, 0x73, 0xba, 0x38, 0x6c, 0xab,
0xa7, 0xbb, 0xb7, 0xbb, 0x86, 0xd4, 0x58, 0x20, 0x12, 0x6c, 0x7c, 0x4c, 0x60, 0x04, 0xbe, 0x1b,
0x09, 0x72, 0xce, 0x25, 0xc7, 0xe4, 0x3f, 0x08, 0x10, 0xc0, 0x80, 0x4f, 0xb9, 0x07, 0xb9, 0xe7,
0x90, 0x5b, 0x0e, 0xc1, 0xab, 0x1f, 0xdd, 0x55, 0xdd, 0x4d, 0xad, 0x82, 0x04, 0x39, 0x71, 0xea,
0x53, 0xaf, 0x5f, 0x55, 0xbd, 0x7a, 0xbf, 0xea, 0x55, 0x11, 0xda, 0x69, 0x32, 0xda, 0x49, 0xd2,
0x98, 0xc7, 0x64, 0x3e, 0x8c, 0xd2, 0x64, 0x34, 0xb8, 0x3d, 0x8e, 0xe3, 0x71, 0xc8, 0x76, 0xbd,
0x24, 0xd8, 0xf5, 0xa2, 0x28, 0xe6, 0x1e, 0x0f, 0xe2, 0x28, 0x93, 0x44, 0xf4, 0xdf, 0x1d, 0xe8,
0xbc, 0x48, 0xbd, 0x28, 0xf3, 0x46, 0x08, 0x93, 0x3e, 0x2c, 0xf2, 0xd7, 0xc3, 0x73, 0x2f, 0x3b,
0xef, 0x3b, 0x77, 0x9d, 0xed, 0xb6, 0xab, 0x9b, 0x64, 0x03, 0x16, 0xbc, 0x49, 0x3c, 0x8d, 0x78,
0xbf, 0x71, 0xd7, 0xd9, 0x9e, 0x73, 0x55, 0x8b, 0x7c, 0x1f, 0x56, 0xa3, 0xe9, 0x64, 0x38, 0x8a,
0xa3, 0xb3, 0x20, 0x9d, 0x48, 0xe6, 0xfd, 0xb9, 0xbb, 0xce, 0xf6, 0xbc, 0x5b, 0xed, 0x20, 0x77,
0x00, 0x4e, 0xc3, 0x78, 0xf4, 0x4a, 0x0e, 0xd1, 0x14, 0x43, 0x18, 0x08, 0xa1, 0xd0, 0x55, 0x2d,
0x16, 0x8c, 0xcf, 0x79, 0x7f, 0x5e, 0x30, 0xb2, 0x30, 0xe4, 0xc1, 0x83, 0x09, 0x1b, 0x66, 0xdc,
0x9b, 0x24, 0xfd, 0x05, 0x31, 0x1b, 0x03, 0x11, 0xfd, 0x31, 0xf7, 0xc2, 0xe1, 0x19, 0x63, 0x59,
0x7f, 0x51, 0xf5, 0xe7, 0x08, 0xed, 0xc3, 0xc6, 0x33, 0xc6, 0x8d, 0x55, 0x67, 0x2e, 0xfb, 0x7a,
0xca, 0x32, 0x4e, 0x8f, 0x80, 0x18, 0xf0, 0x13, 0xc6, 0xbd, 0x20, 0xcc, 0xc8, 0x47, 0xd0, 0xe5,
0x06, 0x71, 0xdf, 0xb9, 0x3b, 0xb7, 0xdd, 0xd9, 0x27, 0x3b, 0x42, 0xbe, 0x3b, 0xc6, 0x07, 0xae,
0x45, 0x47, 0x7f, 0xe3, 0x40, 0xe7, 0x84, 0x45, 0xbe, 0xe2, 0x4e, 0x08, 0x34, 0x7d, 0x96, 0x71,
0x21, 0xd8, 0xae, 0x2b, 0x7e, 0x93, 0xef, 0x40, 0x07, 0xff, 0x0e, 0x33, 0x9e, 0x06, 0xd1, 0x58,
0x88, 0xb6, 0xed, 0x02, 0x42, 0x27, 0x02, 0x21, 0x2b, 0x30, 0xe7, 0x4d, 0xb8, 0x10, 0xe8, 0x9c,
0x8b, 0x3f, 0xc9, 0xfb, 0xd0, 0x4d, 0xbc, 0xd9, 0x84, 0x45, 0xbc, 0x10, 0x62, 0xd7, 0xed, 0x28,
0xec, 0x10, 0xa5, 0xb8, 0x03, 0x6b, 0x26, 0x89, 0xe6, 0x3e, 0x2f, 0xb8, 0xaf, 0x1a, 0x94, 0x6a,
0x90, 0xfb, 0xb0, 0xac, 0xe9, 0x53, 0x39, 0x59, 0x21, 0xd6, 0xb6, 0xbb, 0xa4, 0x60, 0x2d, 0xa0,
0x08, 0xba, 0x72, 0x45, 0x59, 0x12, 0x47, 0x19, 0x23, 0x0f, 0x60, 0x45, 0x7f, 0x98, 0xa4, 0x2c,
0x98, 0x78, 0x63, 0xa6, 0x96, 0x57, 0xc1, 0xc9, 0x3e, 0xf4, 0xf2, 0x41, 0xe2, 0x29, 0x67, 0x62,
0xb1, 0x9d, 0xfd, 0xae, 0x92, 0xa3, 0x8b, 0x98, 0x6b, 0x93, 0xd0, 0x6f, 0x1c, 0xe8, 0x3e, 0x3e,
0xf7, 0xa2, 0x88, 0x85, 0xc7, 0x71, 0x10, 0x71, 0xd4, 0x8f, 0xb3, 0x69, 0xe4, 0x07, 0xd1, 0x78,
0xc8, 0x5f, 0x07, 0xbe, 0x1a, 0xcc, 0xc2, 0x70, 0x52, 0x66, 0x1b, 0x57, 0xaf, 0x04, 0x5b, 0xc1,
0x91, 0x5f, 0x3c, 0xe5, 0xc9, 0x94, 0x0f, 0x83, 0xc8, 0x67, 0xaf, 0x85, 0x9c, 0x7b, 0xae, 0x85,
0xd1, 0x3f, 0x80, 0x95, 0x23, 0x54, 0xbc, 0x28, 0x88, 0xc6, 0x07, 0xbe, 0x9f, 0xb2, 0x2c, 0x43,
0x6b, 0x48, 0xa6, 0xa7, 0xaf, 0xd8, 0x4c, 0x99, 0x89, 0x6a, 0xe1, 0x1e, 0x9f, 0xc7, 0x19, 0x57,
0xe3, 0x89, 0xdf, 0xf4, 0xaf, 0x1d, 0x58, 0x46, 0xa9, 0xfd, 0xc8, 0x8b, 0x66, 0x5a, 0x17, 0x8e,
0xa0, 0x8b, 0xac, 0x5e, 0xc4, 0x07, 0xd2, 0xa6, 0xa4, 0x4e, 0x6d, 0x2b, 0x59, 0x94, 0xa8, 0x77,
0x4c, 0xd2, 0xa7, 0x11, 0x4f, 0x67, 0xae, 0xf5, 0xf5, 0xe0, 0x13, 0x58, 0xad, 0x90, 0xa0, 0xe6,
0x14, 0xf3, 0xc3, 0x9f, 0x64, 0x1d, 0xe6, 0x2f, 0xbc, 0x70, 0xca, 0x94, 0x05, 0xcb, 0xc6, 0xc7,
0x8d, 0x87, 0x0e, 0xfd, 0x00, 0x56, 0x8a, 0x31, 0xd5, 0xde, 0x12, 0x68, 0xe6, 0x22, 0x6e, 0xbb,
0xe2, 0x37, 0x8a, 0x02, 0xe9, 0x1e, 0xc7, 0x41, 0x6e, 0x34, 0x48, 0xe7, 0xf9, 0x7e, 0xaa, 0xe9,
0xf0, 0xf7, 0x75, 0xce, 0x82, 0xde, 0x87, 0x55, 0xe3, 0xfb, 0xb7, 0x0c, 0xf4, 0x6b, 0x07, 0x56,
0x9f, 0xb3, 0x4b, 0x25, 0x6e, 0x3d, 0xd4, 0x43, 0x68, 0xf2, 0x59, 0x22, 0x55, 0x6c, 0x69, 0xff,
0x9e, 0x92, 0x56, 0x85, 0x6e, 0x47, 0x35, 0x5f, 0xcc, 0x12, 0xe6, 0x8a, 0x2f, 0xe8, 0x17, 0xd0,
0x31, 0x40, 0xb2, 0x09, 0x6b, 0x2f, 0x3f, 0x7f, 0xf1, 0xfc, 0xe9, 0xc9, 0xc9, 0xf0, 0xf8, 0xcb,
0x4f, 0x7f, 0xf8, 0xf4, 0x8f, 0x86, 0x87, 0x07, 0x27, 0x87, 0x2b, 0x37, 0xc8, 0x06, 0x90, 0xe7,
0x4f, 0x4f, 0x5e, 0x3c, 0x7d, 0x62, 0xe1, 0x0e, 0x59, 0x86, 0x8e, 0x09, 0x34, 0xe8, 0x00, 0xfa,
0xcf, 0xd9, 0xe5, 0xcb, 0x80, 0x47, 0x2c, 0xcb, 0xec, 0xe1, 0xe9, 0x0e, 0x10, 0x73, 0x4e, 0x6a,
0x99, 0x7d, 0x58, 0xf4, 0x24, 0xa4, 0x5d, 0xab, 0x6a, 0xd2, 0x2f, 0x81, 0x3c, 0x8e, 0xa3, 0x88,
0x8d, 0xf8, 0x31, 0x63, 0xa9, 0x5e, 0xec, 0xf7, 0x0c, 0xb9, 0x76, 0xf6, 0x37, 0xd5, 0x62, 0xcb,
0x9a, 0xa8, 0x04, 0x4e, 0xa0, 0x99, 0xb0, 0x74, 0x22, 0xc4, 0xdd, 0x72, 0xc5, 0x6f, 0xba, 0x0b,
0x6b, 0x16, 0xdb, 0x62, 0x1e, 0x09, 0x63, 0xe9, 0x50, 0x49, 0x7c, 0xde, 0xd5, 0x4d, 0xfa, 0xf7,
0x0e, 0x34, 0x0f, 0x5f, 0x1c, 0x3d, 0x26, 0x03, 0x68, 0x05, 0xd1, 0x28, 0x9e, 0xa0, 0xd3, 0x70,
0x04, 0xc7, 0xbc, 0x7d, 0x6d, 0x1c, 0xb8, 0x0d, 0x6d, 0xe1, 0x6b, 0xd0, 0x53, 0x0b, 0x33, 0xea,
0xba, 0x05, 0x80, 0x51, 0x82, 0xbd, 0x4e, 0x82, 0x54, 0x84, 0x01, 0xed, 0xdc, 0x9b, 0xc2, 0xd8,
0xaa, 0x1d, 0x68, 0xc1, 0x29, 0xbb, 0x88, 0x47, 0x12, 0xf4, 0x59, 0xe8, 0xcd, 0x84, 0xf3, 0xea,
0xb9, 0x15, 0x9c, 0xfe, 0xdb, 0x1c, 0xf4, 0x0e, 0x46, 0x3c, 0xb8, 0x60, 0xca, 0x51, 0x88, 0x19,
0x0a, 0x40, 0xcd, 0x5d, 0xb5, 0xc8, 0x3d, 0xe8, 0xa5, 0x6c, 0x12, 0x73, 0x36, 0x54, 0xa6, 0x2b,
0x8d, 0xd4, 0x06, 0x91, 0x6a, 0x24, 0x19, 0x0d, 0x13, 0x74, 0x39, 0x62, 0x2d, 0x6d, 0xd7, 0x06,
0x51, 0x88, 0x08, 0xa0, 0x10, 0x71, 0x15, 0x4d, 0x57, 0x37, 0x51, 0x76, 0x23, 0x2f, 0xf1, 0x46,
0x01, 0x97, 0x73, 0x9e, 0x73, 0xf3, 0x36, 0xf2, 0x0e, 0xe3, 0x91, 0x17, 0x0e, 0x4f, 0xbd, 0xd0,
0x8b, 0x46, 0x4c, 0x05, 0x2f, 0x1b, 0x24, 0x1f, 0xc0, 0x92, 0x9a, 0x92, 0x26, 0x93, 0x31, 0xac,
0x84, 0xa2, 0x4c, 0xa7, 0x51, 0xc6, 0x38, 0x0f, 0x99, 0x9f, 0x93, 0xb6, 0x04, 0x69, 0xb5, 0x83,
0xec, 0xc1, 0x9a, 0x8c, 0x81, 0x99, 0xc7, 0xe3, 0xec, 0x3c, 0xc8, 0x86, 0x19, 0x8b, 0x78, 0xbf,
0x2d, 0xe8, 0xeb, 0xba, 0xc8, 0x43, 0xd8, 0x2c, 0xc1, 0x29, 0x1b, 0xb1, 0xe0, 0x82, 0xf9, 0x7d,
0x10, 0x5f, 0x5d, 0xd7, 0x4d, 0xee, 0x42, 0x07, 0x43, 0xff, 0x34, 0xf1, 0x3d, 0xce, 0xb2, 0x7e,
0x47, 0x48, 0xc8, 0x84, 0xc8, 0x87, 0xd0, 0x4b, 0x98, 0xf4, 0xc5, 0xe7, 0x3c, 0x1c, 0x65, 0xfd,
0xae, 0x70, 0x80, 0x1d, 0xa5, 0xe5, 0xa8, 0x85, 0xae, 0x4d, 0x41, 0x6f, 0xc2, 0xda, 0x51, 0x90,
0x71, 0xb5, 0xcb, 0xb9, 0xb1, 0x1d, 0xc2, 0xba, 0x0d, 0x2b, 0x35, 0xdf, 0x83, 0x96, 0xda, 0x32,
0x9c, 0x00, 0x32, 0x5f, 0x57, 0xcc, 0x2d, 0x6d, 0x71, 0x73, 0x2a, 0xfa, 0x8b, 0x06, 0x34, 0xd1,
0x52, 0x84, 0x85, 0x4c, 0x4f, 0x87, 0x85, 0xf7, 0xd4, 0x4d, 0xd3, 0x76, 0x1a, 0x96, 0xed, 0x98,
0xd6, 0x3d, 0x67, 0x59, 0xb7, 0x48, 0x79, 0x66, 0x9c, 0x29, 0x79, 0x4b, 0x6d, 0x31, 0x90, 0xa2,
0x3f, 0x65, 0xa3, 0x0b, 0xa1, 0x32, 0x79, 0x3f, 0x22, 0xa8, 0x50, 0x99, 0xc7, 0xe5, 0xd7, 0x52,
0x5f, 0xf2, 0xb6, 0xee, 0x13, 0x5f, 0x2e, 0x16, 0x7d, 0xe2, 0xbb, 0x3e, 0x2c, 0x06, 0xd1, 0x69,
0x3c, 0x8d, 0x7c, 0xa1, 0x14, 0x2d, 0x57, 0x37, 0xd1, 0x54, 0x13, 0x11, 0x05, 0x83, 0x09, 0x53,
0x0a, 0x50, 0x00, 0x94, 0x60, 0xb8, 0xcb, 0x84, 0xcf, 0xc8, 0x85, 0xfc, 0x11, 0xac, 0x1a, 0x98,
0x92, 0xf0, 0xfb, 0x30, 0x8f, 0xab, 0xd7, 0x09, 0x91, 0xde, 0x3b, 0xe1, 0x6c, 0x64, 0x0f, 0x5d,
0x81, 0xa5, 0x67, 0x8c, 0x7f, 0x1e, 0x9d, 0xc5, 0x9a, 0xd3, 0x7f, 0x34, 0x60, 0x39, 0x87, 0x14,
0xa3, 0x6d, 0x58, 0x0e, 0x7c, 0x16, 0xf1, 0x80, 0xcf, 0x86, 0x56, 0x54, 0x2d, 0xc3, 0x18, 0xc1,
0xbc, 0x30, 0xf0, 0x32, 0x65, 0xba, 0xb2, 0x41, 0xf6, 0x61, 0x1d, 0x75, 0x4b, 0xab, 0x4b, 0xbe,
0xed, 0x32, 0x98, 0xd7, 0xf6, 0xa1, 0x39, 0x20, 0x2e, 0x5d, 0x43, 0xf1, 0x89, 0x74, 0x49, 0x75,
0x5d, 0x28, 0x35, 0xc9, 0x09, 0x97, 0x2c, 0xbd, 0x51, 0x01, 0x54, 0x12, 0xd7, 0x05, 0x99, 0x48,
0x94, 0x13, 0x57, 0x23, 0xf9, 0x6d, 0x55, 0x92, 0xdf, 0x6d, 0x58, 0xce, 0x66, 0xd1, 0x88, 0xf9,
0x43, 0x1e, 0xe3, 0xb8, 0x41, 0x24, 0x76, 0xa7, 0xe5, 0x96, 0x61, 0x91, 0xa6, 0xb3, 0x8c, 0x47,
0x8c, 0x0b, 0x53, 0x6c, 0xb9, 0xba, 0x89, 0xce, 0x4f, 0x90, 0x48, 0xa5, 0x6f, 0xbb, 0xaa, 0x45,
0x7f, 0x2e, 0x62, 0x4c, 0x9e, 0x89, 0x7f, 0x29, 0xec, 0x90, 0x6c, 0x41, 0x5b, 0x8e, 0x9f, 0x9d,
0x7b, 0x2a, 0x97, 0x6a, 0x09, 0xe0, 0xe4, 0xdc, 0xc3, 0x44, 0xd3, 0x5a, 0x92, 0xd4, 0xf8, 0x8e,
0xc0, 0x0e, 0xe5, 0x8a, 0xee, 0xc1, 0x92, 0xce, 0xf1, 0xb3, 0x61, 0xc8, 0xce, 0xb8, 0x4e, 0xa0,
0xa2, 0xe9, 0x04, 0x87, 0xcb, 0x8e, 0xd8, 0x19, 0xa7, 0xcf, 0x61, 0x55, 0x59, 0xdb, 0x17, 0x09,
0xd3, 0x43, 0xff, 0xa0, 0xec, 0x67, 0x65, 0x9c, 0x5b, 0x53, 0x5a, 0x64, 0x66, 0x7d, 0x25, 0xe7,
0x4b, 0x5d, 0x20, 0xaa, 0xfb, 0x71, 0x18, 0x67, 0x4c, 0x31, 0xa4, 0xd0, 0x1d, 0x85, 0x71, 0x56,
0x4e, 0x0d, 0x4d, 0x0c, 0xe5, 0x96, 0x4d, 0x47, 0x23, 0xb4, 0x52, 0x19, 0x29, 0x75, 0x93, 0xfe,
0xc2, 0x81, 0x35, 0xc1, 0x4d, 0xfb, 0x85, 0x3c, 0xe5, 0x78, 0xf7, 0x69, 0x76, 0x47, 0x66, 0xaa,
0xfa, 0x9e, 0x3a, 0xa6, 0x84, 0xc1, 0x24, 0xd0, 0xc1, 0xb2, 0x8d, 0xc8, 0x11, 0x02, 0xa8, 0xca,
0x67, 0x71, 0x3a, 0x62, 0x42, 0x62, 0x2d, 0x57, 0x36, 0xe8, 0xbf, 0x38, 0xb0, 0x2a, 0xa6, 0x71,
0xc2, 0x3d, 0x3e, 0xcd, 0xd4, 0xd2, 0x7e, 0x0f, 0x7a, 0xb8, 0x0c, 0xa6, 0xd5, 0x58, 0x4d, 0x62,
0x3d, 0xb7, 0x38, 0x81, 0x4a, 0xe2, 0xc3, 0x1b, 0xae, 0x4d, 0x4c, 0x3e, 0x81, 0xae, 0x79, 0x08,
0x53, 0x79, 0xf7, 0x2d, 0xbd, 0x82, 0x8a, 0x56, 0x1c, 0xde, 0x70, 0xad, 0x0f, 0xc8, 0x23, 0x00,
0x11, 0xdd, 0x04, 0x5b, 0x31, 0x5f, 0xe3, 0xf3, 0xca, 0x46, 0x1c, 0xde, 0x70, 0x0d, 0xf2, 0x4f,
0x5b, 0xb0, 0x20, 0x9d, 0x3e, 0x7d, 0x06, 0x3d, 0x6b, 0xa6, 0x56, 0xe2, 0xd7, 0x95, 0x89, 0x5f,
0x25, 0x21, 0x6f, 0xd4, 0x24, 0xe4, 0xff, 0xe9, 0x00, 0x41, 0x4d, 0x2a, 0x6d, 0xd5, 0x07, 0xb0,
0xc4, 0xbd, 0x74, 0xcc, 0xf8, 0xd0, 0xce, 0x6f, 0x4a, 0xa8, 0x88, 0x4e, 0xb1, 0x6f, 0x65, 0x01,
0x5d, 0xd7, 0x84, 0xc8, 0x0e, 0x10, 0xa3, 0xa9, 0x8f, 0x4f, 0xd2, 0xaf, 0xd7, 0xf4, 0xa0, 0x03,
0x92, 0x21, 0x5c, 0x9f, 0x2f, 0x54, 0x86, 0xd4, 0x14, 0x9b, 0x5e, 0xdb, 0x87, 0xae, 0x3b, 0x99,
0xe2, 0xd9, 0xcc, 0xe3, 0x3a, 0x4f, 0xd0, 0x6d, 0xed, 0x6a, 0x84, 0x59, 0x29, 0x4f, 0x52, 0x00,
0xf4, 0xb7, 0x0e, 0xac, 0xe0, 0xf2, 0x2d, 0x15, 0xf9, 0x18, 0x84, 0xf6, 0xbd, 0xa3, 0x86, 0x58,
0xb4, 0xff, 0x73, 0x05, 0x79, 0x08, 0x6d, 0xc1, 0x30, 0x4e, 0x58, 0xa4, 0xf4, 0xa3, 0x6f, 0xeb,
0x47, 0x61, 0xf8, 0x87, 0x37, 0xdc, 0x82, 0xd8, 0xd0, 0x8e, 0x4d, 0xb8, 0xa9, 0x66, 0x69, 0x6f,
0x2b, 0xfd, 0x9b, 0x36, 0x6c, 0x94, 0x7b, 0xf2, 0x18, 0xaf, 0x12, 0x97, 0x30, 0x98, 0x9c, 0xc6,
0x79, 0x0e, 0xe4, 0x98, 0x39, 0x8d, 0xd5, 0x45, 0xce, 0xe0, 0xa6, 0x0e, 0x05, 0x38, 0x7e, 0xe1,
0xf8, 0x1b, 0x22, 0x86, 0xed, 0xd9, 0xf2, 0x2a, 0x8d, 0xa7, 0x61, 0x53, 0xf7, 0xea, 0xd9, 0x91,
0x31, 0xf4, 0xf3, 0x90, 0xa3, 0x1c, 0x90, 0x11, 0x96, 0x70, 0xa8, 0xef, 0xbd, 0x7d, 0x28, 0x61,
0x50, 0xbe, 0x46, 0xaf, 0x65, 0x46, 0x5e, 0xc3, 0x1d, 0xdd, 0x27, 0x3c, 0x48, 0x75, 0xb8, 0xe6,
0xbb, 0xac, 0xec, 0x33, 0xfc, 0xd6, 0x1e, 0xf3, 0x5b, 0xf8, 0x0e, 0xfe, 0xc9, 0x81, 0x25, 0x9b,
0x1b, 0x06, 0x30, 0x95, 0xa3, 0x6a, 0x23, 0xd1, 0x81, 0xbc, 0x04, 0x57, 0xb3, 0xec, 0x46, 0x5d,
0x96, 0x6d, 0xe6, 0xd2, 0x73, 0xdf, 0x96, 0x4b, 0x37, 0xdf, 0x2d, 0x97, 0x9e, 0xaf, 0xcb, 0xa5,
0x07, 0xff, 0xe0, 0x00, 0xa9, 0xee, 0x2e, 0xf9, 0x4c, 0xa6, 0xf9, 0x11, 0x0b, 0x95, 0x41, 0x7d,
0xff, 0x9d, 0x14, 0x44, 0xc3, 0xfa, 0x63, 0x54, 0x54, 0xd3, 0x60, 0xcc, 0x88, 0xda, 0x73, 0xeb,
0xba, 0xf0, 0x08, 0x24, 0x02, 0x6d, 0x36, 0xe4, 0x41, 0x18, 0x16, 0x96, 0xd5, 0x73, 0x2b, 0xf8,
0xe0, 0x0d, 0xf4, 0xac, 0xad, 0xfb, 0x5f, 0x9b, 0x76, 0x39, 0xa4, 0xca, 0x4d, 0xb2, 0xb0, 0xc1,
0x37, 0x0d, 0x20, 0x55, 0xed, 0xf9, 0xbf, 0x9c, 0x82, 0x50, 0x05, 0xcb, 0x01, 0xcc, 0x29, 0x55,
0xb0, 0x4c, 0x7f, 0x1b, 0x96, 0x27, 0x1e, 0x9f, 0xa6, 0x98, 0x4e, 0x5a, 0x07, 0xd0, 0x32, 0x8c,
0xbb, 0x55, 0xc8, 0x78, 0xa8, 0x7b, 0x55, 0xce, 0x57, 0xd7, 0x45, 0x7f, 0x00, 0xeb, 0x2f, 0xbd,
0x30, 0x64, 0xfc, 0x53, 0x39, 0x98, 0x0e, 0x49, 0xef, 0x43, 0xf7, 0x52, 0x96, 0x08, 0x86, 0x71,
0x14, 0xce, 0xd4, 0x81, 0xb4, 0xa3, 0xb0, 0x2f, 0xa2, 0x70, 0x46, 0x3f, 0x84, 0x9b, 0xa5, 0x4f,
0x8b, 0x73, 0xba, 0xe9, 0xd0, 0x1c, 0x57, 0x37, 0xd1, 0x55, 0x2a, 0x39, 0xd9, 0xc3, 0xd1, 0x7d,
0xd8, 0x28, 0x77, 0xd4, 0x33, 0x9b, 0x2b, 0x98, 0x7d, 0x02, 0xe4, 0xc7, 0x53, 0x96, 0xce, 0x44,
0xfd, 0x2d, 0xaf, 0xb4, 0x6c, 0x96, 0x8f, 0x40, 0x0b, 0xc9, 0xf4, 0xf4, 0x87, 0x6c, 0xa6, 0xeb,
0x91, 0x8d, 0xbc, 0x1e, 0x49, 0x1f, 0xc1, 0x9a, 0xc5, 0x40, 0x8d, 0x78, 0x0f, 0x16, 0x44, 0x0d,
0x4f, 0x1f, 0x0f, 0xec, 0x3a, 0x9f, 0xea, 0xa3, 0x7f, 0x0a, 0x73, 0x87, 0x71, 0x62, 0x1e, 0xa7,
0x1d, 0xfb, 0x38, 0xad, 0x1c, 0xc5, 0x30, 0xf7, 0x03, 0x72, 0x64, 0x1b, 0x44, 0x33, 0xf7, 0x26,
0x1c, 0xf3, 0xe3, 0xb3, 0x38, 0xbd, 0xf4, 0x52, 0x5f, 0xa9, 0x40, 0x09, 0xc5, 0xd9, 0x9f, 0x31,
0xed, 0x2a, 0xf0, 0x27, 0xfd, 0xa5, 0x03, 0xf3, 0x62, 0x4a, 0xa8, 0x1f, 0x32, 0x62, 0xc8, 0xac,
0x2d, 0x1e, 0xbd, 0x12, 0x73, 0xe9, 0xb9, 0x65, 0xb8, 0x54, 0x60, 0x6e, 0x94, 0x0b, 0xcc, 0x18,
0xbe, 0x65, 0xab, 0xa8, 0xdc, 0x16, 0x00, 0xb9, 0x03, 0xcd, 0xf3, 0x38, 0xd1, 0x7e, 0x19, 0xf4,
0x89, 0x37, 0x4e, 0x5c, 0x81, 0xd3, 0x07, 0xb0, 0xfc, 0x3c, 0xf6, 0x99, 0x71, 0x68, 0xba, 0x76,
0x37, 0xe8, 0x9f, 0x39, 0xd0, 0xd2, 0xc4, 0x64, 0x1b, 0x9a, 0xe8, 0x5f, 0x4b, 0xa1, 0x3f, 0x2f,
0x18, 0x21, 0x9d, 0x2b, 0x28, 0xd0, 0xa8, 0x44, 0x3a, 0x51, 0x04, 0x3f, 0x9d, 0xb4, 0x17, 0x81,
0x05, 0xb3, 0x29, 0x31, 0xe7, 0x92, 0x07, 0x2e, 0xa1, 0xf4, 0x57, 0x0e, 0xf4, 0xac, 0x31, 0x30,
0xbf, 0x0a, 0xbd, 0x8c, 0xab, 0xb3, 0xbe, 0x12, 0xa2, 0x09, 0x99, 0x07, 0xec, 0x86, 0x7d, 0xc0,
0xce, 0x0f, 0x78, 0x73, 0xe6, 0x01, 0x6f, 0x0f, 0xda, 0xea, 0x34, 0xcd, 0xb4, 0xdc, 0x74, 0xf9,
0x1d, 0x47, 0xd4, 0xa5, 0xb0, 0x82, 0x88, 0x3e, 0x82, 0x8e, 0xd1, 0x83, 0x03, 0x46, 0x8c, 0x5f,
0xc6, 0xe9, 0x2b, 0x7d, 0xa2, 0x57, 0xcd, 0xbc, 0x7a, 0xd9, 0x28, 0xaa, 0x97, 0xf4, 0xef, 0x1c,
0xe8, 0xa1, 0x4e, 0x04, 0xd1, 0xf8, 0x38, 0x0e, 0x83, 0xd1, 0x4c, 0xe8, 0x86, 0xde, 0xfe, 0xa1,
0xcf, 0x42, 0xee, 0xe5, 0xba, 0x61, 0xc3, 0x18, 0xb2, 0x26, 0x41, 0x24, 0x4a, 0x16, 0x4a, 0x33,
0xf2, 0x36, 0xea, 0xf2, 0x19, 0xc3, 0x98, 0x93, 0xb1, 0xe1, 0x04, 0xf3, 0x3e, 0xe5, 0xa7, 0x2c,
0x10, 0xbd, 0x0f, 0x02, 0xa9, 0xc7, 0xd9, 0x70, 0x12, 0x84, 0x61, 0x20, 0x69, 0xa5, 0xce, 0xd6,
0x75, 0xd1, 0x7f, 0x6c, 0x40, 0x47, 0xd9, 0xfd, 0x53, 0x7f, 0xcc, 0x50, 0x3f, 0x75, 0x1c, 0xcd,
0x0d, 0xca, 0x40, 0x74, 0xbf, 0x15, 0x79, 0x0d, 0xa4, 0xbc, 0x81, 0x73, 0xd5, 0x0d, 0xc4, 0x04,
0x35, 0xf6, 0xd9, 0x87, 0x22, 0xc4, 0xcb, 0x5b, 0x9c, 0x02, 0xd0, 0xbd, 0xfb, 0xa2, 0x77, 0xbe,
0xe8, 0x15, 0x80, 0x15, 0xd4, 0x17, 0x4a, 0x41, 0xfd, 0x21, 0x74, 0x15, 0x1b, 0x21, 0x77, 0x51,
0xd3, 0x28, 0x54, 0xd9, 0xda, 0x13, 0xd7, 0xa2, 0xd4, 0x5f, 0xee, 0xeb, 0x2f, 0x5b, 0xdf, 0xf6,
0xa5, 0xa6, 0xa4, 0x37, 0x61, 0x4d, 0x09, 0xef, 0x59, 0xea, 0x25, 0xe7, 0xda, 0x97, 0xfa, 0xf9,
0xcd, 0x83, 0x80, 0xc9, 0x03, 0x98, 0xc7, 0xcf, 0xb4, 0x3b, 0xab, 0x37, 0x2f, 0x49, 0x42, 0xb6,
0x61, 0x9e, 0xf9, 0x63, 0xa6, 0xb3, 0x4a, 0x62, 0xe7, 0xc2, 0xb8, 0x47, 0xae, 0x24, 0x40, 0x63,
0x47, 0xb4, 0x64, 0xec, 0xb6, 0x2f, 0xc4, 0x23, 0x7c, 0xf4, 0xb9, 0x4f, 0xd7, 0x81, 0x3c, 0x97,
0x5a, 0x6b, 0x16, 0x54, 0xfe, 0x7c, 0x0e, 0x3a, 0x06, 0x8c, 0x76, 0x3b, 0xc6, 0x09, 0x0f, 0xfd,
0xc0, 0x9b, 0x30, 0xce, 0x52, 0xa5, 0xa9, 0x25, 0x54, 0xb8, 0xcc, 0x8b, 0xf1, 0x30, 0x9e, 0xf2,
0xa1, 0xcf, 0xc6, 0x29, 0x93, 0xb7, 0x02, 0x8e, 0x5b, 0x42, 0x91, 0x6e, 0xe2, 0xbd, 0x36, 0xe9,
0xa4, 0x3e, 0x94, 0x50, 0x7d, 0x66, 0x91, 0x32, 0x6a, 0x16, 0x67, 0x16, 0x29, 0x91, 0xb2, 0xc7,
0x99, 0xaf, 0xf1, 0x38, 0x1f, 0xc1, 0x86, 0xf4, 0x2d, 0xca, 0x36, 0x87, 0x25, 0x35, 0xb9, 0xa6,
0x17, 0x53, 0x25, 0x9c, 0xb3, 0x56, 0xf0, 0x2c, 0xf8, 0xb9, 0xac, 0x98, 0x3a, 0x6e, 0x05, 0x47,
0x5a, 0x34, 0x47, 0x8b, 0x56, 0x96, 0x4c, 0x2b, 0xb8, 0xa0, 0xf5, 0x5e, 0xdb, 0xb4, 0x6d, 0x45,
0x5b, 0xc2, 0xe9, 0x16, 0xdc, 0x12, 0x6a, 0xf2, 0x22, 0x4e, 0xe2, 0x30, 0x1e, 0xcf, 0x4e, 0xa6,
0xa7, 0xd9, 0x28, 0x0d, 0x12, 0x4c, 0xe9, 0xe8, 0x3f, 0x3b, 0xb0, 0x66, 0xf5, 0xaa, 0x33, 0xdb,
0xef, 0x48, 0x9d, 0xcd, 0xeb, 0xa4, 0x52, 0xb3, 0x56, 0x0d, 0xcf, 0x26, 0x09, 0xe5, 0xe1, 0xf4,
0x4b, 0x55, 0x3a, 0x3d, 0x80, 0x65, 0x3d, 0xb4, 0xfe, 0x50, 0xaa, 0x59, 0xbf, 0xaa, 0x66, 0xea,
0xfb, 0x25, 0xf5, 0x81, 0x66, 0xf1, 0xfb, 0x32, 0xa9, 0x62, 0xbe, 0x58, 0x84, 0x3e, 0x91, 0x0c,
0xf4, 0xf7, 0x66, 0x22, 0xa7, 0x67, 0x30, 0xca, 0xc1, 0x8c, 0xfe, 0x85, 0x03, 0x50, 0xcc, 0x0e,
0x77, 0xbe, 0xf0, 0xce, 0x8e, 0xa8, 0x3a, 0x15, 0x00, 0xa6, 0x40, 0x79, 0x15, 0xaf, 0x70, 0xf8,
0x1d, 0x8d, 0x61, 0x4e, 0x71, 0x1f, 0x96, 0xc7, 0x61, 0x7c, 0x2a, 0xc2, 0x27, 0x66, 0x54, 0x2c,
0x53, 0x17, 0x08, 0x4b, 0x12, 0xfe, 0x4c, 0xa1, 0x45, 0x74, 0x68, 0x1a, 0xd1, 0x81, 0xfe, 0x65,
0x23, 0xaf, 0x2f, 0x15, 0x6b, 0xbe, 0xd6, 0x8c, 0xc8, 0x7e, 0xc5, 0xfb, 0x5d, 0x53, 0xce, 0x11,
0xc7, 0xd4, 0xe3, 0x6f, 0x3d, 0x88, 0x3c, 0x82, 0xa5, 0x54, 0xba, 0x17, 0xed, 0x7b, 0x9a, 0x6f,
0xf1, 0x3d, 0xbd, 0xd4, 0x0a, 0x2c, 0xff, 0x0f, 0x56, 0x3c, 0xff, 0x82, 0xa5, 0x3c, 0x10, 0xe9,
0xac, 0x88, 0xdf, 0xd2, 0x63, 0x2e, 0x1b, 0xb8, 0x08, 0xab, 0xf7, 0x61, 0x79, 0x24, 0xaf, 0x73,
0x72, 0x4a, 0x75, 0x49, 0x5b, 0xc0, 0x48, 0x48, 0xff, 0x56, 0x97, 0xb2, 0xec, 0x3d, 0xbc, 0x5e,
0x22, 0xe6, 0xea, 0x1a, 0xa5, 0xd5, 0x7d, 0x57, 0x95, 0x9e, 0x7c, 0x9d, 0x33, 0xab, 0x02, 0x9f,
0x04, 0x55, 0x19, 0xd0, 0x16, 0x69, 0xf3, 0x5d, 0x44, 0x4a, 0x77, 0x60, 0xf9, 0x84, 0xf1, 0x03,
0xdc, 0x41, 0xed, 0xf9, 0xb6, 0xa0, 0x1d, 0xb1, 0xcb, 0xa1, 0xdc, 0x62, 0x19, 0xa7, 0x5b, 0x11,
0xbb, 0x14, 0x34, 0x94, 0xc0, 0x4a, 0x41, 0x2f, 0x73, 0x4c, 0xfa, 0x57, 0x0d, 0x58, 0xfc, 0x3c,
0xba, 0x88, 0x83, 0x91, 0x28, 0x26, 0x4d, 0xd8, 0x24, 0xd6, 0xb7, 0x88, 0xf8, 0x1b, 0xc3, 0xbe,
0xb8, 0x93, 0x48, 0xb8, 0xaa, 0xf2, 0xe8, 0x26, 0x86, 0xc0, 0xb4, 0xb8, 0xb2, 0x96, 0xda, 0x66,
0x20, 0x64, 0x03, 0x16, 0x52, 0xf3, 0x7a, 0x5d, 0xb5, 0x8a, 0x2b, 0xd4, 0x79, 0xe3, 0x0a, 0x55,
0x94, 0x15, 0xe5, 0x75, 0x8b, 0xd8, 0x92, 0x96, 0xab, 0x9b, 0x22, 0x7d, 0x4d, 0x99, 0xba, 0xaf,
0xc2, 0x60, 0xba, 0xa8, 0xd2, 0x57, 0x13, 0xc4, 0x80, 0x2b, 0x3f, 0x90, 0x34, 0xd2, 0x21, 0x99,
0x10, 0x26, 0x20, 0xe5, 0x1b, 0xfa, 0xb6, 0x54, 0x93, 0x12, 0x4c, 0xbf, 0x02, 0x72, 0xe0, 0xfb,
0x4a, 0x2a, 0x79, 0x36, 0x5e, 0xac, 0xc7, 0xb1, 0xd6, 0x53, 0xc3, 0xb7, 0x51, 0xcf, 0xf7, 0x29,
0x74, 0x8e, 0x8d, 0x27, 0x06, 0x42, 0x80, 0xfa, 0x71, 0x81, 0x12, 0xba, 0x81, 0x18, 0x03, 0x36,
0xcc, 0x01, 0xe9, 0xef, 0x02, 0x39, 0x0a, 0x32, 0x9e, 0xcf, 0x2f, 0x3f, 0x27, 0xe5, 0x75, 0x14,
0xe3, 0x9c, 0xa4, 0x30, 0x71, 0x4e, 0x3a, 0x90, 0xd7, 0x3f, 0xe5, 0x85, 0x3d, 0x80, 0x56, 0x20,
0x21, 0xed, 0x3f, 0x97, 0x94, 0xe2, 0x69, 0xca, 0xbc, 0x1f, 0x23, 0xbd, 0x02, 0x2d, 0xf7, 0xfc,
0x4b, 0x07, 0x16, 0xd5, 0xd2, 0x30, 0x4e, 0x59, 0x8f, 0x2b, 0xe4, 0xc2, 0x2c, 0xac, 0xfe, 0x1a,
0xbd, 0xba, 0xd3, 0x73, 0x75, 0x3b, 0x4d, 0xa0, 0x99, 0x78, 0xfc, 0x5c, 0x24, 0xb1, 0x6d, 0x57,
0xfc, 0xd6, 0x87, 0x92, 0xf9, 0xe2, 0x50, 0xa2, 0xae, 0xba, 0xd4, 0xa4, 0xf2, 0x5b, 0x98, 0x4f,
0xe5, 0x55, 0x57, 0x01, 0x17, 0x32, 0x50, 0x13, 0x2c, 0xcb, 0x40, 0x91, 0xba, 0x79, 0x3f, 0x1d,
0x40, 0xff, 0x09, 0x0b, 0x19, 0x67, 0x07, 0x61, 0x58, 0xe6, 0xbf, 0x05, 0xb7, 0x6a, 0xfa, 0x94,
0xad, 0x7d, 0x06, 0xab, 0x4f, 0xd8, 0xe9, 0x74, 0x7c, 0xc4, 0x2e, 0x8a, 0x92, 0x2b, 0x81, 0x66,
0x76, 0x1e, 0x5f, 0xaa, 0xfd, 0x12, 0xbf, 0xc9, 0x7b, 0x00, 0x21, 0xd2, 0x0c, 0xb3, 0x84, 0x8d,
0x94, 0x36, 0xb5, 0x05, 0x72, 0x92, 0xb0, 0x11, 0xfd, 0x08, 0x88, 0xc9, 0x47, 0x2d, 0x01, 0x2d,
0x60, 0x7a, 0x3a, 0xcc, 0x66, 0x19, 0x67, 0x13, 0x6d, 0xfc, 0x26, 0x44, 0xef, 0x43, 0xf7, 0xd8,
0x9b, 0xb9, 0xec, 0x6b, 0xf5, 0x66, 0x05, 0xcf, 0x44, 0xde, 0x0c, 0xd5, 0x33, 0x3f, 0x13, 0x89,
0x6e, 0x9a, 0xc2, 0x82, 0x24, 0x44, 0xa6, 0x3e, 0xcb, 0x78, 0x10, 0xc9, 0xb2, 0xa6, 0x62, 0x6a,
0x40, 0x95, 0xed, 0x6e, 0xd4, 0x6c, 0xb7, 0x4a, 0x5d, 0xf4, 0x2d, 0xa7, 0xda, 0x57, 0x0b, 0xdb,
0xff, 0xcd, 0x26, 0xb4, 0xf3, 0x4c, 0x90, 0xfc, 0x0c, 0x7a, 0xd6, 0x91, 0x9e, 0x6c, 0xa9, 0xed,
0xa8, 0xab, 0x11, 0x0c, 0x6e, 0xd7, 0x77, 0x2a, 0xb1, 0xdf, 0xf9, 0xe6, 0xb7, 0xff, 0xfa, 0xab,
0x46, 0x9f, 0x6c, 0xec, 0x5e, 0x7c, 0xb8, 0xab, 0xce, 0xec, 0xbb, 0xa2, 0x04, 0x21, 0x6f, 0x82,
0x5e, 0xc1, 0x92, 0x7d, 0xe4, 0x27, 0xb7, 0x6d, 0xc7, 0x5b, 0x1a, 0xed, 0xbd, 0x6b, 0x7a, 0xd5,
0x70, 0xb7, 0xc5, 0x70, 0x1b, 0x64, 0xdd, 0x1c, 0x2e, 0xcf, 0xd0, 0x98, 0xb8, 0xbb, 0x33, 0x5f,
0x4e, 0x11, 0xcd, 0xaf, 0xfe, 0x45, 0xd5, 0xe0, 0x56, 0xf5, 0x95, 0x94, 0x7a, 0x56, 0x45, 0xfb,
0x62, 0x28, 0x42, 0x56, 0x70, 0x28, 0xf3, 0xe1, 0x14, 0xf9, 0x29, 0xb4, 0xf3, 0x57, 0x22, 0x64,
0xd3, 0x78, 0x13, 0x63, 0xbe, 0x3b, 0x19, 0xf4, 0xab, 0x1d, 0x6a, 0x11, 0x5b, 0x82, 0xf3, 0x4d,
0x5a, 0xe1, 0xfc, 0xb1, 0xf3, 0x80, 0x1c, 0xc1, 0x4d, 0x65, 0xfd, 0xa7, 0xec, 0xbf, 0xb3, 0x92,
0x9a, 0xf7, 0x5e, 0x7b, 0x0e, 0x79, 0x04, 0x2d, 0xfd, 0x70, 0x86, 0x6c, 0xd4, 0xbf, 0xde, 0x19,
0x6c, 0x56, 0x70, 0xa5, 0xf4, 0x07, 0x00, 0xc5, 0x3b, 0x11, 0xd2, 0xbf, 0xee, 0x39, 0x4b, 0x2e,
0xc4, 0x9a, 0x47, 0x25, 0x63, 0xf1, 0x4c, 0xc6, 0x7e, 0x86, 0x42, 0xbe, 0x53, 0xd0, 0xd7, 0x3e,
0x50, 0x79, 0x0b, 0x43, 0xba, 0x21, 0x64, 0xb7, 0x42, 0x96, 0x50, 0x76, 0x11, 0xbb, 0xd4, 0xb7,
0xd8, 0x3f, 0x81, 0x8e, 0xf1, 0x98, 0x84, 0x18, 0x97, 0x03, 0xa5, 0x77, 0x2b, 0x83, 0x41, 0x5d,
0x97, 0xe2, 0xbe, 0x2e, 0xb8, 0x2f, 0xd1, 0x36, 0x72, 0x17, 0x17, 0xa7, 0xb8, 0x25, 0x3f, 0x46,
0xe3, 0x51, 0xb7, 0xcb, 0xa4, 0x78, 0xe8, 0x62, 0xdf, 0x41, 0xe7, 0xfb, 0x5d, 0xb9, 0x88, 0xa6,
0xab, 0x82, 0x6b, 0x87, 0x14, 0x5c, 0xc9, 0x8f, 0x60, 0x51, 0xdd, 0x32, 0x93, 0x9b, 0xc5, 0xbe,
0x1a, 0xe7, 0xa6, 0xc1, 0x46, 0x19, 0x56, 0xcc, 0xd6, 0x04, 0xb3, 0x1e, 0xe9, 0x20, 0xb3, 0x31,
0xe3, 0x01, 0xf2, 0x08, 0x61, 0xd9, 0x2e, 0x50, 0x66, 0xb9, 0x99, 0xd5, 0x5e, 0x5a, 0xe4, 0x66,
0x56, 0x5f, 0xed, 0xb4, 0xcd, 0x4c, 0x9b, 0xd7, 0xae, 0xbe, 0x8f, 0xf9, 0x63, 0xe8, 0x9a, 0x4f,
0x1a, 0xc8, 0xc0, 0x58, 0x79, 0xe9, 0xf9, 0xc3, 0x60, 0xab, 0xb6, 0xcf, 0x16, 0x37, 0xe9, 0x9a,
0xc3, 0x90, 0x9f, 0xc0, 0xb2, 0x51, 0xe3, 0x3e, 0x99, 0x45, 0xa3, 0x7c, 0x3b, 0xab, 0xb7, 0x6a,
0x83, 0xba, 0x3c, 0x8e, 0x6e, 0x0a, 0xc6, 0xab, 0xd4, 0x62, 0x8c, 0x5b, 0xf9, 0x18, 0x3a, 0x66,
0xfd, 0xfc, 0x2d, 0x7c, 0x37, 0x8d, 0x2e, 0xf3, 0x26, 0x6b, 0xcf, 0x21, 0xbf, 0x76, 0xa0, 0x6b,
0xde, 0xc5, 0x12, 0xeb, 0x64, 0x52, 0xe2, 0xd3, 0x37, 0xfb, 0x4c, 0x46, 0xf4, 0x2b, 0x31, 0xc9,
0xe3, 0x07, 0xcf, 0x2d, 0x21, 0xbf, 0xb1, 0xae, 0x18, 0x76, 0xcc, 0x17, 0x81, 0x57, 0xe5, 0x4e,
0xf3, 0xd6, 0xf1, 0x6a, 0xf7, 0x8d, 0xb8, 0x08, 0xb9, 0xda, 0x73, 0xc8, 0xc7, 0xf2, 0x61, 0xa7,
0x4e, 0x1a, 0x88, 0x61, 0xe0, 0x65, 0xb1, 0x99, 0xcf, 0x25, 0xb7, 0x9d, 0x3d, 0x87, 0xfc, 0x89,
0x7c, 0x0c, 0xa8, 0xbe, 0x15, 0xd2, 0x7f, 0xd7, 0xef, 0xe9, 0x3d, 0xb1, 0xa2, 0x3b, 0xf4, 0x96,
0xb5, 0xa2, 0xb2, 0x87, 0x3b, 0x06, 0x28, 0x32, 0x40, 0x52, 0x4a, 0x87, 0x72, 0xdb, 0xaf, 0x26,
0x89, 0xf6, 0xae, 0xea, 0xac, 0x09, 0x39, 0xfe, 0x4c, 0x2a, 0xa4, 0xa2, 0xcf, 0xf2, 0x6d, 0xad,
0x66, 0x72, 0x83, 0x41, 0x5d, 0x97, 0xe2, 0xff, 0x5d, 0xc1, 0xff, 0x3d, 0xb2, 0x65, 0xf2, 0xdf,
0x7d, 0x63, 0x66, 0x7e, 0x57, 0xe4, 0x2b, 0xe8, 0x1d, 0xc5, 0xf1, 0xab, 0x69, 0x92, 0x27, 0xf6,
0x76, 0x2e, 0x83, 0xd9, 0xe7, 0xa0, 0xb4, 0x28, 0xfa, 0xbe, 0xe0, 0xbc, 0x45, 0x6e, 0xd9, 0x9c,
0x8b, 0x7c, 0xf4, 0x8a, 0x78, 0xb0, 0x9a, 0xfb, 0xfd, 0x7c, 0x21, 0x03, 0x9b, 0x8f, 0x99, 0x16,
0x56, 0xc6, 0xb0, 0x22, 0x71, 0x3e, 0x46, 0xa6, 0x79, 0xee, 0x39, 0xe4, 0x18, 0xba, 0x4f, 0xd8,
0x28, 0xf6, 0x99, 0xca, 0x3f, 0xd6, 0x8a, 0x99, 0xe7, 0x79, 0xcb, 0xa0, 0x67, 0x81, 0xb6, 0x27,
0x48, 0xbc, 0x59, 0xca, 0xbe, 0xde, 0x7d, 0xa3, 0x12, 0x9b, 0x2b, 0xed, 0x09, 0x74, 0x32, 0x66,
0x79, 0x82, 0x52, 0xf6, 0x66, 0x79, 0x82, 0x4a, 0xf6, 0x66, 0x79, 0x02, 0x9d, 0x0c, 0x92, 0x10,
0x73, 0xba, 0x52, 0xc2, 0x97, 0x47, 0x8f, 0xeb, 0xd2, 0xc4, 0xc1, 0xdd, 0xeb, 0x09, 0xec, 0xd1,
0x1e, 0xd8, 0xa3, 0x9d, 0x40, 0xef, 0x09, 0x93, 0xc2, 0x92, 0x25, 0xb5, 0x81, 0xed, 0x5a, 0xcc,
0xf2, 0x5b, 0xd9, 0xed, 0x88, 0x3e, 0xdb, 0xd1, 0x8b, 0x7a, 0x16, 0xf9, 0x29, 0x74, 0x9e, 0x31,
0xae, 0x6b, 0x68, 0x79, 0x0c, 0x2e, 0x15, 0xd5, 0x06, 0x35, 0x25, 0x38, 0x7a, 0x57, 0x70, 0x1b,
0x90, 0x7e, 0xce, 0x6d, 0x97, 0xf9, 0x63, 0x26, 0x9d, 0xc0, 0x30, 0xf0, 0xaf, 0xc8, 0x1f, 0x0a,
0xe6, 0x79, 0x81, 0x7d, 0xc3, 0xa8, 0xcc, 0x98, 0xcc, 0x97, 0x4b, 0x78, 0x1d, 0x67, 0x3c, 0xaf,
0xef, 0xbe, 0x51, 0x65, 0xee, 0x2b, 0x12, 0x41, 0xc7, 0xb8, 0x34, 0xc9, 0x0d, 0xaa, 0x7a, 0x13,
0x93, 0x1b, 0x54, 0xcd, 0x1d, 0x0b, 0xdd, 0x16, 0xe3, 0x50, 0x72, 0xb7, 0x18, 0x47, 0xde, 0xab,
0x14, 0x23, 0xed, 0xbe, 0xf1, 0x26, 0xfc, 0x8a, 0xbc, 0x14, 0x0f, 0xb1, 0xcc, 0x3a, 0x61, 0x91,
0x03, 0x94, 0x4b, 0x8a, 0xb9, 0xb0, 0x8c, 0x2e, 0x3b, 0x2f, 0x90, 0x43, 0x89, 0xc8, 0xf8, 0xd2,
0x48, 0xa7, 0xac, 0x7a, 0xa9, 0xd6, 0x92, 0x6b, 0xcb, 0x62, 0xf9, 0xca, 0x6a, 0x4a, 0x63, 0x3a,
0xb3, 0x92, 0xe7, 0x7d, 0x23, 0xb3, 0xb2, 0x0a, 0x06, 0x46, 0x66, 0x65, 0x17, 0x06, 0x30, 0xb3,
0x2a, 0x0e, 0x19, 0x79, 0x66, 0x55, 0x39, 0xbf, 0xe4, 0xce, 0xb0, 0x7a, 0x22, 0x39, 0x5d, 0x10,
0xff, 0x20, 0xf1, 0xff, 0xff, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xdd, 0x47, 0x72, 0xc7, 0x52, 0x31,
0x00, 0x00,
0x75, 0xbf, 0x7a, 0x38, 0xa4, 0x38, 0x6f, 0x66, 0xf8, 0xa3, 0x28, 0x51, 0xa3, 0x91, 0x56, 0xd6,
0x96, 0x85, 0x15, 0xbf, 0xb2, 0x41, 0x6a, 0xf9, 0x0d, 0x36, 0xf2, 0x2a, 0xc9, 0x82, 0x2b, 0x69,
0xc5, 0x85, 0x69, 0x2d, 0xdd, 0xd4, 0xae, 0x12, 0x1b, 0xc1, 0xa4, 0x39, 0x5d, 0x1c, 0xb6, 0xd5,
0xd3, 0xdd, 0xdb, 0x5d, 0x43, 0x69, 0x2c, 0x10, 0x09, 0x36, 0x3e, 0x26, 0x30, 0x02, 0xdf, 0x8d,
0x04, 0x39, 0xe7, 0x92, 0x63, 0x92, 0xbf, 0x20, 0x40, 0x80, 0x00, 0x3e, 0xe5, 0x1e, 0xe4, 0x9e,
0x43, 0x6e, 0x39, 0x04, 0xaf, 0x7e, 0x75, 0x55, 0x77, 0x53, 0xab, 0x20, 0x41, 0x4e, 0x9c, 0xfa,
0xd4, 0xeb, 0x57, 0x55, 0xaf, 0xde, 0xaf, 0x7a, 0x55, 0x84, 0x4e, 0x9e, 0x8d, 0xb7, 0xb3, 0x3c,
0xe5, 0x29, 0x59, 0x8c, 0x93, 0x3c, 0x1b, 0x0f, 0x6f, 0x4e, 0xd2, 0x74, 0x12, 0xb3, 0x9d, 0x20,
0x8b, 0x76, 0x82, 0x24, 0x49, 0x79, 0xc0, 0xa3, 0x34, 0x29, 0x24, 0x11, 0xfd, 0x77, 0x0f, 0xba,
0xcf, 0xf3, 0x20, 0x29, 0x82, 0x31, 0xc2, 0x64, 0x00, 0x97, 0xf9, 0xeb, 0xd1, 0x69, 0x50, 0x9c,
0x0e, 0xbc, 0xdb, 0xde, 0x56, 0xc7, 0xd7, 0x4d, 0xb2, 0x09, 0x4b, 0xc1, 0x34, 0x9d, 0x25, 0x7c,
0xd0, 0xba, 0xed, 0x6d, 0x2d, 0xf8, 0xaa, 0x45, 0xbe, 0x0f, 0xeb, 0xc9, 0x6c, 0x3a, 0x1a, 0xa7,
0xc9, 0x49, 0x94, 0x4f, 0x25, 0xf3, 0xc1, 0xc2, 0x6d, 0x6f, 0x6b, 0xd1, 0xaf, 0x77, 0x90, 0x5b,
0x00, 0xc7, 0x71, 0x3a, 0x7e, 0x29, 0x87, 0x68, 0x8b, 0x21, 0x2c, 0x84, 0x50, 0xe8, 0xa9, 0x16,
0x8b, 0x26, 0xa7, 0x7c, 0xb0, 0x28, 0x18, 0x39, 0x18, 0xf2, 0xe0, 0xd1, 0x94, 0x8d, 0x0a, 0x1e,
0x4c, 0xb3, 0xc1, 0x92, 0x98, 0x8d, 0x85, 0x88, 0xfe, 0x94, 0x07, 0xf1, 0xe8, 0x84, 0xb1, 0x62,
0x70, 0x59, 0xf5, 0x1b, 0x84, 0x0e, 0x60, 0xf3, 0x29, 0xe3, 0xd6, 0xaa, 0x0b, 0x9f, 0x7d, 0x3d,
0x63, 0x05, 0xa7, 0x07, 0x40, 0x2c, 0xf8, 0x31, 0xe3, 0x41, 0x14, 0x17, 0xe4, 0x23, 0xe8, 0x71,
0x8b, 0x78, 0xe0, 0xdd, 0x5e, 0xd8, 0xea, 0xee, 0x92, 0x6d, 0x21, 0xdf, 0x6d, 0xeb, 0x03, 0xdf,
0xa1, 0xa3, 0xff, 0xec, 0x41, 0xf7, 0x88, 0x25, 0xa1, 0xe2, 0x4e, 0x08, 0xb4, 0x43, 0x56, 0x70,
0x21, 0xd8, 0x9e, 0x2f, 0x7e, 0x93, 0xef, 0x40, 0x17, 0xff, 0x8e, 0x0a, 0x9e, 0x47, 0xc9, 0x44,
0x88, 0xb6, 0xe3, 0x03, 0x42, 0x47, 0x02, 0x21, 0x6b, 0xb0, 0x10, 0x4c, 0xb9, 0x10, 0xe8, 0x82,
0x8f, 0x3f, 0xc9, 0xfb, 0xd0, 0xcb, 0x82, 0xf9, 0x94, 0x25, 0xbc, 0x14, 0x62, 0xcf, 0xef, 0x2a,
0x6c, 0x1f, 0xa5, 0xb8, 0x0d, 0x1b, 0x36, 0x89, 0xe6, 0xbe, 0x28, 0xb8, 0xaf, 0x5b, 0x94, 0x6a,
0x90, 0xbb, 0xb0, 0xaa, 0xe9, 0x73, 0x39, 0x59, 0x21, 0xd6, 0x8e, 0xbf, 0xa2, 0x60, 0x2d, 0xa0,
0x04, 0x7a, 0x72, 0x45, 0x45, 0x96, 0x26, 0x05, 0x23, 0xf7, 0x60, 0x4d, 0x7f, 0x98, 0xe5, 0x2c,
0x9a, 0x06, 0x13, 0xa6, 0x96, 0x57, 0xc3, 0xc9, 0x2e, 0xf4, 0xcd, 0x20, 0xe9, 0x8c, 0x33, 0xb1,
0xd8, 0xee, 0x6e, 0x4f, 0xc9, 0xd1, 0x47, 0xcc, 0x77, 0x49, 0xe8, 0x37, 0x1e, 0xf4, 0x1e, 0x9d,
0x06, 0x49, 0xc2, 0xe2, 0xc3, 0x34, 0x4a, 0x38, 0xea, 0xc7, 0xc9, 0x2c, 0x09, 0xa3, 0x64, 0x32,
0xe2, 0xaf, 0xa3, 0x50, 0x0d, 0xe6, 0x60, 0x38, 0x29, 0xbb, 0x8d, 0xab, 0x57, 0x82, 0xad, 0xe1,
0xc8, 0x2f, 0x9d, 0xf1, 0x6c, 0xc6, 0x47, 0x51, 0x12, 0xb2, 0xd7, 0x42, 0xce, 0x7d, 0xdf, 0xc1,
0xe8, 0xef, 0xc1, 0xda, 0x01, 0x2a, 0x5e, 0x12, 0x25, 0x93, 0xbd, 0x30, 0xcc, 0x59, 0x51, 0xa0,
0x35, 0x64, 0xb3, 0xe3, 0x97, 0x6c, 0xae, 0xcc, 0x44, 0xb5, 0x70, 0x8f, 0x4f, 0xd3, 0x82, 0xab,
0xf1, 0xc4, 0x6f, 0xfa, 0x97, 0x1e, 0xac, 0xa2, 0xd4, 0x7e, 0x14, 0x24, 0x73, 0xad, 0x0b, 0x07,
0xd0, 0x43, 0x56, 0xcf, 0xd3, 0x3d, 0x69, 0x53, 0x52, 0xa7, 0xb6, 0x94, 0x2c, 0x2a, 0xd4, 0xdb,
0x36, 0xe9, 0x93, 0x84, 0xe7, 0x73, 0xdf, 0xf9, 0x7a, 0xf8, 0x09, 0xac, 0xd7, 0x48, 0x50, 0x73,
0xca, 0xf9, 0xe1, 0x4f, 0x72, 0x05, 0x16, 0xcf, 0x82, 0x78, 0xc6, 0x94, 0x05, 0xcb, 0xc6, 0xc7,
0xad, 0x07, 0x1e, 0xfd, 0x00, 0xd6, 0xca, 0x31, 0xd5, 0xde, 0x12, 0x68, 0x1b, 0x11, 0x77, 0x7c,
0xf1, 0x1b, 0x45, 0x81, 0x74, 0x8f, 0xd2, 0xc8, 0x18, 0x0d, 0xd2, 0x05, 0x61, 0x98, 0x6b, 0x3a,
0xfc, 0x7d, 0x91, 0xb3, 0xa0, 0x77, 0x61, 0xdd, 0xfa, 0xfe, 0x2d, 0x03, 0xfd, 0xda, 0x83, 0xf5,
0x67, 0xec, 0x95, 0x12, 0xb7, 0x1e, 0xea, 0x01, 0xb4, 0xf9, 0x3c, 0x93, 0x2a, 0xb6, 0xb2, 0x7b,
0x47, 0x49, 0xab, 0x46, 0xb7, 0xad, 0x9a, 0xcf, 0xe7, 0x19, 0xf3, 0xc5, 0x17, 0xf4, 0x0b, 0xe8,
0x5a, 0x20, 0xb9, 0x06, 0x1b, 0x2f, 0x3e, 0x7f, 0xfe, 0xec, 0xc9, 0xd1, 0xd1, 0xe8, 0xf0, 0xcb,
0x4f, 0x7f, 0xf8, 0xe4, 0x0f, 0x46, 0xfb, 0x7b, 0x47, 0xfb, 0x6b, 0x97, 0xc8, 0x26, 0x90, 0x67,
0x4f, 0x8e, 0x9e, 0x3f, 0x79, 0xec, 0xe0, 0x1e, 0x59, 0x85, 0xae, 0x0d, 0xb4, 0xe8, 0x10, 0x06,
0xcf, 0xd8, 0xab, 0x17, 0x11, 0x4f, 0x58, 0x51, 0xb8, 0xc3, 0xd3, 0x6d, 0x20, 0xf6, 0x9c, 0xd4,
0x32, 0x07, 0x70, 0x39, 0x90, 0x90, 0x76, 0xad, 0xaa, 0x49, 0xbf, 0x04, 0xf2, 0x28, 0x4d, 0x12,
0x36, 0xe6, 0x87, 0x8c, 0xe5, 0x7a, 0xb1, 0xdf, 0xb3, 0xe4, 0xda, 0xdd, 0xbd, 0xa6, 0x16, 0x5b,
0xd5, 0x44, 0x25, 0x70, 0x02, 0xed, 0x8c, 0xe5, 0x53, 0x21, 0xee, 0x65, 0x5f, 0xfc, 0xa6, 0x3b,
0xb0, 0xe1, 0xb0, 0x2d, 0xe7, 0x91, 0x31, 0x96, 0x8f, 0x94, 0xc4, 0x17, 0x7d, 0xdd, 0xa4, 0x1f,
0xc2, 0xd5, 0xc7, 0x51, 0x31, 0xae, 0x4f, 0x05, 0x3f, 0x99, 0x1d, 0x8f, 0x4a, 0x75, 0xd2, 0x4d,
0xf4, 0xa5, 0xd5, 0x4f, 0xe4, 0x30, 0xf4, 0x6f, 0x3d, 0x68, 0xef, 0x3f, 0x3f, 0x78, 0x44, 0x86,
0xb0, 0x1c, 0x25, 0xe3, 0x74, 0x8a, 0x1e, 0xc8, 0x13, 0xd3, 0x33, 0xed, 0x0b, 0x83, 0xca, 0x4d,
0xe8, 0x08, 0xc7, 0x85, 0x6e, 0x5f, 0xd8, 0x64, 0xcf, 0x2f, 0x01, 0x0c, 0x39, 0xec, 0x75, 0x16,
0xe5, 0x22, 0xa6, 0xe8, 0x48, 0xd1, 0x16, 0x96, 0x5b, 0xef, 0x40, 0x77, 0x90, 0xb3, 0xb3, 0x74,
0x2c, 0xc1, 0x90, 0xc5, 0xc1, 0x5c, 0x78, 0xc2, 0xbe, 0x5f, 0xc3, 0xe9, 0xbf, 0x2d, 0x40, 0x7f,
0x6f, 0xcc, 0xa3, 0x33, 0xa6, 0xbc, 0x8e, 0x98, 0xa1, 0x00, 0xd4, 0xdc, 0x55, 0x8b, 0xdc, 0x81,
0x7e, 0xce, 0xa6, 0x29, 0x67, 0x23, 0xe5, 0x07, 0xa4, 0xc5, 0xbb, 0x20, 0x52, 0x8d, 0x25, 0xa3,
0x51, 0x86, 0xfe, 0x4b, 0xac, 0xa5, 0xe3, 0xbb, 0x20, 0x8a, 0x17, 0x01, 0xdc, 0x11, 0x5c, 0x45,
0xdb, 0xd7, 0x4d, 0x94, 0xdd, 0x38, 0xc8, 0x82, 0x71, 0xc4, 0xe5, 0x9c, 0x17, 0x7c, 0xd3, 0x46,
0xde, 0x71, 0x3a, 0x0e, 0xe2, 0xd1, 0x71, 0x10, 0x07, 0xc9, 0x98, 0xa9, 0x48, 0xe8, 0x82, 0xe4,
0x03, 0x58, 0x51, 0x53, 0xd2, 0x64, 0x32, 0x20, 0x56, 0x50, 0x94, 0xe9, 0x2c, 0x29, 0x18, 0xe7,
0x31, 0x0b, 0x0d, 0xe9, 0xb2, 0x20, 0xad, 0x77, 0x90, 0xfb, 0xb0, 0x21, 0x03, 0x6a, 0x11, 0xf0,
0xb4, 0x38, 0x8d, 0x8a, 0x51, 0xc1, 0x12, 0x3e, 0xe8, 0x08, 0xfa, 0xa6, 0x2e, 0xf2, 0x00, 0xae,
0x55, 0xe0, 0x9c, 0x8d, 0x59, 0x74, 0xc6, 0xc2, 0x01, 0x88, 0xaf, 0x2e, 0xea, 0x26, 0xb7, 0xa1,
0x8b, 0x79, 0xc4, 0x2c, 0x0b, 0x03, 0xce, 0x8a, 0x41, 0x57, 0x48, 0xc8, 0x86, 0xc8, 0x87, 0xd0,
0xcf, 0x98, 0x74, 0xec, 0xa7, 0x3c, 0x1e, 0x17, 0x83, 0x9e, 0xf0, 0xa6, 0x5d, 0x65, 0x32, 0xa8,
0x85, 0xbe, 0x4b, 0x41, 0xaf, 0xc2, 0xc6, 0x41, 0x54, 0x70, 0xb5, 0xcb, 0xc6, 0x72, 0xf7, 0xe1,
0x8a, 0x0b, 0x2b, 0x9b, 0xb9, 0x0f, 0xcb, 0x6a, 0xcb, 0x70, 0x02, 0xc8, 0xfc, 0x8a, 0x62, 0xee,
0x68, 0x8b, 0x6f, 0xa8, 0xe8, 0x2f, 0x5a, 0xd0, 0x46, 0x7b, 0xb8, 0xd8, 0x76, 0x6c, 0x43, 0x6c,
0x39, 0x86, 0x68, 0xbb, 0x8a, 0x05, 0xc7, 0x55, 0x88, 0xfc, 0x69, 0xce, 0x99, 0x92, 0xb7, 0xd4,
0x16, 0x0b, 0x29, 0xfb, 0x73, 0x36, 0x3e, 0x13, 0x2a, 0x63, 0xfa, 0x11, 0x41, 0x85, 0x2a, 0x02,
0x2e, 0xbf, 0x96, 0xfa, 0x62, 0xda, 0xba, 0x4f, 0x7c, 0x79, 0xb9, 0xec, 0x13, 0xdf, 0x0d, 0xe0,
0x72, 0x94, 0x1c, 0xa7, 0xb3, 0x24, 0x14, 0x4a, 0xb1, 0xec, 0xeb, 0x26, 0x9a, 0x6a, 0x26, 0x42,
0x6a, 0x34, 0x65, 0x4a, 0x01, 0x4a, 0x80, 0x12, 0x8c, 0x9d, 0x85, 0xf0, 0x0c, 0x46, 0xc8, 0x1f,
0xc1, 0xba, 0x85, 0x29, 0x09, 0xbf, 0x0f, 0x8b, 0xb8, 0x7a, 0x9d, 0x5d, 0xe9, 0xbd, 0x13, 0x2e,
0x45, 0xf6, 0xd0, 0x35, 0x58, 0x79, 0xca, 0xf8, 0xe7, 0xc9, 0x49, 0xaa, 0x39, 0xfd, 0x47, 0x0b,
0x56, 0x0d, 0xa4, 0x18, 0x6d, 0xc1, 0x6a, 0x14, 0xb2, 0x84, 0x47, 0x7c, 0x3e, 0x72, 0x42, 0x74,
0x15, 0xc6, 0x70, 0x18, 0xc4, 0x51, 0x50, 0x28, 0xd3, 0x95, 0x0d, 0xb2, 0x0b, 0x57, 0x50, 0xb7,
0xb4, 0xba, 0x98, 0x6d, 0x97, 0x99, 0x41, 0x63, 0x1f, 0x9a, 0x03, 0xe2, 0xd2, 0x35, 0x94, 0x9f,
0x48, 0x97, 0xd4, 0xd4, 0x85, 0x52, 0x93, 0x9c, 0x70, 0xc9, 0xd2, 0x1b, 0x95, 0x40, 0x2d, 0x0b,
0x5e, 0x92, 0x59, 0x49, 0x35, 0x0b, 0xb6, 0x32, 0xe9, 0xe5, 0x5a, 0x26, 0xbd, 0x05, 0xab, 0xc5,
0x3c, 0x19, 0xb3, 0x70, 0xc4, 0x53, 0x1c, 0x37, 0x4a, 0xc4, 0xee, 0x2c, 0xfb, 0x55, 0x58, 0xe4,
0xfc, 0xac, 0xe0, 0x09, 0xe3, 0xc2, 0x14, 0x97, 0x7d, 0xdd, 0x44, 0xe7, 0x27, 0x48, 0xa4, 0xd2,
0x77, 0x7c, 0xd5, 0xa2, 0x3f, 0x17, 0x01, 0xcb, 0xa4, 0xf5, 0x5f, 0x0a, 0x3b, 0x24, 0x37, 0xa0,
0x23, 0xc7, 0x2f, 0x4e, 0x03, 0x95, 0x98, 0x2d, 0x0b, 0xe0, 0xe8, 0x34, 0xc0, 0xac, 0xd5, 0x59,
0x92, 0xd4, 0xf8, 0xae, 0xc0, 0xf6, 0xe5, 0x8a, 0xee, 0xc0, 0x8a, 0x3e, 0x30, 0x14, 0xa3, 0x98,
0x9d, 0x70, 0x9d, 0x8d, 0x25, 0xb3, 0x29, 0x0e, 0x57, 0x1c, 0xb0, 0x13, 0x4e, 0x9f, 0xc1, 0xba,
0xb2, 0xb6, 0x2f, 0x32, 0xa6, 0x87, 0xfe, 0x41, 0xd5, 0xcf, 0xca, 0xa0, 0xb9, 0xa1, 0xb4, 0xc8,
0x4e, 0x21, 0x2b, 0xce, 0x97, 0xfa, 0x40, 0x54, 0xf7, 0xa3, 0x38, 0x2d, 0x98, 0x62, 0x48, 0xa1,
0x37, 0x8e, 0xd3, 0xa2, 0x9a, 0x67, 0xda, 0x18, 0xca, 0xad, 0x98, 0x8d, 0xc7, 0x68, 0xa5, 0x32,
0xec, 0xea, 0x26, 0xfd, 0x85, 0x07, 0x1b, 0x82, 0x9b, 0xf6, 0x0b, 0x26, 0x7f, 0x79, 0xf7, 0x69,
0xf6, 0xc6, 0x76, 0xde, 0xfb, 0x9e, 0x3a, 0xf3, 0xc4, 0xd1, 0x34, 0xd2, 0xc1, 0xb2, 0x83, 0xc8,
0x01, 0x02, 0xa8, 0xca, 0x27, 0x69, 0x3e, 0x66, 0x42, 0x62, 0xcb, 0xbe, 0x6c, 0xd0, 0x7f, 0xf1,
0x60, 0x5d, 0x4c, 0xe3, 0x88, 0x07, 0x7c, 0x56, 0xa8, 0xa5, 0xfd, 0x0e, 0xf4, 0x71, 0x19, 0x4c,
0xab, 0xb1, 0x9a, 0xc4, 0x15, 0x63, 0x71, 0x02, 0x95, 0xc4, 0xfb, 0x97, 0x7c, 0x97, 0x98, 0x7c,
0x02, 0x3d, 0xfb, 0x44, 0xa7, 0x92, 0xf8, 0xeb, 0x7a, 0x05, 0x35, 0xad, 0xd8, 0xbf, 0xe4, 0x3b,
0x1f, 0x90, 0x87, 0x00, 0x22, 0xba, 0x09, 0xb6, 0x62, 0xbe, 0xd6, 0xe7, 0xb5, 0x8d, 0xd8, 0xbf,
0xe4, 0x5b, 0xe4, 0x9f, 0x2e, 0xc3, 0x92, 0x74, 0xfa, 0xf4, 0x29, 0xf4, 0x9d, 0x99, 0x3a, 0x59,
0x64, 0x4f, 0x66, 0x91, 0xb5, 0xec, 0xbe, 0xd5, 0x90, 0xdd, 0xff, 0xa7, 0x07, 0x04, 0x35, 0xa9,
0xb2, 0x55, 0x1f, 0xc0, 0x0a, 0x0f, 0xf2, 0x09, 0xe3, 0x23, 0x37, 0x59, 0xaa, 0xa0, 0x22, 0x3a,
0xa5, 0xa1, 0x93, 0x05, 0xf4, 0x7c, 0x1b, 0x22, 0xdb, 0x40, 0xac, 0xa6, 0x3e, 0x8b, 0x49, 0xbf,
0xde, 0xd0, 0x83, 0x0e, 0x48, 0x86, 0x70, 0x7d, 0x58, 0x51, 0x19, 0x52, 0x5b, 0x6c, 0x7a, 0x63,
0x1f, 0xba, 0xee, 0x6c, 0x86, 0x07, 0xbd, 0x80, 0xeb, 0x3c, 0x41, 0xb7, 0xb5, 0xab, 0x11, 0x66,
0xa5, 0x3c, 0x49, 0x09, 0xd0, 0xdf, 0x78, 0xb0, 0x86, 0xcb, 0x77, 0x54, 0xe4, 0x63, 0x10, 0xda,
0xf7, 0x8e, 0x1a, 0xe2, 0xd0, 0xfe, 0xcf, 0x15, 0xe4, 0x01, 0x74, 0x04, 0xc3, 0x34, 0x63, 0x89,
0xd2, 0x8f, 0x81, 0xab, 0x1f, 0xa5, 0xe1, 0xef, 0x5f, 0xf2, 0x4b, 0x62, 0x4b, 0x3b, 0xae, 0xc1,
0x55, 0x35, 0x4b, 0x77, 0x5b, 0xe9, 0x5f, 0x75, 0x60, 0xb3, 0xda, 0x63, 0x62, 0xbc, 0x4a, 0x5c,
0xe2, 0x68, 0x7a, 0x9c, 0x9a, 0x1c, 0xc8, 0xb3, 0x73, 0x1a, 0xa7, 0x8b, 0x9c, 0xc0, 0x55, 0x1d,
0x0a, 0x70, 0xfc, 0xd2, 0xf1, 0xb7, 0x44, 0x0c, 0xbb, 0xef, 0xca, 0xab, 0x32, 0x9e, 0x86, 0x6d,
0xdd, 0x6b, 0x66, 0x47, 0x26, 0x30, 0x30, 0x21, 0x47, 0x39, 0x20, 0x2b, 0x2c, 0xe1, 0x50, 0xdf,
0x7b, 0xfb, 0x50, 0xc2, 0xa0, 0x42, 0x8d, 0x5e, 0xc8, 0x8c, 0xbc, 0x86, 0x5b, 0xba, 0x4f, 0x78,
0x90, 0xfa, 0x70, 0xed, 0x77, 0x59, 0xd9, 0x67, 0xf8, 0xad, 0x3b, 0xe6, 0xb7, 0xf0, 0x1d, 0xfe,
0xa3, 0x07, 0x2b, 0x2e, 0x37, 0x0c, 0x60, 0x2a, 0x47, 0xd5, 0x46, 0xa2, 0x03, 0x79, 0x05, 0xae,
0x67, 0xd9, 0xad, 0xa6, 0x2c, 0xdb, 0xce, 0xa5, 0x17, 0xbe, 0x2d, 0x97, 0x6e, 0xbf, 0x5b, 0x2e,
0xbd, 0xd8, 0x94, 0x4b, 0x0f, 0xff, 0xce, 0x03, 0x52, 0xdf, 0x5d, 0xf2, 0x99, 0x4c, 0xf3, 0x13,
0x16, 0x2b, 0x83, 0xfa, 0xfe, 0x3b, 0x29, 0x88, 0x86, 0xf5, 0xc7, 0xa8, 0xa8, 0xb6, 0xc1, 0xd8,
0x11, 0xb5, 0xef, 0x37, 0x75, 0xe1, 0x11, 0x48, 0x04, 0xda, 0x62, 0xc4, 0xa3, 0x38, 0x2e, 0x2d,
0xab, 0xef, 0xd7, 0xf0, 0xe1, 0x1b, 0xe8, 0x3b, 0x5b, 0xf7, 0xbf, 0x36, 0xed, 0x6a, 0x48, 0x95,
0x9b, 0xe4, 0x60, 0xc3, 0x6f, 0x5a, 0x40, 0xea, 0xda, 0xf3, 0x7f, 0x39, 0x05, 0xa1, 0x0a, 0x8e,
0x03, 0x58, 0x50, 0xaa, 0xe0, 0x98, 0xfe, 0x16, 0xac, 0x4e, 0x03, 0x3e, 0xcb, 0x31, 0x9d, 0x74,
0x0e, 0xa0, 0x55, 0x18, 0x77, 0xab, 0x94, 0xf1, 0x48, 0xf7, 0xaa, 0x9c, 0xaf, 0xa9, 0x8b, 0xfe,
0x00, 0xae, 0xbc, 0x08, 0xe2, 0x98, 0xf1, 0x4f, 0xe5, 0x60, 0x3a, 0x24, 0xbd, 0x0f, 0xbd, 0x57,
0xb2, 0xde, 0x30, 0x4a, 0x93, 0x78, 0xae, 0x0e, 0xa4, 0x5d, 0x85, 0x7d, 0x91, 0xc4, 0x73, 0x3c,
0xc1, 0x57, 0x3e, 0x2d, 0x0f, 0xfd, 0xb6, 0x43, 0xf3, 0x7c, 0xdd, 0x44, 0x57, 0xa9, 0xe4, 0xe4,
0x0e, 0x47, 0x77, 0x61, 0xb3, 0xda, 0xd1, 0xcc, 0x6c, 0xa1, 0x64, 0xf6, 0x09, 0x90, 0x1f, 0xcf,
0x58, 0x3e, 0x17, 0xc5, 0x3c, 0x53, 0xb6, 0xb9, 0x56, 0x3d, 0x02, 0x2d, 0x65, 0xb3, 0xe3, 0x1f,
0xb2, 0xb9, 0x2e, 0x6e, 0xb6, 0x4c, 0x71, 0x93, 0x3e, 0x84, 0x0d, 0x87, 0x81, 0x1a, 0xf1, 0x0e,
0x2c, 0x89, 0x82, 0xa0, 0x3e, 0x1e, 0xb8, 0x45, 0x43, 0xd5, 0x47, 0xff, 0x18, 0x16, 0xf6, 0xd3,
0xcc, 0x3e, 0x4e, 0x7b, 0xee, 0x71, 0x5a, 0x39, 0x8a, 0x91, 0xf1, 0x03, 0x72, 0x64, 0x17, 0x44,
0x33, 0x0f, 0xa6, 0x1c, 0xf3, 0xe3, 0x93, 0x34, 0x7f, 0x15, 0xe4, 0xa1, 0x52, 0x81, 0x0a, 0x8a,
0xb3, 0x3f, 0x61, 0xda, 0x55, 0xe0, 0x4f, 0xfa, 0x4b, 0x0f, 0x16, 0xc5, 0x94, 0x50, 0x3f, 0x64,
0xc4, 0x90, 0x59, 0x5b, 0x3a, 0x7e, 0x29, 0xe6, 0xd2, 0xf7, 0xab, 0x70, 0xa5, 0x5a, 0xdd, 0xaa,
0x56, 0xab, 0x31, 0x7c, 0xcb, 0x56, 0x59, 0x06, 0x2e, 0x01, 0x72, 0x0b, 0xda, 0xa7, 0x69, 0xa6,
0xfd, 0x32, 0xe8, 0x13, 0x6f, 0x9a, 0xf9, 0x02, 0xa7, 0xf7, 0x60, 0xf5, 0x59, 0x1a, 0x32, 0xeb,
0xd0, 0x74, 0xe1, 0x6e, 0xd0, 0x3f, 0xf1, 0x60, 0x59, 0x13, 0x93, 0x2d, 0x68, 0xa3, 0x7f, 0xad,
0x84, 0x7e, 0x53, 0x7d, 0x42, 0x3a, 0x5f, 0x50, 0xa0, 0x51, 0x89, 0x74, 0xa2, 0x0c, 0x7e, 0x3a,
0x69, 0x2f, 0x03, 0x0b, 0x66, 0x53, 0x62, 0xce, 0x15, 0x0f, 0x5c, 0x41, 0xe9, 0xaf, 0x3c, 0xe8,
0x3b, 0x63, 0x60, 0x7e, 0x15, 0x07, 0x05, 0x57, 0x67, 0x7d, 0x25, 0x44, 0x1b, 0xb2, 0x0f, 0xd8,
0x2d, 0xf7, 0x80, 0x6d, 0x0e, 0x78, 0x0b, 0xf6, 0x01, 0xef, 0x3e, 0x74, 0xd4, 0x69, 0x9a, 0x69,
0xb9, 0xe9, 0x5a, 0x3e, 0x8e, 0xa8, 0xeb, 0x6a, 0x25, 0x11, 0x7d, 0x08, 0x5d, 0xab, 0x07, 0x07,
0x4c, 0x18, 0x7f, 0x95, 0xe6, 0x2f, 0xf5, 0x89, 0x5e, 0x35, 0x4d, 0x29, 0xb4, 0x55, 0x96, 0x42,
0xe9, 0xdf, 0x78, 0xd0, 0x47, 0x9d, 0x88, 0x92, 0xc9, 0x61, 0x1a, 0x47, 0xe3, 0xb9, 0xd0, 0x0d,
0xbd, 0xfd, 0xa3, 0x90, 0xc5, 0x3c, 0x30, 0xba, 0xe1, 0xc2, 0x18, 0xb2, 0xa6, 0x51, 0x22, 0x4a,
0x16, 0x4a, 0x33, 0x4c, 0x1b, 0x75, 0xf9, 0x84, 0x61, 0xcc, 0x29, 0xd8, 0x68, 0x8a, 0x79, 0x9f,
0xf2, 0x53, 0x0e, 0x88, 0xde, 0x07, 0x81, 0x3c, 0xe0, 0x6c, 0x34, 0x8d, 0xe2, 0x38, 0x92, 0xb4,
0x52, 0x67, 0x9b, 0xba, 0xe8, 0xdf, 0xb7, 0xa0, 0xab, 0xec, 0xfe, 0x49, 0x38, 0x61, 0xa8, 0x9f,
0x3a, 0x8e, 0x1a, 0x83, 0xb2, 0x10, 0xdd, 0xef, 0x44, 0x5e, 0x0b, 0xa9, 0x6e, 0xe0, 0x42, 0x7d,
0x03, 0x31, 0x41, 0x4d, 0x43, 0xf6, 0xa1, 0x08, 0xf1, 0xf2, 0x4a, 0xa8, 0x04, 0x74, 0xef, 0xae,
0xe8, 0x5d, 0x2c, 0x7b, 0x05, 0xe0, 0x04, 0xf5, 0xa5, 0x4a, 0x50, 0x7f, 0x00, 0x3d, 0xc5, 0x46,
0xc8, 0x5d, 0xd4, 0x34, 0x4a, 0x55, 0x76, 0xf6, 0xc4, 0x77, 0x28, 0xf5, 0x97, 0xbb, 0xfa, 0xcb,
0xe5, 0x6f, 0xfb, 0x52, 0x53, 0xd2, 0xab, 0xb0, 0xa1, 0x84, 0xf7, 0x34, 0x0f, 0xb2, 0x53, 0xed,
0x4b, 0x43, 0x73, 0x8d, 0x21, 0x60, 0x72, 0x0f, 0x16, 0xf1, 0x33, 0xed, 0xce, 0x9a, 0xcd, 0x4b,
0x92, 0x90, 0x2d, 0x58, 0x64, 0xe1, 0x84, 0xe9, 0xac, 0x92, 0xb8, 0xb9, 0x30, 0xee, 0x91, 0x2f,
0x09, 0xd0, 0xd8, 0x11, 0xad, 0x18, 0xbb, 0xeb, 0x0b, 0xf1, 0x08, 0x9f, 0x7c, 0x1e, 0xd2, 0x2b,
0x40, 0x9e, 0x49, 0xad, 0xb5, 0x0b, 0x2a, 0x7f, 0xba, 0x00, 0x5d, 0x0b, 0x46, 0xbb, 0x9d, 0xe0,
0x84, 0x47, 0x61, 0x14, 0x4c, 0x19, 0x67, 0xb9, 0xd2, 0xd4, 0x0a, 0x2a, 0x5c, 0xe6, 0xd9, 0x64,
0x94, 0xce, 0xf8, 0x28, 0x64, 0x93, 0x9c, 0xc9, 0x2b, 0x06, 0xcf, 0xaf, 0xa0, 0x48, 0x37, 0x0d,
0x5e, 0xdb, 0x74, 0x52, 0x1f, 0x2a, 0xa8, 0x3e, 0xb3, 0x48, 0x19, 0xb5, 0xcb, 0x33, 0x8b, 0x94,
0x48, 0xd5, 0xe3, 0x2c, 0x36, 0x78, 0x9c, 0x8f, 0x60, 0x53, 0xfa, 0x16, 0x65, 0x9b, 0xa3, 0x8a,
0x9a, 0x5c, 0xd0, 0x8b, 0xa9, 0x12, 0xce, 0x59, 0x2b, 0x78, 0x11, 0xfd, 0x5c, 0x56, 0x4c, 0x3d,
0xbf, 0x86, 0x23, 0x2d, 0x9a, 0xa3, 0x43, 0x2b, 0x4b, 0xa6, 0x35, 0x5c, 0xd0, 0x06, 0xaf, 0x5d,
0xda, 0x8e, 0xa2, 0xad, 0xe0, 0xf4, 0x06, 0x5c, 0x17, 0x6a, 0xf2, 0x3c, 0xcd, 0xd2, 0x38, 0x9d,
0xcc, 0x8f, 0x66, 0xc7, 0xc5, 0x38, 0x8f, 0x32, 0x4c, 0xe9, 0xe8, 0x3f, 0x79, 0xb0, 0xe1, 0xf4,
0xaa, 0x33, 0xdb, 0x6f, 0x49, 0x9d, 0x35, 0x75, 0x52, 0xa9, 0x59, 0xeb, 0x96, 0x67, 0x93, 0x84,
0xf2, 0x70, 0xfa, 0xa5, 0x2a, 0x9d, 0xee, 0xc1, 0xaa, 0x1e, 0x5a, 0x7f, 0x28, 0xd5, 0x6c, 0x50,
0x57, 0x33, 0xf5, 0xfd, 0x8a, 0xfa, 0x40, 0xb3, 0xf8, 0x5d, 0x99, 0x54, 0xb1, 0x50, 0x2c, 0x42,
0x9f, 0x48, 0x86, 0xfa, 0x7b, 0x3b, 0x91, 0xd3, 0x33, 0x18, 0x1b, 0xb0, 0xa0, 0x7f, 0xe6, 0x01,
0x94, 0xb3, 0xc3, 0x9d, 0x2f, 0xbd, 0xb3, 0x27, 0xaa, 0x4e, 0x25, 0x80, 0x29, 0x90, 0xa9, 0xe2,
0x95, 0x0e, 0xbf, 0xab, 0x31, 0xcc, 0x29, 0xee, 0xc2, 0xea, 0x24, 0x4e, 0x8f, 0x45, 0xf8, 0xc4,
0x8c, 0x8a, 0x15, 0xea, 0x02, 0x61, 0x45, 0xc2, 0x9f, 0x29, 0xb4, 0x8c, 0x0e, 0x6d, 0x2b, 0x3a,
0xd0, 0x3f, 0x6f, 0x99, 0xfa, 0x52, 0xb9, 0xe6, 0x0b, 0xcd, 0x88, 0xec, 0xd6, 0xbc, 0xdf, 0x05,
0xe5, 0x1c, 0x71, 0x4c, 0x3d, 0xfc, 0xd6, 0x83, 0xc8, 0x43, 0x58, 0xc9, 0xa5, 0x7b, 0xd1, 0xbe,
0xa7, 0xfd, 0x16, 0xdf, 0xd3, 0xcf, 0x9d, 0xc0, 0xf2, 0xff, 0x60, 0x2d, 0x08, 0xcf, 0x58, 0xce,
0x23, 0x91, 0xce, 0x8a, 0xf8, 0x2d, 0x3d, 0xe6, 0xaa, 0x85, 0x8b, 0xb0, 0x7a, 0x17, 0x56, 0xd5,
0xa5, 0x8d, 0xa1, 0x54, 0x37, 0xbe, 0x25, 0x8c, 0x84, 0xf4, 0xaf, 0x75, 0x29, 0xcb, 0xdd, 0xc3,
0x8b, 0x25, 0x62, 0xaf, 0xae, 0x55, 0x59, 0xdd, 0x77, 0x55, 0xe9, 0x29, 0xd4, 0x39, 0xb3, 0x2a,
0xf0, 0x49, 0x50, 0x95, 0x01, 0x5d, 0x91, 0xb6, 0xdf, 0x45, 0xa4, 0x74, 0x1b, 0x56, 0x8f, 0x18,
0xdf, 0xc3, 0x1d, 0xd4, 0x9e, 0xef, 0x06, 0x74, 0x12, 0xf6, 0x6a, 0x24, 0xb7, 0x58, 0xc6, 0xe9,
0xe5, 0x84, 0xbd, 0x12, 0x34, 0x94, 0xc0, 0x5a, 0x49, 0xaf, 0x2e, 0xac, 0xfe, 0xa2, 0x05, 0x97,
0x3f, 0x4f, 0xce, 0xd2, 0x68, 0x2c, 0x8a, 0x49, 0x53, 0x36, 0x4d, 0xf5, 0x95, 0x24, 0xfe, 0xc6,
0xb0, 0x2f, 0xee, 0x24, 0x32, 0xae, 0xaa, 0x3c, 0xba, 0x89, 0x21, 0x30, 0x2f, 0xef, 0xbf, 0xa5,
0xb6, 0x59, 0x08, 0xd9, 0x84, 0xa5, 0xdc, 0xbe, 0xab, 0x57, 0xad, 0xf2, 0x3e, 0x76, 0xd1, 0xba,
0x8f, 0x15, 0x65, 0x45, 0x79, 0xdd, 0x22, 0xb6, 0x64, 0xd9, 0xd7, 0x4d, 0x91, 0xbe, 0xe6, 0x4c,
0xdd, 0x57, 0x61, 0x30, 0xbd, 0xac, 0xd2, 0x57, 0x1b, 0xc4, 0x80, 0x2b, 0x3f, 0x90, 0x34, 0xd2,
0x21, 0xd9, 0x10, 0x26, 0x20, 0xd5, 0xeb, 0xfe, 0x8e, 0x54, 0x93, 0x0a, 0x4c, 0xbf, 0x02, 0xb2,
0x17, 0x86, 0x4a, 0x2a, 0x26, 0x1b, 0x2f, 0xd7, 0xe3, 0x39, 0xeb, 0x69, 0xe0, 0xdb, 0x6a, 0xe6,
0xfb, 0x04, 0xba, 0x87, 0xd6, 0x7b, 0x05, 0x21, 0x40, 0xfd, 0x52, 0x41, 0x09, 0xdd, 0x42, 0xac,
0x01, 0x5b, 0xf6, 0x80, 0xf4, 0xb7, 0x81, 0x1c, 0x44, 0x05, 0x37, 0xf3, 0x33, 0xe7, 0x24, 0x53,
0x47, 0xb1, 0xce, 0x49, 0x0a, 0x13, 0xe7, 0xa4, 0x3d, 0x79, 0xfd, 0x53, 0x5d, 0xd8, 0x3d, 0x58,
0x8e, 0x24, 0xa4, 0xfd, 0xe7, 0x8a, 0x52, 0x3c, 0x4d, 0x69, 0xfa, 0x31, 0xd2, 0x2b, 0xd0, 0x71,
0xcf, 0xbf, 0xf4, 0xe0, 0xb2, 0x5a, 0x1a, 0xc6, 0x29, 0xe7, 0xa5, 0x86, 0x5c, 0x98, 0x83, 0x35,
0xdf, 0xc9, 0xd7, 0x77, 0x7a, 0xa1, 0x69, 0xa7, 0x09, 0xb4, 0xb3, 0x80, 0x9f, 0x8a, 0x24, 0xb6,
0xe3, 0x8b, 0xdf, 0xfa, 0x50, 0xb2, 0x58, 0x1e, 0x4a, 0xd4, 0x55, 0x97, 0x9a, 0x94, 0xb9, 0x85,
0xf9, 0x54, 0x5e, 0x75, 0x95, 0x70, 0x29, 0x03, 0x35, 0xc1, 0xaa, 0x0c, 0x14, 0xa9, 0x6f, 0xfa,
0xe9, 0x10, 0x06, 0x8f, 0x59, 0xcc, 0x38, 0xdb, 0x8b, 0xe3, 0x2a, 0xff, 0x1b, 0x70, 0xbd, 0xa1,
0x4f, 0xd9, 0xda, 0x67, 0xb0, 0xfe, 0x98, 0x1d, 0xcf, 0x26, 0x07, 0xec, 0xac, 0x2c, 0xb9, 0x12,
0x68, 0x17, 0xa7, 0xe9, 0x2b, 0xb5, 0x5f, 0xe2, 0x37, 0x79, 0x0f, 0x20, 0x46, 0x9a, 0x51, 0x91,
0xb1, 0xb1, 0xd2, 0xa6, 0x8e, 0x40, 0x8e, 0x32, 0x36, 0xa6, 0x1f, 0x01, 0xb1, 0xf9, 0xa8, 0x25,
0xa0, 0x05, 0xcc, 0x8e, 0x47, 0xc5, 0xbc, 0xe0, 0x6c, 0xaa, 0x8d, 0xdf, 0x86, 0xe8, 0x5d, 0xe8,
0x1d, 0x06, 0x73, 0x9f, 0x7d, 0xad, 0x1e, 0xc0, 0xe0, 0x99, 0x28, 0x98, 0xa3, 0x7a, 0x9a, 0x33,
0x91, 0xe8, 0xa6, 0x39, 0x2c, 0x49, 0x42, 0x64, 0x1a, 0xb2, 0x82, 0x47, 0x89, 0x2c, 0x6b, 0x2a,
0xa6, 0x16, 0x54, 0xdb, 0xee, 0x56, 0xc3, 0x76, 0xab, 0xd4, 0x45, 0xdf, 0x72, 0xaa, 0x7d, 0x75,
0xb0, 0xdd, 0x7f, 0x18, 0x40, 0xc7, 0x64, 0x82, 0xe4, 0x67, 0xd0, 0x77, 0x8e, 0xf4, 0xe4, 0x86,
0xda, 0x8e, 0xa6, 0x1a, 0xc1, 0xf0, 0x66, 0x73, 0xa7, 0x12, 0xfb, 0xad, 0x6f, 0x7e, 0xf3, 0xaf,
0xbf, 0x6a, 0x0d, 0xc8, 0xe6, 0xce, 0xd9, 0x87, 0x3b, 0xea, 0xcc, 0xbe, 0x23, 0x4a, 0x10, 0xf2,
0x26, 0xe8, 0x25, 0xac, 0xb8, 0x47, 0x7e, 0x72, 0xd3, 0x75, 0xbc, 0x95, 0xd1, 0xde, 0xbb, 0xa0,
0x57, 0x0d, 0x77, 0x53, 0x0c, 0xb7, 0x49, 0xae, 0xd8, 0xc3, 0x99, 0x0c, 0x8d, 0x89, 0xbb, 0x3b,
0xfb, 0x19, 0x16, 0xd1, 0xfc, 0x9a, 0x9f, 0x67, 0x0d, 0xaf, 0xd7, 0x9f, 0x5c, 0xa9, 0x37, 0x5a,
0x74, 0x20, 0x86, 0x22, 0x64, 0x0d, 0x87, 0xb2, 0x5f, 0x61, 0x91, 0x9f, 0x42, 0xc7, 0x3c, 0x39,
0x21, 0xd7, 0xac, 0x07, 0x36, 0xf6, 0x23, 0x96, 0xe1, 0xa0, 0xde, 0xa1, 0x16, 0x71, 0x43, 0x70,
0xbe, 0x4a, 0x6b, 0x9c, 0x3f, 0xf6, 0xee, 0x91, 0x03, 0xb8, 0xaa, 0xac, 0xff, 0x98, 0xfd, 0x77,
0x56, 0xd2, 0xf0, 0x78, 0xec, 0xbe, 0x47, 0x1e, 0xc2, 0xb2, 0x7e, 0x85, 0x43, 0x36, 0x9b, 0x9f,
0x02, 0x0d, 0xaf, 0xd5, 0x70, 0xa5, 0xf4, 0x7b, 0x00, 0xe5, 0xa3, 0x13, 0x32, 0xb8, 0xe8, 0x6d,
0x8c, 0x11, 0x62, 0xc3, 0x0b, 0x95, 0x89, 0x78, 0x73, 0xe3, 0xbe, 0x69, 0x21, 0xdf, 0x29, 0xe9,
0x1b, 0x5f, 0xbb, 0xbc, 0x85, 0x21, 0xdd, 0x14, 0xb2, 0x5b, 0x23, 0x2b, 0x28, 0xbb, 0x84, 0xbd,
0xd2, 0xb7, 0xd8, 0x3f, 0x81, 0xae, 0xf5, 0x32, 0x85, 0x58, 0x97, 0x03, 0x95, 0x97, 0x27, 0xc3,
0x61, 0x53, 0x97, 0xe2, 0x7e, 0x45, 0x70, 0x5f, 0xa1, 0x1d, 0xe4, 0x2e, 0x2e, 0x4e, 0x71, 0x4b,
0x7e, 0x06, 0x2b, 0xee, 0x8b, 0x14, 0xa3, 0xc3, 0x8d, 0x6f, 0x5b, 0x8c, 0x0e, 0x5f, 0xf0, 0x8c,
0x45, 0x6d, 0xff, 0xbd, 0x0d, 0x33, 0xc8, 0xce, 0x1b, 0x55, 0x5f, 0x38, 0x27, 0x3f, 0x46, 0x43,
0x55, 0x37, 0xd9, 0xa4, 0x7c, 0xa1, 0xe3, 0xde, 0x77, 0x1b, 0xdd, 0xaa, 0x5d, 0x7a, 0xd3, 0x75,
0xc1, 0xbc, 0x4b, 0xca, 0x15, 0x90, 0x1f, 0xc1, 0x65, 0x75, 0xa3, 0x4d, 0xae, 0x96, 0x3a, 0x64,
0x9d, 0xd1, 0x86, 0x9b, 0x55, 0x58, 0x31, 0xdb, 0x10, 0xcc, 0xfa, 0xa4, 0x8b, 0xcc, 0x26, 0x8c,
0x47, 0xc8, 0x23, 0x86, 0x55, 0xb7, 0x18, 0x5a, 0x18, 0x71, 0x34, 0x5e, 0x90, 0x18, 0x71, 0x34,
0x57, 0x56, 0x5d, 0x93, 0xd6, 0xa6, 0xbc, 0xa3, 0xef, 0x7e, 0xfe, 0x10, 0x7a, 0xf6, 0xf3, 0x09,
0x32, 0xb4, 0x56, 0x5e, 0x79, 0x6a, 0x31, 0xbc, 0xd1, 0xd8, 0xe7, 0x6e, 0x2d, 0xe9, 0xd9, 0xc3,
0x90, 0x9f, 0xc0, 0xaa, 0x55, 0x4f, 0x3f, 0x9a, 0x27, 0x63, 0xa3, 0x3a, 0xf5, 0x1b, 0xbc, 0x61,
0x53, 0xce, 0x48, 0xaf, 0x09, 0xc6, 0xeb, 0xd4, 0x61, 0x8c, 0x6a, 0xf3, 0x08, 0xba, 0x76, 0xad,
0xfe, 0x2d, 0x7c, 0xaf, 0x59, 0x5d, 0xf6, 0xad, 0xd9, 0x7d, 0x8f, 0xfc, 0xda, 0x83, 0x9e, 0x7d,
0xef, 0x4b, 0x9c, 0x53, 0x50, 0x85, 0xcf, 0xc0, 0xee, 0xb3, 0x19, 0xd1, 0xaf, 0xc4, 0x24, 0x0f,
0xef, 0x3d, 0x73, 0x84, 0xfc, 0xc6, 0xb9, 0xce, 0xd8, 0xb6, 0x9f, 0x32, 0x9e, 0x57, 0x3b, 0xed,
0x1b, 0xce, 0xf3, 0x9d, 0x37, 0xe2, 0xd2, 0xe5, 0xfc, 0xbe, 0x47, 0x3e, 0x96, 0x2f, 0x52, 0x75,
0x82, 0x42, 0x2c, 0x67, 0x52, 0x15, 0x9b, 0xfd, 0xce, 0x73, 0xcb, 0xbb, 0xef, 0x91, 0x3f, 0x92,
0xaf, 0x18, 0xd5, 0xb7, 0x42, 0xfa, 0xef, 0xfa, 0x3d, 0xbd, 0x23, 0x56, 0x74, 0x8b, 0x5e, 0x77,
0x56, 0x54, 0xf5, 0xa6, 0x87, 0x00, 0x65, 0xb6, 0x49, 0x2a, 0xa9, 0x97, 0xf1, 0x33, 0xf5, 0x84,
0xd4, 0xdd, 0x55, 0x9d, 0xa1, 0x49, 0x67, 0xd0, 0xb3, 0xf2, 0xbc, 0xc2, 0x6c, 0x6b, 0x3d, 0x6b,
0x1c, 0x0e, 0x9b, 0xba, 0x14, 0xff, 0xef, 0x0a, 0xfe, 0xef, 0x91, 0x1b, 0x36, 0xff, 0x9d, 0x37,
0x76, 0x96, 0x79, 0x4e, 0xbe, 0x82, 0xfe, 0x41, 0x9a, 0xbe, 0x9c, 0x65, 0xe6, 0x10, 0xe1, 0xe6,
0x4d, 0x98, 0xe9, 0x0e, 0x2b, 0x8b, 0xa2, 0xef, 0x0b, 0xce, 0x37, 0xc8, 0x75, 0x97, 0x73, 0x99,
0xfb, 0x9e, 0x93, 0x00, 0xd6, 0x4d, 0x8c, 0x31, 0x0b, 0x19, 0xba, 0x7c, 0xec, 0x14, 0xb4, 0x36,
0x86, 0x13, 0xf5, 0xcd, 0x18, 0x85, 0xe6, 0x79, 0xdf, 0x23, 0x87, 0xd0, 0x7b, 0xcc, 0xc6, 0x69,
0xc8, 0x54, 0xae, 0xb3, 0x51, 0xce, 0xdc, 0xe4, 0x48, 0xc3, 0xbe, 0x03, 0xba, 0x9e, 0x20, 0x0b,
0xe6, 0x39, 0xfb, 0x7a, 0xe7, 0x8d, 0x4a, 0xa2, 0xce, 0xb5, 0x27, 0xd0, 0x89, 0x9f, 0xe3, 0x09,
0x2a, 0x99, 0xa2, 0xe3, 0x09, 0x6a, 0x99, 0xa2, 0xe3, 0x09, 0x74, 0xe2, 0x49, 0x62, 0xcc, 0x1f,
0x2b, 0xc9, 0xa5, 0x89, 0x54, 0x17, 0xa5, 0xa4, 0xc3, 0xdb, 0x17, 0x13, 0xb8, 0xa3, 0xdd, 0x73,
0x47, 0x3b, 0x82, 0xfe, 0x63, 0x26, 0x85, 0x25, 0xcb, 0x77, 0x43, 0xd7, 0xb5, 0xd8, 0xa5, 0xbe,
0xaa, 0xdb, 0x11, 0x7d, 0xae, 0xa3, 0x17, 0xb5, 0x33, 0xf2, 0x53, 0xe8, 0x3e, 0x65, 0x5c, 0xd7,
0xeb, 0x4c, 0xbc, 0xaf, 0x14, 0xf0, 0x86, 0x0d, 0xe5, 0x3e, 0x7a, 0x5b, 0x70, 0x1b, 0x92, 0x81,
0xe1, 0xb6, 0xc3, 0xc2, 0x09, 0x93, 0x4e, 0x60, 0x14, 0x85, 0xe7, 0xe4, 0xf7, 0x05, 0x73, 0x53,
0xcc, 0xdf, 0xb4, 0xaa, 0x40, 0x36, 0xf3, 0xd5, 0x0a, 0xde, 0xc4, 0x39, 0x49, 0x43, 0x66, 0x85,
0xbc, 0x04, 0xba, 0xd6, 0x05, 0x8d, 0x31, 0xa8, 0xfa, 0xad, 0x8f, 0x31, 0xa8, 0x86, 0xfb, 0x1c,
0xba, 0x25, 0xc6, 0xa1, 0xe4, 0x76, 0x39, 0x8e, 0xbc, 0xc3, 0x29, 0x47, 0xda, 0x79, 0x13, 0x4c,
0xf9, 0x39, 0x79, 0x21, 0x1e, 0x7d, 0xd9, 0x35, 0xc9, 0x32, 0xdf, 0xa8, 0x96, 0x2f, 0x8d, 0xb0,
0xac, 0x2e, 0x37, 0x07, 0x91, 0x43, 0x89, 0xc8, 0xf8, 0xc2, 0x4a, 0xdd, 0x9c, 0xda, 0xac, 0xd6,
0x92, 0x0b, 0x4b, 0x70, 0x66, 0x65, 0x0d, 0x65, 0x38, 0x9d, 0xc5, 0xc9, 0xda, 0x82, 0x95, 0xc5,
0x39, 0xc5, 0x09, 0x2b, 0x8b, 0x73, 0x8b, 0x10, 0x98, 0xc5, 0x95, 0x07, 0x1a, 0x93, 0xc5, 0xd5,
0xce, 0x4a, 0xc6, 0x19, 0xd6, 0x4f, 0x3f, 0xc7, 0x4b, 0xe2, 0x3f, 0x3b, 0xfe, 0xff, 0x7f, 0x05,
0x00, 0x00, 0xff, 0xff, 0x23, 0xe3, 0x4a, 0xbc, 0x0b, 0x32, 0x00, 0x00,
}

@ -97,6 +97,33 @@ func request_Lightning_ConnectPeer_0(ctx context.Context, marshaler runtime.Mars
}
func request_Lightning_DisconnectPeer_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq DisconnectPeerRequest
var metadata runtime.ServerMetadata
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["pub_key"]
if !ok {
return nil, metadata, grpc.Errorf(codes.InvalidArgument, "missing parameter %s", "pub_key")
}
protoReq.PubKey, err = runtime.String(val)
if err != nil {
return nil, metadata, err
}
msg, err := client.DisconnectPeer(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func request_Lightning_ListPeers_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ListPeersRequest
var metadata runtime.ServerMetadata
@ -669,6 +696,34 @@ func RegisterLightningHandler(ctx context.Context, mux *runtime.ServeMux, conn *
})
mux.Handle("DELETE", pattern_Lightning_DisconnectPeer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
if cn, ok := w.(http.CloseNotifier); ok {
go func(done <-chan struct{}, closed <-chan bool) {
select {
case <-done:
case <-closed:
cancel()
}
}(ctx.Done(), cn.CloseNotify())
}
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, req)
if err != nil {
runtime.HTTPError(ctx, outboundMarshaler, w, req, err)
}
resp, md, err := request_Lightning_DisconnectPeer_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, outboundMarshaler, w, req, err)
return
}
forward_Lightning_DisconnectPeer_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_Lightning_ListPeers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
@ -1217,6 +1272,8 @@ var (
pattern_Lightning_ConnectPeer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "peers"}, ""))
pattern_Lightning_DisconnectPeer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "peers", "pub_key"}, ""))
pattern_Lightning_ListPeers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "peers"}, ""))
pattern_Lightning_GetInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "getinfo"}, ""))
@ -1269,6 +1326,8 @@ var (
forward_Lightning_ConnectPeer_0 = runtime.ForwardResponseMessage
forward_Lightning_DisconnectPeer_0 = runtime.ForwardResponseMessage
forward_Lightning_ListPeers_0 = runtime.ForwardResponseMessage
forward_Lightning_GetInfo_0 = runtime.ForwardResponseMessage

@ -5,143 +5,150 @@ import "google/api/annotations.proto";
package lnrpc;
service Lightning {
rpc WalletBalance(WalletBalanceRequest) returns (WalletBalanceResponse) {
rpc WalletBalance (WalletBalanceRequest) returns (WalletBalanceResponse) {
option (google.api.http) = {
get: "/v1/balance/blockchain"
};
}
rpc ChannelBalance(ChannelBalanceRequest) returns (ChannelBalanceResponse) {
rpc ChannelBalance (ChannelBalanceRequest) returns (ChannelBalanceResponse) {
option (google.api.http) = {
get: "/v1/balance/channels"
};
}
rpc GetTransactions(GetTransactionsRequest) returns (TransactionDetails) {
rpc GetTransactions (GetTransactionsRequest) returns (TransactionDetails) {
option (google.api.http) = {
get: "/v1/transactions"
};
}
rpc SendCoins(SendCoinsRequest) returns (SendCoinsResponse) {
rpc SendCoins (SendCoinsRequest) returns (SendCoinsResponse) {
option (google.api.http) = {
post: "/v1/transactions"
body: "*"
};
}
rpc SubscribeTransactions(GetTransactionsRequest) returns (stream Transaction);
rpc SubscribeTransactions (GetTransactionsRequest) returns (stream Transaction);
rpc SendMany(SendManyRequest) returns (SendManyResponse);
rpc SendMany (SendManyRequest) returns (SendManyResponse);
rpc NewAddress(NewAddressRequest) returns (NewAddressResponse);
rpc NewWitnessAddress(NewWitnessAddressRequest) returns (NewAddressResponse) {
rpc NewAddress (NewAddressRequest) returns (NewAddressResponse);
rpc NewWitnessAddress (NewWitnessAddressRequest) returns (NewAddressResponse) {
option (google.api.http) = {
get: "/v1/newaddress"
};
}
rpc ConnectPeer(ConnectPeerRequest) returns (ConnectPeerResponse) {
rpc ConnectPeer (ConnectPeerRequest) returns (ConnectPeerResponse) {
option (google.api.http) = {
post: "/v1/peers"
body: "*"
};
}
rpc ListPeers(ListPeersRequest) returns (ListPeersResponse) {
rpc DisconnectPeer (DisconnectPeerRequest) returns (DisconnectPeerResponse) {
option (google.api.http) = {
delete: "/v1/peers/{pub_key}"
};
}
rpc ListPeers (ListPeersRequest) returns (ListPeersResponse) {
option (google.api.http) = {
get: "/v1/peers"
};
}
rpc GetInfo(GetInfoRequest) returns (GetInfoResponse) {
rpc GetInfo (GetInfoRequest) returns (GetInfoResponse) {
option (google.api.http) = {
get: "/v1/getinfo"
};
}
// TODO(roasbeef): merge with below with bool?
rpc PendingChannels(PendingChannelRequest) returns (PendingChannelResponse) {
rpc PendingChannels (PendingChannelRequest) returns (PendingChannelResponse) {
option (google.api.http) = {
get: "/v1/channels/pending"
};
}
rpc ListChannels(ListChannelsRequest) returns (ListChannelsResponse) {
rpc ListChannels (ListChannelsRequest) returns (ListChannelsResponse) {
option (google.api.http) = {
get: "/v1/channels"
};
}
rpc OpenChannelSync(OpenChannelRequest) returns (ChannelPoint) {
rpc OpenChannelSync (OpenChannelRequest) returns (ChannelPoint) {
option (google.api.http) = {
post: "/v1/channels"
body: "*"
};
}
rpc OpenChannel(OpenChannelRequest) returns (stream OpenStatusUpdate);
rpc OpenChannel (OpenChannelRequest) returns (stream OpenStatusUpdate);
rpc CloseChannel(CloseChannelRequest) returns (stream CloseStatusUpdate) {
rpc CloseChannel (CloseChannelRequest) returns (stream CloseStatusUpdate) {
option (google.api.http) = {
delete: "/v1/channels/{channel_point.funding_txid}/{channel_point.output_index}/{force}"
};
}
rpc SendPayment(stream SendRequest) returns (stream SendResponse);
rpc SendPayment (stream SendRequest) returns (stream SendResponse);
rpc SendPaymentSync(SendRequest) returns (SendResponse) {
rpc SendPaymentSync (SendRequest) returns (SendResponse) {
option (google.api.http) = {
post: "/v1/channels/transactions"
body: "*"
};
}
rpc AddInvoice(Invoice) returns (AddInvoiceResponse) {
rpc AddInvoice (Invoice) returns (AddInvoiceResponse) {
option (google.api.http) = {
post: "/v1/invoices"
body: "*"
};
}
rpc ListInvoices(ListInvoiceRequest) returns (ListInvoiceResponse) {
rpc ListInvoices (ListInvoiceRequest) returns (ListInvoiceResponse) {
option (google.api.http) = {
get: "/v1/invoices/{pending_only}"
};
}
rpc LookupInvoice(PaymentHash) returns (Invoice) {
rpc LookupInvoice (PaymentHash) returns (Invoice) {
option (google.api.http) = {
get: "/v1/invoices/{r_hash_str}"
};
}
rpc SubscribeInvoices(InvoiceSubscription) returns (stream Invoice) {
rpc SubscribeInvoices (InvoiceSubscription) returns (stream Invoice) {
option (google.api.http) = {
get: "/v1/invoices/subscribe"
};
}
rpc DecodePayReq(PayReqString) returns (PayReq) {
rpc DecodePayReq (PayReqString) returns (PayReq) {
option (google.api.http) = {
get: "/v1/payreq/{pay_req}"
};
}
rpc ListPayments(ListPaymentsRequest) returns (ListPaymentsResponse){
rpc ListPayments (ListPaymentsRequest) returns (ListPaymentsResponse) {
option (google.api.http) = {
get: "/v1/payments"
};
};
rpc DeleteAllPayments(DeleteAllPaymentsRequest) returns (DeleteAllPaymentsResponse) {
rpc DeleteAllPayments (DeleteAllPaymentsRequest) returns (DeleteAllPaymentsResponse) {
option (google.api.http) = {
delete: "/v1/payments"
};
};
rpc DescribeGraph(ChannelGraphRequest) returns (ChannelGraph) {
rpc DescribeGraph (ChannelGraphRequest) returns (ChannelGraph) {
option (google.api.http) = {
get: "/v1/graph"
};
}
rpc GetChanInfo(ChanInfoRequest) returns (ChannelEdge) {
rpc GetChanInfo (ChanInfoRequest) returns (ChannelEdge) {
option (google.api.http) = {
get: "/v1/graph/edge/{chan_id}"
};
}
rpc GetNodeInfo(NodeInfoRequest) returns (NodeInfo) {
rpc GetNodeInfo (NodeInfoRequest) returns (NodeInfo) {
option (google.api.http) = {
get: "/v1/graph/node/{pub_key}"
};
@ -153,7 +160,7 @@ service Lightning {
};
}
rpc GetNetworkInfo(NetworkInfoRequest) returns (NetworkInfo) {
rpc GetNetworkInfo (NetworkInfoRequest) returns (NetworkInfo) {
option (google.api.http) = {
get: "/v1/graph/info"
};
@ -163,7 +170,7 @@ service Lightning {
rpc SetAlias(SetAliasRequest) returns (SetAliasResponse);
rpc DebugLevel(DebugLevelRequest) returns (DebugLevelResponse);
rpc DebugLevel (DebugLevelRequest) returns (DebugLevelResponse);
}
message Transaction {
@ -178,7 +185,7 @@ message Transaction {
message GetTransactionsRequest {
}
message TransactionDetails {
repeated Transaction transactions = 1 [ json_name = "transactions" ];
repeated Transaction transactions = 1 [json_name = "transactions"];
}
message SendRequest {
@ -193,8 +200,8 @@ message SendRequest {
string payment_request = 6;
}
message SendResponse {
bytes payment_preimage = 1 [ json_name = "payment_preimage" ];
Route payment_route = 2 [ json_name = "payment_route" ];
bytes payment_preimage = 1 [json_name = "payment_preimage"];
Route payment_route = 2 [json_name = "payment_route"];
}
message ChannelPoint {
@ -205,15 +212,15 @@ message ChannelPoint {
}
message LightningAddress {
string pubkey = 1 [ json_name = "pubkey" ];
string host = 2 [ json_name = "host" ];
string pubkey = 1 [json_name = "pubkey"];
string host = 2 [json_name = "host"];
}
message SendManyRequest {
map<string, int64> AddrToAmount = 1;
}
message SendManyResponse {
string txid = 1 [ json_name = "txid" ];
string txid = 1 [json_name = "txid"];
}
message SendCoinsRequest {
@ -221,7 +228,7 @@ message SendCoinsRequest {
int64 amount = 2;
}
message SendCoinsResponse {
string txid = 1 [ json_name = "txid" ];
string txid = 1 [json_name = "txid"];
}
message NewAddressRequest {
@ -232,9 +239,10 @@ message NewAddressRequest {
}
AddressType type = 1;
}
message NewWitnessAddressRequest {}
message NewWitnessAddressRequest {
}
message NewAddressResponse {
string address = 1 [ json_name = "address" ];
string address = 1 [json_name = "address"];
}
message ConnectPeerRequest {
@ -242,73 +250,82 @@ message ConnectPeerRequest {
bool perm = 2;
}
message ConnectPeerResponse {
int32 peer_id = 1 [ json_name = "peer_id" ];
int32 peer_id = 1 [json_name = "peer_id"];
}
message DisconnectPeerRequest {
string pub_key = 1 [json_name = "pub_key"];
}
message DisconnectPeerResponse {
}
message HTLC {
bool incoming = 1 [ json_name = "incoming" ];
int64 amount = 2 [ json_name = "amount" ];
bytes hash_lock = 3 [ json_name = "hash_lock" ];
uint32 expiration_height = 4 [ json_name = "expiration_height" ];
uint32 revocation_delay = 5 [ json_name = "revocation_delay" ];
bool incoming = 1 [json_name = "incoming"];
int64 amount = 2 [json_name = "amount"];
bytes hash_lock = 3 [json_name = "hash_lock"];
uint32 expiration_height = 4 [json_name = "expiration_height"];
uint32 revocation_delay = 5 [json_name = "revocation_delay"];
}
message ActiveChannel {
bool active = 1 [ json_name = "active" ];
string remote_pubkey = 2 [ json_name = "remote_pubkey" ];
string channel_point = 3 [ json_name = "channel_point" ];
uint64 chan_id = 4 [ json_name = "chan_id" ];
bool active = 1 [json_name = "active"];
string remote_pubkey = 2 [json_name = "remote_pubkey"];
string channel_point = 3 [json_name = "channel_point"];
uint64 chan_id = 4 [json_name = "chan_id"];
int64 capacity = 5 [ json_name = "capacity" ];
int64 local_balance = 6 [ json_name = "local_balance" ];
int64 remote_balance = 7 [ json_name = "remote_balance" ];
int64 capacity = 5 [json_name = "capacity"];
int64 local_balance = 6 [json_name = "local_balance"];
int64 remote_balance = 7 [json_name = "remote_balance"];
int64 unsettled_balance = 8 [ json_name = "unsettled_balance" ];
int64 total_satoshis_sent = 9 [ json_name = "total_satoshis_sent" ];
int64 total_satoshis_received = 10 [ json_name = "total_satoshis_received" ];
uint64 num_updates = 11 [ json_name = "num_updates" ];
int64 unsettled_balance = 8 [json_name = "unsettled_balance"];
int64 total_satoshis_sent = 9 [json_name = "total_satoshis_sent"];
int64 total_satoshis_received = 10 [json_name = "total_satoshis_received"];
uint64 num_updates = 11 [json_name = "num_updates"];
repeated HTLC pending_htlcs = 12 [ json_name = "pending_htlcs" ];
repeated HTLC pending_htlcs = 12 [json_name = "pending_htlcs"];
}
message ListChannelsRequest {}
message ListChannelsRequest {
}
message ListChannelsResponse {
repeated ActiveChannel channels = 11 [ json_name = "channels" ];
repeated ActiveChannel channels = 11 [json_name = "channels"];
}
message Peer {
string pub_key = 1 [ json_name = "pub_key" ];
int32 peer_id = 2 [ json_name = "peer_id" ];
string address = 3 [ json_name = "address" ];
string pub_key = 1 [json_name = "pub_key"];
int32 peer_id = 2 [json_name = "peer_id"];
string address = 3 [json_name = "address"];
uint64 bytes_sent = 4 [ json_name = "bytes_sent" ];
uint64 bytes_recv = 5 [ json_name = "bytes_recv" ];
uint64 bytes_sent = 4 [json_name = "bytes_sent"];
uint64 bytes_recv = 5 [json_name = "bytes_recv"];
int64 sat_sent = 6 [ json_name = "sat_sent" ];
int64 sat_recv = 7 [ json_name = "sat_recv" ];
int64 sat_sent = 6 [json_name = "sat_sent"];
int64 sat_recv = 7 [json_name = "sat_recv"];
bool inbound = 8 [ json_name = "inbound" ];
bool inbound = 8 [json_name = "inbound"];
int64 ping_time = 9 [ json_name = "ping_time" ];
int64 ping_time = 9 [json_name = "ping_time"];
}
message ListPeersRequest {}
message ListPeersRequest {
}
message ListPeersResponse {
repeated Peer peers = 1 [ json_name = "peers" ];
repeated Peer peers = 1 [json_name = "peers"];
}
message GetInfoRequest{}
message GetInfoRequest {
}
message GetInfoResponse {
string identity_pubkey = 1 [ json_name = "identity_pubkey" ];
string alias = 2 [ json_name = "alias" ];
string identity_pubkey = 1 [json_name = "identity_pubkey"];
string alias = 2 [json_name = "alias"];
uint32 num_pending_channels = 3 [ json_name = "num_pending_channels" ];
uint32 num_active_channels = 4 [ json_name = "num_active_channels" ];
uint32 num_pending_channels = 3 [json_name = "num_pending_channels"];
uint32 num_active_channels = 4 [json_name = "num_active_channels"];
uint32 num_peers = 5 [ json_name = "num_peers" ];
uint32 num_peers = 5 [json_name = "num_peers"];
uint32 block_height = 6 [ json_name = "block_height" ];
string block_hash = 8 [ json_name = "block_hash" ];
uint32 block_height = 6 [json_name = "block_height"];
string block_hash = 8 [json_name = "block_hash"];
bool synced_to_chain = 9 [ json_name = "synced_to_chain" ];
bool testnet = 10 [ json_name = "testnet" ];
@ -324,13 +341,13 @@ message ConfirmationUpdate {
}
message ChannelOpenUpdate {
ChannelPoint channel_point = 1 [ json_name = "channel_point"] ;
ChannelPoint channel_point = 1 [json_name = "channel_point"];
}
message ChannelCloseUpdate {
bytes closing_txid = 1 [ json_name = "closing_txid" ];
bytes closing_txid = 1 [json_name = "closing_txid"];
bool success = 2 [ json_name = "success" ];
bool success = 2 [json_name = "success"];
}
message CloseChannelRequest {
@ -340,32 +357,32 @@ message CloseChannelRequest {
}
message CloseStatusUpdate {
oneof update {
PendingUpdate close_pending = 1 [ json_name = "close_pending" ];
ConfirmationUpdate confirmation = 2 [ json_name = "confirmation" ];
ChannelCloseUpdate chan_close = 3 [ json_name = "chan_close" ];
PendingUpdate close_pending = 1 [json_name = "close_pending"];
ConfirmationUpdate confirmation = 2 [json_name = "confirmation"];
ChannelCloseUpdate chan_close = 3 [json_name = "chan_close"];
}
}
message PendingUpdate {
bytes txid = 1 [ json_name = "txid" ];
uint32 output_index = 2 [ json_name = "output_index" ];
bytes txid = 1 [json_name = "txid"];
uint32 output_index = 2 [json_name = "output_index"];
}
message OpenChannelRequest {
int32 target_peer_id = 1 [ json_name = "target_peer_id" ];
bytes node_pubkey = 2 [ json_name = "node_pubkey" ];
string node_pubkey_string = 3 [ json_name = "node_pubkey_string" ];
int32 target_peer_id = 1 [json_name = "target_peer_id"];
bytes node_pubkey = 2 [json_name = "node_pubkey"];
string node_pubkey_string = 3 [json_name = "node_pubkey_string"];
int64 local_funding_amount = 4 [ json_name = "local_funding_amount" ];
int64 push_sat = 5 [ json_name = "push_sat" ];
int64 local_funding_amount = 4 [json_name = "local_funding_amount"];
int64 push_sat = 5 [json_name = "push_sat"];
uint32 num_confs = 6 [ json_name = "num_confs" ];
uint32 num_confs = 6 [json_name = "num_confs"];
}
message OpenStatusUpdate {
oneof update {
PendingUpdate chan_pending = 1 [ json_name = "chan_pending" ];
ConfirmationUpdate confirmation = 2 [ json_name = "confirmation" ];
ChannelOpenUpdate chan_open = 3 [ json_name = "chan_open" ];
PendingUpdate chan_pending = 1 [json_name = "chan_pending"];
ConfirmationUpdate confirmation = 2 [json_name = "confirmation"];
ChannelOpenUpdate chan_open = 3 [json_name = "chan_open"];
}
}
@ -416,13 +433,13 @@ message WalletBalanceRequest {
bool witness_only = 1;
}
message WalletBalanceResponse {
double balance = 1 [ json_name = "balance" ];
double balance = 1 [json_name = "balance"];
}
message ChannelBalanceRequest {
}
message ChannelBalanceResponse {
int64 balance = 1 [ json_name = "balance" ];
int64 balance = 1 [json_name = "balance"];
}
message QueryRoutesRequest {
@ -434,29 +451,29 @@ message QueryRoutesResponse {
}
message Hop {
uint64 chan_id = 1 [ json_name = "chan_id" ];
int64 chan_capacity = 2 [ json_name = "chan_capacity" ];
int64 amt_to_forward = 3 [ json_name = "amt_to_forward" ];
int64 fee = 4 [ json_name = "fee" ];
uint64 chan_id = 1 [json_name = "chan_id"];
int64 chan_capacity = 2 [json_name = "chan_capacity"];
int64 amt_to_forward = 3 [json_name = "amt_to_forward"];
int64 fee = 4 [json_name = "fee"];
}
message Route {
uint32 total_time_lock = 1 [ json_name = "total_time_lock" ];
int64 total_fees = 2 [ json_name = "total_fees" ];
int64 total_amt = 3 [ json_name = "total_amt" ];
uint32 total_time_lock = 1 [json_name = "total_time_lock"];
int64 total_fees = 2 [json_name = "total_fees"];
int64 total_amt = 3 [json_name = "total_amt"];
repeated Hop hops = 4 [ json_name = "hops" ];
repeated Hop hops = 4 [json_name = "hops"];
}
message NodeInfoRequest{
string pub_key = 1;
message NodeInfoRequest {
string pub_key = 1;
}
message NodeInfo {
LightningNode node = 1 [ json_name = "node" ];
LightningNode node = 1 [json_name = "node"];
uint32 num_channels = 2 [ json_name = "num_channels" ];
int64 total_capacity = 3 [ json_name = "total_capacity" ];
uint32 num_channels = 2 [json_name = "num_channels"];
int64 total_capacity = 3 [json_name = "total_capacity"];
}
message LightningNode {
@ -472,52 +489,54 @@ message NodeAddress {
}
message RoutingPolicy {
uint32 time_lock_delta = 1 [ json_name = "time_lock_delta" ];
int64 min_htlc = 2 [ json_name = "min_htlc" ];
int64 fee_base_msat = 3 [ json_name = "fee_base_msat" ];
int64 fee_rate_milli_msat = 4 [ json_name = "fee_rate_milli_msat" ];
uint32 time_lock_delta = 1 [json_name = "time_lock_delta"];
int64 min_htlc = 2 [json_name = "min_htlc"];
int64 fee_base_msat = 3 [json_name = "fee_base_msat"];
int64 fee_rate_milli_msat = 4 [json_name = "fee_rate_milli_msat"];
}
message ChannelEdge {
uint64 channel_id = 1 [ json_name = "channel_id" ];
string chan_point = 2 [ json_name = "chan_point" ];
uint64 channel_id = 1 [json_name = "channel_id"];
string chan_point = 2 [json_name = "chan_point"];
uint32 last_update = 3 [ json_name = "last_update" ];
uint32 last_update = 3 [json_name = "last_update"];
string node1_pub = 4 [ json_name = "node1_pub" ];
string node2_pub = 5 [ json_name = "node2_pub" ];
string node1_pub = 4 [json_name = "node1_pub"];
string node2_pub = 5 [json_name = "node2_pub"];
int64 capacity = 6 [ json_name = "capacity" ];
int64 capacity = 6 [json_name = "capacity"];
RoutingPolicy node1_policy = 7 [ json_name = "node1_policy" ];
RoutingPolicy node2_policy = 8 [ json_name = "node2_policy" ];
RoutingPolicy node1_policy = 7 [json_name = "node1_policy"];
RoutingPolicy node2_policy = 8 [json_name = "node2_policy"];
}
message ChannelGraphRequest{}
message ChannelGraphRequest {
}
message ChannelGraph {
repeated LightningNode nodes = 1 [ json_name = "nodes" ];
repeated ChannelEdge edges = 2 [ json_name = "edges" ];
repeated LightningNode nodes = 1 [json_name = "nodes"];
repeated ChannelEdge edges = 2 [json_name = "edges"];
}
message ChanInfoRequest {
uint64 chan_id = 1;
}
message NetworkInfoRequest{}
message NetworkInfoRequest {
}
message NetworkInfo {
uint32 graph_diameter = 1 [ json_name = "graph_diameter" ];
double avg_out_degree = 2 [ json_name = "avg_out_degree" ];
uint32 max_out_degree = 3 [ json_name = "max_out_degree" ];
uint32 graph_diameter = 1 [json_name = "graph_diameter"];
double avg_out_degree = 2 [json_name = "avg_out_degree"];
uint32 max_out_degree = 3 [json_name = "max_out_degree"];
uint32 num_nodes = 4 [ json_name = "num_nodes" ];
uint32 num_channels = 5 [ json_name = "num_channels" ];
uint32 num_nodes = 4 [json_name = "num_nodes"];
uint32 num_channels = 5 [json_name = "num_channels"];
int64 total_network_capacity = 6 [ json_name = "total_network_capacity" ];
int64 total_network_capacity = 6 [json_name = "total_network_capacity"];
double avg_channel_size = 7 [ json_name = "avg_channel_size" ];
int64 min_channel_size = 8 [ json_name = "min_channel_size" ];
int64 max_channel_size = 9 [ json_name = "max_channel_size" ];
double avg_channel_size = 7 [json_name = "avg_channel_size"];
int64 min_channel_size = 8 [json_name = "min_channel_size"];
int64 max_channel_size = 9 [json_name = "max_channel_size"];
// TODO(roasbeef): fee rate info, expiry
// * also additional RPC for tracking fee info once in
@ -557,59 +576,61 @@ message ClosedChannelUpdate {
message SetAliasRequest {
string new_alias = 1;
}
message SetAliasResponse{}
message SetAliasResponse {
}
message Invoice {
string memo = 1 [ json_name = "memo" ];
bytes receipt = 2 [ json_name = "receipt" ];
string memo = 1 [json_name = "memo"];
bytes receipt = 2 [json_name = "receipt"];
bytes r_preimage = 3 [ json_name = "r_preimage" ];
bytes r_hash = 4 [ json_name = "r_hash" ];
bytes r_preimage = 3 [json_name = "r_preimage"];
bytes r_hash = 4 [json_name = "r_hash"];
int64 value = 5 [ json_name = "value" ];
int64 value = 5 [json_name = "value"];
bool settled = 6 [ json_name = "settled" ];
bool settled = 6 [json_name = "settled"];
int64 creation_date = 7 [ json_name = "creation_date" ];
int64 settle_date = 8 [ json_name = "settle_date" ];
int64 creation_date = 7 [json_name = "creation_date"];
int64 settle_date = 8 [json_name = "settle_date"];
string payment_request = 9 [ json_name = "payment_request" ];
string payment_request = 9 [json_name = "payment_request"];
}
message AddInvoiceResponse {
bytes r_hash = 1 [ json_name = "r_hash" ];
bytes r_hash = 1 [json_name = "r_hash"];
string payment_request = 2 [ json_name = "payment_request" ];
string payment_request = 2 [json_name = "payment_request"];
}
message PaymentHash {
string r_hash_str = 1 [ json_name = "r_hash_str" ];
bytes r_hash = 2 [ json_name = "r_hash" ];
string r_hash_str = 1 [json_name = "r_hash_str"];
bytes r_hash = 2 [json_name = "r_hash"];
}
message ListInvoiceRequest {
bool pending_only = 1;
}
message ListInvoiceResponse {
repeated Invoice invoices = 1 [ json_name = "invoices" ];
repeated Invoice invoices = 1 [json_name = "invoices"];
}
message InvoiceSubscription {}
message InvoiceSubscription {
}
message Payment {
string payment_hash = 1 [ json_name = "payment_hash" ];
int64 value = 2 [ json_name = "value" ];
string payment_hash = 1 [json_name = "payment_hash"];
int64 value = 2 [json_name = "value"];
int64 creation_date = 3 [ json_name = "creation_date" ];
int64 creation_date = 3 [json_name = "creation_date"];
repeated string path = 4 [ json_name = "path" ];
int64 fee = 5 [ json_name = "fee" ];
int64 fee = 5 [json_name = "fee"];
}
message ListPaymentsRequest {
}
message ListPaymentsResponse {
repeated Payment payments = 1 [ json_name= "payments" ];
repeated Payment payments = 1 [json_name = "payments"];
}
message DeleteAllPaymentsRequest {
@ -623,14 +644,14 @@ message DebugLevelRequest {
string level_spec = 2;
}
message DebugLevelResponse {
string sub_systems = 1 [ json_name = "sub_systems" ];
string sub_systems = 1 [json_name = "sub_systems"];
}
message PayReqString {
string pay_req = 1;
}
message PayReq {
string destination = 1 [ json_name = "destination" ];
string payment_hash = 2 [ json_name = "payment_hash" ];
int64 num_satoshis = 3 [ json_name = "num_satoshis" ];
string destination = 1 [json_name = "destination"];
string payment_hash = 2 [json_name = "payment_hash"];
int64 num_satoshis = 3 [json_name = "num_satoshis"];
}

@ -514,6 +514,30 @@
]
}
},
"/v1/peers/{pub_key}": {
"delete": {
"operationId": "DisconnectPeer",
"responses": {
"200": {
"description": "",
"schema": {
"$ref": "#/definitions/lnrpcDisconnectPeerResponse"
}
}
},
"parameters": [
{
"name": "pub_key",
"in": "path",
"required": true,
"type": "string"
}
],
"tags": [
"Lightning"
]
}
},
"/v1/transactions": {
"get": {
"operationId": "GetTransactions",
@ -953,6 +977,17 @@
"lnrpcDeleteAllPaymentsResponse": {
"type": "object"
},
"lnrpcDisconnectPeerRequest": {
"type": "object",
"properties": {
"pub_key": {
"type": "string"
}
}
},
"lnrpcDisconnectPeerResponse": {
"type": "object"
},
"lnrpcGetInfoRequest": {
"type": "object"
},