docs: function decodeArray( bundle, database, op ) {
  	var i=0, type=0, ln=0, len=0, nArr = [], vArr;
  	op = op & 0xFF;
  
  	if (op === 0x6E) { // PRIM_BULK_PLAIN
  
  		// Decode and return plain bulk array
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Plain Bulk Plain");
  		return decodePlainBulkArray( bundle, database );
  
  	} else if (op === 0x6F) { // PRIM_SHORT
  
  		// Collect up to 255 primitives
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Prim Short");
  		len = bundle.u8[bundle.i8++];
  		nArr[len-1] = null;
  		for (i=0; i<len; ++i)
  			nArr[i] = decodePrimitive( bundle, database );
  
  		// Return
  		return DEBUG
  			? __debugMeta( nArr, 'array.primitive.short', {} )
  			: nArr;
  
  	} else if (op === 0x7E) { // EMPTY
  
  		// Return empty array
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Empty");
  		return DEBUG
  			? __debugMeta( [], 'array.empty', {} )
  			: [];
  
  	} else if (op === 0x7F) { // PRIM_CHUNK_END
  		throw new Errors.AssertError('Encountered PRIM_CHUNK_END outside of chunked array!');
  
  	} else if ((op & 0xE0) === 0x00) { // NUM_DWS
  
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Numeric DWS");
  		ln = op & 0x01;
  		type = (op >> 1) & 0x0F;
  		len = ln ? bundle.u32[bundle.i32++] : bundle.u16[bundle.i16++];
  
  		// Read from and encode to
  		// console.log("Reading NUM_DWS len="+len+", ln="+ln);
  		vArr = bundle.readTypedArray( NUMTYPE_DOWNSCALE.TO[type] , len );
  		var tArr = new NUMTYPE_CLASS[ NUMTYPE_DOWNSCALE.FROM[type] ]( vArr );
  
  		// Return
  		return DEBUG
  			? __debugMeta( tArr, 'array.numeric.downscaled', { 'type': type } )
  			: tArr;
  
  	} else if ((op & 0xF0) === 0x20) { // NUM_DELTA_INT
  
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Numeric Delta Int");
  		ln = op & 0x01;
  		type = (op >> 1) & 0x07;
  		len = ln ? bundle.u32[bundle.i32++] : bundle.u16[bundle.i16++];
  
  		// Return delta-encoded integers
  		return decodeDeltaArrayInt( bundle, database, len, type );
  
  	} else if ((op & 0xF0) === 0x30) { // NUM_DELTA_FLOAT
  
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Numeric Delta Float");
  		ln = op & 0x01;
  		type = (op >> 1) & 0x07;
  		len = ln ? bundle.u32[bundle.i32++] : bundle.u16[bundle.i16++];
  
  		// Return pivot-encoded floats
  		return decodePivotArrayFloat( bundle, database, len, type );
  
  	} else if ((op & 0xF0) === 0x40) { // NUM_REPEATED
  
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Numeric Repeated");
  		ln = op & 0x01;
  		type = (op >> 1) & 0x07;
  		len = ln ? bundle.u32[bundle.i32++] : bundle.u16[bundle.i16++];
  
  		// Repeat value
  		switch (type) {
  			case 0: vArr = bundle.u8[bundle.i8++]; break;
  			case 1: vArr = bundle.s8[bundle.i8++]; break;
  			case 2: vArr = bundle.u16[bundle.i16++]; break;
  			case 3: vArr = bundle.s16[bundle.i16++]; break;
  			case 4: vArr = bundle.u32[bundle.i32++]; break;
  			case 5: vArr = bundle.s32[bundle.i32++]; break;
  			case 6: vArr = bundle.f32[bundle.i32++]; break;
  			case 7: vArr = bundle.f64[bundle.i64++]; break;
  		}
  		var tArr = new NUMTYPE_CLASS[ type ]( len );
  		// tArr.fill(vArr);
  		for (i=0; i<len; ++i) tArr[i]=vArr;
  
  		// Return
  		return DEBUG
  			? __debugMeta( tArr, 'array.numeric.repeated', { 'type': type } )
  			: tArr;
  
  	} else if ((op & 0xF0) === 0x50) { // NUM_RAW
  
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Numeric Raw");
  		ln = op & 0x01;
  		type = (op >> 1) & 0x07;
  		len = ln ? bundle.u32[bundle.i32++] : bundle.u16[bundle.i16++];
  
  		// Read raw array
  		// console.log("Reading NUM_RAW len="+len+", ln="+ln);
  		nArr = bundle.readTypedArray( type , len );
  
  		// Return
  		return DEBUG
  			? __debugMeta( nArr, 'array.numeric.raw', { 'type': type } )
  			: nArr;
  
  	} else if ((op & 0xF8) === 0x60) { // NUM_SHORT
  
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Numeric Short");
  		type = op & 0x07;
  		len = bundle.u8[bundle.i8++];
  
  		// Read raw array
  		// console.log("Reading NUM_DWS len="+len+", ln="+ln);
    		nArr = bundle.readTypedArray( type , len );
  
  		// Return
  		return DEBUG
  			? __debugMeta( nArr, 'array.numeric.short', { 'type': type } )
  			: nArr;
  
  	} else if ((op & 0xFE) === 0x68) { // PRIM_REPEATED
  
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Prim Repeated");
  		ln = op & 0x01;
  		len = ln ? bundle.u32[bundle.i32++] : bundle.u16[bundle.i16++];
  
  		// Repeat value
  		vArr = decodePrimitive( bundle, database );
  		nArr[len-1] = null;
  		// nArr.fill( vArr );
  		for (i=0; i<len; i++) nArr[i]=vArr;
  
  		// Return
  		return DEBUG
  			? __debugMeta( nArr, 'array.primitive.repeated', { 'type': type } )
  			: nArr;
  
  
  	} else if ((op & 0xFE) === 0x6A) { // PRIM_RAW
  
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Prim Raw");
  		ln = op & 0x01;
  		len = ln ? bundle.u32[bundle.i32++] : bundle.u16[bundle.i16++];
  
  		// Compile primitives
  		nArr[len-1] = null;
  		for (i=0; i<len; ++i)
  			nArr[i] = decodePrimitive( bundle, database );
  
  		// Return
  		return DEBUG
  			? __debugMeta( nArr, 'array.primitive.raw', {} )
  			: nArr;
  
  	} else if ((op & 0xFC) === 0x78) { // PRIM_CHUNK
  
  		// Get length and numeric flag
  		ln = op & 0x01;
  		type = (op >> 1) & 0x01;
  		len = ln ? bundle.u32[bundle.i32++] : bundle.u16[bundle.i16++];
  
  		// Return chunked array
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Prim Chunk");
  		return decodeChunkedArray( bundle, database, len, type );
  
  	} else if ((op & 0xFE) === 0x7C) { // PRIM_BULK_KNOWN
  
  		// console.log("<<< @"+(bundle.i8-bundle.ofs8)+" Prim Bulk Known");
  		ln = op & 0x01;
  		len = ln ? bundle.u32[bundle.i32++] : bundle.u16[bundle.i16++];
  
  		// Decode and return primitive bulk array
  		return decodeKnownBulkArray( bundle, database, len );
  
  	} else {
  		throw new Errors.AssertError('Unknown array op-code 0x'+op.toString(16)+' at offset @'+(bundle.i8 - bundle.ofs8)+'!');
  
  	}
  }