// Path: src/main/java/util/RangeSet.java
// public class Range implements Comparable<Range> {
// 	public final int low; /* inclusive */
// 	public final int high; /* exclusive */
// 		
// 	public Range(int low, int high) {
// 		if (low < rangesLowerBound || high > rangesUpperBound + 1) {
// 			throw new IllegalArgumentException("Range exceeds bounds.");
// 		}
// 		if (low >= high) {
// 			throw new IllegalArgumentException("Low must less than high.");
// 		}
// 		this.low = low;
// 		this.high = high;
// 	}
// 
// 	public Range(int num) {
// 		if (num < rangesLowerBound || num > rangesUpperBound + 1) {
// 			throw new IllegalArgumentException("Range exceeds bounds.");
// 		}
// 		this.low = num;
// 		this.high = num + 1;
// 	}
// 		
// 	public boolean overlaps(Range r) {
// 		return low < r.high && r.low < high;
// 	}
// 		
// 	public boolean overlapsAdjacent(Range r) {
// 		return low <= r.high && r.low <= high;
// 	}
// 		
// 		
// 		
// 	public Range merge(Range r) {
// 		int newLow = 0;
// 		int newHigh = 0;
// 		if (!overlapsAdjacent(r)) {
// 			throw new RuntimeException("Cannot merge non-overlapping ranges");
// 		}
// 			
// 		if (low <= r.low) {
// 			newLow = low;
// 		} else {
// 			newLow = r.low;
// 		}
// 			
// 		if (high >= r.high) {
// 			newHigh = high;
// 		} else {
// 			newHigh = r.high;
// 		}
// 			
// 		return new Range(newLow, newHigh);
// 	}
// 		
// 	public RangeSet complement() {
// 		if (low == rangesLowerBound && high == rangesUpperBound + 1) {
// 			/* empty range set */
// 			return new RangeSet(rangesLowerBound, rangesUpperBound);
// 		}
// 		if (low == rangesLowerBound) {
// 			/* only one range */
// 			Range rComplement = new Range(high, rangesUpperBound + 1);
// 			RangeSet rs = new RangeSet(rangesLowerBound, rangesUpperBound);
// 			rs.union(rComplement);
// 			return rs;
// 		}
// 		if (high == rangesUpperBound + 1) {
// 			/* only one range */
// 			Range rComplement = new Range(rangesLowerBound, low);
// 			RangeSet rs = new RangeSet(rangesLowerBound, rangesUpperBound);
// 			rs.union(rComplement);
// 			return rs;
// 		}
// 			
// 		Range r1 = new Range(rangesLowerBound, low);
// 		Range r2 = new Range(high, rangesUpperBound + 1);
// 		/* TODO there might be a better way to do this... */
// 		RangeSet comp1 = new RangeSet(rangesLowerBound, rangesUpperBound);
// 		comp1.union(r1);
// 		RangeSet comp2 = new RangeSet(rangesLowerBound, rangesUpperBound);
// 		comp2.union(r2);
// 		comp1.union(comp2);
// 		return comp1;
// 	}
// 
// 	@Override
// 	public int compareTo(Range r) {
// 		if (low != r.low) {
// 			return low - r.low;
// 		}
// 		return high - r.high;
// 	}
// 		
// 	@Override
// 	public String toString() {
// 		return "[" + low + ", " + (high - 1) + "]";
// 	}
// 		
// 	@Override
// 	public boolean equals(Object o) {
// 		if (o == null) {
// 			return false;
// 		}
// 	    if (o == this) {
// 	    	return true;
// 	    }
// 	    if (!(o instanceof Range)) {
// 	    	return false;
// 	    }
// 		    
// 	    Range r = (Range) o;
// 	    return low == r.low && high == r.high;
// 	}
// 		
// 	@Override
// 	public int hashCode() {
// 		return 5 * low + 7 * high;
// 	}
// }


import java.util.*;
import util.RangeSet.Range;
				return false;
			}
		    if (o == this) {
		    	return true;
		    }
		    if (!(o instanceof Range)) {
		    	return false;
		    }
		    
		    Range r = (Range) o;
		    return low == r.low && high == r.high;
		}
		
		@Override
		public int hashCode() {
			return 5 * low + 7 * high;
		}
	}

	
	public static void main(String [] args) {
		RangeSet rs1 =  new RangeSet(0, 256);
		Range r11 = rs1.createRange(0, 10);
		rs1.union(r11);
		Range r12 = rs1.createRange(20, 30);
		rs1.union(r12);
		Range r13 = rs1.createRange(40, 50);
		rs1.union(r13);
		
		RangeSet rs2 =  new RangeSet(0, 256);
// Path: src/main/java/util/RangeSet.java
// public class Range implements Comparable<Range> {
// 	public final int low; /* inclusive */
// 	public final int high; /* exclusive */
// 		
// 	public Range(int low, int high) {
// 		if (low < rangesLowerBound || high > rangesUpperBound + 1) {
// 			throw new IllegalArgumentException("Range exceeds bounds.");
// 		}
// 		if (low >= high) {
// 			throw new IllegalArgumentException("Low must less than high.");
// 		}
// 		this.low = low;
// 		this.high = high;
// 	}
// 
// 	public Range(int num) {
// 		if (num < rangesLowerBound || num > rangesUpperBound + 1) {
// 			throw new IllegalArgumentException("Range exceeds bounds.");
// 		}
// 		this.low = num;
// 		this.high = num + 1;
// 	}
// 		
// 	public boolean overlaps(Range r) {
// 		return low < r.high && r.low < high;
// 	}
// 		
// 	public boolean overlapsAdjacent(Range r) {
// 		return low <= r.high && r.low <= high;
// 	}
// 		
// 		
// 		
// 	public Range merge(Range r) {
// 		int newLow = 0;
// 		int newHigh = 0;
// 		if (!overlapsAdjacent(r)) {
// 			throw new RuntimeException("Cannot merge non-overlapping ranges");
// 		}
// 			
// 		if (low <= r.low) {
// 			newLow = low;
// 		} else {
// 			newLow = r.low;
// 		}
// 			
// 		if (high >= r.high) {
// 			newHigh = high;
// 		} else {
// 			newHigh = r.high;
// 		}
// 			
// 		return new Range(newLow, newHigh);
// 	}
// 		
// 	public RangeSet complement() {
// 		if (low == rangesLowerBound && high == rangesUpperBound + 1) {
// 			/* empty range set */
// 			return new RangeSet(rangesLowerBound, rangesUpperBound);
// 		}
// 		if (low == rangesLowerBound) {
// 			/* only one range */
// 			Range rComplement = new Range(high, rangesUpperBound + 1);
// 			RangeSet rs = new RangeSet(rangesLowerBound, rangesUpperBound);
// 			rs.union(rComplement);
// 			return rs;
// 		}
// 		if (high == rangesUpperBound + 1) {
// 			/* only one range */
// 			Range rComplement = new Range(rangesLowerBound, low);
// 			RangeSet rs = new RangeSet(rangesLowerBound, rangesUpperBound);
// 			rs.union(rComplement);
// 			return rs;
// 		}
// 			
// 		Range r1 = new Range(rangesLowerBound, low);
// 		Range r2 = new Range(high, rangesUpperBound + 1);
// 		/* TODO there might be a better way to do this... */
// 		RangeSet comp1 = new RangeSet(rangesLowerBound, rangesUpperBound);
// 		comp1.union(r1);
// 		RangeSet comp2 = new RangeSet(rangesLowerBound, rangesUpperBound);
// 		comp2.union(r2);
// 		comp1.union(comp2);
// 		return comp1;
// 	}
// 
// 	@Override
// 	public int compareTo(Range r) {
// 		if (low != r.low) {
// 			return low - r.low;
// 		}
// 		return high - r.high;
// 	}
// 		
// 	@Override
// 	public String toString() {
// 		return "[" + low + ", " + (high - 1) + "]";
// 	}
// 		
// 	@Override
// 	public boolean equals(Object o) {
// 		if (o == null) {
// 			return false;
// 		}
// 	    if (o == this) {
// 	    	return true;
// 	    }
// 	    if (!(o instanceof Range)) {
// 	    	return false;
// 	    }
// 		    
// 	    Range r = (Range) o;
// 	    return low == r.low && high == r.high;
// 	}
// 		
// 	@Override
// 	public int hashCode() {
// 		return 5 * low + 7 * high;
// 	}
// }


// Path: src/main/java/util/RangeSet.java
import java.util.*;
import util.RangeSet.Range;

				return false;
			}
		    if (o == this) {
		    	return true;
		    }
		    if (!(o instanceof Range)) {
		    	return false;
		    }
		    
		    Range r = (Range) o;
		    return low == r.low && high == r.high;
		}
		
		@Override
		public int hashCode() {
			return 5 * low + 7 * high;
		}
	}

	
	public static void main(String [] args) {
		RangeSet rs1 =  new RangeSet(0, 256);
		Range r11 = rs1.createRange(0, 10);
		rs1.union(r11);
		Range r12 = rs1.createRange(20, 30);
		rs1.union(r12);
		Range r13 = rs1.createRange(40, 50);
		rs1.union(r13);
		
		RangeSet rs2 =  new RangeSet(0, 256);
		Range r21 = rs2.createRange(10, 20);