tor-commits
  Threads by month 
                
            - ----- 2025 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
May 2018
- 17 participants
- 1515 discussions
                    
                        commit c39409096ee1531b0c0b0a8fc79ae295d84e6e27
Author: iwakeh <iwakeh(a)torproject.org>
Date:   Wed Dec 20 13:06:53 2017 +0000
    Rename Parsed* to Ipv6*.
    
    Indicate that this is not the typical descriptor, but only provides relevant
    information for the ipv6servers module.
---
 .../metrics/stats/ipv6servers/Database.java        | 29 ++++++++++------------
 ...edNetworkStatus.java => Ipv6NetworkStatus.java} |  2 +-
 ...erDescriptor.java => Ipv6ServerDescriptor.java} |  2 +-
 .../metrics/stats/ipv6servers/Parser.java          | 14 +++++------
 ...kStatusTest.java => Ipv6NetworkStatusTest.java} |  6 ++---
 ...ptorTest.java => Ipv6ServerDescriptorTest.java} |  4 +--
 6 files changed, 27 insertions(+), 30 deletions(-)
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/Database.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Database.java
index e95aba0..1d5187b 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/Database.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Database.java
@@ -84,10 +84,10 @@ class Database implements AutoCloseable {
 
   /** Insert a server descriptor into the server_descriptors table. */
   void insertServerDescriptor(
-      ParsedServerDescriptor parsedServerDescriptor) throws SQLException {
+      Ipv6ServerDescriptor serverDescriptor) throws SQLException {
     this.psServerDescriptorsSelect.clearParameters();
     this.psServerDescriptorsSelect.setString(1,
-        parsedServerDescriptor.digest);
+        serverDescriptor.digest);
     try (ResultSet rs = psServerDescriptorsSelect.executeQuery()) {
       if (rs.next()) {
         if (rs.getBoolean(1)) {
@@ -97,28 +97,25 @@ class Database implements AutoCloseable {
       }
     }
     this.psServerDescriptorsInsert.clearParameters();
-    this.psServerDescriptorsInsert.setString(1,
-        parsedServerDescriptor.digest);
+    this.psServerDescriptorsInsert.setString(1, serverDescriptor.digest);
     this.psServerDescriptorsInsert.setInt(2,
-        parsedServerDescriptor.advertisedBandwidth);
-    this.psServerDescriptorsInsert.setBoolean(3,
-        parsedServerDescriptor.announced);
-    this.psServerDescriptorsInsert.setBoolean(4,
-        parsedServerDescriptor.exiting);
+        serverDescriptor.advertisedBandwidth);
+    this.psServerDescriptorsInsert.setBoolean(3, serverDescriptor.announced);
+    this.psServerDescriptorsInsert.setBoolean(4, serverDescriptor.exiting);
     this.psServerDescriptorsInsert.execute();
   }
 
   /** Insert a status and all contained entries into the statuses and
    * status_entries table. */
-  void insertStatus(ParsedNetworkStatus parsedNetworkStatus)
+  void insertStatus(Ipv6NetworkStatus networkStatus)
       throws SQLException {
     this.psStatusesSelect.clearParameters();
     this.psStatusesSelect.setString(1,
-        parsedNetworkStatus.isRelay ? "relay" : "bridge");
+        networkStatus.isRelay ? "relay" : "bridge");
     Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"),
         Locale.US);
     this.psStatusesSelect.setTimestamp(2,
-        Timestamp.from(ZonedDateTime.of(parsedNetworkStatus.timestamp,
+        Timestamp.from(ZonedDateTime.of(networkStatus.timestamp,
         ZoneId.of("UTC")).toInstant()), calendar);
     try (ResultSet rs = this.psStatusesSelect.executeQuery()) {
       if (rs.next()) {
@@ -131,11 +128,11 @@ class Database implements AutoCloseable {
     int statusId = -1;
     this.psStatusesInsert.clearParameters();
     this.psStatusesInsert.setString(1,
-        parsedNetworkStatus.isRelay ? "relay" : "bridge");
+        networkStatus.isRelay ? "relay" : "bridge");
     this.psStatusesInsert.setTimestamp(2,
-        Timestamp.from(ZonedDateTime.of(parsedNetworkStatus.timestamp,
+        Timestamp.from(ZonedDateTime.of(networkStatus.timestamp,
         ZoneId.of("UTC")).toInstant()), calendar);
-    this.psStatusesInsert.setInt(3, parsedNetworkStatus.running);
+    this.psStatusesInsert.setInt(3, networkStatus.running);
     this.psStatusesInsert.execute();
     try (ResultSet rs = this.psStatusesInsert.getGeneratedKeys()) {
       if (rs.next()) {
@@ -146,7 +143,7 @@ class Database implements AutoCloseable {
       throw new SQLException("Could not retrieve auto-generated key for new "
           + "statuses entry.");
     }
-    for (ParsedNetworkStatus.Entry entry : parsedNetworkStatus.entries) {
+    for (Ipv6NetworkStatus.Entry entry : networkStatus.entries) {
       this.psStatusEntriesInsert.clearParameters();
       this.psStatusEntriesInsert.setInt(1, statusId);
       this.psStatusEntriesInsert.setString(2, entry.digest);
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/ParsedNetworkStatus.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatus.java
similarity index 97%
rename from src/main/java/org/torproject/metrics/stats/ipv6servers/ParsedNetworkStatus.java
rename to src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatus.java
index f185250..1600d47 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/ParsedNetworkStatus.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatus.java
@@ -9,7 +9,7 @@ import java.util.List;
 
 /** Data object holding all relevant parts parsed from a (relay or bridge)
  * network status. */
-class ParsedNetworkStatus {
+class Ipv6NetworkStatus {
 
   /** Whether this is a relay network status as opposed to a bridge network
    * status. */
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/ParsedServerDescriptor.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptor.java
similarity index 96%
rename from src/main/java/org/torproject/metrics/stats/ipv6servers/ParsedServerDescriptor.java
rename to src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptor.java
index c8d0ceb..3655d3e 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/ParsedServerDescriptor.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptor.java
@@ -5,7 +5,7 @@ package org.torproject.metrics.stats.ipv6servers;
 
 /** Data object holding all relevant parts parsed from a (relay or bridge)
  * server descriptor. */
-class ParsedServerDescriptor {
+class Ipv6ServerDescriptor {
 
   /** Hex-encoded SHA-1 server descriptor digest. */
   String digest;
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java
index 95b1d5a..a66ad23 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java
@@ -20,9 +20,9 @@ import java.time.ZoneId;
 class Parser {
 
   /** Parse a (relay or bridge) server descriptor. */
-  ParsedServerDescriptor parseServerDescriptor(
+  Ipv6ServerDescriptor parseServerDescriptor(
       ServerDescriptor serverDescriptor) {
-    ParsedServerDescriptor parsedDescriptor = new ParsedServerDescriptor();
+    Ipv6ServerDescriptor parsedDescriptor = new Ipv6ServerDescriptor();
     parsedDescriptor.digest = serverDescriptor.getDigestSha1Hex();
     for (String orAddress : serverDescriptor.getOrAddresses()) {
       if (StringUtils.countMatches(orAddress, ":") >= 2) {
@@ -48,22 +48,22 @@ class Parser {
   }
 
   /** Parse a relay network status. */
-  ParsedNetworkStatus parseRelayNetworkStatusConsensus(
+  Ipv6NetworkStatus parseRelayNetworkStatusConsensus(
       RelayNetworkStatusConsensus consensus) throws Exception {
     return this.parseStatus(true, consensus.getValidAfterMillis(),
         consensus.getStatusEntries().values());
   }
 
   /** Parse a bridge network status. */
-  ParsedNetworkStatus parseBridgeNetworkStatus(BridgeNetworkStatus status)
+  Ipv6NetworkStatus parseBridgeNetworkStatus(BridgeNetworkStatus status)
       throws Exception {
     return this.parseStatus(false, status.getPublishedMillis(),
         status.getStatusEntries().values());
   }
 
-  private ParsedNetworkStatus parseStatus(boolean isRelay, long timestampMillis,
+  private Ipv6NetworkStatus parseStatus(boolean isRelay, long timestampMillis,
       Iterable<NetworkStatusEntry> entries) {
-    ParsedNetworkStatus parsedStatus = new ParsedNetworkStatus();
+    Ipv6NetworkStatus parsedStatus = new Ipv6NetworkStatus();
     parsedStatus.isRelay = isRelay;
     parsedStatus.timestamp = Instant.ofEpochMilli(timestampMillis)
         .atZone(ZoneId.of("UTC")).toLocalDateTime();
@@ -77,7 +77,7 @@ class Parser {
       if (!entry.getFlags().contains("Running")) {
         continue;
       }
-      ParsedNetworkStatus.Entry parsedEntry = new ParsedNetworkStatus.Entry();
+      Ipv6NetworkStatus.Entry parsedEntry = new Ipv6NetworkStatus.Entry();
       parsedEntry.digest = entry.getDescriptor().toLowerCase();
       if (isRelay) {
         parsedEntry.guard = entry.getFlags().contains("Guard");
diff --git a/src/test/java/org/torproject/metrics/stats/ipv6servers/ParsedNetworkStatusTest.java b/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatusTest.java
similarity index 97%
rename from src/test/java/org/torproject/metrics/stats/ipv6servers/ParsedNetworkStatusTest.java
rename to src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatusTest.java
index c2642b8..9069218 100644
--- a/src/test/java/org/torproject/metrics/stats/ipv6servers/ParsedNetworkStatusTest.java
+++ b/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatusTest.java
@@ -28,7 +28,7 @@ import java.util.Arrays;
 import java.util.Collection;
 
 @RunWith(Parameterized.class)
-public class ParsedNetworkStatusTest {
+public class Ipv6NetworkStatusTest {
 
   /** Provide test data. */
   @Parameters
@@ -102,7 +102,7 @@ public class ParsedNetworkStatusTest {
     for (Descriptor descriptor
         : DescriptorSourceFactory.createDescriptorParser().parseDescriptors(
         sb.toString().getBytes(), new File(this.fileName), this.fileName)) {
-      ParsedNetworkStatus parsedNetworkStatus;
+      Ipv6NetworkStatus parsedNetworkStatus;
       if (descriptor instanceof RelayNetworkStatusConsensus) {
         parsedNetworkStatus = new Parser().parseRelayNetworkStatusConsensus(
             (RelayNetworkStatusConsensus) descriptor);
@@ -119,7 +119,7 @@ public class ParsedNetworkStatusTest {
       assertEquals(this.description, this.running, parsedNetworkStatus.running);
       if (null != this.digest) {
         boolean foundEntry = false;
-        for (ParsedNetworkStatus.Entry parsedEntry
+        for (Ipv6NetworkStatus.Entry parsedEntry
             : parsedNetworkStatus.entries) {
           if (this.digest.equals(parsedEntry.digest)) {
             assertEquals(this.description, this.guard, parsedEntry.guard);
diff --git a/src/test/java/org/torproject/metrics/stats/ipv6servers/ParsedServerDescriptorTest.java b/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptorTest.java
similarity index 97%
rename from src/test/java/org/torproject/metrics/stats/ipv6servers/ParsedServerDescriptorTest.java
rename to src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptorTest.java
index baff31b..1842315 100644
--- a/src/test/java/org/torproject/metrics/stats/ipv6servers/ParsedServerDescriptorTest.java
+++ b/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptorTest.java
@@ -25,7 +25,7 @@ import java.util.Arrays;
 import java.util.Collection;
 
 @RunWith(Parameterized.class)
-public class ParsedServerDescriptorTest {
+public class Ipv6ServerDescriptorTest {
 
   /** Provide test data. */
   @Parameters
@@ -83,7 +83,7 @@ public class ParsedServerDescriptorTest {
         : DescriptorSourceFactory.createDescriptorParser().parseDescriptors(
         sb.toString().getBytes(), new File(this.fileName), this.fileName)) {
       assertTrue(this.description, descriptor instanceof ServerDescriptor);
-      ParsedServerDescriptor parsedServerDescriptor
+      Ipv6ServerDescriptor parsedServerDescriptor
           = new Parser().parseServerDescriptor((ServerDescriptor) descriptor);
       assertEquals(this.description, this.advertisedBandwidth,
           parsedServerDescriptor.advertisedBandwidth);
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            [metrics-web/release] Removed redundant comments and added explanatory comment.
                        
                        
by karsten@torproject.org 30 May '18
                    by karsten@torproject.org 30 May '18
30 May '18
                    
                        commit 66caac798cb4524956c1bc9114ab7b1441b1e89e
Author: iwakeh <iwakeh(a)torproject.org>
Date:   Wed Dec 20 13:06:54 2017 +0000
    Removed redundant comments and added explanatory comment.
---
 .../java/org/torproject/metrics/stats/ipv6servers/Parser.java     | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java
index a66ad23..962ca27 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java
@@ -25,6 +25,9 @@ class Parser {
     Ipv6ServerDescriptor parsedDescriptor = new Ipv6ServerDescriptor();
     parsedDescriptor.digest = serverDescriptor.getDigestSha1Hex();
     for (String orAddress : serverDescriptor.getOrAddresses()) {
+      /* Check whether the additional OR address is an IPv6 address containing
+       * at least two colons as opposed to an IPv4 address and TCP port
+       * containing only one colon as separator. */
       if (StringUtils.countMatches(orAddress, ":") >= 2) {
         parsedDescriptor.announced = true;
         break;
@@ -47,14 +50,12 @@ class Parser {
     return parsedDescriptor;
   }
 
-  /** Parse a relay network status. */
   Ipv6NetworkStatus parseRelayNetworkStatusConsensus(
       RelayNetworkStatusConsensus consensus) throws Exception {
     return this.parseStatus(true, consensus.getValidAfterMillis(),
         consensus.getStatusEntries().values());
   }
 
-  /** Parse a bridge network status. */
   Ipv6NetworkStatus parseBridgeNetworkStatus(BridgeNetworkStatus status)
       throws Exception {
     return this.parseStatus(false, status.getPublishedMillis(),
@@ -85,6 +86,9 @@ class Parser {
             && !entry.getFlags().contains("BadExit");
         parsedEntry.reachable = false;
         for (String orAddress : entry.getOrAddresses()) {
+          /* Check whether the additional OR address is an IPv6 address
+           * containing at least two colons as opposed to an IPv4 address and
+           * TCP port containing only one colon as separator. */
           if (StringUtils.countMatches(orAddress, ":") >= 2) {
             parsedEntry.reachable = true;
             break;
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    30 May '18
                    
                        commit 9ed1c31b1230a988e398d4014b7bb97a24cfd9b6
Author: iwakeh <iwakeh(a)torproject.org>
Date:   Wed Dec 20 13:06:56 2017 +0000
    Move test script to correct location.
---
 src/{main/sql/clients => test/sql/userstats}/test-userstats.sql | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/src/main/sql/clients/test-userstats.sql b/src/test/sql/userstats/test-userstats.sql
similarity index 100%
rename from src/main/sql/clients/test-userstats.sql
rename to src/test/sql/userstats/test-userstats.sql
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    30 May '18
                    
                        commit 184fb88ce01444b2fc6de8d74c0821ffbeb6cc7c
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date:   Fri Dec 22 20:16:51 2017 +0100
    Make ipv6servers.csv available, too.
---
 build.xml | 1 +
 1 file changed, 1 insertion(+)
diff --git a/build.xml b/build.xml
index c884cc6..8e85956 100644
--- a/build.xml
+++ b/build.xml
@@ -385,6 +385,7 @@
       <fileset dir="${modulebase}/hidserv/stats" includes="hidserv.csv" />
       <fileset dir="${modulebase}/clients/stats"
                includes="clients*.csv userstats-combined.csv" />
+      <fileset dir="${modulebase}/ipv6servers/stats" includes="ipv6servers.csv" />
       <fileset dir="${modulebase}/webstats/stats" includes="webstats.csv" />
     </copy>
     <copy todir="${rdatadir}" >
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    30 May '18
                    
                        commit 661c53df912606b885ea3d74622addf9567b61b4
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date:   Fri Dec 22 18:45:35 2017 +0100
    Make column headers lower-case.
---
 src/main/java/org/torproject/metrics/stats/ipv6servers/OutputLine.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/OutputLine.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/OutputLine.java
index 31838d3..a6a1aa5 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/OutputLine.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/OutputLine.java
@@ -20,7 +20,7 @@ class OutputLine {
 
   /** Column headers joined together with the given delimiter. */
   static String columnHeadersDelimitedBy(String delimiter) {
-    return Arrays.stream(Column.values()).map(c -> c.toString())
+    return Arrays.stream(Column.values()).map(c -> c.toString().toLowerCase())
         .collect(Collectors.joining(delimiter));
   }
 
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            [metrics-web/release] Add pgTAB extension and license information.
                        
                        
by karsten@torproject.org 30 May '18
                    by karsten@torproject.org 30 May '18
30 May '18
                    
                        commit b9f63b6bb8d96abf984e90afe3a24c696dde0c05
Author: iwakeh <iwakeh(a)torproject.org>
Date:   Wed Dec 20 13:06:57 2017 +0000
    Add pgTAB extension and license information.
---
 src/test/sql/userstats/test-userstats.sql | 7 +++++++
 1 file changed, 7 insertions(+)
diff --git a/src/test/sql/userstats/test-userstats.sql b/src/test/sql/userstats/test-userstats.sql
index 66f8b82..a08cc7d 100644
--- a/src/test/sql/userstats/test-userstats.sql
+++ b/src/test/sql/userstats/test-userstats.sql
@@ -1,3 +1,10 @@
+-- Copyright 2013--2017 The Tor Project
+-- See LICENSE for licensing information
+
+-- Hint: You'll need pgTAP in order to run these tests!
+
+CREATE EXTENSION IF NOT EXISTS pgtap;
+
 BEGIN;
 SET search_path TO tap, public;
 SELECT plan(152);
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    30 May '18
                    
                        commit 2207847531c80e35d8e126617813e999aee143c0
Author: iwakeh <iwakeh(a)torproject.org>
Date:   Wed Dec 20 13:06:58 2017 +0000
    Make old tests run (still failing).
    
    This test still needs to be adapted to not fail, cf. TODOs.
    Changed some types to lowercase, pgTAP seems to also test case on types.
---
 src/test/sql/userstats/test-userstats.sql | 198 +++++++++++++++---------------
 1 file changed, 99 insertions(+), 99 deletions(-)
diff --git a/src/test/sql/userstats/test-userstats.sql b/src/test/sql/userstats/test-userstats.sql
index a08cc7d..299f4ab 100644
--- a/src/test/sql/userstats/test-userstats.sql
+++ b/src/test/sql/userstats/test-userstats.sql
@@ -20,7 +20,7 @@ SELECT enum_has_labels('metric', ARRAY['responses', 'bytes', 'status']);
 -- it.
 SELECT has_table('imported');
 SELECT has_column('imported', 'fingerprint');
-SELECT col_type_is('imported', 'fingerprint', 'CHARACTER(40)');
+SELECT col_type_is('imported', 'fingerprint', 'character(40)');
 SELECT col_not_null('imported', 'fingerprint');
 SELECT has_column('imported', 'node');
 SELECT col_type_is('imported', 'node', 'node');
@@ -29,24 +29,24 @@ SELECT has_column('imported', 'metric');
 SELECT col_type_is('imported', 'metric', 'metric');
 SELECT col_not_null('imported', 'metric');
 SELECT has_column('imported', 'country');
-SELECT col_type_is('imported', 'country', 'CHARACTER VARYING(2)');
+SELECT col_type_is('imported', 'country', 'character varying(2)');
 SELECT col_not_null('imported', 'country');
 SELECT has_column('imported', 'transport');
-SELECT col_type_is('imported', 'transport', 'CHARACTER VARYING(20)');
+SELECT col_type_is('imported', 'transport', 'character varying(20)');
 SELECT col_not_null('imported', 'transport');
 SELECT has_column('imported', 'version');
-SELECT col_type_is('imported', 'version', 'CHARACTER VARYING(2)');
+SELECT col_type_is('imported', 'version', 'character varying(2)');
 SELECT col_not_null('imported', 'version');
 SELECT has_column('imported', 'stats_start');
 SELECT col_type_is('imported', 'stats_start',
-  'TIMESTAMP WITHOUT TIME ZONE');
+  'timestamp without time zone');
 SELECT col_not_null('imported', 'stats_start');
 SELECT has_column('imported', 'stats_end');
 SELECT col_type_is('imported', 'stats_end',
-  'TIMESTAMP WITHOUT TIME ZONE');
+  'timestamp without time zone');
 SELECT col_not_null('imported', 'stats_end');
 SELECT has_column('imported', 'val');
-SELECT col_type_is('imported', 'val', 'DOUBLE PRECISION');
+SELECT col_type_is('imported', 'val', 'double precision');
 SELECT col_not_null('imported', 'val');
 SELECT hasnt_pk('imported');
 
@@ -54,10 +54,10 @@ SELECT hasnt_pk('imported');
 -- expects it.
 SELECT has_table('merged');
 SELECT has_column('merged', 'id');
-SELECT col_type_is('merged', 'id', 'INTEGER');
+SELECT col_type_is('merged', 'id', 'integer');
 SELECT col_is_pk('merged', 'id');
 SELECT has_column('merged', 'fingerprint');
-SELECT col_type_is('merged', 'fingerprint', 'CHARACTER(40)');
+SELECT col_type_is('merged', 'fingerprint', 'character(40)');
 SELECT col_not_null('merged', 'fingerprint');
 SELECT has_column('merged', 'node');
 SELECT col_type_is('merged', 'node', 'node');
@@ -66,73 +66,73 @@ SELECT has_column('merged', 'metric');
 SELECT col_type_is('merged', 'metric', 'metric');
 SELECT col_not_null('merged', 'metric');
 SELECT has_column('merged', 'country');
-SELECT col_type_is('merged', 'country', 'CHARACTER VARYING(2)');
+SELECT col_type_is('merged', 'country', 'character varying(2)');
 SELECT col_not_null('merged', 'country');
 SELECT has_column('merged', 'transport');
-SELECT col_type_is('merged', 'transport', 'CHARACTER VARYING(20)');
+SELECT col_type_is('merged', 'transport', 'character varying(20)');
 SELECT col_not_null('merged', 'transport');
 SELECT has_column('merged', 'version');
-SELECT col_type_is('merged', 'version', 'CHARACTER VARYING(2)');
+SELECT col_type_is('merged', 'version', 'character varying(2)');
 SELECT col_not_null('merged', 'version');
 SELECT has_column('merged', 'stats_start');
 SELECT col_type_is('merged', 'stats_start',
-  'TIMESTAMP WITHOUT TIME ZONE');
+  'timestamp without time zone');
 SELECT col_not_null('merged', 'stats_start');
 SELECT has_column('merged', 'stats_end');
 SELECT col_type_is('merged', 'stats_end',
-  'TIMESTAMP WITHOUT TIME ZONE');
+  'timestamp without time zone');
 SELECT col_not_null('merged', 'stats_end');
 SELECT has_column('merged', 'val');
-SELECT col_type_is('merged', 'val', 'DOUBLE PRECISION');
+SELECT col_type_is('merged', 'val', 'double precision');
 SELECT col_not_null('merged', 'val');
 
 -- Make sure that the internally-used aggregated table is exactly as
 -- aggregate() expects it.
 SELECT has_table('aggregated');
 SELECT has_column('aggregated', 'date');
-SELECT col_type_is('aggregated', 'date', 'DATE');
+SELECT col_type_is('aggregated', 'date', 'date');
 SELECT col_not_null('aggregated', 'date');
 SELECT has_column('aggregated', 'node');
 SELECT col_type_is('aggregated', 'node', 'node');
 SELECT col_not_null('aggregated', 'node');
 SELECT has_column('aggregated', 'country');
-SELECT col_type_is('aggregated', 'country', 'CHARACTER VARYING(2)');
+SELECT col_type_is('aggregated', 'country', 'character varying(2)');
 SELECT col_not_null('aggregated', 'country');
 SELECT col_default_is('aggregated', 'country', '');
 SELECT has_column('aggregated', 'transport');
-SELECT col_type_is('aggregated', 'transport', 'CHARACTER VARYING(20)');
+SELECT col_type_is('aggregated', 'transport', 'character varying(20)');
 SELECT col_not_null('aggregated', 'transport');
 SELECT col_default_is('aggregated', 'transport', '');
 SELECT has_column('aggregated', 'version');
-SELECT col_type_is('aggregated', 'version', 'CHARACTER VARYING(2)');
+SELECT col_type_is('aggregated', 'version', 'character varying(2)');
 SELECT col_not_null('aggregated', 'version');
 SELECT col_default_is('aggregated', 'version', '');
 SELECT has_column('aggregated', 'rrx');
-SELECT col_type_is('aggregated', 'rrx', 'DOUBLE PRECISION');
+SELECT col_type_is('aggregated', 'rrx', 'double precision');
 SELECT col_not_null('aggregated', 'rrx');
 SELECT col_default_is('aggregated', 'rrx', 0);
 SELECT has_column('aggregated', 'nrx');
-SELECT col_type_is('aggregated', 'nrx', 'DOUBLE PRECISION');
+SELECT col_type_is('aggregated', 'nrx', 'double precision');
 SELECT col_not_null('aggregated', 'nrx');
 SELECT col_default_is('aggregated', 'nrx', 0);
 SELECT has_column('aggregated', 'hh');
-SELECT col_type_is('aggregated', 'hh', 'DOUBLE PRECISION');
+SELECT col_type_is('aggregated', 'hh', 'double precision');
 SELECT col_not_null('aggregated', 'hh');
 SELECT col_default_is('aggregated', 'hh', 0);
 SELECT has_column('aggregated', 'nn');
-SELECT col_type_is('aggregated', 'nn', 'DOUBLE PRECISION');
+SELECT col_type_is('aggregated', 'nn', 'double precision');
 SELECT col_not_null('aggregated', 'nn');
 SELECT col_default_is('aggregated', 'nn', 0);
 SELECT has_column('aggregated', 'hrh');
-SELECT col_type_is('aggregated', 'hrh', 'DOUBLE PRECISION');
+SELECT col_type_is('aggregated', 'hrh', 'double precision');
 SELECT col_not_null('aggregated', 'hrh');
 SELECT col_default_is('aggregated', 'hrh', 0);
 SELECT has_column('aggregated', 'nh');
-SELECT col_type_is('aggregated', 'nh', 'DOUBLE PRECISION');
+SELECT col_type_is('aggregated', 'nh', 'double precision');
 SELECT col_not_null('aggregated', 'nh');
 SELECT col_default_is('aggregated', 'nh', 0);
 SELECT has_column('aggregated', 'nrh');
-SELECT col_type_is('aggregated', 'nrh', 'DOUBLE PRECISION');
+SELECT col_type_is('aggregated', 'nrh', 'double precision');
 SELECT col_not_null('aggregated', 'nrh');
 SELECT col_default_is('aggregated', 'nrh', 0);
 
@@ -153,7 +153,7 @@ CREATE TEMPORARY TABLE imported (
 );
 CREATE TEMPORARY TABLE merged (
   id SERIAL PRIMARY KEY,
-  fingerprint CHARACTER(40) NOT NULL,
+  fingerprint character(40) NOT NULL,
   node node NOT NULL,
   metric metric NOT NULL,
   country CHARACTER VARYING(2) NOT NULL,
@@ -164,7 +164,7 @@ CREATE TEMPORARY TABLE merged (
   val DOUBLE PRECISION NOT NULL
 );
 CREATE TEMPORARY TABLE aggregated (
-  date DATE NOT NULL,
+  date date NOT NULL,
   node node NOT NULL,
   country CHARACTER VARYING(2) NOT NULL DEFAULT '',
   transport CHARACTER VARYING(20) NOT NULL DEFAULT '',
@@ -179,13 +179,13 @@ CREATE TEMPORARY TABLE aggregated (
 );
 
 -- Test merging newly imported data.
-PREPARE new_imported(TIMESTAMP WITHOUT TIME ZONE,
-  TIMESTAMP WITHOUT TIME ZONE) AS INSERT INTO imported
+PREPARE new_imported(timestamp without time zone,
+  timestamp without time zone) AS INSERT INTO imported
   (fingerprint, node, metric, country, transport, version, stats_start,
   stats_end, val) VALUES ('1234567890123456789012345678901234567890',
   'relay', 'status', '', '', '', $1, $2, 0);
-PREPARE new_merged(TIMESTAMP WITHOUT TIME ZONE,
-  TIMESTAMP WITHOUT TIME ZONE) AS INSERT INTO merged
+PREPARE new_merged(timestamp without time zone,
+  timestamp without time zone) AS INSERT INTO merged
   (fingerprint, node, metric, country, transport, version, stats_start,
   stats_end, val) VALUES ('1234567890123456789012345678901234567890',
   'relay', 'status', '', '', '', $1, $2, 0);
@@ -193,35 +193,35 @@ PREPARE new_merged(TIMESTAMP WITHOUT TIME ZONE,
 EXECUTE new_imported('2013-04-11 14:00:00', '2013-04-11 15:00:00');
 SELECT merge();
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 15:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 15:00:00'::timestamp without time zone)$$,
   'Should insert new entry into empty table as is');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 14:00:00');
 EXECUTE new_imported('2013-04-11 16:00:00', '2013-04-11 17:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 14:00:00'::TIMESTAMP WITHOUT TIME ZONE),
-           ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 14:00:00'::timestamp without time zone),
+           ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should insert two non-contiguous entries');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 15:00:00');
 EXECUTE new_imported('2013-04-11 15:00:00', '2013-04-11 17:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should merge two contiguous entries');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 16:00:00');
 EXECUTE new_imported('2013-04-11 14:00:00', '2013-04-11 17:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 16:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 16:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts before and ends after the start of ' ||
   'another new entry');
 DELETE FROM imported;
@@ -229,9 +229,9 @@ DELETE FROM merged;
 
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 15:00:00');
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 16:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 15:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 15:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts at and ends after the start of ' ||
   'another new entry');
 DELETE FROM imported;
@@ -239,9 +239,9 @@ DELETE FROM merged;
 
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 16:00:00');
 EXECUTE new_imported('2013-04-11 14:00:00', '2013-04-11 15:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 16:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 16:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts after another new entry starts and ' ||
   'ends before that entry ends');
 DELETE FROM imported;
@@ -249,18 +249,18 @@ DELETE FROM merged;
 
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 16:00:00');
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 16:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 16:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 16:00:00'::timestamp without time zone)$$,
   'Should skip entry that has same start and end as another new entry');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 16:00:00');
 EXECUTE new_imported('2013-04-11 14:00:00', '2013-04-11 16:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 16:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 16:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts before and ends at the end of ' ||
   'another new entry');
 DELETE FROM imported;
@@ -268,28 +268,28 @@ DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 16:00:00', '2013-04-11 17:00:00');
 EXECUTE new_imported('2013-04-11 14:00:00', '2013-04-11 15:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 15:00:00'::TIMESTAMP WITHOUT TIME ZONE),
-           ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 15:00:00'::timestamp without time zone),
+           ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should insert entry that ends before existing entry starts');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 15:00:00', '2013-04-11 16:00:00');
 EXECUTE new_imported('2013-04-11 14:00:00', '2013-04-11 15:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 16:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 16:00:00'::timestamp without time zone)$$,
   'Should merge entry that ends when existing entry starts');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 14:00:00', '2013-04-11 15:00:00');
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 14:30:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_start FROM merged',
-  $$VALUES ('2013-04-11 14:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 14:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts before but ends after existing entry ' ||
   'starts');
 DELETE FROM imported;
@@ -298,10 +298,10 @@ DELETE FROM merged;
 EXECUTE new_merged('2013-04-11 11:00:00', '2013-04-11 13:00:00');
 EXECUTE new_merged('2013-04-11 14:00:00', '2013-04-11 16:00:00');
 EXECUTE new_imported('2013-04-11 13:00:00', '2013-04-11 15:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 13:00:00'::TIMESTAMP WITHOUT TIME ZONE),
-           ('2013-04-11 16:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 13:00:00'::timestamp without time zone),
+           ('2013-04-11 16:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts when existing entry ends but ' ||
   'ends before another entry starts');
 DELETE FROM imported;
@@ -309,45 +309,45 @@ DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 14:00:00', '2013-04-11 17:00:00');
 EXECUTE new_imported('2013-04-11 14:00:00', '2013-04-11 15:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts when existing entry starts');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 14:00:00', '2013-04-11 17:00:00');
 EXECUTE new_imported('2013-04-11 15:00:00', '2013-04-11 16:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts after and ends before existing entry');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 14:00:00', '2013-04-11 17:00:00');
 EXECUTE new_imported('2013-04-11 14:00:00', '2013-04-11 17:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should skip entry that is already contained');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 14:00:00', '2013-04-11 17:00:00');
 EXECUTE new_imported('2013-04-11 16:00:00', '2013-04-11 17:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should skip entry that ends when existing entry ends');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 14:00:00', '2013-04-11 17:00:00');
 EXECUTE new_imported('2013-04-11 16:00:00', '2013-04-11 18:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts before but ends after existing entry ' ||
   'ends');
 DELETE FROM imported;
@@ -356,10 +356,10 @@ DELETE FROM merged;
 EXECUTE new_merged('2013-04-11 14:00:00', '2013-04-11 17:00:00');
 EXECUTE new_merged('2013-04-11 18:00:00', '2013-04-11 19:00:00');
 EXECUTE new_imported('2013-04-11 16:00:00', '2013-04-11 18:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE),
-           ('2013-04-11 19:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 17:00:00'::timestamp without time zone),
+           ('2013-04-11 19:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts before existing entry ends and ends ' ||
   'when another entry starts');
 DELETE FROM imported;
@@ -368,10 +368,10 @@ DELETE FROM merged;
 EXECUTE new_merged('2013-04-11 11:00:00', '2013-04-11 13:00:00');
 EXECUTE new_merged('2013-04-11 15:00:00', '2013-04-11 17:00:00');
 EXECUTE new_imported('2013-04-11 12:00:00', '2013-04-11 16:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 13:00:00'::TIMESTAMP WITHOUT TIME ZONE),
-           ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 13:00:00'::timestamp without time zone),
+           ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts before existing entry ends and ends ' ||
   'after another entry starts');
 DELETE FROM imported;
@@ -379,28 +379,28 @@ DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 14:00:00', '2013-04-11 15:00:00');
 EXECUTE new_imported('2013-04-11 15:00:00', '2013-04-11 16:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 16:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 16:00:00'::timestamp without time zone)$$,
   'Should merge entry that ends when existing entry starts');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 14:00:00', '2013-04-11 15:00:00');
 EXECUTE new_imported('2013-04-11 16:00:00', '2013-04-11 17:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 15:00:00'::TIMESTAMP WITHOUT TIME ZONE),
-           ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 15:00:00'::timestamp without time zone),
+           ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should insert entry that starts after existing entry ends');
 DELETE FROM imported;
 DELETE FROM merged;
 
 EXECUTE new_merged('2013-04-11 15:00:00', '2013-04-11 16:00:00');
 EXECUTE new_imported('2013-04-11 14:00:00', '2013-04-11 17:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 16:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 16:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts before existing entry starts and ' ||
   'ends after that entry ends');
 DELETE FROM imported;
@@ -409,10 +409,10 @@ DELETE FROM merged;
 EXECUTE new_merged('2013-04-11 13:00:00', '2013-04-11 14:00:00');
 EXECUTE new_merged('2013-04-11 15:00:00', '2013-04-11 16:00:00');
 EXECUTE new_imported('2013-04-11 12:00:00', '2013-04-11 17:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 14:00:00'::TIMESTAMP WITHOUT TIME ZONE),
-           ('2013-04-11 16:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 14:00:00'::timestamp without time zone),
+           ('2013-04-11 16:00:00'::timestamp without time zone)$$,
   'Should skip entry that starts before and ends after multiple ' ||
   'existing entries');
 DELETE FROM imported;
@@ -420,10 +420,10 @@ DELETE FROM merged;
 
 EXECUTE new_imported('2013-04-11 23:00:00', '2013-04-12 00:00:00');
 EXECUTE new_imported('2013-04-12 00:00:00', '2013-04-12 01:00:00');
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-12 00:00:00'::TIMESTAMP WITHOUT TIME ZONE),
-           ('2013-04-12 01:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-12 00:00:00'::timestamp without time zone),
+           ('2013-04-12 01:00:00'::timestamp without time zone)$$,
   'Should insert two contiguous entries that end and start at midnight');
 DELETE FROM imported;
 DELETE FROM merged;
@@ -433,10 +433,10 @@ INSERT INTO imported (fingerprint, node, metric, country, transport,
   version, stats_start, stats_end, val) VALUES
   ('9876543210987654321098765432109876543210', 'relay', 'status', '', '',
   '', '2013-04-11 12:00:00', '2013-04-11 17:00:00', 0);
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE),
-           ('2013-04-11 17:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 17:00:00'::timestamp without time zone),
+           ('2013-04-11 17:00:00'::timestamp without time zone)$$,
   'Should import two entries with different fingerprints and same ' ||
   'start and end');
 DELETE FROM imported;
@@ -447,10 +447,10 @@ INSERT INTO imported (fingerprint, node, metric, country, transport,
   version, stats_start, stats_end, val) VALUES
   ('9876543210987654321098765432109876543210', 'relay', 'status', '', '',
   '', '2013-04-11 14:00:00', '2013-04-11 16:00:00', 0);
-SELECT merge();
+-- SELECT merge(); -- TODO fix: ERROR:  relation "merged_part" already exists
 SELECT bag_eq('SELECT stats_end FROM merged',
-  $$VALUES ('2013-04-11 15:00:00'::TIMESTAMP WITHOUT TIME ZONE),
-           ('2013-04-11 16:00:00'::TIMESTAMP WITHOUT TIME ZONE)$$,
+  $$VALUES ('2013-04-11 15:00:00'::timestamp without time zone),
+           ('2013-04-11 16:00:00'::timestamp without time zone)$$,
   'Should import two entries with overlapping starts and ends and ' ||
   'different fingerprints');
 DELETE FROM imported;
@@ -462,19 +462,19 @@ DELETE FROM merged;
 -- for the .csv export.
 SELECT has_view('estimated');
 SELECT has_column('estimated', 'date');
-SELECT col_type_is('estimated', 'date', 'DATE');
+SELECT col_type_is('estimated', 'date', 'date');
 SELECT has_column('estimated', 'node');
 SELECT col_type_is('estimated', 'node', 'node');
 SELECT has_column('estimated', 'country');
-SELECT col_type_is('estimated', 'country', 'CHARACTER VARYING(2)');
+SELECT col_type_is('estimated', 'country', 'character varying(2)');
 SELECT has_column('estimated', 'transport');
-SELECT col_type_is('estimated', 'transport', 'CHARACTER VARYING(20)');
+SELECT col_type_is('estimated', 'transport', 'character varying(20)');
 SELECT has_column('estimated', 'version');
-SELECT col_type_is('estimated', 'version', 'CHARACTER VARYING(2)');
+SELECT col_type_is('estimated', 'version', 'character varying(2)');
 SELECT has_column('estimated', 'frac');
-SELECT col_type_is('estimated', 'frac', 'INTEGER');
+SELECT col_type_is('estimated', 'frac', 'integer');
 SELECT has_column('estimated', 'users');
-SELECT col_type_is('estimated', 'users', 'INTEGER');
+SELECT col_type_is('estimated', 'users', 'integer');
 
 -- TODO Test that frac and users are computed correctly in the view.
 
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            [metrics-web/release] Update news.json to version 209 of doc/MetricsTimeline.
                        
                        
by karsten@torproject.org 30 May '18
                    by karsten@torproject.org 30 May '18
30 May '18
                    
                        commit a293f9e18840610d7fc5f72c6a85319b40edddfe
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date:   Mon Jan 8 09:13:38 2018 +0100
    Update news.json to version 209 of doc/MetricsTimeline.
---
 src/main/resources/web/json/news.json | 65 +++++++++++++++++++++++++++++++----
 1 file changed, 58 insertions(+), 7 deletions(-)
diff --git a/src/main/resources/web/json/news.json b/src/main/resources/web/json/news.json
index 410dd9a..ee3e1cf 100644
--- a/src/main/resources/web/json/news.json
+++ b/src/main/resources/web/json/news.json
@@ -2876,6 +2876,37 @@
     ]
   },
   {
+    "start": "2017-12-04",
+    "description": "DDoS attack uses a bug in the KIST scheduler to crash relays by running them out of memory.",
+    "links": [
+      "<a href=\"https://lists.torproject.org/pipermail/tor-relays/2017-December/013669.html\">tor-relays thread</a>",
+      "<a href=\"https://metrics.torproject.org/relayflags.html?start=2017-11-01&end=2018-01…">relay graph</a>",
+      "<a href=\"https://lists.torproject.org/pipermail/tor-project/2017-December/001604.htm…">summary post</a>",
+      "<a href=\"https://bugs.torproject.org/24665\">ticket</a>"
+    ]
+  },
+  {
+    "start": "2017-12-21",
+    "description": "Release of tor 0.3.2.8-rc, intended to fix the bug that was enabling an ongoing DDoS on relays.",
+    "links": [
+      "<a href=\"https://lists.torproject.org/pipermail/tor-talk/2017-December/043844.html\">announcement</a>",
+      "<a href=\"https://bugs.torproject.org/24665\">ticket</a>"
+    ]
+  },
+  {
+    "start": "2017-12-28",
+    "places": [
+      "ir"
+    ],
+    "description": "Protests in Iran, blocking of various services including Tor.",
+    "links": [
+      "<a href=\"https://ooni.torproject.org/post/2018-iran-protests/\">OONI report</a>",
+      "<a href=\"https://metrics.torproject.org/userstats-relay-country.html?start=2017-11-0…">relay graph</a>",
+      "<a href=\"https://metrics.torproject.org/userstats-bridge-country.html?start=2017-11-…">bridge graph</a>",
+      "<a href=\"https://twitter.com/nusenu_/status/948914485045145601\">tweet</a>"
+    ]
+  },
+  {
     "start": "2016-02-24",
     "places": [
       "tm"
@@ -2906,13 +2937,14 @@
   },
   {
     "start": "2016-08-18",
+    "end": "2016-08-29",
     "places": [
       "ml"
     ],
     "description": "Sudden increase of direct and bridge users in Mali.",
     "links": [
-      "<a href=\"https://metrics.torproject.org/userstats-relay-country.html?start=2016-01-0…">relay graph</a>",
-      "<a href=\"https://metrics.torproject.org/userstats-bridge-country.html?start=2016-01-…">bridge graph</a>"
+      "<a href=\"https://metrics.torproject.org/userstats-relay-country.html?start=2016-03-0…">relay graph</a>",
+      "<a href=\"https://metrics.torproject.org/userstats-bridge-country.html?start=2016-03-…">bridge graph</a>"
     ],
     "unknown": true
   },
@@ -3166,13 +3198,14 @@
   },
   {
     "start": "2017-06-14",
+    "end": "2017-07-06",
     "places": [
       "ml"
     ],
     "description": "Sudden increase of direct and bridge users in Mali.",
     "links": [
-      "<a href=\"https://metrics.torproject.org/userstats-relay-country.html?start=2017-01-0…">relay graph</a>",
-      "<a href=\"https://metrics.torproject.org/userstats-bridge-country.html?start=2017-01-…">bridge graph</a>"
+      "<a href=\"https://metrics.torproject.org/userstats-relay-country.html?start=2017-03-0…">relay graph</a>",
+      "<a href=\"https://metrics.torproject.org/userstats-bridge-country.html?start=2017-03-…">bridge graph</a>"
     ],
     "unknown": true
   },
@@ -3367,6 +3400,7 @@
   },
   {
     "start": "2017-09-26",
+    "end": "2017-10-22",
     "places": [
       "de"
     ],
@@ -3374,7 +3408,7 @@
       "<OR>",
       "relay"
     ],
-    "description": "Steady increase of users in Germany, from 180k to over 500k.",
+    "description": "Steady increase of relay users in Germany, from 180k to around 500k. It could increase further starting 2017-12-10.",
     "links": [
       "<a href=\"https://metrics.torproject.org/userstats-relay-country.html?start=2017-08-1…">de graph</a>",
       "<a href=\"https://www.reddit.com/r/TOR/comments/7b53kq/direct_users_from_germany_go_f…">reddit thread</a>"
@@ -3383,6 +3417,7 @@
   },
   {
     "start": "2017-10-07",
+    "end": "2017-12-20",
     "places": [
       "ro"
     ],
@@ -3390,9 +3425,9 @@
       "<OR>",
       "relay"
     ],
-    "description": "Steady increase of relay users in Romania.",
+    "description": "Surge of relay users in Romania, from 10k to around 90k, which later subsided.",
     "links": [
-      "<a href=\"https://metrics.torproject.org/userstats-relay-country.html?start=2017-08-0…">graph</a>",
+      "<a href=\"https://metrics.torproject.org/userstats-relay-country.html?start=2017-08-0…">graph</a>",
       "<a href=\"https://lists.torproject.org/pipermail/metrics-team/2017-October/000502.htm…">metrics-team thread</a>"
     ],
     "unknown": true
@@ -3412,5 +3447,21 @@
       "<a href=\"https://metrics.torproject.org/userstats-relay-country.html?start=2017-08-0…">graph</a>"
     ],
     "unknown": true
+  },
+  {
+    "start": "2017-12-10",
+    "places": [
+      "de"
+    ],
+    "protocols": [
+      "<OR>",
+      "relay"
+    ],
+    "description": "Further increase of relay users in Germany, from 500k to over 1M.",
+    "links": [
+      "<a href=\"https://metrics.torproject.org/userstats-relay-country.html?start=2017-11-0…">graph</a>",
+      "<a href=\"https://www.reddit.com/r/TOR/comments/7ldrox/tor_usage_in_germany_what_happ…">reddit thread</a>"
+    ],
+    "unknown": true
   }
 ]
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        commit 12080dc058b8f61ce2c95bf9d79aee1d50061494
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date:   Tue Jan 9 10:21:45 2018 +0100
    Update copyright to 2018.
---
 src/main/java/org/torproject/ernie/cron/Configuration.java              | 2 +-
 src/main/java/org/torproject/ernie/cron/LockFile.java                   | 2 +-
 src/main/java/org/torproject/ernie/cron/LoggingConfiguration.java       | 2 +-
 src/main/java/org/torproject/ernie/cron/Main.java                       | 2 +-
 .../java/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java | 2 +-
 .../org/torproject/ernie/cron/network/ConsensusStatsFileHandler.java    | 2 +-
 src/main/java/org/torproject/metrics/advbwdist/Main.java                | 2 +-
 src/main/java/org/torproject/metrics/clients/Main.java                  | 2 +-
 src/main/java/org/torproject/metrics/collectdescs/Main.java             | 2 +-
 src/main/java/org/torproject/metrics/connbidirect/Main.java             | 2 +-
 src/main/java/org/torproject/metrics/hidserv/Aggregator.java            | 2 +-
 .../java/org/torproject/metrics/hidserv/ComputedNetworkFractions.java   | 2 +-
 src/main/java/org/torproject/metrics/hidserv/DateTimeHelper.java        | 2 +-
 src/main/java/org/torproject/metrics/hidserv/Document.java              | 2 +-
 src/main/java/org/torproject/metrics/hidserv/DocumentStore.java         | 2 +-
 .../java/org/torproject/metrics/hidserv/ExtrapolatedHidServStats.java   | 2 +-
 src/main/java/org/torproject/metrics/hidserv/Extrapolator.java          | 2 +-
 src/main/java/org/torproject/metrics/hidserv/Main.java                  | 2 +-
 src/main/java/org/torproject/metrics/hidserv/Parser.java                | 2 +-
 src/main/java/org/torproject/metrics/hidserv/ReportedHidServStats.java  | 2 +-
 src/main/java/org/torproject/metrics/hidserv/Simulate.java              | 2 +-
 .../java/org/torproject/metrics/stats/ipv6servers/Configuration.java    | 2 +-
 src/main/java/org/torproject/metrics/stats/ipv6servers/Database.java    | 2 +-
 .../org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatus.java     | 2 +-
 .../org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptor.java  | 2 +-
 src/main/java/org/torproject/metrics/stats/ipv6servers/Main.java        | 2 +-
 src/main/java/org/torproject/metrics/stats/ipv6servers/OutputLine.java  | 2 +-
 src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java      | 2 +-
 src/main/java/org/torproject/metrics/stats/ipv6servers/Writer.java      | 2 +-
 src/main/java/org/torproject/metrics/web/AboutServlet.java              | 2 +-
 src/main/java/org/torproject/metrics/web/Category.java                  | 2 +-
 src/main/java/org/torproject/metrics/web/CollecTorServlet.java          | 2 +-
 .../java/org/torproject/metrics/web/CollectorDirectoryProvider.java     | 2 +-
 src/main/java/org/torproject/metrics/web/ContentProvider.java           | 2 +-
 src/main/java/org/torproject/metrics/web/DataSourceServlet.java         | 2 +-
 src/main/java/org/torproject/metrics/web/DevelopmentServlet.java        | 2 +-
 src/main/java/org/torproject/metrics/web/DirectoryListing.java          | 2 +-
 src/main/java/org/torproject/metrics/web/ErrorServlet.java              | 2 +-
 src/main/java/org/torproject/metrics/web/GlossaryServlet.java           | 2 +-
 src/main/java/org/torproject/metrics/web/GraphServlet.java              | 2 +-
 src/main/java/org/torproject/metrics/web/IndexServlet.java              | 2 +-
 src/main/java/org/torproject/metrics/web/LinkServlet.java               | 2 +-
 src/main/java/org/torproject/metrics/web/Metric.java                    | 2 +-
 src/main/java/org/torproject/metrics/web/MetricServlet.java             | 2 +-
 src/main/java/org/torproject/metrics/web/MetricsLibServlet.java         | 2 +-
 src/main/java/org/torproject/metrics/web/News.java                      | 2 +-
 src/main/java/org/torproject/metrics/web/NewsServlet.java               | 2 +-
 src/main/java/org/torproject/metrics/web/OnionooServlet.java            | 2 +-
 src/main/java/org/torproject/metrics/web/OperationServlet.java          | 2 +-
 src/main/java/org/torproject/metrics/web/ResearchServlet.java           | 2 +-
 src/main/java/org/torproject/metrics/web/ServerMain.java                | 2 +-
 src/main/java/org/torproject/metrics/web/ServicesServlet.java           | 2 +-
 src/main/java/org/torproject/metrics/web/SourcesServlet.java            | 2 +-
 src/main/java/org/torproject/metrics/web/StatsServlet.java              | 2 +-
 src/main/java/org/torproject/metrics/web/TableServlet.java              | 2 +-
 src/main/java/org/torproject/metrics/web/graphs/BubblesServlet.java     | 2 +-
 src/main/java/org/torproject/metrics/web/graphs/Countries.java          | 2 +-
 src/main/java/org/torproject/metrics/web/graphs/GraphImageServlet.java  | 2 +-
 .../java/org/torproject/metrics/web/graphs/GraphParameterChecker.java   | 2 +-
 src/main/java/org/torproject/metrics/web/graphs/RObject.java            | 2 +-
 src/main/java/org/torproject/metrics/web/graphs/RObjectGenerator.java   | 2 +-
 .../java/org/torproject/metrics/web/graphs/TableParameterChecker.java   | 2 +-
 .../java/org/torproject/metrics/web/research/ResearchStatsServlet.java  | 2 +-
 src/main/java/org/torproject/metrics/webstats/Main.java                 | 2 +-
 src/main/resources/bootstrap-development.sh                             | 2 +-
 src/main/sql/clients/init-userstats.sql                                 | 2 +-
 src/main/sql/ipv6servers/init-ipv6servers.sql                           | 2 +-
 src/main/sql/legacy/tordir.sql                                          | 2 +-
 src/main/sql/onionperf/init-onionperf.sql                               | 2 +-
 src/main/sql/webstats/init-webstats.sql                                 | 2 +-
 src/test/java/org/torproject/metrics/connbidirect/MainTest.java         | 2 +-
 .../org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatusTest.java | 2 +-
 .../torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptorTest.java  | 2 +-
 src/test/java/org/torproject/metrics/web/DirectoryListingTest.java      | 2 +-
 src/test/java/org/torproject/metrics/webstats/MainTest.java             | 2 +-
 src/test/sql/ipv6servers/test-ipv6servers.sql                           | 2 +-
 src/test/sql/userstats/test-userstats.sql                               | 2 +-
 77 files changed, 77 insertions(+), 77 deletions(-)
diff --git a/src/main/java/org/torproject/ernie/cron/Configuration.java b/src/main/java/org/torproject/ernie/cron/Configuration.java
index 0c40293..e223566 100644
--- a/src/main/java/org/torproject/ernie/cron/Configuration.java
+++ b/src/main/java/org/torproject/ernie/cron/Configuration.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.ernie.cron;
diff --git a/src/main/java/org/torproject/ernie/cron/LockFile.java b/src/main/java/org/torproject/ernie/cron/LockFile.java
index 862e1d2..d8ff985 100644
--- a/src/main/java/org/torproject/ernie/cron/LockFile.java
+++ b/src/main/java/org/torproject/ernie/cron/LockFile.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.ernie.cron;
diff --git a/src/main/java/org/torproject/ernie/cron/LoggingConfiguration.java b/src/main/java/org/torproject/ernie/cron/LoggingConfiguration.java
index f6658c5..9f49dff 100644
--- a/src/main/java/org/torproject/ernie/cron/LoggingConfiguration.java
+++ b/src/main/java/org/torproject/ernie/cron/LoggingConfiguration.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.ernie.cron;
diff --git a/src/main/java/org/torproject/ernie/cron/Main.java b/src/main/java/org/torproject/ernie/cron/Main.java
index 8b97143..4e272bc 100644
--- a/src/main/java/org/torproject/ernie/cron/Main.java
+++ b/src/main/java/org/torproject/ernie/cron/Main.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.ernie.cron;
diff --git a/src/main/java/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java b/src/main/java/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
index 36f2102..99b931c 100644
--- a/src/main/java/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
+++ b/src/main/java/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.ernie.cron;
diff --git a/src/main/java/org/torproject/ernie/cron/network/ConsensusStatsFileHandler.java b/src/main/java/org/torproject/ernie/cron/network/ConsensusStatsFileHandler.java
index c4b8770..c47db13 100644
--- a/src/main/java/org/torproject/ernie/cron/network/ConsensusStatsFileHandler.java
+++ b/src/main/java/org/torproject/ernie/cron/network/ConsensusStatsFileHandler.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.ernie.cron.network;
diff --git a/src/main/java/org/torproject/metrics/advbwdist/Main.java b/src/main/java/org/torproject/metrics/advbwdist/Main.java
index 8928be2..76c701f 100644
--- a/src/main/java/org/torproject/metrics/advbwdist/Main.java
+++ b/src/main/java/org/torproject/metrics/advbwdist/Main.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.advbwdist;
diff --git a/src/main/java/org/torproject/metrics/clients/Main.java b/src/main/java/org/torproject/metrics/clients/Main.java
index ea198ff..0ad3a49 100644
--- a/src/main/java/org/torproject/metrics/clients/Main.java
+++ b/src/main/java/org/torproject/metrics/clients/Main.java
@@ -1,4 +1,4 @@
-/* Copyright 2013--2017 The Tor Project
+/* Copyright 2013--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.clients;
diff --git a/src/main/java/org/torproject/metrics/collectdescs/Main.java b/src/main/java/org/torproject/metrics/collectdescs/Main.java
index 499dff9..3ed0e71 100644
--- a/src/main/java/org/torproject/metrics/collectdescs/Main.java
+++ b/src/main/java/org/torproject/metrics/collectdescs/Main.java
@@ -1,4 +1,4 @@
-/* Copyright 2015--2017 The Tor Project
+/* Copyright 2015--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.collectdescs;
diff --git a/src/main/java/org/torproject/metrics/connbidirect/Main.java b/src/main/java/org/torproject/metrics/connbidirect/Main.java
index 6e23ea7..fa24e6e 100644
--- a/src/main/java/org/torproject/metrics/connbidirect/Main.java
+++ b/src/main/java/org/torproject/metrics/connbidirect/Main.java
@@ -1,4 +1,4 @@
-/* Copyright 2015--2017 The Tor Project
+/* Copyright 2015--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.connbidirect;
diff --git a/src/main/java/org/torproject/metrics/hidserv/Aggregator.java b/src/main/java/org/torproject/metrics/hidserv/Aggregator.java
index d7a1054..c492f4d 100644
--- a/src/main/java/org/torproject/metrics/hidserv/Aggregator.java
+++ b/src/main/java/org/torproject/metrics/hidserv/Aggregator.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/hidserv/ComputedNetworkFractions.java b/src/main/java/org/torproject/metrics/hidserv/ComputedNetworkFractions.java
index 54c80c8..9f14cf7 100644
--- a/src/main/java/org/torproject/metrics/hidserv/ComputedNetworkFractions.java
+++ b/src/main/java/org/torproject/metrics/hidserv/ComputedNetworkFractions.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/hidserv/DateTimeHelper.java b/src/main/java/org/torproject/metrics/hidserv/DateTimeHelper.java
index 5be6800..278ef80 100644
--- a/src/main/java/org/torproject/metrics/hidserv/DateTimeHelper.java
+++ b/src/main/java/org/torproject/metrics/hidserv/DateTimeHelper.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/hidserv/Document.java b/src/main/java/org/torproject/metrics/hidserv/Document.java
index 46ce40d..af1489a 100644
--- a/src/main/java/org/torproject/metrics/hidserv/Document.java
+++ b/src/main/java/org/torproject/metrics/hidserv/Document.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/hidserv/DocumentStore.java b/src/main/java/org/torproject/metrics/hidserv/DocumentStore.java
index 6dde889..488b89e 100644
--- a/src/main/java/org/torproject/metrics/hidserv/DocumentStore.java
+++ b/src/main/java/org/torproject/metrics/hidserv/DocumentStore.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/hidserv/ExtrapolatedHidServStats.java b/src/main/java/org/torproject/metrics/hidserv/ExtrapolatedHidServStats.java
index 60f9ce0..2d89d15 100644
--- a/src/main/java/org/torproject/metrics/hidserv/ExtrapolatedHidServStats.java
+++ b/src/main/java/org/torproject/metrics/hidserv/ExtrapolatedHidServStats.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/hidserv/Extrapolator.java b/src/main/java/org/torproject/metrics/hidserv/Extrapolator.java
index fdeafdf..2372bed 100644
--- a/src/main/java/org/torproject/metrics/hidserv/Extrapolator.java
+++ b/src/main/java/org/torproject/metrics/hidserv/Extrapolator.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/hidserv/Main.java b/src/main/java/org/torproject/metrics/hidserv/Main.java
index f027f1e..f133e7b 100644
--- a/src/main/java/org/torproject/metrics/hidserv/Main.java
+++ b/src/main/java/org/torproject/metrics/hidserv/Main.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/hidserv/Parser.java b/src/main/java/org/torproject/metrics/hidserv/Parser.java
index b3f5361..9d3f8dd 100644
--- a/src/main/java/org/torproject/metrics/hidserv/Parser.java
+++ b/src/main/java/org/torproject/metrics/hidserv/Parser.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/hidserv/ReportedHidServStats.java b/src/main/java/org/torproject/metrics/hidserv/ReportedHidServStats.java
index 66a81c4..1bc2c6b 100644
--- a/src/main/java/org/torproject/metrics/hidserv/ReportedHidServStats.java
+++ b/src/main/java/org/torproject/metrics/hidserv/ReportedHidServStats.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/hidserv/Simulate.java b/src/main/java/org/torproject/metrics/hidserv/Simulate.java
index 5419da9..1bb1167 100644
--- a/src/main/java/org/torproject/metrics/hidserv/Simulate.java
+++ b/src/main/java/org/torproject/metrics/hidserv/Simulate.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.hidserv;
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/Configuration.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Configuration.java
index ccc1cc6..c940882 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/Configuration.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Configuration.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.stats.ipv6servers;
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/Database.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Database.java
index 1d5187b..67afa92 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/Database.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Database.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.stats.ipv6servers;
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatus.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatus.java
index 1600d47..611ca4e 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatus.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatus.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.stats.ipv6servers;
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptor.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptor.java
index 3655d3e..cb725b0 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptor.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptor.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.stats.ipv6servers;
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/Main.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Main.java
index 28c1d24..5a20b58 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Main.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.stats.ipv6servers;
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/OutputLine.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/OutputLine.java
index a6a1aa5..a5acfa0 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/OutputLine.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/OutputLine.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.stats.ipv6servers;
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java
index 962ca27..9959b93 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Parser.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.stats.ipv6servers;
diff --git a/src/main/java/org/torproject/metrics/stats/ipv6servers/Writer.java b/src/main/java/org/torproject/metrics/stats/ipv6servers/Writer.java
index 388fb4d..9edb347 100644
--- a/src/main/java/org/torproject/metrics/stats/ipv6servers/Writer.java
+++ b/src/main/java/org/torproject/metrics/stats/ipv6servers/Writer.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.stats.ipv6servers;
diff --git a/src/main/java/org/torproject/metrics/web/AboutServlet.java b/src/main/java/org/torproject/metrics/web/AboutServlet.java
index 3906a43..30cb606 100644
--- a/src/main/java/org/torproject/metrics/web/AboutServlet.java
+++ b/src/main/java/org/torproject/metrics/web/AboutServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2014--2017 The Tor Project
+/* Copyright 2014--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/Category.java b/src/main/java/org/torproject/metrics/web/Category.java
index 7896e98..5b0185c 100644
--- a/src/main/java/org/torproject/metrics/web/Category.java
+++ b/src/main/java/org/torproject/metrics/web/Category.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/CollecTorServlet.java b/src/main/java/org/torproject/metrics/web/CollecTorServlet.java
index 2b0a13a..687afb8 100644
--- a/src/main/java/org/torproject/metrics/web/CollecTorServlet.java
+++ b/src/main/java/org/torproject/metrics/web/CollecTorServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/CollectorDirectoryProvider.java b/src/main/java/org/torproject/metrics/web/CollectorDirectoryProvider.java
index ca0e0af..ecf716c 100644
--- a/src/main/java/org/torproject/metrics/web/CollectorDirectoryProvider.java
+++ b/src/main/java/org/torproject/metrics/web/CollectorDirectoryProvider.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/ContentProvider.java b/src/main/java/org/torproject/metrics/web/ContentProvider.java
index 4f3a5ad..4c2f9f9 100644
--- a/src/main/java/org/torproject/metrics/web/ContentProvider.java
+++ b/src/main/java/org/torproject/metrics/web/ContentProvider.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/DataSourceServlet.java b/src/main/java/org/torproject/metrics/web/DataSourceServlet.java
index eb86a1f..f5e83b4 100644
--- a/src/main/java/org/torproject/metrics/web/DataSourceServlet.java
+++ b/src/main/java/org/torproject/metrics/web/DataSourceServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/DevelopmentServlet.java b/src/main/java/org/torproject/metrics/web/DevelopmentServlet.java
index 61d8670..a330ab1 100644
--- a/src/main/java/org/torproject/metrics/web/DevelopmentServlet.java
+++ b/src/main/java/org/torproject/metrics/web/DevelopmentServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/DirectoryListing.java b/src/main/java/org/torproject/metrics/web/DirectoryListing.java
index b83cedb..ceeb2fe 100644
--- a/src/main/java/org/torproject/metrics/web/DirectoryListing.java
+++ b/src/main/java/org/torproject/metrics/web/DirectoryListing.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/ErrorServlet.java b/src/main/java/org/torproject/metrics/web/ErrorServlet.java
index 338f0f1..f3d6974 100644
--- a/src/main/java/org/torproject/metrics/web/ErrorServlet.java
+++ b/src/main/java/org/torproject/metrics/web/ErrorServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/GlossaryServlet.java b/src/main/java/org/torproject/metrics/web/GlossaryServlet.java
index 694e814..30fd3c6 100644
--- a/src/main/java/org/torproject/metrics/web/GlossaryServlet.java
+++ b/src/main/java/org/torproject/metrics/web/GlossaryServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2014--2017 The Tor Project
+/* Copyright 2014--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/GraphServlet.java b/src/main/java/org/torproject/metrics/web/GraphServlet.java
index 7df5294..e05e15d 100644
--- a/src/main/java/org/torproject/metrics/web/GraphServlet.java
+++ b/src/main/java/org/torproject/metrics/web/GraphServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/IndexServlet.java b/src/main/java/org/torproject/metrics/web/IndexServlet.java
index 983315d..ed76081 100644
--- a/src/main/java/org/torproject/metrics/web/IndexServlet.java
+++ b/src/main/java/org/torproject/metrics/web/IndexServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/LinkServlet.java b/src/main/java/org/torproject/metrics/web/LinkServlet.java
index 2319660..b2687f1 100644
--- a/src/main/java/org/torproject/metrics/web/LinkServlet.java
+++ b/src/main/java/org/torproject/metrics/web/LinkServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/Metric.java b/src/main/java/org/torproject/metrics/web/Metric.java
index 50f3978..a5604eb 100644
--- a/src/main/java/org/torproject/metrics/web/Metric.java
+++ b/src/main/java/org/torproject/metrics/web/Metric.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/MetricServlet.java b/src/main/java/org/torproject/metrics/web/MetricServlet.java
index 0b3bb11..f5b29dd 100644
--- a/src/main/java/org/torproject/metrics/web/MetricServlet.java
+++ b/src/main/java/org/torproject/metrics/web/MetricServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/MetricsLibServlet.java b/src/main/java/org/torproject/metrics/web/MetricsLibServlet.java
index d71ea7a..4f1915e 100644
--- a/src/main/java/org/torproject/metrics/web/MetricsLibServlet.java
+++ b/src/main/java/org/torproject/metrics/web/MetricsLibServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/News.java b/src/main/java/org/torproject/metrics/web/News.java
index 9afa598..eddb162 100644
--- a/src/main/java/org/torproject/metrics/web/News.java
+++ b/src/main/java/org/torproject/metrics/web/News.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/NewsServlet.java b/src/main/java/org/torproject/metrics/web/NewsServlet.java
index 227f949..7840a40 100644
--- a/src/main/java/org/torproject/metrics/web/NewsServlet.java
+++ b/src/main/java/org/torproject/metrics/web/NewsServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/OnionooServlet.java b/src/main/java/org/torproject/metrics/web/OnionooServlet.java
index 1133f10..848790e 100644
--- a/src/main/java/org/torproject/metrics/web/OnionooServlet.java
+++ b/src/main/java/org/torproject/metrics/web/OnionooServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/OperationServlet.java b/src/main/java/org/torproject/metrics/web/OperationServlet.java
index e41ceed..1e434f5 100644
--- a/src/main/java/org/torproject/metrics/web/OperationServlet.java
+++ b/src/main/java/org/torproject/metrics/web/OperationServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/ResearchServlet.java b/src/main/java/org/torproject/metrics/web/ResearchServlet.java
index ba5021f..fbfb70d 100644
--- a/src/main/java/org/torproject/metrics/web/ResearchServlet.java
+++ b/src/main/java/org/torproject/metrics/web/ResearchServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/ServerMain.java b/src/main/java/org/torproject/metrics/web/ServerMain.java
index 882ab80..d45090d 100644
--- a/src/main/java/org/torproject/metrics/web/ServerMain.java
+++ b/src/main/java/org/torproject/metrics/web/ServerMain.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/ServicesServlet.java b/src/main/java/org/torproject/metrics/web/ServicesServlet.java
index c96f22c..c9fa3ad 100644
--- a/src/main/java/org/torproject/metrics/web/ServicesServlet.java
+++ b/src/main/java/org/torproject/metrics/web/ServicesServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/SourcesServlet.java b/src/main/java/org/torproject/metrics/web/SourcesServlet.java
index 8ac6874..03dcfc5 100644
--- a/src/main/java/org/torproject/metrics/web/SourcesServlet.java
+++ b/src/main/java/org/torproject/metrics/web/SourcesServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/StatsServlet.java b/src/main/java/org/torproject/metrics/web/StatsServlet.java
index fe08494..ca04a5c 100644
--- a/src/main/java/org/torproject/metrics/web/StatsServlet.java
+++ b/src/main/java/org/torproject/metrics/web/StatsServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/TableServlet.java b/src/main/java/org/torproject/metrics/web/TableServlet.java
index 650921a..e745da0 100644
--- a/src/main/java/org/torproject/metrics/web/TableServlet.java
+++ b/src/main/java/org/torproject/metrics/web/TableServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/main/java/org/torproject/metrics/web/graphs/BubblesServlet.java b/src/main/java/org/torproject/metrics/web/graphs/BubblesServlet.java
index 0348924..1cea611 100644
--- a/src/main/java/org/torproject/metrics/web/graphs/BubblesServlet.java
+++ b/src/main/java/org/torproject/metrics/web/graphs/BubblesServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2013--2017 The Tor Project
+/* Copyright 2013--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web.graphs;
diff --git a/src/main/java/org/torproject/metrics/web/graphs/Countries.java b/src/main/java/org/torproject/metrics/web/graphs/Countries.java
index b153940..8472bd7 100644
--- a/src/main/java/org/torproject/metrics/web/graphs/Countries.java
+++ b/src/main/java/org/torproject/metrics/web/graphs/Countries.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web.graphs;
diff --git a/src/main/java/org/torproject/metrics/web/graphs/GraphImageServlet.java b/src/main/java/org/torproject/metrics/web/graphs/GraphImageServlet.java
index f544b9f..473c743 100644
--- a/src/main/java/org/torproject/metrics/web/graphs/GraphImageServlet.java
+++ b/src/main/java/org/torproject/metrics/web/graphs/GraphImageServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web.graphs;
diff --git a/src/main/java/org/torproject/metrics/web/graphs/GraphParameterChecker.java b/src/main/java/org/torproject/metrics/web/graphs/GraphParameterChecker.java
index e08a5bf..ed4943b 100644
--- a/src/main/java/org/torproject/metrics/web/graphs/GraphParameterChecker.java
+++ b/src/main/java/org/torproject/metrics/web/graphs/GraphParameterChecker.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web.graphs;
diff --git a/src/main/java/org/torproject/metrics/web/graphs/RObject.java b/src/main/java/org/torproject/metrics/web/graphs/RObject.java
index c8ce10a..8f5c231 100644
--- a/src/main/java/org/torproject/metrics/web/graphs/RObject.java
+++ b/src/main/java/org/torproject/metrics/web/graphs/RObject.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web.graphs;
diff --git a/src/main/java/org/torproject/metrics/web/graphs/RObjectGenerator.java b/src/main/java/org/torproject/metrics/web/graphs/RObjectGenerator.java
index c81d4dd..4ea8186 100644
--- a/src/main/java/org/torproject/metrics/web/graphs/RObjectGenerator.java
+++ b/src/main/java/org/torproject/metrics/web/graphs/RObjectGenerator.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web.graphs;
diff --git a/src/main/java/org/torproject/metrics/web/graphs/TableParameterChecker.java b/src/main/java/org/torproject/metrics/web/graphs/TableParameterChecker.java
index eb13531..3a13439 100644
--- a/src/main/java/org/torproject/metrics/web/graphs/TableParameterChecker.java
+++ b/src/main/java/org/torproject/metrics/web/graphs/TableParameterChecker.java
@@ -1,4 +1,4 @@
-/* Copyright 2011--2017 The Tor Project
+/* Copyright 2011--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web.graphs;
diff --git a/src/main/java/org/torproject/metrics/web/research/ResearchStatsServlet.java b/src/main/java/org/torproject/metrics/web/research/ResearchStatsServlet.java
index ab4b954..c173000 100644
--- a/src/main/java/org/torproject/metrics/web/research/ResearchStatsServlet.java
+++ b/src/main/java/org/torproject/metrics/web/research/ResearchStatsServlet.java
@@ -1,4 +1,4 @@
-/* Copyright 2013--2017 The Tor Project
+/* Copyright 2013--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web.research;
diff --git a/src/main/java/org/torproject/metrics/webstats/Main.java b/src/main/java/org/torproject/metrics/webstats/Main.java
index 1b4072a..18433d2 100644
--- a/src/main/java/org/torproject/metrics/webstats/Main.java
+++ b/src/main/java/org/torproject/metrics/webstats/Main.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.webstats;
diff --git a/src/main/resources/bootstrap-development.sh b/src/main/resources/bootstrap-development.sh
index 28fb975..d301e25 100755
--- a/src/main/resources/bootstrap-development.sh
+++ b/src/main/resources/bootstrap-development.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright 2016--2017 The Tor Project
+# Copyright 2016--2018 The Tor Project
 # See LICENSE for licensing information
 #
 # Use for submodule initialization and checkout.
diff --git a/src/main/sql/clients/init-userstats.sql b/src/main/sql/clients/init-userstats.sql
index 25422a6..733a516 100644
--- a/src/main/sql/clients/init-userstats.sql
+++ b/src/main/sql/clients/init-userstats.sql
@@ -1,4 +1,4 @@
--- Copyright 2013--2017 The Tor Project
+-- Copyright 2013--2018 The Tor Project
 -- See LICENSE for licensing information
 
 -- Use enum types for dimensions that may only change if we write new code
diff --git a/src/main/sql/ipv6servers/init-ipv6servers.sql b/src/main/sql/ipv6servers/init-ipv6servers.sql
index 6a72167..a5d56f3 100644
--- a/src/main/sql/ipv6servers/init-ipv6servers.sql
+++ b/src/main/sql/ipv6servers/init-ipv6servers.sql
@@ -1,4 +1,4 @@
--- Copyright 2017 The Tor Project
+-- Copyright 2017--2018 The Tor Project
 -- See LICENSE for licensing information
 
 -- Table of all relevant parts contained in relay or bridge server descriptors.
diff --git a/src/main/sql/legacy/tordir.sql b/src/main/sql/legacy/tordir.sql
index 5a77c92..e0ea651 100644
--- a/src/main/sql/legacy/tordir.sql
+++ b/src/main/sql/legacy/tordir.sql
@@ -1,4 +1,4 @@
--- Copyright 2010, 2017 The Tor Project
+-- Copyright 2010, 2018 The Tor Project
 -- See LICENSE for licensing information
 
 CREATE LANGUAGE plpgsql;
diff --git a/src/main/sql/onionperf/init-onionperf.sql b/src/main/sql/onionperf/init-onionperf.sql
index 466c1d7..eddfe0f 100644
--- a/src/main/sql/onionperf/init-onionperf.sql
+++ b/src/main/sql/onionperf/init-onionperf.sql
@@ -1,4 +1,4 @@
--- Copyright 2017 The Tor Project
+-- Copyright 2017--2018 The Tor Project
 -- See LICENSE for licensing information
 
 CREATE TABLE IF NOT EXISTS measurements (
diff --git a/src/main/sql/webstats/init-webstats.sql b/src/main/sql/webstats/init-webstats.sql
index 5c23176..e44205f 100644
--- a/src/main/sql/webstats/init-webstats.sql
+++ b/src/main/sql/webstats/init-webstats.sql
@@ -1,4 +1,4 @@
--- Copyright 2016--2017 The Tor Project
+-- Copyright 2016--2018 The Tor Project
 -- See LICENSE for licensing information
 
 CREATE TYPE method AS ENUM ('GET', 'HEAD');
diff --git a/src/test/java/org/torproject/metrics/connbidirect/MainTest.java b/src/test/java/org/torproject/metrics/connbidirect/MainTest.java
index c35fe80..0f387a6 100644
--- a/src/test/java/org/torproject/metrics/connbidirect/MainTest.java
+++ b/src/test/java/org/torproject/metrics/connbidirect/MainTest.java
@@ -1,4 +1,4 @@
-/* Copyright 2016--2017 The Tor Project
+/* Copyright 2016--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.connbidirect;
diff --git a/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatusTest.java b/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatusTest.java
index 9069218..aaadcbf 100644
--- a/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatusTest.java
+++ b/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6NetworkStatusTest.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.stats.ipv6servers;
diff --git a/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptorTest.java b/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptorTest.java
index 1842315..7b63c1e 100644
--- a/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptorTest.java
+++ b/src/test/java/org/torproject/metrics/stats/ipv6servers/Ipv6ServerDescriptorTest.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.stats.ipv6servers;
diff --git a/src/test/java/org/torproject/metrics/web/DirectoryListingTest.java b/src/test/java/org/torproject/metrics/web/DirectoryListingTest.java
index 509785e..3bd354f 100644
--- a/src/test/java/org/torproject/metrics/web/DirectoryListingTest.java
+++ b/src/test/java/org/torproject/metrics/web/DirectoryListingTest.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.web;
diff --git a/src/test/java/org/torproject/metrics/webstats/MainTest.java b/src/test/java/org/torproject/metrics/webstats/MainTest.java
index 7b59c54..76268b1 100644
--- a/src/test/java/org/torproject/metrics/webstats/MainTest.java
+++ b/src/test/java/org/torproject/metrics/webstats/MainTest.java
@@ -1,4 +1,4 @@
-/* Copyright 2017 The Tor Project
+/* Copyright 2017--2018 The Tor Project
  * See LICENSE for licensing information */
 
 package org.torproject.metrics.webstats;
diff --git a/src/test/sql/ipv6servers/test-ipv6servers.sql b/src/test/sql/ipv6servers/test-ipv6servers.sql
index 7e5ca2e..797cfd0 100644
--- a/src/test/sql/ipv6servers/test-ipv6servers.sql
+++ b/src/test/sql/ipv6servers/test-ipv6servers.sql
@@ -1,4 +1,4 @@
--- Copyright 2017 The Tor Project
+-- Copyright 2017--2018 The Tor Project
 -- See LICENSE for licensing information
 
 -- Hint: You'll need pgTAP in order to run these tests!
diff --git a/src/test/sql/userstats/test-userstats.sql b/src/test/sql/userstats/test-userstats.sql
index 299f4ab..405bf51 100644
--- a/src/test/sql/userstats/test-userstats.sql
+++ b/src/test/sql/userstats/test-userstats.sql
@@ -1,4 +1,4 @@
--- Copyright 2013--2017 The Tor Project
+-- Copyright 2013--2018 The Tor Project
 -- See LICENSE for licensing information
 
 -- Hint: You'll need pgTAP in order to run these tests!
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                     
                        
                    
                        
                            
                                
                            
                            [metrics-web/release] Update news.json to version 218 of doc/MetricsTimeline.
                        
                        
by karsten@torproject.org 30 May '18
                    by karsten@torproject.org 30 May '18
30 May '18
                    
                        commit 41b6bcfa4656d54a769b63f87b230cf36a8e7ce1
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date:   Thu Jan 18 12:03:44 2018 +0100
    Update news.json to version 218 of doc/MetricsTimeline.
---
 src/main/resources/web/json/news.json | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
diff --git a/src/main/resources/web/json/news.json b/src/main/resources/web/json/news.json
index 8f81364..8da74f9 100644
--- a/src/main/resources/web/json/news.json
+++ b/src/main/resources/web/json/news.json
@@ -2683,6 +2683,14 @@
     ]
   },
   {
+    "start": "2017-12-12",
+    "end": "2018-01-18",
+    "protocols": [
+      "meek"
+    ],
+    "description": "Outage of the <a href=\"https://atlas.torproject.org/#details/C20658946DD706A7A2181159A1A04CD838570…">meek.bamsoftware.com</a> (unthrottled for public use), <a href=\"https://atlas.torproject.org/#details/AA033EEB61601B2B7312D89B62AAA23DC3ED8…">meek.bamsoftware.com:7443</a> (former meek-azure, now unused), and <a href=\"https://atlas.torproject.org/#details/D36B0328969EC57AB3085A4470882D99A09C0…">gaeuploader.meek.bamsoftware.com</a> (used by <a href=\"https://github.com/katherinelitor/GAEuploader\">GAEuploader</a>) bridges."
+  },
+  {
     "start": "2017-12-05",
     "end": "2017-12-15",
     "places": [
@@ -2746,6 +2754,13 @@
     ]
   },
   {
+    "start": "2018-01-16",
+    "description": "Tor 0.3.2.9 reaches deb.torproject.org.",
+    "links": [
+      "<a href=\"https://metrics.torproject.org/versions.html?start=2017-12-01&end=2018-03-0…">relay versions graph</a>"
+    ]
+  },
+  {
     "start": "2016-02-24",
     "places": [
       "tm"
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0