Skip to content

Commit 68b68e8

Browse files
committed
Remove check_closed_event macro
Replace calls to `check_closed_event` macro to the identically-named function.
1 parent 6514200 commit 68b68e8

20 files changed

+310
-281
lines changed

lightning-liquidity/tests/lsps5_integration_tests.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ use common::{
88
};
99

1010
use lightning::chain::{BestBlock, Filter};
11-
use lightning::check_closed_event;
1211
use lightning::events::ClosureReason;
1312
use lightning::ln::channelmanager::{ChainParameters, InterceptId};
1413
use lightning::ln::functional_test_utils::{
15-
close_channel, create_chan_between_nodes, create_chanmon_cfgs, create_network,
16-
create_node_cfgs, create_node_chanmgrs, Node,
14+
check_closed_event, close_channel, create_chan_between_nodes, create_chanmon_cfgs,
15+
create_network, create_node_cfgs, create_node_chanmgrs, Node,
1716
};
1817
use lightning::ln::msgs::Init;
1918
use lightning::ln::peer_handler::CustomMessageHandler;
@@ -1480,9 +1479,9 @@ fn dos_protection() {
14801479

14811480
close_channel(&service_node.inner, &client_node.inner, &channel_id, funding_tx, true);
14821481
let node_a_reason = ClosureReason::CounterpartyInitiatedCooperativeClosure;
1483-
check_closed_event!(service_node.inner, 1, node_a_reason, [client_node_id], 100000);
1482+
check_closed_event(&service_node.inner, 1, node_a_reason, false, &[client_node_id], 100000);
14841483
let node_b_reason = ClosureReason::LocallyInitiatedCooperativeClosure;
1485-
check_closed_event!(client_node.inner, 1, node_b_reason, [service_node_id], 100000);
1484+
check_closed_event(&client_node.inner, 1, node_b_reason, false, &[service_node_id], 100000);
14861485

14871486
// channel is now closed again -> should reject
14881487
assert_lsps5_reject(&service_node, &client_node);

lightning-persister/src/fs_store.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,6 @@ mod tests {
720720

721721
use lightning::chain::chainmonitor::Persist;
722722
use lightning::chain::ChannelMonitorUpdateStatus;
723-
use lightning::check_closed_event;
724723
use lightning::events::ClosureReason;
725724
use lightning::ln::functional_test_utils::*;
726725
use lightning::ln::msgs::BaseMessageHandler;
@@ -884,7 +883,7 @@ mod tests {
884883
.unwrap();
885884
let reason =
886885
ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
887-
check_closed_event!(nodes[1], 1, reason, [node_a_id], 100000);
886+
check_closed_event(&nodes[1], 1, reason, false, &[node_a_id], 100000);
888887
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
889888

890889
// Set the store's directory to read-only, which should result in
@@ -928,7 +927,7 @@ mod tests {
928927
.unwrap();
929928
let reason =
930929
ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
931-
check_closed_event!(nodes[1], 1, reason, [node_a_id], 100000);
930+
check_closed_event(&nodes[1], 1, reason, false, &[node_a_id], 100000);
932931
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
933932
let update_map = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap();
934933
let update_id = update_map.get(&added_monitors[0].1.channel_id()).unwrap();

lightning-persister/src/test_utils.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use lightning::events::ClosureReason;
22
use lightning::ln::functional_test_utils::{
3-
connect_block, create_announced_chan_between_nodes, create_chanmon_cfgs, create_dummy_block,
4-
create_network, create_node_cfgs, create_node_chanmgrs, send_payment,
3+
check_closed_event, connect_block, create_announced_chan_between_nodes, create_chanmon_cfgs,
4+
create_dummy_block, create_network, create_node_cfgs, create_node_chanmgrs, send_payment,
55
};
66
use lightning::util::persist::{
77
migrate_kv_store_data, read_channel_monitors, KVStoreSync, MigratableKVStore,
88
KVSTORE_NAMESPACE_KEY_ALPHABET, KVSTORE_NAMESPACE_KEY_MAX_LEN,
99
};
1010
use lightning::util::test_utils;
11-
use lightning::{check_added_monitors, check_closed_broadcast, check_closed_event};
11+
use lightning::{check_added_monitors, check_closed_broadcast};
1212

1313
use std::panic::RefUnwindSafe;
1414

@@ -188,7 +188,7 @@ pub(crate) fn do_test_store<K: KVStoreSync + Sync>(store_0: &K, store_1: &K) {
188188
.force_close_broadcasting_latest_txn(&chan_id, &node_b_id, message.clone())
189189
.unwrap();
190190
let reason = ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
191-
check_closed_event!(nodes[0], 1, reason, [node_b_id], 100000);
191+
check_closed_event(&nodes[0], 1, reason, false, &[node_b_id], 100000);
192192
check_closed_broadcast!(nodes[0], true);
193193
check_added_monitors!(nodes[0], 1);
194194

@@ -204,12 +204,13 @@ pub(crate) fn do_test_store<K: KVStoreSync + Sync>(store_0: &K, store_1: &K) {
204204
),
205205
);
206206
check_closed_broadcast!(nodes[1], true);
207-
check_closed_event!(
208-
nodes[1],
207+
check_closed_event(
208+
&nodes[1],
209209
1,
210210
ClosureReason::CommitmentTxConfirmed,
211-
[nodes[0].node.get_our_node_id()],
212-
100000
211+
false,
212+
&[nodes[0].node.get_our_node_id()],
213+
100000,
213214
);
214215
check_added_monitors!(nodes[1], 1);
215216

lightning/src/chain/chainmonitor.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,10 +1596,10 @@ where
15961596
mod tests {
15971597
use crate::chain::channelmonitor::ANTI_REORG_DELAY;
15981598
use crate::chain::{ChannelMonitorUpdateStatus, Watch};
1599+
use crate::check_added_monitors;
15991600
use crate::events::{ClosureReason, Event};
16001601
use crate::ln::functional_test_utils::*;
16011602
use crate::ln::msgs::{BaseMessageHandler, ChannelMessageHandler, MessageSendEvent};
1602-
use crate::{check_added_monitors, check_closed_event};
16031603
use crate::{expect_payment_path_successful, get_event_msg};
16041604

16051605
const CHAINSYNC_MONITOR_PARTITION_FACTOR: u32 = 5;
@@ -1780,7 +1780,7 @@ mod tests {
17801780
.unwrap();
17811781
let closure_reason =
17821782
ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
1783-
check_closed_event!(&nodes[0], 1, closure_reason, false, [node_c_id], 1000000);
1783+
check_closed_event(&nodes[0], 1, closure_reason, false, &[node_c_id], 1000000);
17841784
check_closed_broadcast(&nodes[0], 1, true);
17851785
let close_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
17861786
assert_eq!(close_tx.len(), 1);
@@ -1789,7 +1789,7 @@ mod tests {
17891789
check_closed_broadcast(&nodes[2], 1, true);
17901790
check_added_monitors(&nodes[2], 1);
17911791
let closure_reason = ClosureReason::CommitmentTxConfirmed;
1792-
check_closed_event!(&nodes[2], 1, closure_reason, false, [node_a_id], 1000000);
1792+
check_closed_event(&nodes[2], 1, closure_reason, false, &[node_a_id], 1000000);
17931793

17941794
chanmon_cfgs[0].persister.chain_sync_monitor_persistences.lock().unwrap().clear();
17951795
chanmon_cfgs[2].persister.chain_sync_monitor_persistences.lock().unwrap().clear();

lightning/src/ln/async_signer_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,9 +1319,9 @@ fn do_test_closing_signed(extra_closing_signed: bool, reconnect: bool) {
13191319
assert!(nodes[0].node.list_channels().is_empty());
13201320
assert!(nodes[1].node.list_channels().is_empty());
13211321
let reason_a = ClosureReason::LocallyInitiatedCooperativeClosure;
1322-
check_closed_event!(nodes[0], 1, reason_a, [node_b_id], 100000);
1322+
check_closed_event(&nodes[0], 1, reason_a, false, &[node_b_id], 100000);
13231323
let reason_b = ClosureReason::CounterpartyInitiatedCooperativeClosure;
1324-
check_closed_event!(nodes[1], 1, reason_b, [node_a_id], 100000);
1324+
check_closed_event(&nodes[1], 1, reason_b, false, &[node_a_id], 100000);
13251325
}
13261326

13271327
#[test]

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
288288
// PaymentPathFailed event
289289

290290
assert_eq!(nodes[0].node.list_channels().len(), 0);
291-
check_closed_event!(nodes[0], 1, reason, [node_b_id], 100000);
291+
check_closed_event(&nodes[0], 1, reason, false, &[node_b_id], 100000);
292292
}
293293

294294
#[test]
@@ -2274,9 +2274,9 @@ fn do_during_funding_monitor_fail(
22742274
send_payment(&nodes[0], &[&nodes[1]], 8000000);
22752275
close_channel(&nodes[0], &nodes[1], &channel_id, funding_tx, true);
22762276
let reason_a = ClosureReason::CounterpartyInitiatedCooperativeClosure;
2277-
check_closed_event!(nodes[0], 1, reason_a, [node_b_id], 100000);
2277+
check_closed_event(&nodes[0], 1, reason_a, false, &[node_b_id], 100000);
22782278
let reason_b = ClosureReason::LocallyInitiatedCooperativeClosure;
2279-
check_closed_event!(nodes[1], 1, reason_b, [node_a_id], 100000);
2279+
check_closed_event(&nodes[1], 1, reason_b, false, &[node_a_id], 100000);
22802280
}
22812281

22822282
#[test]
@@ -2514,7 +2514,8 @@ fn test_fail_htlc_on_broadcast_after_claim() {
25142514
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
25152515

25162516
mine_transaction(&nodes[1], &bs_txn[0]);
2517-
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed, [node_c_id], 100000);
2517+
let reason = ClosureReason::CommitmentTxConfirmed;
2518+
check_closed_event(&nodes[1], 1, reason, false, &[node_c_id], 100000);
25182519
check_closed_broadcast!(nodes[1], true);
25192520
connect_blocks(&nodes[1], ANTI_REORG_DELAY - 1);
25202521
check_added_monitors!(nodes[1], 1);
@@ -3070,9 +3071,9 @@ fn test_temporary_error_during_shutdown() {
30703071
assert_eq!(txn_a.len(), 1);
30713072
check_spends!(txn_a[0], funding_tx);
30723073
let reason_b = ClosureReason::CounterpartyInitiatedCooperativeClosure;
3073-
check_closed_event!(nodes[1], 1, reason_b, [node_a_id], 100000);
3074+
check_closed_event(&nodes[1], 1, reason_b, false, &[node_a_id], 100000);
30743075
let reason_a = ClosureReason::LocallyInitiatedCooperativeClosure;
3075-
check_closed_event!(nodes[0], 1, reason_a, [node_b_id], 100000);
3076+
check_closed_event(&nodes[0], 1, reason_a, false, &[node_b_id], 100000);
30763077
}
30773078

30783079
#[test]
@@ -3309,7 +3310,7 @@ fn do_test_outbound_reload_without_init_mon(use_0conf: bool) {
33093310

33103311
let node_a_ser = nodes[0].node.encode();
33113312
reload_node!(nodes[0], &node_a_ser, &[], persister, new_chain_monitor, node_a_reload);
3312-
check_closed_event!(nodes[0], 1, ClosureReason::DisconnectedPeer, [node_b_id], 100000);
3313+
check_closed_event(&nodes[0], 1, ClosureReason::DisconnectedPeer, false, &[node_b_id], 100000);
33133314
assert!(nodes[0].node.list_channels().is_empty());
33143315
}
33153316

@@ -3417,7 +3418,7 @@ fn do_test_inbound_reload_without_init_mon(use_0conf: bool, lock_commitment: boo
34173418
let node_b_ser = nodes[1].node.encode();
34183419
reload_node!(nodes[1], &node_b_ser, &[], persister, new_chain_monitor, node_b_reload);
34193420

3420-
check_closed_event!(nodes[1], 1, ClosureReason::DisconnectedPeer, [node_a_id], 100000);
3421+
check_closed_event(&nodes[1], 1, ClosureReason::DisconnectedPeer, false, &[node_a_id], 100000);
34213422
assert!(nodes[1].node.list_channels().is_empty());
34223423
}
34233424

@@ -4493,7 +4494,7 @@ fn test_claim_to_closed_channel_blocks_forwarded_preimage_removal() {
44934494
.unwrap();
44944495
check_added_monitors!(nodes[0], 1);
44954496
let a_reason = ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
4496-
check_closed_event!(nodes[0], 1, a_reason, [node_b_id], 1000000);
4497+
check_closed_event(&nodes[0], 1, a_reason, false, &[node_b_id], 1000000);
44974498
check_closed_broadcast!(nodes[0], true);
44984499

44994500
let as_commit_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
@@ -4502,7 +4503,8 @@ fn test_claim_to_closed_channel_blocks_forwarded_preimage_removal() {
45024503
mine_transaction(&nodes[1], &as_commit_tx[0]);
45034504
check_closed_broadcast!(nodes[1], true);
45044505
check_added_monitors!(nodes[1], 1);
4505-
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed, [node_a_id], 1000000);
4506+
let b_reason = ClosureReason::CommitmentTxConfirmed;
4507+
check_closed_event(&nodes[1], 1, b_reason, false, &[node_a_id], 1000000);
45064508

45074509
// Now that B has a pending forwarded payment across it with the inbound edge on-chain, claim
45084510
// the payment on C and give B the preimage for it.
@@ -4569,7 +4571,7 @@ fn test_claim_to_closed_channel_blocks_claimed_event() {
45694571
.unwrap();
45704572
check_added_monitors!(nodes[0], 1);
45714573
let a_reason = ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
4572-
check_closed_event!(nodes[0], 1, a_reason, [node_b_id], 1000000);
4574+
check_closed_event(&nodes[0], 1, a_reason, false, &[node_b_id], 1000000);
45734575
check_closed_broadcast!(nodes[0], true);
45744576

45754577
let as_commit_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
@@ -4578,7 +4580,8 @@ fn test_claim_to_closed_channel_blocks_claimed_event() {
45784580
mine_transaction(&nodes[1], &as_commit_tx[0]);
45794581
check_closed_broadcast!(nodes[1], true);
45804582
check_added_monitors!(nodes[1], 1);
4581-
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed, [node_a_id], 1000000);
4583+
let b_reason = ClosureReason::CommitmentTxConfirmed;
4584+
check_closed_event(&nodes[1], 1, b_reason, false, &[node_a_id], 1000000);
45824585

45834586
// Now that B has a pending payment with the inbound HTLC on a closed channel, claim the
45844587
// payment on disk, but don't let the `ChannelMonitorUpdate` complete. This should prevent the

lightning/src/ln/channel_open_tests.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,7 @@ pub fn test_user_configurable_csv_delay() {
10451045
panic!();
10461046
}
10471047
let reason = ClosureReason::ProcessingError { err: reason_msg };
1048-
check_closed_event!(nodes[0], 1, reason, [node_b_id], 1000000);
1048+
check_closed_event(&nodes[0], 1, reason, false, &[node_b_id], 1000000);
10491049

10501050
// We test msg.to_self_delay <= config.their_to_self_delay is enforced in InboundV1Channel::new()
10511051
nodes[1].node.create_channel(node_a_id, 1000000, 1000000, 42, None, None).unwrap();
@@ -1705,7 +1705,7 @@ pub fn test_invalid_funding_tx() {
17051705
confirm_transaction_at(&nodes[1], &tx, 1);
17061706

17071707
let reason = ClosureReason::ProcessingError { err: expected_err.to_string() };
1708-
check_closed_event!(nodes[1], 1, reason, [node_a_id], 100000);
1708+
check_closed_event(&nodes[1], 1, reason, false, &[node_a_id], 100000);
17091709

17101710
check_added_monitors(&nodes[1], 1);
17111711
let events_2 = nodes[1].node.get_and_clear_pending_msg_events();
@@ -1963,7 +1963,7 @@ pub fn test_channel_close_when_not_timely_accepted() {
19631963
// Since we disconnected from peer and did not connect back within time,
19641964
// we should have forced-closed the channel by now.
19651965
let reason = ClosureReason::FundingTimedOut;
1966-
check_closed_event!(nodes[0], 1, reason, [node_b_id], 100000);
1966+
check_closed_event(&nodes[0], 1, reason, false, &[node_b_id], 100000);
19671967
assert_eq!(nodes[0].node.list_channels().len(), 0);
19681968

19691969
{
@@ -2542,5 +2542,5 @@ fn test_fund_pending_channel() {
25422542
let reason = ClosureReason::ProcessingError {
25432543
err: "Error in transaction funding: Misuse error: Channel f7fee84016d554015f5166c0a0df6479942ef55fd70713883b0493493a38e13a with counterparty 0355f8d2238a322d16b602bd0ceaad5b01019fb055971eaadcc9b29226a4da6c23 is not an unfunded, outbound channel ready to fund".to_owned(),
25442544
};
2545-
check_closed_event!(nodes[0], 1, reason, [node_b_id], 100_000);
2545+
check_closed_event(&nodes[0], 1, reason, false, &[node_b_id], 100_000);
25462546
}

lightning/src/ln/channelmanager.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18890,7 +18890,7 @@ mod tests {
1889018890
nodes[0].node.force_close_broadcasting_latest_txn(&chan.2, &nodes[1].node.get_our_node_id(), message.clone()).unwrap();
1889118891
check_added_monitors!(nodes[0], 1);
1889218892
let reason = ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
18893-
check_closed_event!(nodes[0], 1, reason, [nodes[1].node.get_our_node_id()], 100000);
18893+
check_closed_event(&nodes[0], 1, reason, false, &[nodes[1].node.get_our_node_id()], 100000);
1889418894

1889518895
// Confirm that the channel_update was not sent immediately to node[1] but was cached.
1889618896
let node_1_events = nodes[1].node.get_and_clear_pending_msg_events();
@@ -18954,7 +18954,7 @@ mod tests {
1895418954
.unwrap();
1895518955
check_added_monitors!(nodes[0], 1);
1895618956
let reason = ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
18957-
check_closed_event!(nodes[0], 1, reason, [nodes[1].node.get_our_node_id()], 1_000_000);
18957+
check_closed_event(&nodes[0], 1, reason, false, &[nodes[1].node.get_our_node_id()], 1_000_000);
1895818958

1895918959
{
1896018960
// Assert that nodes[1] is awaiting removal for nodes[0] once nodes[1] has been
@@ -18991,8 +18991,8 @@ mod tests {
1899118991

1899218992
nodes[0].node.peer_disconnected(nodes[1].node.get_our_node_id());
1899318993
nodes[1].node.peer_disconnected(nodes[0].node.get_our_node_id());
18994-
check_closed_event!(nodes[0], 1, ClosureReason::DisconnectedPeer, [nodes[1].node.get_our_node_id()], 1_000_000);
18995-
check_closed_event!(nodes[1], 1, ClosureReason::DisconnectedPeer, [nodes[0].node.get_our_node_id()], 1_000_000);
18994+
check_closed_event(&nodes[0], 1, ClosureReason::DisconnectedPeer, false, &[nodes[1].node.get_our_node_id()], 1_000_000);
18995+
check_closed_event(&nodes[1], 1, ClosureReason::DisconnectedPeer, false, &[nodes[0].node.get_our_node_id()], 1_000_000);
1899618996

1899718997
// At this point the state for the peers should have been removed.
1899818998
assert_eq!(nodes[0].node.per_peer_state.read().unwrap().len(), 0);
@@ -19438,7 +19438,7 @@ mod tests {
1943819438
check_closed_broadcast(&nodes[0], 1, false);
1943919439
check_added_monitors(&nodes[0], 1);
1944019440
let reason = ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message };
19441-
check_closed_event!(nodes[0], 1, reason, [nodes[1].node.get_our_node_id()], 100000);
19441+
check_closed_event(&nodes[0], 1, reason, false, &[nodes[1].node.get_our_node_id()], 100000);
1944219442
{
1944319443
let txn = nodes[0].tx_broadcaster.txn_broadcast();
1944419444
assert_eq!(txn.len(), 1);
@@ -19476,7 +19476,7 @@ mod tests {
1947619476
let expected_close_reason = ClosureReason::ProcessingError {
1947719477
err: "Peer sent an invalid channel_reestablish to force close in a non-standard way".to_string()
1947819478
};
19479-
check_closed_event!(nodes[1], 1, expected_close_reason, [nodes[0].node.get_our_node_id()], 100000);
19479+
check_closed_event(&nodes[1], 1, expected_close_reason, false, &[nodes[0].node.get_our_node_id()], 100000);
1948019480
{
1948119481
let txn = nodes[1].tx_broadcaster.txn_broadcast();
1948219482
assert_eq!(txn.len(), 1);

lightning/src/ln/functional_test_utils.rs

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2374,33 +2374,6 @@ pub fn check_closed_event(
23742374
check_closed_events(node, expected_close_events.as_slice());
23752375
}
23762376

2377-
/// Check that a channel's closing channel events has been issued
2378-
///
2379-
/// Don't use this, use the identically-named function instead.
2380-
#[macro_export]
2381-
macro_rules! check_closed_event {
2382-
($node: expr, $events: expr, $reason: expr, $counterparty_node_ids: expr, $channel_capacity: expr) => {
2383-
check_closed_event!(
2384-
$node,
2385-
$events,
2386-
$reason,
2387-
false,
2388-
$counterparty_node_ids,
2389-
$channel_capacity
2390-
);
2391-
};
2392-
($node: expr, $events: expr, $reason: expr, $is_check_discard_funding: expr, $counterparty_node_ids: expr, $channel_capacity: expr) => {
2393-
$crate::ln::functional_test_utils::check_closed_event(
2394-
&$node,
2395-
$events,
2396-
$reason,
2397-
$is_check_discard_funding,
2398-
&$counterparty_node_ids,
2399-
$channel_capacity,
2400-
);
2401-
};
2402-
}
2403-
24042377
pub fn handle_bump_events(node: &Node, expected_close: bool, expected_htlc_count: usize) {
24052378
let events = node.chain_monitor.chain_monitor.get_and_clear_pending_events();
24062379
let mut close = false;

0 commit comments

Comments
 (0)