// Path: src/main/java/tech/pinto/time/PeriodicRange.java
// public final class PeriodicRange<P extends Period<P>> {
// 	
// 	private final Periodicity<P> periodicity;
// 	private final P startInclusive;
// 	private final P endInclusive;
// 	private final String id = ID.getId();
// 
// 	PeriodicRange(Periodicity<P> periodcity, P startInclusive, P endInclusive) {
// 		if(endInclusive.isBefore(startInclusive)) {
// 			throw new IllegalArgumentException("Range end must be >= range start");
// 		}
// 		this.periodicity = periodcity;
// 		this.startInclusive = startInclusive;
// 		this.endInclusive = endInclusive;
// 	}
// 	
// 	public String getId() {
// 		return id;
// 	}
// 	
// 	public List<P> values() {
// 		List<P> l = new ArrayList<>();
// 		P p = start();
// 		do {
// 			l.add(p);
// 			p = (P) p.next();
// 		} while(!p.isAfter(end()));
// 		return l;
// 	}
// 	
// 	public List<LocalDate> dates() {
// 		List<LocalDate> l = new ArrayList<>();
// 		P p = start();
// 		do {
// 			l.add(p.endDate());
// 			p = p.next();
// 		} while(!p.isAfter(end()));
// 		return l;
// 	}
// 
// 	public long[] datesInMillis() {
// 		var zone = ZoneId.of("GMT");
// 		long[] d = new long[(int)size()];
// 		int i = 0;
// 		P p = start();
// 		do {
// 			d[i++] = p.endDate().atStartOfDay(zone).toInstant().toEpochMilli();
// 			p = p.next();
// 		} while(!p.isAfter(end()));
// 		return d;
// 	}
// 	
// 	public long size() {
// 		return periodicity.distance(startInclusive, endInclusive) + 1;
// 	}
// 	
// 	public long indexOf(P period) {
// 		return periodicity.distance(startInclusive, (P) period);
// 	}
// 
// 	public long indexOf(LocalDate d) {
// 		return periodicity.distance(startInclusive, periodicity.from(d));
// 	}
// 
// 	public P start() {
// 		return startInclusive;
// 	}
// 
// 	public P end() {
// 		return endInclusive;
// 	}
// 	
// 	public PeriodicRange<P> expand(long offset) {
// 		P start = periodicity.offset(Math.min(offset, 0), start());
// 		P end = periodicity.offset(Math.max(offset, 0), end());
// 		return periodicity.range(start, end);
// 	}
// 
// 	public Periodicity<P> periodicity() {
// 		return periodicity;
// 	}
// 	
// 	public Map<String,String> asStringMap() {
// 		return new ImmutableMap.Builder<String, String>()
// 				.put("start", start().endDate().toString())
// 				.put("end", end().endDate().toString())
// 				.put("freq", periodicity().code()).build();	
// 	}
// 	
// 	@Override
// 	public boolean equals(Object obj) {
//         if (obj == null) return false;
//         if (getClass() != obj.getClass()) return false;
//         final PeriodicRange<?> other = (PeriodicRange<?>) obj;
//         return Objects.equals(this.periodicity, other.periodicity)
//             && Objects.equals(this.startInclusive, other.startInclusive)
//             && Objects.equals(this.endInclusive, other.endInclusive);
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		return Joiner.on(":").join(periodicity.code(),start().toString(),end().toString());
// 	}
// 	
// 	@Override
// 	public int hashCode() {
// 		return Objects.hash(periodicity.code(),startInclusive.hashCode(),endInclusive.hashCode());
// 	}
// }
// 
// Path: src/main/java/tech/pinto/Pinto.java
// public static class Stack extends LinkedList<Column<?>> {
// 	private static final long serialVersionUID = 1L;
// 
// 	public Stack() {
// 		super();
// 	}
// 
// 	public Stack(Collection<? extends Column<?>> c) {
// 		super(c);
// 	}
// 		
// }


import static java.util.stream.Collectors.toList;
import java.text.NumberFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Collectors;
import java.util.stream.DoubleStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import com.google.common.collect.ImmutableMap;
import com.jakewharton.fliptables.FlipTable;
import tech.pinto.time.PeriodicRange;
import tech.pinto.Pinto.Stack;

package tech.pinto;





public class Table {

	private final LinkedList<Level> levels = new LinkedList<>();
	private Optional<String> status = Optional.empty();
	private Optional<PeriodicRange<?>> range = Optional.empty();

// Path: src/main/java/tech/pinto/time/PeriodicRange.java
// public final class PeriodicRange<P extends Period<P>> {
// 	
// 	private final Periodicity<P> periodicity;
// 	private final P startInclusive;
// 	private final P endInclusive;
// 	private final String id = ID.getId();
// 
// 	PeriodicRange(Periodicity<P> periodcity, P startInclusive, P endInclusive) {
// 		if(endInclusive.isBefore(startInclusive)) {
// 			throw new IllegalArgumentException("Range end must be >= range start");
// 		}
// 		this.periodicity = periodcity;
// 		this.startInclusive = startInclusive;
// 		this.endInclusive = endInclusive;
// 	}
// 	
// 	public String getId() {
// 		return id;
// 	}
// 	
// 	public List<P> values() {
// 		List<P> l = new ArrayList<>();
// 		P p = start();
// 		do {
// 			l.add(p);
// 			p = (P) p.next();
// 		} while(!p.isAfter(end()));
// 		return l;
// 	}
// 	
// 	public List<LocalDate> dates() {
// 		List<LocalDate> l = new ArrayList<>();
// 		P p = start();
// 		do {
// 			l.add(p.endDate());
// 			p = p.next();
// 		} while(!p.isAfter(end()));
// 		return l;
// 	}
// 
// 	public long[] datesInMillis() {
// 		var zone = ZoneId.of("GMT");
// 		long[] d = new long[(int)size()];
// 		int i = 0;
// 		P p = start();
// 		do {
// 			d[i++] = p.endDate().atStartOfDay(zone).toInstant().toEpochMilli();
// 			p = p.next();
// 		} while(!p.isAfter(end()));
// 		return d;
// 	}
// 	
// 	public long size() {
// 		return periodicity.distance(startInclusive, endInclusive) + 1;
// 	}
// 	
// 	public long indexOf(P period) {
// 		return periodicity.distance(startInclusive, (P) period);
// 	}
// 
// 	public long indexOf(LocalDate d) {
// 		return periodicity.distance(startInclusive, periodicity.from(d));
// 	}
// 
// 	public P start() {
// 		return startInclusive;
// 	}
// 
// 	public P end() {
// 		return endInclusive;
// 	}
// 	
// 	public PeriodicRange<P> expand(long offset) {
// 		P start = periodicity.offset(Math.min(offset, 0), start());
// 		P end = periodicity.offset(Math.max(offset, 0), end());
// 		return periodicity.range(start, end);
// 	}
// 
// 	public Periodicity<P> periodicity() {
// 		return periodicity;
// 	}
// 	
// 	public Map<String,String> asStringMap() {
// 		return new ImmutableMap.Builder<String, String>()
// 				.put("start", start().endDate().toString())
// 				.put("end", end().endDate().toString())
// 				.put("freq", periodicity().code()).build();	
// 	}
// 	
// 	@Override
// 	public boolean equals(Object obj) {
//         if (obj == null) return false;
//         if (getClass() != obj.getClass()) return false;
//         final PeriodicRange<?> other = (PeriodicRange<?>) obj;
//         return Objects.equals(this.periodicity, other.periodicity)
//             && Objects.equals(this.startInclusive, other.startInclusive)
//             && Objects.equals(this.endInclusive, other.endInclusive);
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		return Joiner.on(":").join(periodicity.code(),start().toString(),end().toString());
// 	}
// 	
// 	@Override
// 	public int hashCode() {
// 		return Objects.hash(periodicity.code(),startInclusive.hashCode(),endInclusive.hashCode());
// 	}
// }
// 
// Path: src/main/java/tech/pinto/Pinto.java
// public static class Stack extends LinkedList<Column<?>> {
// 	private static final long serialVersionUID = 1L;
// 
// 	public Stack() {
// 		super();
// 	}
// 
// 	public Stack(Collection<? extends Column<?>> c) {
// 		super(c);
// 	}
// 		
// }


// Path: src/main/java/tech/pinto/Table.java
import static java.util.stream.Collectors.toList;
import java.text.NumberFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Collectors;
import java.util.stream.DoubleStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import com.google.common.collect.ImmutableMap;
import com.jakewharton.fliptables.FlipTable;
import tech.pinto.time.PeriodicRange;
import tech.pinto.Pinto.Stack;

package tech.pinto;





public class Table {

	private final LinkedList<Level> levels = new LinkedList<>();
	private Optional<String> status = Optional.empty();
	private Optional<PeriodicRange<?>> range = Optional.empty();

	private Optional<Stack> flattenedStack = Optional.empty();
