ln-sync v6.4.0
LN Sync
Methods for synchronizing metadata about Lightning Network nodes, channels, and payments.
Methods
acceptsChannelOpen
Confirm that a peer will accept a channel open
{
capacity: <Channel Capacity Tokens Number>
[cooperative_close_address]: <Restrict Coop Close To Address String>
[give_tokens]: <Tokens to Gift To Partner Number> // Defaults to zero
[is_private]: <Channel is Private Bool> // Defaults to false
lnd: <Authenticated LND API Object>
[min_htlc_mtokens]: <Minimum HTLC Millitokens String>
[partner_csv_delay]: <Peer Output CSV Delay Number>
partner_public_key: <Public Key Hex String>
}
@returns via cbk or Promise
{
is_accepted: <Channel Proposal Is Accepted Bool>
}
askForFeeRate
Ask to get a chain fee rate
{
ask: <Inquirer Ask Function>
lnd: <Authenticated LND API Object>
}
@returns via cbk or Promise
{
tokens_per_vbyte: <Chain Fee Tokens Per VByte Number>
}
assembleUnsignedPsbt
Assemble an unsigned PSBT with funding from multiple parties
{
capacity: <Channel Capacity Tokens Number>
proposed: [{
[change]: <Change Output Hex String>
[funding]: [<Funding Output Hex String>]
utxos: [{
[non_witness_utxo]: <Spending Transaction Hex String>
transaction_id: <Transaction Id Hex String>
transaction_vout: <Transaction Output Index Number>
witness_utxo: {
script_pub: <Witness Output Script Hex String>
tokens: <Tokens Number>
}
}]
}]
rate: <Fee Rate Number>
}
@returns via cbk or Promise
{
psbt: <Unsigned Funding Transaction PSBT Hex String>
}
broadcastTransaction
Broadcast a chain transaction until it gets confirmed in a block
{
[description]: <Transaction Description String>
lnd: <Authenticated LND API Object>
logger: <Winston Logger Object>
transaction: <Transaction String>
}
@returns via cbk or Promise
{
transaction_confirmed_in_block: <Block Height Number>
}
connectPeer
Connect a peer
{
id: <Node Public Key Hex String>
lnd: <Authenticated LND API Object>
[sockets]: [<Host Network Address And Optional Port String>]
}
@returns via cbk or Promise
findConfirmedOutput
Find a confirmed on-chain output
{
lnd: <Authenticated LND API Object>
[min_confirmations]: <Minimum Confirmations Count Number>
output_script: <Chain Output Script Hex String>
start_height: <Start Chain Height Number>
timeout_ms: <Timeout Milliseconds Number>
tokens: <Tokens Sent To Script Number>
}
@returns via cbk or Promise
{
confirmation_height: <Transaction Confirmed At Height Number>
is_coinbase: <Transaction is Coinbase Transaction Bool>
transaction_id: <Transaction Id Hex String>
transaction_vout: <Transaction Output Index Number>
}
findKey
Find a public key given a query
{
[channels]: [{
partner_public_key: <Partner Public Key Hex String>
}]
lnd: <Authenticated LND API Object>
[query]: <Query String>
}
@returns via cbk or Promise
{
[public_key]: <Public Key Hex String>
}
formatTokens
Format tokens for display
{
is_monochrome: <Avoid Applying Colors Bool>
tokens: <Tokens Number>
}
@returns
{
display: <Display Formatted Tokens String>
}
getAllInvoices
Get all invoices
{
[confirmed_after]: <Confirmed At or After ISO 8601 Date String>
[created_after]: <Confirmed At or After ISO 8601 Date String>
lnd: <Authenticated LND API Object>
}
@returns via cbk or Promise
{
invoices: [{
[chain_address]: <Fallback Chain Address String>
cltv_delta: <Final CLTV Delta Number>
[confirmed_at]: <Settled at ISO 8601 Date String>
created_at: <ISO 8601 Date String>
description: <Description String>
[description_hash]: <Description Hash Hex String>
expires_at: <ISO 8601 Date String>
features: [{
bit: <BOLT 09 Feature Bit Number>
is_known: <Feature is Known Bool>
is_required: <Feature Support is Required To Pay Bool>
type: <Feature Type String>
}]
id: <Payment Hash String>
[is_canceled]: <Invoice is Canceled Bool>
is_confirmed: <Invoice is Confirmed Bool>
[is_held]: <HTLC is Held Bool>
is_private: <Invoice is Private Bool>
[is_push]: <Invoice is Push Payment Bool>
payments: [{
[confirmed_at]: <Payment Settled At ISO 8601 Date String>
created_at: <Payment Held Since ISO 860 Date String>
created_height: <Payment Held Since Block Height Number>
in_channel: <Incoming Payment Through Channel Id String>
is_canceled: <Payment is Canceled Bool>
is_confirmed: <Payment is Confirmed Bool>
is_held: <Payment is Held Bool>
messages: [{
type: <Message Type Number String>
value: <Raw Value Hex String>
}]
mtokens: <Incoming Payment Millitokens String>
[pending_index]: <Pending Payment Channel HTLC Index Number>
tokens: <Payment Tokens Number>
[total_mtokens]: <Total Millitokens String>
}]
received: <Received Tokens Number>
received_mtokens: <Received Millitokens String>
[request]: <Bolt 11 Invoice String>
secret: <Secret Preimage Hex String>
tokens: <Tokens Number>
}]
}
getFundedTransaction
Get a funded transaction
{
ask: <Inquirer Ask Function>
[chain_fee_tokens_per_vbyte]: <Internal Funding Uses Tokens/Vbyte Number>
[is_external]: <Transaction Uses External Funds Bool>
lnd: Authenticated LND API Object>
logger: <Winston Logger Object>
outputs: [{
address: <Chain Address String>
tokens: <Tokens To Send To Output Number>
}]
}
@returns via cbk or Promise
{
id: <Transaction Id Hex String>
[inputs]: [{
[lock_expires_at]: <UTXO Lock Expires At ISO 8601 Date String>
[lock_id]: <UTXO Lock Id Hex String>
transaction_id: <Transaction Hex Id String>
transaction_vout: <Transaction Output Index Number>
}]
[psbt]: <Transaction As Finalized PSBT Hex String>
transaction: <Raw Transaction Hex String>
}
getLiquidity
Get the channel available liquidity
A request function is required when min_node_score is specified
{
[is_outbound]: <Return Outbound Liquidity Bool>
[is_top]: <Return Top Liquidity Bool>
lnd: <Authenticated LND API Object>
[min_node_score]: <Minimum Node Score Number>
[max_fee_rate]: <Max Inbound Fee Rate Parts Per Million Number>
[request]: <Request Function>
[with]: [<Liquidity With Specific Node Public Key Hex String>]
}
@returns via cbk
{
tokens: [<Liquidity Tokens Number>]
}
getNetwork
Get network name for lnd
{
lnd: <Authenticated LND API Object>
}
@returns via cbk or Promise
{
[bitcoinjs]: <Bitcoin JS Network Name String>
network: <Network Name String>
}
getNodeAlias
Get the alias of a node, ignoring errors
{
id: <Node Identity Public Key Hex String>
lnd: <Authenticated LND API Object>
}
@returns via cbk or Promise
{
alias: <Node Alias String>
id: <Node Identity Public Key Hex String>
}
getNodeFunds
Get a detailed balance that categorizes balance of tokens on the node
{
[is_confirmed]: <Only Consider Confirmed Transactions Bool>
lnd: <Authenticated LND API Object>
}
@returns via cbk or Promise
{
[closing_balance]: <Total Coins Closing Tokens Number>
[conflicted_pending]: <Conflicted Transaction Tokens Number>
[invalid_pending]: <Invalid Pending Tokens Tokens Number>
[offchain_balance]: <Channel Tokens Balance Tokens Number>
[offchain_pending]: <Pending Channel Tokens Balance Tokens Number>
[onchain_confirmed]: <Confirmed On Chain Balance Tokens Number>
[onchain_pending]: <Pending Chain Tokens Balance Tokens Number>
[onchain_vbytes]: <UTXO Footprint Virtual Bytes Number>
[utxos_count]: <Total UTXOs Count Number>
}
getMaxFundAmount
Find the max amount that can be used for funding outputs given inputs
{
addresses: [<Send to Address String>]
fee_tokens_per_vbyte: <Funding Fee Tokens Per VByte Number>
inputs: [{
tokens: <Input Tokens Number>
transaction_id: <UTXO Transaction Id Hex String>
transaction_vout: <UTXO Transaction Output Index Number>
}]
lnd: <Authenticated LND API Object>
}
@returns via cbk or Promise
{
fee_tokens_per_vbyte: <Effective Final Fee Tokens Per VByte Number>
max_tokens: <Maximum Spendable Tokens Number>
}
getPayments
Get payments
{
[after]: <Get Only Payments Create At Or After ISO 8601 Date String>
lnd: <Authenticated LND API Object>
}
@returns via cbk or Promise
{
payments: [{
attempts: [{
[failure]: {
code: <Error Type Code Number>
[details]: {
[channel]: <Standard Format Channel Id String>
[height]: <Error Associated Block Height Number>
[index]: <Failed Hop Index Number>
[mtokens]: <Error Millitokens String>
[policy]: {
base_fee_mtokens: <Base Fee Millitokens String>
cltv_delta: <Locktime Delta Number>
fee_rate: <Fees Charged in Millitokens Per Million Number>
[is_disabled]: <Channel is Disabled Bool>
max_htlc_mtokens: <Maximum HLTC Millitokens Value String>
min_htlc_mtokens: <Minimum HTLC Millitokens Value String>
updated_at: <Updated At ISO 8601 Date String>
}
[timeout_height]: <Error CLTV Timeout Height Number>
[update]: {
chain: <Chain Id Hex String>
channel_flags: <Channel Flags Number>
extra_opaque_data: <Extra Opaque Data Hex String>
message_flags: <Message Flags Number>
signature: <Channel Update Signature Hex String>
}
}
message: <Error Message String>
}
[index]: <Payment Add Index Number>
is_confirmed: <Payment Attempt Succeeded Bool>
is_failed: <Payment Attempt Failed Bool>
is_pending: <Payment Attempt is Waiting For Resolution Bool>
route: {
fee: <Route Fee Tokens Number>
fee_mtokens: <Route Fee Millitokens String>
hops: [{
channel: <Standard Format Channel Id String>
channel_capacity: <Channel Capacity Tokens Number>
fee: <Fee Number>
fee_mtokens: <Fee Millitokens String>
forward: <Forward Tokens Number>
forward_mtokens: <Forward Millitokens String>
[public_key]: <Forward Edge Public Key Hex String>
[timeout]: <Timeout Block Height Number>
}]
mtokens: <Total Fee-Inclusive Millitokens String>
[payment]: <Payment Identifier Hex String>
timeout: <Timeout Block Height Number>
tokens: <Total Fee-Inclusive Tokens Number>
[total_mtokens]: <Total Millitokens String>
}
}]
created_at: <Payment at ISO-8601 Date String>
destination: <Destination Node Public Key Hex String>
fee: <Paid Routing Fee Rounded Down Tokens Number>
fee_mtokens: <Paid Routing Fee in Millitokens String>
hops: [<First Route Hop Public Key Hex String>]
id: <Payment Preimage Hash String>
[index]: <Payment Add Index Number>
is_confirmed: <Payment is Confirmed Bool>
is_outgoing: <Transaction Is Outgoing Bool>
mtokens: <Millitokens Sent to Destination String>
[request]: <BOLT 11 Payment Request String>
safe_fee: <Payment Forwarding Fee Rounded Up Tokens Number>
safe_tokens: <Payment Tokens Rounded Up Number>
secret: <Payment Preimage Hex String>
tokens: <Rounded Down Tokens Sent to Destination Number>
}]
}
getPeerLiquidity
Get the rundown on liquidity with a specific peer
{
lnd: <Authenticated LND API Object>
public_key: <Peer Public Key Hex String>
[settled]: <Known Settled Payment Id String>
}
@returns via cbk or Promise
{
alias: <Alias String>
inbound: <Inbound Liquidity Tokens Number>
inbound_pending: <Pending Inbound Liquidity Tokens Number>
outbound: <Outbound Liquidity Tokens Number>
outbound_pending: <Pending Outbound Liquidity Tokens Number>
}
getRebalancePayments
Get payments that were rebalances
{
after: <Rebalance Payments After ISO 8601 Date String>
lnds: [<Authenticated LND API Object>]
}
@returns via cbk or Promise
{
payments: [{
attempts: [{
[failure]: {
code: <Error Type Code Number>
[details]: {
[channel]: <Standard Format Channel Id String>
[height]: <Error Associated Block Height Number>
[index]: <Failed Hop Index Number>
[mtokens]: <Error Millitokens String>
[policy]: {
base_fee_mtokens: <Base Fee Millitokens String>
cltv_delta: <Locktime Delta Number>
fee_rate: <Fees Charged in Millitokens Per Million Number>
[is_disabled]: <Channel is Disabled Bool>
max_htlc_mtokens: <Maximum HLTC Millitokens Value String>
min_htlc_mtokens: <Minimum HTLC Millitokens Value String>
updated_at: <Updated At ISO 8601 Date String>
}
[timeout_height]: <Error CLTV Timeout Height Number>
[update]: {
chain: <Chain Id Hex String>
channel_flags: <Channel Flags Number>
extra_opaque_data: <Extra Opaque Data Hex String>
message_flags: <Message Flags Number>
signature: <Channel Update Signature Hex String>
}
}
message: <Error Message String>
}
[index]: <Payment Add Index Number>
[confirmed_at]: <Payment Confirmed At ISO 8601 Date String>
is_confirmed: <Payment Attempt Succeeded Bool>
is_failed: <Payment Attempt Failed Bool>
is_pending: <Payment Attempt is Waiting For Resolution Bool>
route: {
fee: <Route Fee Tokens Number>
fee_mtokens: <Route Fee Millitokens String>
hops: [{
channel: <Standard Format Channel Id String>
channel_capacity: <Channel Capacity Tokens Number>
fee: <Fee Number>
fee_mtokens: <Fee Millitokens String>
forward: <Forward Tokens Number>
forward_mtokens: <Forward Millitokens String>
[public_key]: <Forward Edge Public Key Hex String>
[timeout]: <Timeout Block Height Number>
}]
mtokens: <Total Fee-Inclusive Millitokens String>
[payment]: <Payment Identifier Hex String>
timeout: <Timeout Block Height Number>
tokens: <Total Fee-Inclusive Tokens Number>
[total_mtokens]: <Total Millitokens String>
}
}]
confirmed_at: <Payment Confirmed At ISO 8601 Date String>
created_at: <Payment at ISO-8601 Date String>
destination: <Destination Node Public Key Hex String>
fee: <Paid Routing Fee Rounded Down Tokens Number>
fee_mtokens: <Paid Routing Fee in Millitokens String>
hops: [<First Route Hop Public Key Hex String>]
id: <Payment Preimage Hash String>
[index]: <Payment Add Index Number>
is_confirmed: <Payment is Confirmed Bool>
is_outgoing: <Transaction Is Outgoing Bool>
mtokens: <Millitokens Sent to Destination String>
[request]: <BOLT 11 Payment Request String>
safe_fee: <Payment Forwarding Fee Rounded Up Tokens Number>
safe_tokens: <Payment Tokens Rounded Up Number>
secret: <Payment Preimage Hex String>
tokens: <Rounded Down Tokens Sent to Destination Number>
}]
}
getScoredNodes
Get scored nodes
{
network: <Network Name String>
request: <Request Function>
}
@returns via cbk or Promise
{
nodes: [{
public_key: <Public Key Hex String>
score: <Forwarding Quality Score Out Of One Hundred Million Number>
}]
}
getTransactionRecord
Get LND internal record associated with a transaction id
{
[chain_transactions]: [{
[block_id]: <Block Hash String>
[confirmation_count]: <Confirmation Count Number>
[confirmation_height]: <Confirmation Block Height Number>
created_at: <Created ISO 8601 Date String>
[description]: <Transaction Label String>
[fee]: <Fees Paid Tokens Number>
id: <Transaction Id String>
is_confirmed: <Is Confirmed Bool>
is_outgoing: <Transaction Outbound Bool>
output_addresses: [<Address String>]
tokens: <Tokens Including Fee Number>
[transaction]: <Raw Transaction Hex String>
}]
[channels]: [{
capacity: <Capacity Tokens Numberr>
id: <Standard Format Short Channel Id Hex String>
partner_public_key: <Peer Public Key Hex String>
transaction_id: <Channel Transaction Id Hex String>
}]
[closed_channels]: [{
capacity: <Closed Channel Capacity Tokens Number>
[close_balance_spent_by]: <Channel Balance Output Spent By Tx Id String>
[close_balance_vout]: <Channel Balance Close Tx Output Index Number>
[close_confirm_height]: <Channel Close Confirmation Height Number>
close_payments: [{
is_outgoing: <Payment Is Outgoing Bool>
is_paid: <Payment Is Claimed With Preimage Bool>
is_pending: <Payment Resolution Is Pending Bool>
is_refunded: <Payment Timed Out And Went Back To Payer Bool>
[spent_by]: <Close Transaction Spent By Transaction Id Hex String>
tokens: <Associated Tokens Number>
transaction_id: <Transaction Id Hex String>
transaction_vout: <Transaction Output Index Number>
}]
[close_transaction_id]: <Closing Transaction Id Hex String>
final_local_balance: <Channel Close Final Local Balance Tokens Number>
final_time_locked_balance: <Closed Channel Timelocked Tokens Number>
[id]: <Closed Standard Format Channel Id String>
is_breach_close: <Is Breach Close Bool>
is_cooperative_close: <Is Cooperative Close Bool>
is_funding_cancel: <Is Funding Cancelled Close Bool>
is_local_force_close: <Is Local Force Close Bool>
[is_partner_closed]: <Channel Was Closed By Channel Peer Bool>
[is_partner_initiated]: <Channel Was Initiated By Channel Peer Bool>
is_remote_force_close: <Is Remote Force Close Bool>
partner_public_key: <Partner Public Key Hex String>
transaction_id: <Channel Funding Transaction Id Hex String>
transaction_vout: <Channel Funding Output Index Number>
}]
id: <Transaction Id Hex String>
lnd: <Authenticated LND API Object>
[pending_channels]: [{
[close_transaction_id]: <Channel Closing Transaction Id String>
is_active: <Channel Is Active Bool>
is_closing: <Channel Is Closing Bool>
is_opening: <Channel Is Opening Bool>
is_partner_initiated: <Channel Partner Initiated Channel Bool>
local_balance: <Channel Local Tokens Balance Number>
local_reserve: <Channel Local Reserved Tokens Number>
partner_public_key: <Channel Peer Public Key String>
[pending_balance]: <Tokens Pending Recovery Number>
[pending_payments]: [{
is_incoming: <Payment Is Incoming Bool>
timelock_height: <Payment Timelocked Until Height Number>
tokens: <Payment Tokens Number>
transaction_id: <Payment Transaction Id String>
transaction_vout: <Payment Transaction Vout Number>
}]
received: <Tokens Received Number>
[recovered_tokens]: <Tokens Recovered From Close Number>
remote_balance: <Remote Tokens Balance Number>
remote_reserve: <Channel Remote Reserved Tokens Number>
sent: <Send Tokens Number>
[timelock_expiration]: <Pending Tokens Block Height Timelock Number>
[transaction_fee]: <Funding Transaction Fee Tokens Number>
transaction_id: <Channel Funding Transaction Id String>
transaction_vout: <Channel Funding Transaction Vout Number>
[transaction_weight]: <Funding Transaction Weight Number>
}]
}
@returns via cbk or Promise
{
[chain_fee]: <Paid Transaction Fee Tokens Number>
[received]: <Received Tokens Number>
related_channels: [{
action: <Channel Action String>
[balance]: <Channel Balance Tokens Number>
[capacity]: <Channel Capacity Value Number>
[channel]: <Channel Standard Format Id String>
[close_tx]: <Channel Closing Transaction Id Hex String>
[open_tx]: <Channel Opening Transaction id Hex String>
[timelock]: <Channel Funds Timelocked Until Height Number>
with: <Channel Peer Public Key Hex String>
}]
[sent]: <Sent Tokens Number>
[sent_to]: [<Sent to Address String>]
[tx]: <Transaction Id Hex String>
}
getTransitRefund
Make a refund transaction for transit funds
{
funded_tokens: <Tokens Sent to Transit Address Number>
lnd: <Authenticated LND API Object>
network: <Network Name String>
refund_address: <Refund Coins to On Chain Address String>
transit_address: <Transit On Chain Bech32 Address String>
transit_key_index: <Transit Key Index Number>
transit_public_key: <Transit Public Key Hex String>
transaction_id: <Transaction Id Hex String>
transaction_vout: <Transaction Output Index Number>
}
@returns via cbk or Promise
{
refund: <Fully Signed Refund Transaction Hex String>
}
reserveTransitFunds
Get on-chain funding and a refund
{
ask: <Ask Function>
lnd: <Authenticated LND API Object>
logger: <Winston Logger Object>
[rate]: <Chain Fee Rate Tokens Per VByte Number>
tokens: <Fund Tokens Number>
}
@returns via cbk or Promise
{
address: <Transit Address String>
id: <Transaction Id Hex String>
index: <Transit Public Key Index Number>
[inputs]: [{
[lock_expires_at]: <UTXO Lock Expires At ISO 8601 Date String>
[lock_id]: <UTXO Lock Id Hex String>
transaction_id: <Transaction Hex Id String>
transaction_vout: <Transaction Output Index Number>
}]
key: <Transit Key Public Key Hex String>
output: <Transit Output Script Hex String>
[psbt]: <Transaction As Finalized PSBT Hex String>
refund: <Refund Transaction Hex String>
script: <Transit Signing Witness Script Hex String>
transaction: <Raw Transaction Hex String>
vout: <Funds Reserved At Output Index Number>
}
signAndFundPsbt
Partially sign and fund a PSBT and create a conflicting transaction
Only P2TR and P2WPKH inputs are supported
To allow for funding a channel, a dummy "finalized" PSBT is returned
{
lnd: <Authenticated Signing LND API Object>
psbt: <Base Funding With Bare Inputs PSBT Hex String>
utxos: [{
bip32_derivations: [{
fingerprint: <Public Key Fingerprint Hex String>
[leaf_hashes]: <Taproot Leaf Hash Hex String>
path: <BIP 32 Child / Hardened Child / Index Derivation Path String>
public_key: <Public Key Hex String>
}]
[non_witness_utxo]: <UTXO Spending Transaction Hex String>
transaction_id: <Unspent Transaction Id Hex String>
transaction_vout: <Unspent Transaction Output Index Number>
witness_utxo: {
script_pub: <UTXO Output Script Hex String>
tokens: <UTXO Tokens Value Number>
}
}]
}
@returns via cbk or Promise
{
conflict: <Conflict Transaction Hex String>
funding: <Funding Dummy PSBT Hex String>
psbt: <Partially Signed PSBT Hex String>
}
updateChannelFee
Update the fee for an individual channel
{
[base_fee_mtokens]: <Base Fee Millitokens String>
[cltv_delta]: <CLTV Delta to Use Number>
fee_rate: <Fee Rate Number>
from: <Local Node Public Key Hex String>
[inbound_rate_discount]: <Source Based PPM Fee Rate Discount Number>
lnd: <Authenticated LND API Object>
[max_htlc_mtokens]: <Maximum HTLC Millitokens to Forward String>
[min_htlc_mtokens]: <Minimum HTLC Millitokens to Forward String>
transaction_id: <Funding Transaction Id Hex String>
transaction_vout: <Funding Transaction Output Index Number>
}
@returns via cbk or Promise
waitForConnectedPeer
Wait for a peer to connect
{
id: <Node Identity Public Key Hex String>
lnd: <Authenticated LND API Object>
[timeout]: <Timeout Milliseconds Number>
}
@returns via cbk or Promise
waitForPendingOpen
Wait for an incoming pending open channel matching specific criteria
{
[capacity]: <Channel Capacity Tokens Number>
interval: <Check Time Milliseconds Number>
lnd: <Authenticated LND API Object>
local_balance: <Starting Local Balance Number>
partner_public_key: <Peer Public Key Hex String>
times: <Total Check Times Number>
transaction_id: <Transaction Id Hex String>
transaction_vout: <Transaction Output Index Number>
}
@returns via cbk or Promise
{
transaction_id: <Transaction Id Hex String>
transaction_vout: <Transaction Output Index Number>
}
4 months ago
4 months ago
5 months ago
7 months ago
4 months ago
6 months ago
9 months ago
9 months ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago