code: @NotNull
  	public ByteBuf takeAtMost(int size) {
  		assert hasRemaining();
  		ByteBuf buf = bufs[first];
  		if (size >= buf.readRemaining()) {
  			first = next(first);
  			return buf;
  		}
  		ByteBuf result = buf.slice(size);
  		buf.moveHead(size);
  		return result;
  	}
docs: Creates and returns a {@link io.datakernel.bytebuf.ByteBuf.ByteBufSlice}
  which contains {@code size} bytes from queue's first ByteBuf if the
  latter contains too many bytes.
  <p>
  Otherwise creates and returns a ByteBuf which contains all
  bytes from the first ByteBuf in the queue. Then {@code first}
  index is increased by 1 or set to the value 0 if it has run
  a full circle of the queue.
  
  @param size number of bytes to be returned
  @return ByteBuf with result bytes