docs: public Packer loadBytes(byte[] in) throws InvalidInputDataException {
  		// TODO: Improve input data parsing exceptions
  		int inlen = in.length;
  		int flags = 0;
  		if (useFlagFooter) {
  			flags = (int) in[--inlen];
  		} else {
  			if (useCompress)
  				flags |= FLAG_COMPRESS;
  			if (aesKey != null) {
  				flags |= FLAG_AES;
  				switch (aesTypeIV) { // useAES + randomIV
  					case RANDOM_IV:
  						flags |= FLAG_RANDOM_IV;
  						break;
  					case RANDOM_INT_IV:
  						flags |= FLAG_RANDOM_INT_IV;
  						break;
  				}
  			}
  			if (useCRC)
  				flags |= FLAG_CRC;
  			if (mdHash != null)
  				flags |= FLAG_HASH;
  			if (hMac != null)
  				flags |= FLAG_HMAC;
  		}
  		if (checkFlag(flags, FLAG_HMAC)) {
  			if (hMac == null)
  				throw new InvalidInputDataException("Invalid Flags (HMAC) or hmac not initialized");
  			final int hmacLen = hMac.getMacLength();
  			byte[] mdBuf = hmac(in, 0, inlen - hmacLen);
  			boolean hmacOK = compareBuffer(in, inlen - hmacLen, mdBuf, 0, hmacLen);
  			if (!hmacOK)
  				throw new InvalidInputDataException("Invalid HMAC");
  			inlen -= hmacLen;
  		}
  		if (checkFlag(flags, FLAG_HASH)) {
  			if (mdHash == null)
  				throw new InvalidInputDataException("Invalid Flags (HASH) or hash not initialized");
  			final int mdLen = mdHash.getDigestLength();
  			byte[] mdBuf = hash(in, 0, inlen - mdLen);
  			boolean hashOK = compareBuffer(in, inlen - mdLen, mdBuf, 0, mdLen);
  			if (!hashOK)
  				throw new InvalidInputDataException("Invalid HASH");
  			inlen -= mdLen;
  		}
  		if (checkFlag(flags, FLAG_CRC)) {
  			if (!useCRC)
  				throw new InvalidInputDataException("Invalid Flags (CRC)");
  			final byte crc = (byte) crc8(in, 0, inlen - 1);
  			final byte crc2 = in[inlen - 1];
  			boolean crcOK = (crc == crc2);
  			if (!crcOK)
  				throw new InvalidInputDataException("Invalid CRC");
  			inlen -= 1;
  		}
  		if (checkFlag(flags, FLAG_RSA)) {
  			if (rsaKeyForDecrypt == null)
  				throw new InvalidInputDataException("Invalid Flags (Crypto) or RSA crypto not initialized");
  			try {
  				in = cryptoAsym(in, 0, inlen, true);
  			} catch (Exception e) {
  				throw new InvalidInputDataException("Invalid RSA Crypto data", e);
  			}
  			inlen = in.length;
  		}
  		if (checkFlag(flags, FLAG_AES)) {
  			if (aesKey == null)
  				throw new InvalidInputDataException("Invalid Flags (Crypto) or AES crypto not initialized");
  			if (checkFlag(flags, FLAG_RANDOM_IV)) {
  				final int ivLen = aesCipherLen;
  				final byte[] ivBuf = new byte[ivLen];
  				System.arraycopy(in, inlen - ivLen, ivBuf, 0, ivLen);
  				initCipherIV(ivBuf, AESTYPEIV.RANDOM_IV);
  				inlen -= ivLen;
  			} else if (checkFlag(flags, FLAG_RANDOM_INT_IV)) {
  				final int ivLen = 4; // Integer length
  				final byte[] ivBuf = new byte[ivLen];
  				System.arraycopy(in, inlen - ivLen, ivBuf, 0, ivLen);
  				try {
  					initCipherIV(generateMdfromBuffer(ivBuf, aesCipherLen), AESTYPEIV.RANDOM_INT_IV);
  				} catch (Exception e) {
  					throw new InvalidInputDataException("Invalid AES Crypto data (RANDOM_INT_IV)", e);
  				}
  				inlen -= ivLen;
  			}
  			try {
  				in = crypto(in, 0, inlen, true);
  			} catch (Exception e) {
  				throw new InvalidInputDataException("Invalid AES Crypto data", e);
  			}
  			inlen = in.length;
  		}
  		if (checkFlag(flags, FLAG_COMPRESS)) {
  			if (!useCompress)
  				throw new InvalidInputDataException("Invalid Flags (Compressed)");
  			try {
  				in = inflate(in, 0, inlen);
  			} catch (DataFormatException e) {
  				throw new InvalidInputDataException("Invalid Compressed data", e);
  			}
  			inlen = in.length;
  		}
  		ensureCapacity(inlen);
  		System.arraycopy(in, 0, buf, 0, inlen);
  		bufPosition = inlen;
  		flip();
  		return this;
  	}