function parseSubsequence( raw, str, shape, strict ) {
	var s = seq2multislice( str, shape, true );
	if ( s.code ) {
		if ( s.code === 'ERR_SLICE_INVALID_INCREMENT' ) {
			throw new Error( format( 'invalid operation. A subsequence increment must be a non-zero integer. Value: `%s`.', raw ) );
		}
		if ( s.code === 'ERR_SLICE_INVALID_ELLIPSIS' ) {
			throw new Error( format( 'invalid operation. A subsequence may only include a single ellipsis. Value: `%s`.', raw ) );
		}
		if ( s.code === 'ERR_SLICE_INVALID_SUBSEQUENCE' ) {
			throw new Error( format( 'invalid operation. Unsupported slice operation. Value: `%s`.', raw ) );
		}
		if ( s.code === 'ERR_SLICE_TOO_MANY_DIMENSIONS' ) {
			throw new RangeError( format( 'invalid operation. Number of slice dimensions does not match the number of array dimensions. Array shape: (%s). Slice dimensions: %u.', shape.join( ',' ), replace( str, /\.\.\.,/, '' ).split( ',' ).length ) );
		}
		// NOTE: the following error check must come last due to fall-through when in non-strict mode...
		if ( s.code === 'ERR_SLICE_OUT_OF_BOUNDS' ) {
			if ( strict ) {
				throw new RangeError( format( 'invalid operation. Slice exceeds array bounds. Array shape: (%s).', shape.join( ',' ) ) );
			}
			// Repeat parsing, this time allowing for out-of-bounds slices:
			s = seq2multislice( str, shape, false );
		}
	}
	return s;
}
Parses a subsequence string.

@private
@param {string} raw - original unprocessed input string
@param {string} str - subsequence string
@param {NonNegativeIntegerArray} shape - array dimensions
@param {boolean} strict - boolean indicating whether to enforce strict bounds checking
@throws {Error} invalid slice operation
@throws {RangeError} slice exceeds array bounds
@returns {MultiSlice} MultiSlice object

@example
var s = parseSubsequence( ' :10 ', ':10', [ 10 ], false );
// returns <MultiSlice>