protected void generateEvidence(IndentWriter writer) {
    writer.println("Tunnel Handler");

    writer.indent();

    writer.println("started=" + started + ", active=" + active);

    if (init_fail != null) {

      writer.println("Init fail: " + init_fail);
    }

    long now = SystemTime.getMonotonousTime();

    writer.println("total local=" + total_local_servers);
    writer.println(
        "last local create="
            + (last_local_server_create_time == 0
                ? "<never>"
                : String.valueOf(now - last_local_server_create_time)));
    writer.println(
        "last local agree="
            + (last_local_server_agree_time == 0
                ? "<never>"
                : String.valueOf(now - last_local_server_agree_time)));

    writer.println("total remote=" + total_servers);
    writer.println(
        "last remote create="
            + (last_server_create_time == 0
                ? "<never>"
                : String.valueOf(now - last_server_create_time)));
    writer.println(
        "last remote agree="
            + (last_server_agree_time == 0
                ? "<never>"
                : String.valueOf(now - last_server_agree_time)));

    synchronized (tunnels) {
      writer.println("tunnels=" + tunnels.size());

      for (PairManagerTunnel tunnel : tunnels.values()) {

        writer.println("    " + tunnel.getString());
      }
    }

    try {
      writer.println("IPv4 punchers: " + nat_punchers_ipv4.size());

      for (DHTNATPuncher p : nat_punchers_ipv4) {

        writer.println("    " + p.getStats());
      }

      writer.println("IPv6 punchers: " + nat_punchers_ipv6.size());

      for (DHTNATPuncher p : nat_punchers_ipv6) {

        writer.println("    " + p.getStats());
      }
    } finally {

      writer.exdent();
    }
  }