code: protected static <R extends AddressSection, S extends AddressSegment> R increment(
  			R section,
  			long increment,
  			BigInteger bigIncrement,
  			AddressCreator<?, R, ?, S> addrCreator, 
  			Supplier<R> lowerProducer,
  			Supplier<R> upperProducer,
  			Integer prefixLength) {
  		if(!section.isMultiple()) {
  			return add(section, bigIncrement, addrCreator, prefixLength);
  		}
  		boolean isDecrement = increment <= 0;
  		if(isDecrement) {
  			return add(lowerProducer.get(), bigIncrement, addrCreator, prefixLength);
  		}
  		BigInteger count = section.getCount();
  		BigInteger incrementPlus1 = bigIncrement.add(BigInteger.ONE);
  		int countCompare = count.compareTo(incrementPlus1);
  		if(countCompare <= 0) {
  			if(countCompare == 0) {
  				return upperProducer.get();
  			}
  			return add(upperProducer.get(), incrementPlus1.subtract(count), addrCreator, prefixLength);
  		}
  		return incrementRange(section, increment, addrCreator, lowerProducer, prefixLength);
  	}
docs: this does not handle overflow, overflow should be checked before calling this