#!/usr/bin/env bash

# samtools_view v0.1.0
# 
# This wrapper script is auto-generated by viash 0.9.0-RC6 and is thus a
# derivative work thereof. This software comes with ABSOLUTELY NO WARRANTY from
# Data Intuitive.
# 
# The component may contain files which fall under a different license. The
# authors of this component should specify the license in the header of such
# files, or include a separate license file detailing the licenses of all included
# files.

set -e

if [ -z "$VIASH_TEMP" ]; then
  VIASH_TEMP=${VIASH_TEMP:-$VIASH_TMPDIR}
  VIASH_TEMP=${VIASH_TEMP:-$VIASH_TEMPDIR}
  VIASH_TEMP=${VIASH_TEMP:-$VIASH_TMP}
  VIASH_TEMP=${VIASH_TEMP:-$TMPDIR}
  VIASH_TEMP=${VIASH_TEMP:-$TMP}
  VIASH_TEMP=${VIASH_TEMP:-$TEMPDIR}
  VIASH_TEMP=${VIASH_TEMP:-$TEMP}
  VIASH_TEMP=${VIASH_TEMP:-/tmp}
fi

# define helper functions
# ViashQuote: put quotes around non flag values
# $1     : unquoted string
# return : possibly quoted string
# examples:
#   ViashQuote --foo      # returns --foo
#   ViashQuote bar        # returns 'bar'
#   Viashquote --foo=bar  # returns --foo='bar'
function ViashQuote {
  if [[ "$1" =~ ^-+[a-zA-Z0-9_\-]+=.+$ ]]; then
    echo "$1" | sed "s#=\(.*\)#='\1'#"
  elif [[ "$1" =~ ^-+[a-zA-Z0-9_\-]+$ ]]; then
    echo "$1"
  else
    echo "'$1'"
  fi
}
# ViashRemoveFlags: Remove leading flag
# $1     : string with a possible leading flag
# return : string without possible leading flag
# examples:
#   ViashRemoveFlags --foo=bar  # returns bar
function ViashRemoveFlags {
  echo "$1" | sed 's/^--*[a-zA-Z0-9_\-]*=//'
}
# ViashSourceDir: return the path of a bash file, following symlinks
# usage   : ViashSourceDir ${BASH_SOURCE[0]}
# $1      : Should always be set to ${BASH_SOURCE[0]}
# returns : The absolute path of the bash file
function ViashSourceDir {
  SOURCE="$1"
  while [ -h "$SOURCE" ]; do
    DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
    SOURCE="$(readlink "$SOURCE")"
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
  done
  cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd
}
# ViashFindTargetDir: return the path of the '.build.yaml' file, following symlinks
# usage   : ViashFindTargetDir 'ScriptPath'
# $1      : The location from where to start the upward search
# returns : The absolute path of the '.build.yaml' file
function ViashFindTargetDir {
  SOURCE="$1"
  while [[ "$SOURCE" != "" && ! -e "$SOURCE/.build.yaml" ]]; do
    SOURCE=${SOURCE%/*}
  done
  echo $SOURCE
}
# see https://en.wikipedia.org/wiki/Syslog#Severity_level
VIASH_LOGCODE_EMERGENCY=0
VIASH_LOGCODE_ALERT=1
VIASH_LOGCODE_CRITICAL=2
VIASH_LOGCODE_ERROR=3
VIASH_LOGCODE_WARNING=4
VIASH_LOGCODE_NOTICE=5
VIASH_LOGCODE_INFO=6
VIASH_LOGCODE_DEBUG=7
VIASH_VERBOSITY=$VIASH_LOGCODE_NOTICE

# ViashLog: Log events depending on the verbosity level
# usage: ViashLog 1 alert Oh no something went wrong!
# $1: required verbosity level
# $2: display tag
# $3+: messages to display
# stdout: Your input, prepended by '[$2] '.
function ViashLog {
  local required_level="$1"
  local display_tag="$2"
  shift 2
  if [ $VIASH_VERBOSITY -ge $required_level ]; then
    >&2 echo "[$display_tag]" "$@"
  fi
}

# ViashEmergency: log events when the system is unstable
# usage: ViashEmergency Oh no something went wrong.
# stdout: Your input, prepended by '[emergency] '.
function ViashEmergency {
  ViashLog $VIASH_LOGCODE_EMERGENCY emergency "$@"
}

# ViashAlert: log events when actions must be taken immediately (e.g. corrupted system database)
# usage: ViashAlert Oh no something went wrong.
# stdout: Your input, prepended by '[alert] '.
function ViashAlert {
  ViashLog $VIASH_LOGCODE_ALERT alert "$@"
}

# ViashCritical: log events when a critical condition occurs
# usage: ViashCritical Oh no something went wrong.
# stdout: Your input, prepended by '[critical] '.
function ViashCritical {
  ViashLog $VIASH_LOGCODE_CRITICAL critical "$@"
}

# ViashError: log events when an error condition occurs
# usage: ViashError Oh no something went wrong.
# stdout: Your input, prepended by '[error] '.
function ViashError {
  ViashLog $VIASH_LOGCODE_ERROR error "$@"
}

# ViashWarning: log potentially abnormal events
# usage: ViashWarning Something may have gone wrong.
# stdout: Your input, prepended by '[warning] '.
function ViashWarning {
  ViashLog $VIASH_LOGCODE_WARNING warning "$@"
}

# ViashNotice: log significant but normal events
# usage: ViashNotice This just happened.
# stdout: Your input, prepended by '[notice] '.
function ViashNotice {
  ViashLog $VIASH_LOGCODE_NOTICE notice "$@"
}

# ViashInfo: log normal events
# usage: ViashInfo This just happened.
# stdout: Your input, prepended by '[info] '.
function ViashInfo {
  ViashLog $VIASH_LOGCODE_INFO info "$@"
}

# ViashDebug: log all events, for debugging purposes
# usage: ViashDebug This just happened.
# stdout: Your input, prepended by '[debug] '.
function ViashDebug {
  ViashLog $VIASH_LOGCODE_DEBUG debug "$@"
}

# find source folder of this component
VIASH_META_RESOURCES_DIR=`ViashSourceDir ${BASH_SOURCE[0]}`

# find the root of the built components & dependencies
VIASH_TARGET_DIR=`ViashFindTargetDir $VIASH_META_RESOURCES_DIR`

# define meta fields
VIASH_META_NAME="samtools_view"
VIASH_META_FUNCTIONALITY_NAME="samtools_view"
VIASH_META_EXECUTABLE="$VIASH_META_RESOURCES_DIR/$VIASH_META_NAME"
VIASH_META_CONFIG="$VIASH_META_RESOURCES_DIR/.config.vsh.yaml"
VIASH_META_TEMP_DIR="$VIASH_TEMP"


# ViashHelp: Display helpful explanation about this executable
function ViashHelp {
  echo "samtools_view v0.1.0"
  echo ""
  echo "Views and converts SAM/BAM/CRAM files."
  echo ""
  echo "Inputs:"
  echo "    --input"
  echo "        type: file, required parameter, file must exist"
  echo "        Input SAM, BAM, or CRAM file."
  echo ""
  echo "    -t, --fai_reference"
  echo "        type: file, file must exist"
  echo "        A tab-delimited FILE. Each line must contain the reference name in the"
  echo "        first column"
  echo "        and the length of the reference in the second column, with one line for"
  echo "        each distinct"
  echo "        reference. Any additional fields beyond the second column are ignored."
  echo "        This file also"
  echo "        defines the order of the reference sequences in sorting. If you run:"
  echo "        \`samtools faidx <ref.fa>',"
  echo "        the resulting index file <ref.fa>.fai can be used as this FILE."
  echo ""
  echo "    -T, --reference"
  echo "        type: file, file must exist"
  echo "        A FASTA format reference FILE, optionally compressed by bgzip and"
  echo "        ideally indexed by samtools faidx."
  echo "        If an index is not present one will be generated for you, if the"
  echo "        reference file is local."
  echo "        If the reference file is not local, but is accessed instead via an"
  echo "        https://, s3:// or other URL,"
  echo "        the index file will need to be supplied by the server alongside the"
  echo "        reference. It is possible to"
  echo "        have the reference and index files in different locations by supplying"
  echo "        both to this option separated"
  echo "        by the string \"##idx##\", for example:"
  echo "        --reference ftp://x.com/ref.fa##idx##ftp://y.com/index.fa.fai"
  echo "        However, note that only the location of the reference will be stored in"
  echo "        the output file header."
  echo "        If this method is used to make CRAM files, the cram reader may not be"
  echo "        able to find the index,"
  echo "        and may not be able to decode the file unless it can get the references"
  echo "        it needs using a different"
  echo "        method."
  echo ""
  echo "    -L, --target_file"
  echo "        type: file, file must exist"
  echo "        Only output alignments overlapping the input BED FILE [null]."
  echo ""
  echo "    --region_file"
  echo "        type: file, file must exist"
  echo "        Use an index and multi-region iterator to only output alignments"
  echo "        overlapping the input BED FILE."
  echo "        Equivalent to --use_index --target_file FILE."
  echo ""
  echo "    -N, --qname_file"
  echo "        type: file, file must exist"
  echo "        Output only alignments with read names listed in FILE. If FILE starts"
  echo "        with ^ then the operation is"
  echo "        negated and only outputs alignment with read groups not listed in FILE."
  echo "        It is not permissible to mix"
  echo "        both the filter-in and filter-out style syntax in the same command."
  echo ""
  echo "    -R, --read_group_file"
  echo "        type: file, file must exist"
  echo "        Output alignments in read groups listed in FILE [null]. If FILE starts"
  echo "        with ^ then the operation is"
  echo "        negated and only outputs alignment with read names not listed in FILE."
  echo "        It is not permissible to mix"
  echo "        both the filter-in and filter-out style syntax in the same command. Note"
  echo "        that records with no RG tag"
  echo "        will also be output when using this option. This behaviour may change in"
  echo "        a future release."
  echo ""
  echo "    -M, --use_index"
  echo "        type: boolean_true"
  echo "        Use the multi-region iterator on the union of a BED file and"
  echo "        command-line region arguments."
  echo "        This avoids re-reading the same regions of files so can sometimes be"
  echo "        much faster. Note this also"
  echo "        removes duplicate sequences. Without this a sequence that overlaps"
  echo "        multiple regions specified on"
  echo "        the command line will be reported multiple times. The usage of a BED"
  echo "        file is optional and its path"
  echo "        has to be preceded by --target_file option."
  echo ""
  echo "Outputs:"
  echo "    -o, --output"
  echo "        type: file, required parameter, output, file must exist"
  echo "        example: output.bam"
  echo "        Output to FILE instead of [stdout]."
  echo ""
  echo "    -b, --bam"
  echo "        type: boolean_true"
  echo "        Output in the BAM format."
  echo ""
  echo "    -C, --cram"
  echo "        type: boolean_true"
  echo "        Output in the CRAM format (requires --reference)."
  echo ""
  echo "    --fast"
  echo "        type: boolean_true"
  echo "        Enable fast compression. This also changes the default output format to"
  echo "        BAM,"
  echo "        but this can be overridden by the explicit format options or using a"
  echo "        filename"
  echo "        with a known suffix."
  echo ""
  echo "    -u, --uncompressed"
  echo "        type: boolean_true"
  echo "        Output uncompressed data. This also changes the default output format to"
  echo "        BAM,"
  echo "        but this can be overridden by the explicit format options or using a"
  echo "        filename"
  echo "        with a known suffix."
  echo "        This option saves time spent on compression/decompression and is thus"
  echo "        preferred"
  echo "        when the output is piped to another samtools command."
  echo ""
  echo "    --with_header"
  echo "        type: boolean_true"
  echo "        Include the header in the output."
  echo ""
  echo "    -H, --header_only"
  echo "        type: boolean_true"
  echo "        Output the header only."
  echo ""
  echo "    --no_header"
  echo "        type: boolean_true"
  echo "        When producing SAM format, output alignment records but not headers."
  echo "        This is the default; the option can be used to reset the effect of"
  echo "        --with_header/--header_only."
  echo ""
  echo "    -c, --count"
  echo "        type: boolean_true"
  echo "        Instead of printing the alignments, only count them and print the total"
  echo "        number."
  echo "        All filter options, such as --require_flags, --excl_flags, and --min_MQ,"
  echo "        are taken"
  echo "        into account. The --unmap option is ignored in this mode."
  echo ""
  echo "    -U, --output_unselected"
  echo "        type: file, file must exist"
  echo "        Write alignments that are not selected by the various filter options to"
  echo "        FILE."
  echo "        When this option is used, all alignments (or all alignments intersecting"
  echo "        the regions"
  echo "        specified) are written to either the output file or this file, but never"
  echo "        both."
  echo ""
  echo "    -p, --unmap"
  echo "        type: boolean_true"
  echo "        Set the UNMAP flag on alignments that are not selected by the filter"
  echo "        options."
  echo "        These alignments are then written to the normal output. This is not"
  echo "        compatible"
  echo "        with --output_unselected."
  echo ""
  echo "    -r, --read_group"
  echo "        type: string"
  echo "        Output alignments in read group STR [null]. Note that records with no RG"
  echo "        tag will also be output"
  echo "        when using this option. This behaviour may change in a future release."
  echo ""
  echo "    -d, --tag"
  echo "        type: string"
  echo "        Only output alignments with tag STR1 and associated value STR2, which"
  echo "        can be a string or an integer"
  echo "        [null]."
  echo "        The value can be omitted, in which case only the tag is considered."
  echo "        Note that this option does not specify a tag type. For example, use"
  echo "        --tag XX:42 to select alignments"
  echo "        with an XX:i:42 field, not --tag XX:i:42."
  echo ""
  echo "    -D, --tag_file"
  echo "        type: file, file must exist"
  echo "        Only output alignments with tag STR and associated values listed in"
  echo "        FILE."
  echo ""
  echo "    -q, --min_MQ"
  echo "        type: integer"
  echo "        default: 0"
  echo "        Skip alignments with MAPQ smaller than INT."
  echo ""
  echo "    -l, --library"
  echo "        type: string"
  echo "        Only output alignments in library STR."
  echo ""
  echo "    -m, --min_qlen"
  echo "        type: integer"
  echo "        default: 0"
  echo "        Only output alignments with number of CIGAR bases consuming query"
  echo "        sequence >= INT."
  echo ""
  echo "    -e, --expr"
  echo "        type: string"
  echo "        Only include alignments that match the filter expression STR. The syntax"
  echo "        for these expressions is"
  echo "        described in the main samtools."
  echo ""
  echo "    -f, --require_flags"
  echo "        type: string"
  echo "        Only output alignments with all bits set in FLAG present in the FLAG"
  echo "        field. FLAG can be specified"
  echo "        in hex by beginning with \`0x' (i.e. /^0x[0-9A-F]+/), in octal by"
  echo "        beginning with \`0' (i.e. /^0[0-7]+/),"
  echo "        as a decimal number not beginning with '0' or as a comma-separated list"
  echo "        of flag names."
  echo ""
  echo "    -F, --excl_flags"
  echo "        type: string"
  echo "        Do not output alignments with any bits set in FLAG present in the FLAG"
  echo "        field. FLAG can be specified"
  echo "        in hex by beginning with \`0x' (i.e. /^0x[0-9A-F]+/), in octal by"
  echo "        beginning with \`0' (i.e. /^0[0-7]+/),"
  echo "        as a decimal number not beginning with '0' or as a comma-separated list"
  echo "        of flag names."
  echo ""
  echo "    -G, --excl_all_flags"
  echo "        type: integer"
  echo "        Do not output alignments with all bits set in INT present in the FLAG"
  echo "        field. This is the opposite of"
  echo "        --require_flags such that --require_flags 12 --exclude_all_flags 12 is"
  echo "        the same as no filtering at all."
  echo "        FLAG can be specified in hex by beginning with \`0x' (i.e."
  echo "        /^0x[0-9A-F]+/), in octal by beginning with \`0'"
  echo "        (i.e. /^0[0-7]+/), as a decimal number not beginning with '0' or as a"
  echo "        comma-separated list of flag names."
  echo ""
  echo "    --rf, --incl_flags"
  echo "        type: string"
  echo "        Only output alignments with any bit set in FLAG present in the FLAG"
  echo "        field. FLAG can be specified in hex"
  echo "        by beginning with \`0x' (i.e. /^0x[0-9A-F]+/), in octal by beginning with"
  echo "        \`0' (i.e. /^0[0-7]+/), as a decimal"
  echo "        number not beginning with '0' or as a comma-separated list of flag"
  echo "        names."
  echo ""
  echo "    -x, --remove_tag"
  echo "        type: string"
  echo "        Read tag(s) to exclude from output (repeatable) [null]. This can be a"
  echo "        single tag or a comma separated list."
  echo "        Alternatively the option itself can be repeated multiple times."
  echo "        If the list starts with a \`^' then it is negated and treated as a"
  echo "        request to remove all tags except those in STR."
  echo "        The list may be empty, so --remove_tag ^ will remove all tags."
  echo "        Note that tags will only be removed from reads that pass filtering."
  echo ""
  echo "    --keep_tag"
  echo "        type: string"
  echo "        This keeps only tags listed in STR and is directly equivalent to"
  echo "        --remove_tag ^STR. Specifying an empty list"
  echo "        will remove all tags. If both --keep_tag and --remove_tag are specified"
  echo "        then --keep_tag has precedence."
  echo "        Note that tags will only be removed from reads that pass filtering."
  echo ""
  echo "    -B, --remove_B"
  echo "        type: boolean_true"
  echo "        Collapse the backward CIGAR operation."
  echo ""
  echo "    --add_flags"
  echo "        type: string"
  echo "        Adds flag(s) to read. FLAG can be specified in hex by beginning with"
  echo "        \`0x' (i.e. /^0x[0-9A-F]+/), in octal"
  echo "        by beginning with \`0' (i.e. /^0[0-7]+/), as a decimal number not"
  echo "        beginning with '0' or as a comma-separated"
  echo "        list of flag names."
  echo ""
  echo "    --remove_flags"
  echo "        type: string"
  echo "        Remove flag(s) from read. FLAG is specified in the same way as with the"
  echo "        --add_flags option."
  echo ""
  echo "    --subsample"
  echo "        type: double"
  echo "        Output only a proportion of the input alignments, as specified by 0.0 <="
  echo "        FLOAT <= 1.0, which gives the fraction"
  echo "        of templates/pairs to be kept. This subsampling acts in the same way on"
  echo "        all of the alignment records in the same"
  echo "        template or read pair, so it never keeps a read but not its mate."
  echo ""
  echo "    --subsample_seed"
  echo "        type: integer"
  echo "        default: 0"
  echo "        Subsampling seed used to influence which subset of reads is kept. When"
  echo "        subsampling data that has previously"
  echo "        been subsampled, be sure to use a different seed value from those used"
  echo "        previously; otherwise more reads will"
  echo "        be retained than expected."
  echo ""
  echo "    -P, --fetch_pairs"
  echo "        type: boolean_true"
  echo "        Retrieve pairs even when the mate is outside of the requested region."
  echo "        Enabling this option also turns on the"
  echo "        multi-region iterator (-M). A region to search must be specified, either"
  echo "        on the command-line, or using the"
  echo "        --target_file option. The input file must be an indexed regular file."
  echo "        This option first scans the requested region, using the RNEXT and PNEXT"
  echo "        fields of the records that have the"
  echo "        PAIRED flag set and pass other filtering options to find where paired"
  echo "        reads are located. These locations are"
  echo "        used to build an expanded region list, and a set of QNAMEs to allow from"
  echo "        the new regions. It will then make"
  echo "        a second pass, collecting all reads from the originally-specified region"
  echo "        list together with reads from additional"
  echo "        locations that match the allowed set of QNAMEs. Any other filtering"
  echo "        options used will be applied to all reads"
  echo "        found during this second pass."
  echo "        As this option links reads using RNEXT and PNEXT, it is important that"
  echo "        these fields are set accurately. Use"
  echo "        'samtools fixmate' to correct them if necessary."
  echo "        Note that this option does not work with the --count,"
  echo "        --output-unselected or --unmap options."
  echo ""
  echo "    -X, --customized_index"
  echo "        type: boolean_true"
  echo "        Include customized index file as a part of arguments. See EXAMPLES"
  echo "        section for sample of usage."
  echo ""
  echo "    -z, --sanitize"
  echo "        type: string"
  echo "        Perform some sanity checks on the state of SAM record fields, fixing up"
  echo "        common mistakes made by aligners."
  echo "        These include soft-clipping alignments when they extend beyond the end"
  echo "        of the reference, marking records as"
  echo "        unmapped when they have reference * or position 0, and ensuring unmapped"
  echo "        alignments have no CIGAR or mapping"
  echo "        quality for unmapped alignments and no MD, NM, CG or SM tags."
  echo "        FLAGs is a comma-separated list of keywords chosen from the following"
  echo "        list."
  echo "        unmap: The UNMAPPED BAM flag. This is set for reads with position <= 0,"
  echo "        reference name \"*\" or reads starting"
  echo "        beyond the end of the reference. Note CIGAR \"*\" is permitted for mapped"
  echo "        data so does not trigger this."
  echo "        pos: Position and reference name fields. These may be cleared when a"
  echo "        sequence is unmapped due to the"
  echo "        coordinates being beyond the end of the reference. Selecting this may"
  echo "        change the sort order of the file,"
  echo "        so it is not a part of the on compound argument."
  echo "        mqual: Mapping quality. This is set to zero for unmapped reads."
  echo "        cigar: Modifies CIGAR fields, either by adding soft-clips for reads that"
  echo "        overlap the end of the reference or"
  echo "               by clearing it for unmapped reads."
  echo "        aux: For unmapped data, some auxiliary fields are meaningless and will"
  echo "        be removed. These include NM, MD, CG and SM."
  echo "        off: Perform no sanity fixing. This is the default"
  echo "        on: Sanitize data in a way that guarantees the same sort order. This is"
  echo "        everything except for pos."
  echo "        all: All sanitizing options, including pos."
  echo ""
  echo "    --no_PG"
  echo "        type: boolean_true"
  echo "        Do not add a @PG line to the header of the output file."
  echo ""
  echo "    --input_fmt_option"
  echo "        type: string"
  echo "        Specify a single input file format option in the form of OPTION or"
  echo "        OPTION=VALUE."
  echo ""
  echo "    -O, --output_fmt"
  echo "        type: string"
  echo "        Specify output format (SAM, BAM, CRAM)."
  echo ""
  echo "    --output_fmt_option"
  echo "        type: string"
  echo "        Specify a single output file format option in the form of OPTION or"
  echo "        OPTION=VALUE."
  echo ""
  echo "    --write_index"
  echo "        type: boolean_true"
  echo "        Automatically index the output files."
}

# initialise variables
VIASH_MODE='run'
VIASH_ENGINE_ID='docker'

######## Helper functions for setting up Docker images for viash ########
# expects: ViashDockerBuild

# ViashDockerInstallationCheck: check whether Docker is installed correctly
#
# examples:
#   ViashDockerInstallationCheck
function ViashDockerInstallationCheck {
  ViashDebug "Checking whether Docker is installed"
  if [ ! command -v docker &> /dev/null ]; then
    ViashCritical "Docker doesn't seem to be installed. See 'https://docs.docker.com/get-docker/' for instructions."
    exit 1
  fi

  ViashDebug "Checking whether the Docker daemon is running"
  save=$-; set +e
  docker_version=$(docker version --format '{{.Client.APIVersion}}' 2> /dev/null)
  out=$?
  [[ $save =~ e ]] && set -e
  if [ $out -ne 0 ]; then
    ViashCritical "Docker daemon does not seem to be running. Try one of the following:"
    ViashCritical "- Try running 'dockerd' in the command line"
    ViashCritical "- See https://docs.docker.com/config/daemon/"
    exit 1
  fi
}

# ViashDockerRemoteTagCheck: check whether a Docker image is available 
# on a remote. Assumes `docker login` has been performed, if relevant.
#
# $1                  : image identifier with format `[registry/]image[:tag]`
# exit code $?        : whether or not the image was found
# examples:
#   ViashDockerRemoteTagCheck python:latest
#   echo $?                                     # returns '0'
#   ViashDockerRemoteTagCheck sdaizudceahifu
#   echo $?                                     # returns '1'
function ViashDockerRemoteTagCheck {
  docker manifest inspect $1 > /dev/null 2> /dev/null
}

# ViashDockerLocalTagCheck: check whether a Docker image is available locally
#
# $1                  : image identifier with format `[registry/]image[:tag]`
# exit code $?        : whether or not the image was found
# examples:
#   docker pull python:latest
#   ViashDockerLocalTagCheck python:latest
#   echo $?                                     # returns '0'
#   ViashDockerLocalTagCheck sdaizudceahifu
#   echo $?                                     # returns '1'
function ViashDockerLocalTagCheck {
  [ -n "$(docker images -q $1)" ]
}

# ViashDockerPull: pull a Docker image
#
# $1                  : image identifier with format `[registry/]image[:tag]`
# exit code $?        : whether or not the image was found
# examples:
#   ViashDockerPull python:latest
#   echo $?                                     # returns '0'
#   ViashDockerPull sdaizudceahifu
#   echo $?                                     # returns '1'
function ViashDockerPull {
  ViashNotice "Checking if Docker image is available at '$1'"
  if [ $VIASH_VERBOSITY -ge $VIASH_LOGCODE_INFO ]; then
    docker pull $1 && return 0 || return 1
  else
    save=$-; set +e
    docker pull $1 2> /dev/null > /dev/null
    out=$?
    [[ $save =~ e ]] && set -e
    if [ $out -ne 0 ]; then
      ViashWarning "Could not pull from '$1'. Docker image doesn't exist or is not accessible."
    fi
    return $out
  fi
}

# ViashDockerPush: push a Docker image
#
# $1                  : image identifier with format `[registry/]image[:tag]`
# exit code $?        : whether or not the image was found
# examples:
#   ViashDockerPush python:latest
#   echo $?                                     # returns '0'
#   ViashDockerPush sdaizudceahifu
#   echo $?                                     # returns '1'
function ViashDockerPush {
  ViashNotice "Pushing image to '$1'"
  save=$-; set +e
  if [ $VIASH_VERBOSITY -ge $VIASH_LOGCODE_INFO ]; then
    docker push $1
    out=$?
  else
    docker push $1 2> /dev/null > /dev/null
    out=$?
  fi
  [[ $save =~ e ]] && set -e
  if [ $out -eq 0 ]; then
    ViashNotice "Container '$1' push succeeded."
  else
    ViashError "Container '$1' push errored. You might not be logged in or have the necessary permissions."
  fi
  return $out
}

# ViashDockerPullElseBuild: pull a Docker image, else build it
#
# $1                  : image identifier with format `[registry/]image[:tag]`
# ViashDockerBuild    : a Bash function which builds a docker image, takes image identifier as argument.
# examples:
#   ViashDockerPullElseBuild mynewcomponent
function ViashDockerPullElseBuild {
  save=$-; set +e
  ViashDockerPull $1
  out=$?
  [[ $save =~ e ]] && set -e
  if [ $out -ne 0 ]; then
    ViashDockerBuild $@
  fi
}

# ViashDockerSetup: create a Docker image, according to specified docker setup strategy
#
# $1          : image identifier with format `[registry/]image[:tag]`
# $2          : docker setup strategy, see DockerSetupStrategy.scala
# examples:
#   ViashDockerSetup mynewcomponent alwaysbuild
function ViashDockerSetup {
  local image_id="$1"
  local setup_strategy="$2"
  if [ "$setup_strategy" == "alwaysbuild" -o "$setup_strategy" == "build" -o "$setup_strategy" == "b" ]; then
    ViashDockerBuild $image_id --no-cache $(ViashDockerBuildArgs "$engine_id")
  elif [ "$setup_strategy" == "alwayspull" -o "$setup_strategy" == "pull" -o "$setup_strategy" == "p" ]; then
    ViashDockerPull $image_id
  elif [ "$setup_strategy" == "alwayspullelsebuild" -o "$setup_strategy" == "pullelsebuild" ]; then
    ViashDockerPullElseBuild $image_id --no-cache $(ViashDockerBuildArgs "$engine_id")
  elif [ "$setup_strategy" == "alwayspullelsecachedbuild" -o "$setup_strategy" == "pullelsecachedbuild" ]; then
    ViashDockerPullElseBuild $image_id $(ViashDockerBuildArgs "$engine_id")
  elif [ "$setup_strategy" == "alwayscachedbuild" -o "$setup_strategy" == "cachedbuild" -o "$setup_strategy" == "cb" ]; then
    ViashDockerBuild $image_id $(ViashDockerBuildArgs "$engine_id")
  elif [[ "$setup_strategy" =~ ^ifneedbe ]]; then
    local save=$-; set +e
    ViashDockerLocalTagCheck $image_id
    local outCheck=$?
    [[ $save =~ e ]] && set -e
    if [ $outCheck -eq 0 ]; then
      ViashInfo "Image $image_id already exists"
    elif [ "$setup_strategy" == "ifneedbebuild" ]; then
      ViashDockerBuild $image_id --no-cache $(ViashDockerBuildArgs "$engine_id")
    elif [ "$setup_strategy" == "ifneedbecachedbuild" ]; then
      ViashDockerBuild $image_id $(ViashDockerBuildArgs "$engine_id")
    elif [ "$setup_strategy" == "ifneedbepull" ]; then
      ViashDockerPull $image_id
    elif [ "$setup_strategy" == "ifneedbepullelsebuild" ]; then
      ViashDockerPullElseBuild $image_id --no-cache $(ViashDockerBuildArgs "$engine_id")
    elif [ "$setup_strategy" == "ifneedbepullelsecachedbuild" ]; then
      ViashDockerPullElseBuild $image_id $(ViashDockerBuildArgs "$engine_id")
    else
      ViashError "Unrecognised Docker strategy: $setup_strategy"
      exit 1
    fi
  elif [ "$setup_strategy" == "push" -o "$setup_strategy" == "forcepush" -o "$setup_strategy" == "alwayspush" ]; then
    ViashDockerPush "$image_id"
  elif [ "$setup_strategy" == "pushifnotpresent" -o "$setup_strategy" == "gentlepush" -o "$setup_strategy" == "maybepush" ]; then
    local save=$-; set +e
    ViashDockerRemoteTagCheck $image_id
    local outCheck=$?
    [[ $save =~ e ]] && set -e
    if [ $outCheck -eq 0 ]; then
      ViashNotice "Container '$image_id' exists, doing nothing."
    else
      ViashNotice "Container '$image_id' does not yet exist."
      ViashDockerPush "$image_id"
    fi
  elif [ "$setup_strategy" == "donothing" -o "$setup_strategy" == "meh" ]; then
    ViashNotice "Skipping setup."
  else
    ViashError "Unrecognised Docker strategy: $setup_strategy"
    exit 1
  fi
}

# ViashDockerCheckCommands: Check whether a docker container has the required commands
#
# $1                  : image identifier with format `[registry/]image[:tag]`
# $@                  : commands to verify being present
# examples:
#   ViashDockerCheckCommands bash:4.0 bash ps foo
function ViashDockerCheckCommands {
  local image_id="$1"
  shift 1
  local commands="$@"
  local save=$-; set +e
  local missing # mark 'missing' as local in advance, otherwise the exit code of the command will be missing and always be '0'
  missing=$(docker run --rm --entrypoint=sh "$image_id" -c "for command in $commands; do command -v \$command >/dev/null 2>&1; if [ \$? -ne 0 ]; then echo \$command; exit 1; fi; done")
  local outCheck=$?
  [[ $save =~ e ]] && set -e
  if [ $outCheck -ne 0 ]; then
  	ViashError "Docker container '$image_id' does not contain command '$missing'."
  	exit 1
  fi
}

# ViashDockerBuild: build a docker image
# $1                               : image identifier with format `[registry/]image[:tag]`
# $...                             : additional arguments to pass to docker build
# $VIASH_META_TEMP_DIR             : temporary directory to store dockerfile & optional resources in
# $VIASH_META_NAME                 : name of the component
# $VIASH_META_RESOURCES_DIR        : directory containing the resources
# $VIASH_VERBOSITY                 : verbosity level
# exit code $?                     : whether or not the image was built successfully
function ViashDockerBuild {
  local image_id="$1"
  shift 1

  # create temporary directory to store dockerfile & optional resources in
  local tmpdir=$(mktemp -d "$VIASH_META_TEMP_DIR/dockerbuild-$VIASH_META_NAME-XXXXXX")
  local dockerfile="$tmpdir/Dockerfile"
  function clean_up {
    rm -rf "$tmpdir"
  }
  trap clean_up EXIT

  # store dockerfile and resources
  ViashDockerfile "$VIASH_ENGINE_ID" > "$dockerfile"

  # generate the build command
  local docker_build_cmd="docker build -t '$image_id' $@ '$VIASH_META_RESOURCES_DIR' -f '$dockerfile'"

  # build the container
  ViashNotice "Building container '$image_id' with Dockerfile"
  ViashInfo "$docker_build_cmd"
  local save=$-; set +e
  if [ $VIASH_VERBOSITY -ge $VIASH_LOGCODE_INFO ]; then
    eval $docker_build_cmd
  else
    eval $docker_build_cmd &> "$tmpdir/docker_build.log"
  fi

  # check exit code
  local out=$?
  [[ $save =~ e ]] && set -e
  if [ $out -ne 0 ]; then
    ViashError "Error occurred while building container '$image_id'"
    if [ $VIASH_VERBOSITY -lt $VIASH_LOGCODE_INFO ]; then
      ViashError "Transcript: --------------------------------"
      cat "$tmpdir/docker_build.log"
      ViashError "End of transcript --------------------------"
    fi
    exit 1
  fi
}

######## End of helper functions for setting up Docker images for viash ########

# ViashDockerFile: print the dockerfile to stdout
# $1    : engine identifier
# return : dockerfile required to run this component
# examples:
#   ViashDockerFile
function ViashDockerfile {
  local engine_id="$1"

  if [[ "$engine_id" == "docker" ]]; then
    cat << 'VIASHDOCKER'
FROM quay.io/biocontainers/samtools:1.19.2--h50ea8bc_1
ENTRYPOINT []
RUN samtools --version 2>&1 | grep -E '^(samtools|Using htslib)' | \
sed 's#Using ##;s# \([0-9\.]*\)$#: \1#' > /var/software_versions.txt

LABEL org.opencontainers.image.description="Companion container for running component samtools samtools_view"
LABEL org.opencontainers.image.created="2024-06-24T09:12:32Z"
LABEL org.opencontainers.image.source="https://github.com/samtools/samtools"
LABEL org.opencontainers.image.revision="b84b29747d0635f2ac83ea63b496be9a9edb6724"
LABEL org.opencontainers.image.version="v0.1.0"

VIASHDOCKER
  fi
}

# ViashDockerBuildArgs: return the arguments to pass to docker build
# $1    : engine identifier
# return : arguments to pass to docker build
function ViashDockerBuildArgs {
  local engine_id="$1"

  if [[ "$engine_id" == "docker" ]]; then
    echo ""
  fi
}

# ViashAbsolutePath: generate absolute path from relative path
# borrowed from https://stackoverflow.com/a/21951256
# $1     : relative filename
# return : absolute path
# examples:
#   ViashAbsolutePath some_file.txt   # returns /path/to/some_file.txt
#   ViashAbsolutePath /foo/bar/..     # returns /foo
function ViashAbsolutePath {
  local thePath
  if [[ ! "$1" =~ ^/ ]]; then
    thePath="$PWD/$1"
  else
    thePath="$1"
  fi
  echo "$thePath" | (
    IFS=/
    read -a parr
    declare -a outp
    for i in "${parr[@]}"; do
      case "$i" in
      ''|.) continue ;;
      ..)
        len=${#outp[@]}
        if ((len==0)); then
          continue
        else
          unset outp[$((len-1))]
        fi
        ;;
      *)
        len=${#outp[@]}
        outp[$len]="$i"
      ;;
      esac
    done
    echo /"${outp[*]}"
  )
}
# ViashDockerAutodetectMount: auto configuring docker mounts from parameters
# $1                  : The parameter value
# returns             : New parameter
# $VIASH_DIRECTORY_MOUNTS : Added another parameter to be passed to docker
# examples:
#   ViashDockerAutodetectMount /path/to/bar      # returns '/viash_automount/path/to/bar'
#   ViashDockerAutodetectMountArg /path/to/bar   # returns '--volume="/path/to:/viash_automount/path/to"'
function ViashDockerAutodetectMount {
  abs_path=$(ViashAbsolutePath "$1")
  if [ -d "$abs_path" ]; then
    mount_source="$abs_path"
    base_name=""
  else
    mount_source=`dirname "$abs_path"`
    base_name=`basename "$abs_path"`
  fi
  mount_target="/viash_automount$mount_source"
  if [ -z "$base_name" ]; then
    echo "$mount_target"
  else
    echo "$mount_target/$base_name"
  fi
}
function ViashDockerAutodetectMountArg {
  abs_path=$(ViashAbsolutePath "$1")
  if [ -d "$abs_path" ]; then
    mount_source="$abs_path"
    base_name=""
  else
    mount_source=`dirname "$abs_path"`
    base_name=`basename "$abs_path"`
  fi
  mount_target="/viash_automount$mount_source"
  ViashDebug "ViashDockerAutodetectMountArg $1 -> $mount_source -> $mount_target"
  echo "--volume=\"$mount_source:$mount_target\""
}
function ViashDockerStripAutomount {
  abs_path=$(ViashAbsolutePath "$1")
  echo "${abs_path#/viash_automount}"
}
# initialise variables
VIASH_DIRECTORY_MOUNTS=()

# initialise docker variables
VIASH_DOCKER_RUN_ARGS=(-i --rm)

# initialise array
VIASH_POSITIONAL_ARGS=''

while [[ $# -gt 0 ]]; do
    case "$1" in
        -h|--help)
            ViashHelp
            exit
            ;;
        ---v|---verbose)
            let "VIASH_VERBOSITY=VIASH_VERBOSITY+1"
            shift 1
            ;;
        ---verbosity)
            VIASH_VERBOSITY="$2"
            shift 2
            ;;
        ---verbosity=*)
            VIASH_VERBOSITY="$(ViashRemoveFlags "$1")"
            shift 1
            ;;
        --version)
            echo "samtools_view v0.1.0"
            exit
            ;;
        --input)
            [ -n "$VIASH_PAR_INPUT" ] && ViashError Bad arguments for option \'--input\': \'$VIASH_PAR_INPUT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_INPUT="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --input. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --input=*)
            [ -n "$VIASH_PAR_INPUT" ] && ViashError Bad arguments for option \'--input=*\': \'$VIASH_PAR_INPUT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_INPUT=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --fai_reference)
            [ -n "$VIASH_PAR_FAI_REFERENCE" ] && ViashError Bad arguments for option \'--fai_reference\': \'$VIASH_PAR_FAI_REFERENCE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FAI_REFERENCE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --fai_reference. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --fai_reference=*)
            [ -n "$VIASH_PAR_FAI_REFERENCE" ] && ViashError Bad arguments for option \'--fai_reference=*\': \'$VIASH_PAR_FAI_REFERENCE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FAI_REFERENCE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -t)
            [ -n "$VIASH_PAR_FAI_REFERENCE" ] && ViashError Bad arguments for option \'-t\': \'$VIASH_PAR_FAI_REFERENCE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FAI_REFERENCE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -t. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --reference)
            [ -n "$VIASH_PAR_REFERENCE" ] && ViashError Bad arguments for option \'--reference\': \'$VIASH_PAR_REFERENCE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REFERENCE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --reference. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --reference=*)
            [ -n "$VIASH_PAR_REFERENCE" ] && ViashError Bad arguments for option \'--reference=*\': \'$VIASH_PAR_REFERENCE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REFERENCE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -T)
            [ -n "$VIASH_PAR_REFERENCE" ] && ViashError Bad arguments for option \'-T\': \'$VIASH_PAR_REFERENCE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REFERENCE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -T. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --target_file)
            [ -n "$VIASH_PAR_TARGET_FILE" ] && ViashError Bad arguments for option \'--target_file\': \'$VIASH_PAR_TARGET_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_TARGET_FILE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --target_file. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --target_file=*)
            [ -n "$VIASH_PAR_TARGET_FILE" ] && ViashError Bad arguments for option \'--target_file=*\': \'$VIASH_PAR_TARGET_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_TARGET_FILE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -L)
            [ -n "$VIASH_PAR_TARGET_FILE" ] && ViashError Bad arguments for option \'-L\': \'$VIASH_PAR_TARGET_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_TARGET_FILE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -L. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --region_file)
            [ -n "$VIASH_PAR_REGION_FILE" ] && ViashError Bad arguments for option \'--region_file\': \'$VIASH_PAR_REGION_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REGION_FILE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --region_file. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --region_file=*)
            [ -n "$VIASH_PAR_REGION_FILE" ] && ViashError Bad arguments for option \'--region_file=*\': \'$VIASH_PAR_REGION_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REGION_FILE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --qname_file)
            [ -n "$VIASH_PAR_QNAME_FILE" ] && ViashError Bad arguments for option \'--qname_file\': \'$VIASH_PAR_QNAME_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_QNAME_FILE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --qname_file. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --qname_file=*)
            [ -n "$VIASH_PAR_QNAME_FILE" ] && ViashError Bad arguments for option \'--qname_file=*\': \'$VIASH_PAR_QNAME_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_QNAME_FILE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -N)
            [ -n "$VIASH_PAR_QNAME_FILE" ] && ViashError Bad arguments for option \'-N\': \'$VIASH_PAR_QNAME_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_QNAME_FILE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -N. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --read_group_file)
            [ -n "$VIASH_PAR_READ_GROUP_FILE" ] && ViashError Bad arguments for option \'--read_group_file\': \'$VIASH_PAR_READ_GROUP_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ_GROUP_FILE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --read_group_file. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --read_group_file=*)
            [ -n "$VIASH_PAR_READ_GROUP_FILE" ] && ViashError Bad arguments for option \'--read_group_file=*\': \'$VIASH_PAR_READ_GROUP_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ_GROUP_FILE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -R)
            [ -n "$VIASH_PAR_READ_GROUP_FILE" ] && ViashError Bad arguments for option \'-R\': \'$VIASH_PAR_READ_GROUP_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ_GROUP_FILE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -R. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --use_index)
            [ -n "$VIASH_PAR_USE_INDEX" ] && ViashError Bad arguments for option \'--use_index\': \'$VIASH_PAR_USE_INDEX\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_USE_INDEX=true
            shift 1
            ;;
        -M)
            [ -n "$VIASH_PAR_USE_INDEX" ] && ViashError Bad arguments for option \'-M\': \'$VIASH_PAR_USE_INDEX\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_USE_INDEX=true
            shift 1
            ;;
        --output)
            [ -n "$VIASH_PAR_OUTPUT" ] && ViashError Bad arguments for option \'--output\': \'$VIASH_PAR_OUTPUT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --output. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --output=*)
            [ -n "$VIASH_PAR_OUTPUT" ] && ViashError Bad arguments for option \'--output=*\': \'$VIASH_PAR_OUTPUT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -o)
            [ -n "$VIASH_PAR_OUTPUT" ] && ViashError Bad arguments for option \'-o\': \'$VIASH_PAR_OUTPUT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -o. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --bam)
            [ -n "$VIASH_PAR_BAM" ] && ViashError Bad arguments for option \'--bam\': \'$VIASH_PAR_BAM\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_BAM=true
            shift 1
            ;;
        -b)
            [ -n "$VIASH_PAR_BAM" ] && ViashError Bad arguments for option \'-b\': \'$VIASH_PAR_BAM\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_BAM=true
            shift 1
            ;;
        --cram)
            [ -n "$VIASH_PAR_CRAM" ] && ViashError Bad arguments for option \'--cram\': \'$VIASH_PAR_CRAM\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_CRAM=true
            shift 1
            ;;
        -C)
            [ -n "$VIASH_PAR_CRAM" ] && ViashError Bad arguments for option \'-C\': \'$VIASH_PAR_CRAM\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_CRAM=true
            shift 1
            ;;
        --fast)
            [ -n "$VIASH_PAR_FAST" ] && ViashError Bad arguments for option \'--fast\': \'$VIASH_PAR_FAST\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FAST=true
            shift 1
            ;;
        --uncompressed)
            [ -n "$VIASH_PAR_UNCOMPRESSED" ] && ViashError Bad arguments for option \'--uncompressed\': \'$VIASH_PAR_UNCOMPRESSED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_UNCOMPRESSED=true
            shift 1
            ;;
        -u)
            [ -n "$VIASH_PAR_UNCOMPRESSED" ] && ViashError Bad arguments for option \'-u\': \'$VIASH_PAR_UNCOMPRESSED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_UNCOMPRESSED=true
            shift 1
            ;;
        --with_header)
            [ -n "$VIASH_PAR_WITH_HEADER" ] && ViashError Bad arguments for option \'--with_header\': \'$VIASH_PAR_WITH_HEADER\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_WITH_HEADER=true
            shift 1
            ;;
        --header_only)
            [ -n "$VIASH_PAR_HEADER_ONLY" ] && ViashError Bad arguments for option \'--header_only\': \'$VIASH_PAR_HEADER_ONLY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_HEADER_ONLY=true
            shift 1
            ;;
        -H)
            [ -n "$VIASH_PAR_HEADER_ONLY" ] && ViashError Bad arguments for option \'-H\': \'$VIASH_PAR_HEADER_ONLY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_HEADER_ONLY=true
            shift 1
            ;;
        --no_header)
            [ -n "$VIASH_PAR_NO_HEADER" ] && ViashError Bad arguments for option \'--no_header\': \'$VIASH_PAR_NO_HEADER\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_NO_HEADER=true
            shift 1
            ;;
        --count)
            [ -n "$VIASH_PAR_COUNT" ] && ViashError Bad arguments for option \'--count\': \'$VIASH_PAR_COUNT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_COUNT=true
            shift 1
            ;;
        -c)
            [ -n "$VIASH_PAR_COUNT" ] && ViashError Bad arguments for option \'-c\': \'$VIASH_PAR_COUNT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_COUNT=true
            shift 1
            ;;
        --output_unselected)
            [ -n "$VIASH_PAR_OUTPUT_UNSELECTED" ] && ViashError Bad arguments for option \'--output_unselected\': \'$VIASH_PAR_OUTPUT_UNSELECTED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT_UNSELECTED="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --output_unselected. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --output_unselected=*)
            [ -n "$VIASH_PAR_OUTPUT_UNSELECTED" ] && ViashError Bad arguments for option \'--output_unselected=*\': \'$VIASH_PAR_OUTPUT_UNSELECTED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT_UNSELECTED=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -U)
            [ -n "$VIASH_PAR_OUTPUT_UNSELECTED" ] && ViashError Bad arguments for option \'-U\': \'$VIASH_PAR_OUTPUT_UNSELECTED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT_UNSELECTED="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -U. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --unmap)
            [ -n "$VIASH_PAR_UNMAP" ] && ViashError Bad arguments for option \'--unmap\': \'$VIASH_PAR_UNMAP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_UNMAP=true
            shift 1
            ;;
        -p)
            [ -n "$VIASH_PAR_UNMAP" ] && ViashError Bad arguments for option \'-p\': \'$VIASH_PAR_UNMAP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_UNMAP=true
            shift 1
            ;;
        --read_group)
            [ -n "$VIASH_PAR_READ_GROUP" ] && ViashError Bad arguments for option \'--read_group\': \'$VIASH_PAR_READ_GROUP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ_GROUP="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --read_group. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --read_group=*)
            [ -n "$VIASH_PAR_READ_GROUP" ] && ViashError Bad arguments for option \'--read_group=*\': \'$VIASH_PAR_READ_GROUP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ_GROUP=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -r)
            [ -n "$VIASH_PAR_READ_GROUP" ] && ViashError Bad arguments for option \'-r\': \'$VIASH_PAR_READ_GROUP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ_GROUP="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -r. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --tag)
            [ -n "$VIASH_PAR_TAG" ] && ViashError Bad arguments for option \'--tag\': \'$VIASH_PAR_TAG\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_TAG="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --tag. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --tag=*)
            [ -n "$VIASH_PAR_TAG" ] && ViashError Bad arguments for option \'--tag=*\': \'$VIASH_PAR_TAG\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_TAG=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -d)
            [ -n "$VIASH_PAR_TAG" ] && ViashError Bad arguments for option \'-d\': \'$VIASH_PAR_TAG\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_TAG="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -d. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --tag_file)
            [ -n "$VIASH_PAR_TAG_FILE" ] && ViashError Bad arguments for option \'--tag_file\': \'$VIASH_PAR_TAG_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_TAG_FILE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --tag_file. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --tag_file=*)
            [ -n "$VIASH_PAR_TAG_FILE" ] && ViashError Bad arguments for option \'--tag_file=*\': \'$VIASH_PAR_TAG_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_TAG_FILE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -D)
            [ -n "$VIASH_PAR_TAG_FILE" ] && ViashError Bad arguments for option \'-D\': \'$VIASH_PAR_TAG_FILE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_TAG_FILE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -D. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --min_MQ)
            [ -n "$VIASH_PAR_MIN_MQ" ] && ViashError Bad arguments for option \'--min_MQ\': \'$VIASH_PAR_MIN_MQ\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_MQ="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --min_MQ. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --min_MQ=*)
            [ -n "$VIASH_PAR_MIN_MQ" ] && ViashError Bad arguments for option \'--min_MQ=*\': \'$VIASH_PAR_MIN_MQ\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_MQ=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -q)
            [ -n "$VIASH_PAR_MIN_MQ" ] && ViashError Bad arguments for option \'-q\': \'$VIASH_PAR_MIN_MQ\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_MQ="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -q. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --library)
            [ -n "$VIASH_PAR_LIBRARY" ] && ViashError Bad arguments for option \'--library\': \'$VIASH_PAR_LIBRARY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_LIBRARY="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --library. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --library=*)
            [ -n "$VIASH_PAR_LIBRARY" ] && ViashError Bad arguments for option \'--library=*\': \'$VIASH_PAR_LIBRARY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_LIBRARY=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -l)
            [ -n "$VIASH_PAR_LIBRARY" ] && ViashError Bad arguments for option \'-l\': \'$VIASH_PAR_LIBRARY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_LIBRARY="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -l. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --min_qlen)
            [ -n "$VIASH_PAR_MIN_QLEN" ] && ViashError Bad arguments for option \'--min_qlen\': \'$VIASH_PAR_MIN_QLEN\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_QLEN="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --min_qlen. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --min_qlen=*)
            [ -n "$VIASH_PAR_MIN_QLEN" ] && ViashError Bad arguments for option \'--min_qlen=*\': \'$VIASH_PAR_MIN_QLEN\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_QLEN=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -m)
            [ -n "$VIASH_PAR_MIN_QLEN" ] && ViashError Bad arguments for option \'-m\': \'$VIASH_PAR_MIN_QLEN\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_QLEN="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -m. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --expr)
            [ -n "$VIASH_PAR_EXPR" ] && ViashError Bad arguments for option \'--expr\': \'$VIASH_PAR_EXPR\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_EXPR="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --expr. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --expr=*)
            [ -n "$VIASH_PAR_EXPR" ] && ViashError Bad arguments for option \'--expr=*\': \'$VIASH_PAR_EXPR\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_EXPR=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -e)
            [ -n "$VIASH_PAR_EXPR" ] && ViashError Bad arguments for option \'-e\': \'$VIASH_PAR_EXPR\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_EXPR="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -e. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --require_flags)
            [ -n "$VIASH_PAR_REQUIRE_FLAGS" ] && ViashError Bad arguments for option \'--require_flags\': \'$VIASH_PAR_REQUIRE_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REQUIRE_FLAGS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --require_flags. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --require_flags=*)
            [ -n "$VIASH_PAR_REQUIRE_FLAGS" ] && ViashError Bad arguments for option \'--require_flags=*\': \'$VIASH_PAR_REQUIRE_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REQUIRE_FLAGS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -f)
            [ -n "$VIASH_PAR_REQUIRE_FLAGS" ] && ViashError Bad arguments for option \'-f\': \'$VIASH_PAR_REQUIRE_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REQUIRE_FLAGS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -f. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --excl_flags)
            [ -n "$VIASH_PAR_EXCL_FLAGS" ] && ViashError Bad arguments for option \'--excl_flags\': \'$VIASH_PAR_EXCL_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_EXCL_FLAGS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --excl_flags. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --excl_flags=*)
            [ -n "$VIASH_PAR_EXCL_FLAGS" ] && ViashError Bad arguments for option \'--excl_flags=*\': \'$VIASH_PAR_EXCL_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_EXCL_FLAGS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -F)
            [ -n "$VIASH_PAR_EXCL_FLAGS" ] && ViashError Bad arguments for option \'-F\': \'$VIASH_PAR_EXCL_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_EXCL_FLAGS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -F. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --excl_all_flags)
            [ -n "$VIASH_PAR_EXCL_ALL_FLAGS" ] && ViashError Bad arguments for option \'--excl_all_flags\': \'$VIASH_PAR_EXCL_ALL_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_EXCL_ALL_FLAGS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --excl_all_flags. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --excl_all_flags=*)
            [ -n "$VIASH_PAR_EXCL_ALL_FLAGS" ] && ViashError Bad arguments for option \'--excl_all_flags=*\': \'$VIASH_PAR_EXCL_ALL_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_EXCL_ALL_FLAGS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -G)
            [ -n "$VIASH_PAR_EXCL_ALL_FLAGS" ] && ViashError Bad arguments for option \'-G\': \'$VIASH_PAR_EXCL_ALL_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_EXCL_ALL_FLAGS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -G. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --incl_flags)
            [ -n "$VIASH_PAR_INCL_FLAGS" ] && ViashError Bad arguments for option \'--incl_flags\': \'$VIASH_PAR_INCL_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_INCL_FLAGS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --incl_flags. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --incl_flags=*)
            [ -n "$VIASH_PAR_INCL_FLAGS" ] && ViashError Bad arguments for option \'--incl_flags=*\': \'$VIASH_PAR_INCL_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_INCL_FLAGS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --rf)
            [ -n "$VIASH_PAR_INCL_FLAGS" ] && ViashError Bad arguments for option \'--rf\': \'$VIASH_PAR_INCL_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_INCL_FLAGS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --rf. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --remove_tag)
            [ -n "$VIASH_PAR_REMOVE_TAG" ] && ViashError Bad arguments for option \'--remove_tag\': \'$VIASH_PAR_REMOVE_TAG\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REMOVE_TAG="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --remove_tag. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --remove_tag=*)
            [ -n "$VIASH_PAR_REMOVE_TAG" ] && ViashError Bad arguments for option \'--remove_tag=*\': \'$VIASH_PAR_REMOVE_TAG\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REMOVE_TAG=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -x)
            [ -n "$VIASH_PAR_REMOVE_TAG" ] && ViashError Bad arguments for option \'-x\': \'$VIASH_PAR_REMOVE_TAG\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REMOVE_TAG="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -x. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --keep_tag)
            [ -n "$VIASH_PAR_KEEP_TAG" ] && ViashError Bad arguments for option \'--keep_tag\': \'$VIASH_PAR_KEEP_TAG\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_KEEP_TAG="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --keep_tag. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --keep_tag=*)
            [ -n "$VIASH_PAR_KEEP_TAG" ] && ViashError Bad arguments for option \'--keep_tag=*\': \'$VIASH_PAR_KEEP_TAG\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_KEEP_TAG=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --remove_B)
            [ -n "$VIASH_PAR_REMOVE_B" ] && ViashError Bad arguments for option \'--remove_B\': \'$VIASH_PAR_REMOVE_B\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REMOVE_B=true
            shift 1
            ;;
        -B)
            [ -n "$VIASH_PAR_REMOVE_B" ] && ViashError Bad arguments for option \'-B\': \'$VIASH_PAR_REMOVE_B\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REMOVE_B=true
            shift 1
            ;;
        --add_flags)
            [ -n "$VIASH_PAR_ADD_FLAGS" ] && ViashError Bad arguments for option \'--add_flags\': \'$VIASH_PAR_ADD_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_ADD_FLAGS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --add_flags. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --add_flags=*)
            [ -n "$VIASH_PAR_ADD_FLAGS" ] && ViashError Bad arguments for option \'--add_flags=*\': \'$VIASH_PAR_ADD_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_ADD_FLAGS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --remove_flags)
            [ -n "$VIASH_PAR_REMOVE_FLAGS" ] && ViashError Bad arguments for option \'--remove_flags\': \'$VIASH_PAR_REMOVE_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REMOVE_FLAGS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --remove_flags. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --remove_flags=*)
            [ -n "$VIASH_PAR_REMOVE_FLAGS" ] && ViashError Bad arguments for option \'--remove_flags=*\': \'$VIASH_PAR_REMOVE_FLAGS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REMOVE_FLAGS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --subsample)
            [ -n "$VIASH_PAR_SUBSAMPLE" ] && ViashError Bad arguments for option \'--subsample\': \'$VIASH_PAR_SUBSAMPLE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SUBSAMPLE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --subsample. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --subsample=*)
            [ -n "$VIASH_PAR_SUBSAMPLE" ] && ViashError Bad arguments for option \'--subsample=*\': \'$VIASH_PAR_SUBSAMPLE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SUBSAMPLE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --subsample_seed)
            [ -n "$VIASH_PAR_SUBSAMPLE_SEED" ] && ViashError Bad arguments for option \'--subsample_seed\': \'$VIASH_PAR_SUBSAMPLE_SEED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SUBSAMPLE_SEED="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --subsample_seed. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --subsample_seed=*)
            [ -n "$VIASH_PAR_SUBSAMPLE_SEED" ] && ViashError Bad arguments for option \'--subsample_seed=*\': \'$VIASH_PAR_SUBSAMPLE_SEED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SUBSAMPLE_SEED=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --fetch_pairs)
            [ -n "$VIASH_PAR_FETCH_PAIRS" ] && ViashError Bad arguments for option \'--fetch_pairs\': \'$VIASH_PAR_FETCH_PAIRS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FETCH_PAIRS=true
            shift 1
            ;;
        -P)
            [ -n "$VIASH_PAR_FETCH_PAIRS" ] && ViashError Bad arguments for option \'-P\': \'$VIASH_PAR_FETCH_PAIRS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FETCH_PAIRS=true
            shift 1
            ;;
        --customized_index)
            [ -n "$VIASH_PAR_CUSTOMIZED_INDEX" ] && ViashError Bad arguments for option \'--customized_index\': \'$VIASH_PAR_CUSTOMIZED_INDEX\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_CUSTOMIZED_INDEX=true
            shift 1
            ;;
        -X)
            [ -n "$VIASH_PAR_CUSTOMIZED_INDEX" ] && ViashError Bad arguments for option \'-X\': \'$VIASH_PAR_CUSTOMIZED_INDEX\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_CUSTOMIZED_INDEX=true
            shift 1
            ;;
        --sanitize)
            [ -n "$VIASH_PAR_SANITIZE" ] && ViashError Bad arguments for option \'--sanitize\': \'$VIASH_PAR_SANITIZE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SANITIZE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --sanitize. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --sanitize=*)
            [ -n "$VIASH_PAR_SANITIZE" ] && ViashError Bad arguments for option \'--sanitize=*\': \'$VIASH_PAR_SANITIZE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SANITIZE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -z)
            [ -n "$VIASH_PAR_SANITIZE" ] && ViashError Bad arguments for option \'-z\': \'$VIASH_PAR_SANITIZE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SANITIZE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -z. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --no_PG)
            [ -n "$VIASH_PAR_NO_PG" ] && ViashError Bad arguments for option \'--no_PG\': \'$VIASH_PAR_NO_PG\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_NO_PG=true
            shift 1
            ;;
        --input_fmt_option)
            [ -n "$VIASH_PAR_INPUT_FMT_OPTION" ] && ViashError Bad arguments for option \'--input_fmt_option\': \'$VIASH_PAR_INPUT_FMT_OPTION\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_INPUT_FMT_OPTION="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --input_fmt_option. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --input_fmt_option=*)
            [ -n "$VIASH_PAR_INPUT_FMT_OPTION" ] && ViashError Bad arguments for option \'--input_fmt_option=*\': \'$VIASH_PAR_INPUT_FMT_OPTION\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_INPUT_FMT_OPTION=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --output_fmt)
            [ -n "$VIASH_PAR_OUTPUT_FMT" ] && ViashError Bad arguments for option \'--output_fmt\': \'$VIASH_PAR_OUTPUT_FMT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT_FMT="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --output_fmt. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --output_fmt=*)
            [ -n "$VIASH_PAR_OUTPUT_FMT" ] && ViashError Bad arguments for option \'--output_fmt=*\': \'$VIASH_PAR_OUTPUT_FMT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT_FMT=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -O)
            [ -n "$VIASH_PAR_OUTPUT_FMT" ] && ViashError Bad arguments for option \'-O\': \'$VIASH_PAR_OUTPUT_FMT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT_FMT="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -O. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --output_fmt_option)
            [ -n "$VIASH_PAR_OUTPUT_FMT_OPTION" ] && ViashError Bad arguments for option \'--output_fmt_option\': \'$VIASH_PAR_OUTPUT_FMT_OPTION\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT_FMT_OPTION="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --output_fmt_option. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --output_fmt_option=*)
            [ -n "$VIASH_PAR_OUTPUT_FMT_OPTION" ] && ViashError Bad arguments for option \'--output_fmt_option=*\': \'$VIASH_PAR_OUTPUT_FMT_OPTION\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OUTPUT_FMT_OPTION=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --write_index)
            [ -n "$VIASH_PAR_WRITE_INDEX" ] && ViashError Bad arguments for option \'--write_index\': \'$VIASH_PAR_WRITE_INDEX\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_WRITE_INDEX=true
            shift 1
            ;;
        ---engine)
            VIASH_ENGINE_ID="$2"
            shift 2
            ;;
        ---engine=*)
            VIASH_ENGINE_ID="$(ViashRemoveFlags "$1")"
            shift 1
            ;;
        ---setup)
            VIASH_MODE='setup'
            VIASH_SETUP_STRATEGY="$2"
            shift 2
            ;;
        ---setup=*)
            VIASH_MODE='setup'
            VIASH_SETUP_STRATEGY="$(ViashRemoveFlags "$1")"
            shift 1
            ;;
        ---dockerfile)
            VIASH_MODE='dockerfile'
            shift 1
            ;;
        ---debug)
            VIASH_MODE='debug'
            shift 1
            ;;
        ---cpus)
            [ -n "$VIASH_META_CPUS" ] && ViashError Bad arguments for option \'---cpus\': \'$VIASH_META_CPUS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_META_CPUS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to ---cpus. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        ---cpus=*)
            [ -n "$VIASH_META_CPUS" ] && ViashError Bad arguments for option \'---cpus=*\': \'$VIASH_META_CPUS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_META_CPUS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        ---memory)
            [ -n "$VIASH_META_MEMORY" ] && ViashError Bad arguments for option \'---memory\': \'$VIASH_META_MEMORY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_META_MEMORY="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to ---memory. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        ---memory=*)
            [ -n "$VIASH_META_MEMORY" ] && ViashError Bad arguments for option \'---memory=*\': \'$VIASH_META_MEMORY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_META_MEMORY=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        *)  # positional arg or unknown option
            # since the positional args will be eval'd, can we always quote, instead of using ViashQuote
            VIASH_POSITIONAL_ARGS="$VIASH_POSITIONAL_ARGS '$1'"
            [[ $1 == -* ]] && ViashWarning $1 looks like a parameter but is not a defined parameter and will instead be treated as a positional argument. Use "--help" to get more information on the parameters.
            shift # past argument
            ;;
    esac
done

# parse positional parameters
eval set -- $VIASH_POSITIONAL_ARGS


if   [ "$VIASH_ENGINE_ID" == "native" ]  ; then
  VIASH_ENGINE_TYPE='native'
elif   [ "$VIASH_ENGINE_ID" == "docker" ]  ; then
  VIASH_ENGINE_TYPE='docker'
else
  ViashError "Engine '$VIASH_ENGINE_ID' is not recognized. Options are: docker, native."
  exit 1
fi

if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then
  # check if docker is installed properly
  ViashDockerInstallationCheck

  # determine docker image id
  if [[ "$VIASH_ENGINE_ID" == 'docker' ]]; then
    VIASH_DOCKER_IMAGE_ID='images.viash-hub.com/vsh/biobox/samtools/samtools_view:v0.1.0'
  fi

  # print dockerfile
  if [ "$VIASH_MODE" == "dockerfile" ]; then
    ViashDockerfile "$VIASH_ENGINE_ID"
    exit 0
  
  # enter docker container
  elif [[ "$VIASH_MODE" == "debug" ]]; then
    VIASH_CMD="docker run --entrypoint=bash ${VIASH_DOCKER_RUN_ARGS[@]} -v '$(pwd)':/pwd --workdir /pwd -t $VIASH_DOCKER_IMAGE_ID"
    ViashNotice "+ $VIASH_CMD"
    eval $VIASH_CMD
    exit 

  # build docker image
  elif [ "$VIASH_MODE" == "setup" ]; then
    ViashDockerSetup "$VIASH_DOCKER_IMAGE_ID" "$VIASH_SETUP_STRATEGY"
    ViashDockerCheckCommands "$VIASH_DOCKER_IMAGE_ID" 'ps' 'bash'
    exit 0
  fi

  # check if docker image exists
  ViashDockerSetup "$VIASH_DOCKER_IMAGE_ID" ifneedbepullelsecachedbuild
  ViashDockerCheckCommands "$VIASH_DOCKER_IMAGE_ID" 'ps' 'bash'
fi

# setting computational defaults

# helper function for parsing memory strings
function ViashMemoryAsBytes {
  local memory=`echo "$1" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]'`
  local memory_regex='^([0-9]+)([kmgtp]i?b?|b)$'
  if [[ $memory =~ $memory_regex ]]; then
    local number=${memory/[^0-9]*/}
    local symbol=${memory/*[0-9]/}
    
    case $symbol in
      b)      memory_b=$number ;;
      kb|k)   memory_b=$(( $number * 1000 )) ;;
      mb|m)   memory_b=$(( $number * 1000 * 1000 )) ;;
      gb|g)   memory_b=$(( $number * 1000 * 1000 * 1000 )) ;;
      tb|t)   memory_b=$(( $number * 1000 * 1000 * 1000 * 1000 )) ;;
      pb|p)   memory_b=$(( $number * 1000 * 1000 * 1000 * 1000 * 1000 )) ;;
      kib|ki)   memory_b=$(( $number * 1024 )) ;;
      mib|mi)   memory_b=$(( $number * 1024 * 1024 )) ;;
      gib|gi)   memory_b=$(( $number * 1024 * 1024 * 1024 )) ;;
      tib|ti)   memory_b=$(( $number * 1024 * 1024 * 1024 * 1024 )) ;;
      pib|pi)   memory_b=$(( $number * 1024 * 1024 * 1024 * 1024 * 1024 )) ;;
    esac
    echo "$memory_b"
  fi
}
# compute memory in different units
if [ ! -z ${VIASH_META_MEMORY+x} ]; then
  VIASH_META_MEMORY_B=`ViashMemoryAsBytes $VIASH_META_MEMORY`
  # do not define other variables if memory_b is an empty string
  if [ ! -z "$VIASH_META_MEMORY_B" ]; then
    VIASH_META_MEMORY_KB=$(( ($VIASH_META_MEMORY_B+999) / 1000 ))
    VIASH_META_MEMORY_MB=$(( ($VIASH_META_MEMORY_KB+999) / 1000 ))
    VIASH_META_MEMORY_GB=$(( ($VIASH_META_MEMORY_MB+999) / 1000 ))
    VIASH_META_MEMORY_TB=$(( ($VIASH_META_MEMORY_GB+999) / 1000 ))
    VIASH_META_MEMORY_PB=$(( ($VIASH_META_MEMORY_TB+999) / 1000 ))
    VIASH_META_MEMORY_KIB=$(( ($VIASH_META_MEMORY_B+1023) / 1024 ))
    VIASH_META_MEMORY_MIB=$(( ($VIASH_META_MEMORY_KIB+1023) / 1024 ))
    VIASH_META_MEMORY_GIB=$(( ($VIASH_META_MEMORY_MIB+1023) / 1024 ))
    VIASH_META_MEMORY_TIB=$(( ($VIASH_META_MEMORY_GIB+1023) / 1024 ))
    VIASH_META_MEMORY_PIB=$(( ($VIASH_META_MEMORY_TIB+1023) / 1024 ))
  else
    # unset memory if string is empty
    unset $VIASH_META_MEMORY_B
  fi
fi
# unset nproc if string is empty
if [ -z "$VIASH_META_CPUS" ]; then
  unset $VIASH_META_CPUS
fi


# check whether required parameters exist
if [ -z ${VIASH_PAR_INPUT+x} ]; then
  ViashError '--input' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi
if [ -z ${VIASH_PAR_OUTPUT+x} ]; then
  ViashError '--output' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi
if [ -z ${VIASH_META_NAME+x} ]; then
  ViashError 'name' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi
if [ -z ${VIASH_META_FUNCTIONALITY_NAME+x} ]; then
  ViashError 'functionality_name' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi
if [ -z ${VIASH_META_RESOURCES_DIR+x} ]; then
  ViashError 'resources_dir' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi
if [ -z ${VIASH_META_EXECUTABLE+x} ]; then
  ViashError 'executable' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi
if [ -z ${VIASH_META_CONFIG+x} ]; then
  ViashError 'config' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi
if [ -z ${VIASH_META_TEMP_DIR+x} ]; then
  ViashError 'temp_dir' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi

# filling in defaults
if [ -z ${VIASH_PAR_USE_INDEX+x} ]; then
  VIASH_PAR_USE_INDEX="false"
fi
if [ -z ${VIASH_PAR_BAM+x} ]; then
  VIASH_PAR_BAM="false"
fi
if [ -z ${VIASH_PAR_CRAM+x} ]; then
  VIASH_PAR_CRAM="false"
fi
if [ -z ${VIASH_PAR_FAST+x} ]; then
  VIASH_PAR_FAST="false"
fi
if [ -z ${VIASH_PAR_UNCOMPRESSED+x} ]; then
  VIASH_PAR_UNCOMPRESSED="false"
fi
if [ -z ${VIASH_PAR_WITH_HEADER+x} ]; then
  VIASH_PAR_WITH_HEADER="false"
fi
if [ -z ${VIASH_PAR_HEADER_ONLY+x} ]; then
  VIASH_PAR_HEADER_ONLY="false"
fi
if [ -z ${VIASH_PAR_NO_HEADER+x} ]; then
  VIASH_PAR_NO_HEADER="false"
fi
if [ -z ${VIASH_PAR_COUNT+x} ]; then
  VIASH_PAR_COUNT="false"
fi
if [ -z ${VIASH_PAR_UNMAP+x} ]; then
  VIASH_PAR_UNMAP="false"
fi
if [ -z ${VIASH_PAR_MIN_MQ+x} ]; then
  VIASH_PAR_MIN_MQ="0"
fi
if [ -z ${VIASH_PAR_MIN_QLEN+x} ]; then
  VIASH_PAR_MIN_QLEN="0"
fi
if [ -z ${VIASH_PAR_REMOVE_B+x} ]; then
  VIASH_PAR_REMOVE_B="false"
fi
if [ -z ${VIASH_PAR_SUBSAMPLE_SEED+x} ]; then
  VIASH_PAR_SUBSAMPLE_SEED="0"
fi
if [ -z ${VIASH_PAR_FETCH_PAIRS+x} ]; then
  VIASH_PAR_FETCH_PAIRS="false"
fi
if [ -z ${VIASH_PAR_CUSTOMIZED_INDEX+x} ]; then
  VIASH_PAR_CUSTOMIZED_INDEX="false"
fi
if [ -z ${VIASH_PAR_NO_PG+x} ]; then
  VIASH_PAR_NO_PG="false"
fi
if [ -z ${VIASH_PAR_WRITE_INDEX+x} ]; then
  VIASH_PAR_WRITE_INDEX="false"
fi

# check whether required files exist
if [ ! -z "$VIASH_PAR_INPUT" ] && [ ! -e "$VIASH_PAR_INPUT" ]; then
  ViashError "Input file '$VIASH_PAR_INPUT' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_FAI_REFERENCE" ] && [ ! -e "$VIASH_PAR_FAI_REFERENCE" ]; then
  ViashError "Input file '$VIASH_PAR_FAI_REFERENCE' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_REFERENCE" ] && [ ! -e "$VIASH_PAR_REFERENCE" ]; then
  ViashError "Input file '$VIASH_PAR_REFERENCE' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_TARGET_FILE" ] && [ ! -e "$VIASH_PAR_TARGET_FILE" ]; then
  ViashError "Input file '$VIASH_PAR_TARGET_FILE' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_REGION_FILE" ] && [ ! -e "$VIASH_PAR_REGION_FILE" ]; then
  ViashError "Input file '$VIASH_PAR_REGION_FILE' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_QNAME_FILE" ] && [ ! -e "$VIASH_PAR_QNAME_FILE" ]; then
  ViashError "Input file '$VIASH_PAR_QNAME_FILE' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_READ_GROUP_FILE" ] && [ ! -e "$VIASH_PAR_READ_GROUP_FILE" ]; then
  ViashError "Input file '$VIASH_PAR_READ_GROUP_FILE' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_OUTPUT_UNSELECTED" ] && [ ! -e "$VIASH_PAR_OUTPUT_UNSELECTED" ]; then
  ViashError "Input file '$VIASH_PAR_OUTPUT_UNSELECTED' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_TAG_FILE" ] && [ ! -e "$VIASH_PAR_TAG_FILE" ]; then
  ViashError "Input file '$VIASH_PAR_TAG_FILE' does not exist."
  exit 1
fi

# check whether parameters values are of the right type
if [[ -n "$VIASH_PAR_USE_INDEX" ]]; then
  if ! [[ "$VIASH_PAR_USE_INDEX" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--use_index' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_BAM" ]]; then
  if ! [[ "$VIASH_PAR_BAM" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--bam' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_CRAM" ]]; then
  if ! [[ "$VIASH_PAR_CRAM" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--cram' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_FAST" ]]; then
  if ! [[ "$VIASH_PAR_FAST" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--fast' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_UNCOMPRESSED" ]]; then
  if ! [[ "$VIASH_PAR_UNCOMPRESSED" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--uncompressed' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_WITH_HEADER" ]]; then
  if ! [[ "$VIASH_PAR_WITH_HEADER" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--with_header' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_HEADER_ONLY" ]]; then
  if ! [[ "$VIASH_PAR_HEADER_ONLY" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--header_only' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_NO_HEADER" ]]; then
  if ! [[ "$VIASH_PAR_NO_HEADER" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--no_header' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_COUNT" ]]; then
  if ! [[ "$VIASH_PAR_COUNT" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--count' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_UNMAP" ]]; then
  if ! [[ "$VIASH_PAR_UNMAP" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--unmap' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_MIN_MQ" ]]; then
  if ! [[ "$VIASH_PAR_MIN_MQ" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--min_MQ' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_MIN_QLEN" ]]; then
  if ! [[ "$VIASH_PAR_MIN_QLEN" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--min_qlen' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_EXCL_ALL_FLAGS" ]]; then
  if ! [[ "$VIASH_PAR_EXCL_ALL_FLAGS" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--excl_all_flags' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_REMOVE_B" ]]; then
  if ! [[ "$VIASH_PAR_REMOVE_B" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--remove_B' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_SUBSAMPLE" ]]; then
  if ! [[ "$VIASH_PAR_SUBSAMPLE" =~ ^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$ ]]; then
    ViashError '--subsample' has to be a double. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_SUBSAMPLE_SEED" ]]; then
  if ! [[ "$VIASH_PAR_SUBSAMPLE_SEED" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--subsample_seed' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_FETCH_PAIRS" ]]; then
  if ! [[ "$VIASH_PAR_FETCH_PAIRS" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--fetch_pairs' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_CUSTOMIZED_INDEX" ]]; then
  if ! [[ "$VIASH_PAR_CUSTOMIZED_INDEX" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--customized_index' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_NO_PG" ]]; then
  if ! [[ "$VIASH_PAR_NO_PG" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--no_PG' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_WRITE_INDEX" ]]; then
  if ! [[ "$VIASH_PAR_WRITE_INDEX" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--write_index' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_CPUS" ]]; then
  if ! [[ "$VIASH_META_CPUS" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'cpus' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_B" ]]; then
  if ! [[ "$VIASH_META_MEMORY_B" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_b' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_KB" ]]; then
  if ! [[ "$VIASH_META_MEMORY_KB" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_kb' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_MB" ]]; then
  if ! [[ "$VIASH_META_MEMORY_MB" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_mb' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_GB" ]]; then
  if ! [[ "$VIASH_META_MEMORY_GB" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_gb' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_TB" ]]; then
  if ! [[ "$VIASH_META_MEMORY_TB" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_tb' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_PB" ]]; then
  if ! [[ "$VIASH_META_MEMORY_PB" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_pb' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_KIB" ]]; then
  if ! [[ "$VIASH_META_MEMORY_KIB" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_kib' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_MIB" ]]; then
  if ! [[ "$VIASH_META_MEMORY_MIB" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_mib' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_GIB" ]]; then
  if ! [[ "$VIASH_META_MEMORY_GIB" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_gib' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_TIB" ]]; then
  if ! [[ "$VIASH_META_MEMORY_TIB" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_tib' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_META_MEMORY_PIB" ]]; then
  if ! [[ "$VIASH_META_MEMORY_PIB" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError 'memory_pib' has to be a long. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi

# create parent directories of output files, if so desired
if [ ! -z "$VIASH_PAR_OUTPUT" ] && [ ! -d "$(dirname "$VIASH_PAR_OUTPUT")" ]; then
  mkdir -p "$(dirname "$VIASH_PAR_OUTPUT")"
fi

if  [ "$VIASH_ENGINE_ID" == "native" ]  ; then
  if [ "$VIASH_MODE" == "run" ]; then
    VIASH_CMD="bash"
  else
    ViashError "Engine '$VIASH_ENGINE_ID' does not support mode '$VIASH_MODE'."
    exit 1
  fi
fi

if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then
  # detect volumes from file arguments
  VIASH_CHOWN_VARS=()
if [ ! -z "$VIASH_PAR_INPUT" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_INPUT")" )
  VIASH_PAR_INPUT=$(ViashDockerAutodetectMount "$VIASH_PAR_INPUT")
fi
if [ ! -z "$VIASH_PAR_FAI_REFERENCE" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_FAI_REFERENCE")" )
  VIASH_PAR_FAI_REFERENCE=$(ViashDockerAutodetectMount "$VIASH_PAR_FAI_REFERENCE")
fi
if [ ! -z "$VIASH_PAR_REFERENCE" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_REFERENCE")" )
  VIASH_PAR_REFERENCE=$(ViashDockerAutodetectMount "$VIASH_PAR_REFERENCE")
fi
if [ ! -z "$VIASH_PAR_TARGET_FILE" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_TARGET_FILE")" )
  VIASH_PAR_TARGET_FILE=$(ViashDockerAutodetectMount "$VIASH_PAR_TARGET_FILE")
fi
if [ ! -z "$VIASH_PAR_REGION_FILE" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_REGION_FILE")" )
  VIASH_PAR_REGION_FILE=$(ViashDockerAutodetectMount "$VIASH_PAR_REGION_FILE")
fi
if [ ! -z "$VIASH_PAR_QNAME_FILE" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_QNAME_FILE")" )
  VIASH_PAR_QNAME_FILE=$(ViashDockerAutodetectMount "$VIASH_PAR_QNAME_FILE")
fi
if [ ! -z "$VIASH_PAR_READ_GROUP_FILE" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_READ_GROUP_FILE")" )
  VIASH_PAR_READ_GROUP_FILE=$(ViashDockerAutodetectMount "$VIASH_PAR_READ_GROUP_FILE")
fi
if [ ! -z "$VIASH_PAR_OUTPUT" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_OUTPUT")" )
  VIASH_PAR_OUTPUT=$(ViashDockerAutodetectMount "$VIASH_PAR_OUTPUT")
  VIASH_CHOWN_VARS+=( "$VIASH_PAR_OUTPUT" )
fi
if [ ! -z "$VIASH_PAR_OUTPUT_UNSELECTED" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_OUTPUT_UNSELECTED")" )
  VIASH_PAR_OUTPUT_UNSELECTED=$(ViashDockerAutodetectMount "$VIASH_PAR_OUTPUT_UNSELECTED")
fi
if [ ! -z "$VIASH_PAR_TAG_FILE" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_TAG_FILE")" )
  VIASH_PAR_TAG_FILE=$(ViashDockerAutodetectMount "$VIASH_PAR_TAG_FILE")
fi
if [ ! -z "$VIASH_META_RESOURCES_DIR" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_META_RESOURCES_DIR")" )
  VIASH_META_RESOURCES_DIR=$(ViashDockerAutodetectMount "$VIASH_META_RESOURCES_DIR")
fi
if [ ! -z "$VIASH_META_EXECUTABLE" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_META_EXECUTABLE")" )
  VIASH_META_EXECUTABLE=$(ViashDockerAutodetectMount "$VIASH_META_EXECUTABLE")
fi
if [ ! -z "$VIASH_META_CONFIG" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_META_CONFIG")" )
  VIASH_META_CONFIG=$(ViashDockerAutodetectMount "$VIASH_META_CONFIG")
fi
if [ ! -z "$VIASH_META_TEMP_DIR" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_META_TEMP_DIR")" )
  VIASH_META_TEMP_DIR=$(ViashDockerAutodetectMount "$VIASH_META_TEMP_DIR")
fi
  
  # get unique mounts
  VIASH_UNIQUE_MOUNTS=($(for val in "${VIASH_DIRECTORY_MOUNTS[@]}"; do echo "$val"; done | sort -u))
fi

if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then
  # change file ownership
  function ViashPerformChown {
    if (( ${#VIASH_CHOWN_VARS[@]} )); then
      set +e
      VIASH_CMD="docker run --entrypoint=bash --rm ${VIASH_UNIQUE_MOUNTS[@]} $VIASH_DOCKER_IMAGE_ID -c 'chown $(id -u):$(id -g) --silent --recursive ${VIASH_CHOWN_VARS[@]}'"
      ViashDebug "+ $VIASH_CMD"
      eval $VIASH_CMD
      set -e
    fi
  }
  trap ViashPerformChown EXIT
fi

if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then
  # helper function for filling in extra docker args
  if [ ! -z "$VIASH_META_MEMORY_B" ]; then
    VIASH_DOCKER_RUN_ARGS+=("--memory=${VIASH_META_MEMORY_B}")
  fi
  if [ ! -z "$VIASH_META_CPUS" ]; then
    VIASH_DOCKER_RUN_ARGS+=("--cpus=${VIASH_META_CPUS}")
  fi
fi

if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then
  VIASH_CMD="docker run --entrypoint=bash ${VIASH_DOCKER_RUN_ARGS[@]} ${VIASH_UNIQUE_MOUNTS[@]} $VIASH_DOCKER_IMAGE_ID"
fi


# set dependency paths


ViashDebug "Running command: $(echo $VIASH_CMD)"
cat << VIASHEOF | eval $VIASH_CMD
set -e
tempscript=\$(mktemp "$VIASH_META_TEMP_DIR/viash-run-samtools_view-XXXXXX").sh
function clean_up {
  rm "\$tempscript"
}
function interrupt {
  echo -e "\nCTRL-C Pressed..."
  exit 1
}
trap clean_up EXIT
trap interrupt INT SIGINT
cat > "\$tempscript" << 'VIASHMAIN'
#!/bin/bash

## VIASH START
# The following code has been auto-generated by Viash.
$( if [ ! -z ${VIASH_PAR_INPUT+x} ]; then echo "${VIASH_PAR_INPUT}" | sed "s#'#'\"'\"'#g;s#.*#par_input='&'#" ; else echo "# par_input="; fi )
$( if [ ! -z ${VIASH_PAR_FAI_REFERENCE+x} ]; then echo "${VIASH_PAR_FAI_REFERENCE}" | sed "s#'#'\"'\"'#g;s#.*#par_fai_reference='&'#" ; else echo "# par_fai_reference="; fi )
$( if [ ! -z ${VIASH_PAR_REFERENCE+x} ]; then echo "${VIASH_PAR_REFERENCE}" | sed "s#'#'\"'\"'#g;s#.*#par_reference='&'#" ; else echo "# par_reference="; fi )
$( if [ ! -z ${VIASH_PAR_TARGET_FILE+x} ]; then echo "${VIASH_PAR_TARGET_FILE}" | sed "s#'#'\"'\"'#g;s#.*#par_target_file='&'#" ; else echo "# par_target_file="; fi )
$( if [ ! -z ${VIASH_PAR_REGION_FILE+x} ]; then echo "${VIASH_PAR_REGION_FILE}" | sed "s#'#'\"'\"'#g;s#.*#par_region_file='&'#" ; else echo "# par_region_file="; fi )
$( if [ ! -z ${VIASH_PAR_QNAME_FILE+x} ]; then echo "${VIASH_PAR_QNAME_FILE}" | sed "s#'#'\"'\"'#g;s#.*#par_qname_file='&'#" ; else echo "# par_qname_file="; fi )
$( if [ ! -z ${VIASH_PAR_READ_GROUP_FILE+x} ]; then echo "${VIASH_PAR_READ_GROUP_FILE}" | sed "s#'#'\"'\"'#g;s#.*#par_read_group_file='&'#" ; else echo "# par_read_group_file="; fi )
$( if [ ! -z ${VIASH_PAR_USE_INDEX+x} ]; then echo "${VIASH_PAR_USE_INDEX}" | sed "s#'#'\"'\"'#g;s#.*#par_use_index='&'#" ; else echo "# par_use_index="; fi )
$( if [ ! -z ${VIASH_PAR_OUTPUT+x} ]; then echo "${VIASH_PAR_OUTPUT}" | sed "s#'#'\"'\"'#g;s#.*#par_output='&'#" ; else echo "# par_output="; fi )
$( if [ ! -z ${VIASH_PAR_BAM+x} ]; then echo "${VIASH_PAR_BAM}" | sed "s#'#'\"'\"'#g;s#.*#par_bam='&'#" ; else echo "# par_bam="; fi )
$( if [ ! -z ${VIASH_PAR_CRAM+x} ]; then echo "${VIASH_PAR_CRAM}" | sed "s#'#'\"'\"'#g;s#.*#par_cram='&'#" ; else echo "# par_cram="; fi )
$( if [ ! -z ${VIASH_PAR_FAST+x} ]; then echo "${VIASH_PAR_FAST}" | sed "s#'#'\"'\"'#g;s#.*#par_fast='&'#" ; else echo "# par_fast="; fi )
$( if [ ! -z ${VIASH_PAR_UNCOMPRESSED+x} ]; then echo "${VIASH_PAR_UNCOMPRESSED}" | sed "s#'#'\"'\"'#g;s#.*#par_uncompressed='&'#" ; else echo "# par_uncompressed="; fi )
$( if [ ! -z ${VIASH_PAR_WITH_HEADER+x} ]; then echo "${VIASH_PAR_WITH_HEADER}" | sed "s#'#'\"'\"'#g;s#.*#par_with_header='&'#" ; else echo "# par_with_header="; fi )
$( if [ ! -z ${VIASH_PAR_HEADER_ONLY+x} ]; then echo "${VIASH_PAR_HEADER_ONLY}" | sed "s#'#'\"'\"'#g;s#.*#par_header_only='&'#" ; else echo "# par_header_only="; fi )
$( if [ ! -z ${VIASH_PAR_NO_HEADER+x} ]; then echo "${VIASH_PAR_NO_HEADER}" | sed "s#'#'\"'\"'#g;s#.*#par_no_header='&'#" ; else echo "# par_no_header="; fi )
$( if [ ! -z ${VIASH_PAR_COUNT+x} ]; then echo "${VIASH_PAR_COUNT}" | sed "s#'#'\"'\"'#g;s#.*#par_count='&'#" ; else echo "# par_count="; fi )
$( if [ ! -z ${VIASH_PAR_OUTPUT_UNSELECTED+x} ]; then echo "${VIASH_PAR_OUTPUT_UNSELECTED}" | sed "s#'#'\"'\"'#g;s#.*#par_output_unselected='&'#" ; else echo "# par_output_unselected="; fi )
$( if [ ! -z ${VIASH_PAR_UNMAP+x} ]; then echo "${VIASH_PAR_UNMAP}" | sed "s#'#'\"'\"'#g;s#.*#par_unmap='&'#" ; else echo "# par_unmap="; fi )
$( if [ ! -z ${VIASH_PAR_READ_GROUP+x} ]; then echo "${VIASH_PAR_READ_GROUP}" | sed "s#'#'\"'\"'#g;s#.*#par_read_group='&'#" ; else echo "# par_read_group="; fi )
$( if [ ! -z ${VIASH_PAR_TAG+x} ]; then echo "${VIASH_PAR_TAG}" | sed "s#'#'\"'\"'#g;s#.*#par_tag='&'#" ; else echo "# par_tag="; fi )
$( if [ ! -z ${VIASH_PAR_TAG_FILE+x} ]; then echo "${VIASH_PAR_TAG_FILE}" | sed "s#'#'\"'\"'#g;s#.*#par_tag_file='&'#" ; else echo "# par_tag_file="; fi )
$( if [ ! -z ${VIASH_PAR_MIN_MQ+x} ]; then echo "${VIASH_PAR_MIN_MQ}" | sed "s#'#'\"'\"'#g;s#.*#par_min_MQ='&'#" ; else echo "# par_min_MQ="; fi )
$( if [ ! -z ${VIASH_PAR_LIBRARY+x} ]; then echo "${VIASH_PAR_LIBRARY}" | sed "s#'#'\"'\"'#g;s#.*#par_library='&'#" ; else echo "# par_library="; fi )
$( if [ ! -z ${VIASH_PAR_MIN_QLEN+x} ]; then echo "${VIASH_PAR_MIN_QLEN}" | sed "s#'#'\"'\"'#g;s#.*#par_min_qlen='&'#" ; else echo "# par_min_qlen="; fi )
$( if [ ! -z ${VIASH_PAR_EXPR+x} ]; then echo "${VIASH_PAR_EXPR}" | sed "s#'#'\"'\"'#g;s#.*#par_expr='&'#" ; else echo "# par_expr="; fi )
$( if [ ! -z ${VIASH_PAR_REQUIRE_FLAGS+x} ]; then echo "${VIASH_PAR_REQUIRE_FLAGS}" | sed "s#'#'\"'\"'#g;s#.*#par_require_flags='&'#" ; else echo "# par_require_flags="; fi )
$( if [ ! -z ${VIASH_PAR_EXCL_FLAGS+x} ]; then echo "${VIASH_PAR_EXCL_FLAGS}" | sed "s#'#'\"'\"'#g;s#.*#par_excl_flags='&'#" ; else echo "# par_excl_flags="; fi )
$( if [ ! -z ${VIASH_PAR_EXCL_ALL_FLAGS+x} ]; then echo "${VIASH_PAR_EXCL_ALL_FLAGS}" | sed "s#'#'\"'\"'#g;s#.*#par_excl_all_flags='&'#" ; else echo "# par_excl_all_flags="; fi )
$( if [ ! -z ${VIASH_PAR_INCL_FLAGS+x} ]; then echo "${VIASH_PAR_INCL_FLAGS}" | sed "s#'#'\"'\"'#g;s#.*#par_incl_flags='&'#" ; else echo "# par_incl_flags="; fi )
$( if [ ! -z ${VIASH_PAR_REMOVE_TAG+x} ]; then echo "${VIASH_PAR_REMOVE_TAG}" | sed "s#'#'\"'\"'#g;s#.*#par_remove_tag='&'#" ; else echo "# par_remove_tag="; fi )
$( if [ ! -z ${VIASH_PAR_KEEP_TAG+x} ]; then echo "${VIASH_PAR_KEEP_TAG}" | sed "s#'#'\"'\"'#g;s#.*#par_keep_tag='&'#" ; else echo "# par_keep_tag="; fi )
$( if [ ! -z ${VIASH_PAR_REMOVE_B+x} ]; then echo "${VIASH_PAR_REMOVE_B}" | sed "s#'#'\"'\"'#g;s#.*#par_remove_B='&'#" ; else echo "# par_remove_B="; fi )
$( if [ ! -z ${VIASH_PAR_ADD_FLAGS+x} ]; then echo "${VIASH_PAR_ADD_FLAGS}" | sed "s#'#'\"'\"'#g;s#.*#par_add_flags='&'#" ; else echo "# par_add_flags="; fi )
$( if [ ! -z ${VIASH_PAR_REMOVE_FLAGS+x} ]; then echo "${VIASH_PAR_REMOVE_FLAGS}" | sed "s#'#'\"'\"'#g;s#.*#par_remove_flags='&'#" ; else echo "# par_remove_flags="; fi )
$( if [ ! -z ${VIASH_PAR_SUBSAMPLE+x} ]; then echo "${VIASH_PAR_SUBSAMPLE}" | sed "s#'#'\"'\"'#g;s#.*#par_subsample='&'#" ; else echo "# par_subsample="; fi )
$( if [ ! -z ${VIASH_PAR_SUBSAMPLE_SEED+x} ]; then echo "${VIASH_PAR_SUBSAMPLE_SEED}" | sed "s#'#'\"'\"'#g;s#.*#par_subsample_seed='&'#" ; else echo "# par_subsample_seed="; fi )
$( if [ ! -z ${VIASH_PAR_FETCH_PAIRS+x} ]; then echo "${VIASH_PAR_FETCH_PAIRS}" | sed "s#'#'\"'\"'#g;s#.*#par_fetch_pairs='&'#" ; else echo "# par_fetch_pairs="; fi )
$( if [ ! -z ${VIASH_PAR_CUSTOMIZED_INDEX+x} ]; then echo "${VIASH_PAR_CUSTOMIZED_INDEX}" | sed "s#'#'\"'\"'#g;s#.*#par_customized_index='&'#" ; else echo "# par_customized_index="; fi )
$( if [ ! -z ${VIASH_PAR_SANITIZE+x} ]; then echo "${VIASH_PAR_SANITIZE}" | sed "s#'#'\"'\"'#g;s#.*#par_sanitize='&'#" ; else echo "# par_sanitize="; fi )
$( if [ ! -z ${VIASH_PAR_NO_PG+x} ]; then echo "${VIASH_PAR_NO_PG}" | sed "s#'#'\"'\"'#g;s#.*#par_no_PG='&'#" ; else echo "# par_no_PG="; fi )
$( if [ ! -z ${VIASH_PAR_INPUT_FMT_OPTION+x} ]; then echo "${VIASH_PAR_INPUT_FMT_OPTION}" | sed "s#'#'\"'\"'#g;s#.*#par_input_fmt_option='&'#" ; else echo "# par_input_fmt_option="; fi )
$( if [ ! -z ${VIASH_PAR_OUTPUT_FMT+x} ]; then echo "${VIASH_PAR_OUTPUT_FMT}" | sed "s#'#'\"'\"'#g;s#.*#par_output_fmt='&'#" ; else echo "# par_output_fmt="; fi )
$( if [ ! -z ${VIASH_PAR_OUTPUT_FMT_OPTION+x} ]; then echo "${VIASH_PAR_OUTPUT_FMT_OPTION}" | sed "s#'#'\"'\"'#g;s#.*#par_output_fmt_option='&'#" ; else echo "# par_output_fmt_option="; fi )
$( if [ ! -z ${VIASH_PAR_WRITE_INDEX+x} ]; then echo "${VIASH_PAR_WRITE_INDEX}" | sed "s#'#'\"'\"'#g;s#.*#par_write_index='&'#" ; else echo "# par_write_index="; fi )
$( if [ ! -z ${VIASH_META_NAME+x} ]; then echo "${VIASH_META_NAME}" | sed "s#'#'\"'\"'#g;s#.*#meta_name='&'#" ; else echo "# meta_name="; fi )
$( if [ ! -z ${VIASH_META_FUNCTIONALITY_NAME+x} ]; then echo "${VIASH_META_FUNCTIONALITY_NAME}" | sed "s#'#'\"'\"'#g;s#.*#meta_functionality_name='&'#" ; else echo "# meta_functionality_name="; fi )
$( if [ ! -z ${VIASH_META_RESOURCES_DIR+x} ]; then echo "${VIASH_META_RESOURCES_DIR}" | sed "s#'#'\"'\"'#g;s#.*#meta_resources_dir='&'#" ; else echo "# meta_resources_dir="; fi )
$( if [ ! -z ${VIASH_META_EXECUTABLE+x} ]; then echo "${VIASH_META_EXECUTABLE}" | sed "s#'#'\"'\"'#g;s#.*#meta_executable='&'#" ; else echo "# meta_executable="; fi )
$( if [ ! -z ${VIASH_META_CONFIG+x} ]; then echo "${VIASH_META_CONFIG}" | sed "s#'#'\"'\"'#g;s#.*#meta_config='&'#" ; else echo "# meta_config="; fi )
$( if [ ! -z ${VIASH_META_TEMP_DIR+x} ]; then echo "${VIASH_META_TEMP_DIR}" | sed "s#'#'\"'\"'#g;s#.*#meta_temp_dir='&'#" ; else echo "# meta_temp_dir="; fi )
$( if [ ! -z ${VIASH_META_CPUS+x} ]; then echo "${VIASH_META_CPUS}" | sed "s#'#'\"'\"'#g;s#.*#meta_cpus='&'#" ; else echo "# meta_cpus="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_B+x} ]; then echo "${VIASH_META_MEMORY_B}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_b='&'#" ; else echo "# meta_memory_b="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_KB+x} ]; then echo "${VIASH_META_MEMORY_KB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_kb='&'#" ; else echo "# meta_memory_kb="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_MB+x} ]; then echo "${VIASH_META_MEMORY_MB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_mb='&'#" ; else echo "# meta_memory_mb="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_GB+x} ]; then echo "${VIASH_META_MEMORY_GB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_gb='&'#" ; else echo "# meta_memory_gb="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_TB+x} ]; then echo "${VIASH_META_MEMORY_TB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_tb='&'#" ; else echo "# meta_memory_tb="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_PB+x} ]; then echo "${VIASH_META_MEMORY_PB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_pb='&'#" ; else echo "# meta_memory_pb="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_KIB+x} ]; then echo "${VIASH_META_MEMORY_KIB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_kib='&'#" ; else echo "# meta_memory_kib="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_MIB+x} ]; then echo "${VIASH_META_MEMORY_MIB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_mib='&'#" ; else echo "# meta_memory_mib="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_GIB+x} ]; then echo "${VIASH_META_MEMORY_GIB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_gib='&'#" ; else echo "# meta_memory_gib="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_TIB+x} ]; then echo "${VIASH_META_MEMORY_TIB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_tib='&'#" ; else echo "# meta_memory_tib="; fi )
$( if [ ! -z ${VIASH_META_MEMORY_PIB+x} ]; then echo "${VIASH_META_MEMORY_PIB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_pib='&'#" ; else echo "# meta_memory_pib="; fi )

## VIASH END

set -e

[[ "\$par_bam" == "false" ]] && unset par_bam
[[ "\$par_cram" == "false" ]] && unset par_cram
[[ "\$par_fast" == "false" ]] && unset par_fast
[[ "\$par_uncompressed" == "false" ]] && unset par_uncompressed
[[ "\$par_with_header" == "false" ]] && unset par_with_header
[[ "\$par_header_only" == "false" ]] && unset par_header_only
[[ "\$par_no_header" == "false" ]] && unset par_no_header
[[ "\$par_count" == "false" ]] && unset par_count
[[ "\$par_unmap" == "false" ]] && unset par_unmap
[[ "\$par_use_index" == "false" ]] && unset par_use_index
[[ "\$par_fetch_pairs" == "false" ]] && unset par_fetch_pairs
[[ "\$par_customized_index" == "false" ]] && unset par_customized_index
[[ "\$par_no_PG" == "false" ]] && unset par_no_PG
[[ "\$par_write_index" == "false" ]] && unset par_write_index
[[ "\$par_remove_B" == "false" ]] && unset par_remove_B

samtools view \\
    \${par_bam:+-b} \\
    \${par_cram:+-C} \\
    \${par_fast:+--fast} \\
    \${par_uncompressed:+-u} \\
    \${par_with_header:+--with-header} \\
    \${par_header_only:+-H} \\
    \${par_no_header:+--no-header} \\
    \${par_count:+-c} \\
    \${par_output:+-o "\$par_output"} \\
    \${par_output_unselected:+-U "\$par_output_unselected"} \\
    \${par_unmap:+-p "\$par_unmap"} \\
    \${par_fetch_pairs:+-P "\$par_fetch_pairs"} \\
    \${par_fai_reference:+-t "\$par_fai_reference"} \\
    \${par_use_index:+-M "\$par_use_index"} \\
    \${par_region_file:+--region-file "\$par_region_file"} \\
    \${par_customized_index:+-X} \\
    \${par_target_file:+-L "\$par_target_file"} \\
    \${par_qname_file:+-N "\$par_qname_file"} \\
    \${par_read_group:+-r "\$par_read_group"} \\
    \${par_read_group_file:+-R "\$par_read_group_file"} \\
    \${par_tag:+-d "\$par_tag"} \\
    \${par_tag_file:+-D "\$par_tag_file"} \\
    \${par_min_MQ:+-q "\$par_min_MQ"} \\
    \${par_library:+-l "\$par_library"} \\
    \${par_min_qlen:+-m "\$par_min_qlen"} \\
    \${par_expr:+-e "\$par_expr"} \\
    \${par_require_flags:+-f "\$par_require_flags"} \\
    \${par_excl_flags:+-F "\$par_excl_flags"} \\
    \${par_incl_flags:+--rf "\$par_incl_flags"} \\
    \${par_excl_all_flags:+-G "\$par_excl_all_flags"} \\
    \${par_subsample:+--subsample "\$par_subsample"} \\
    \${par_subsample_seed:+--subsample-seed "\$par_subsample_seed"} \\
    \${par_add_flags:+--add-flags "\$par_add_flags"} \\
    \${par_remove_flags:+--remove-flags "\$par_remove_flags"} \\
    \${par_remove_tag:+-x "\$par_remove_tag"} \\
    \${par_keep_tag:+--keep-tag "\$par_keep_tag"} \\
    \${par_remove_B:+-B} \\
    \${par_sanitize:+-z "\$par_sanitize"} \\
    \${par_input_fmt_option:+--input-fmt-option "\$par_input_fmt_option"} \\
    \${par_output_fmt:+-O "\$par_output_fmt"} \\
    \${par_output_fmt_option:+--output-fmt-option "\$par_output_fmt_option"} \\
    \${par_reference:+-T "\$par_reference"} \\
    \${par_write_index:+--write-index} \\
    \${par_no_PG:+--no-PG} \\
    "\$par_input"

exit 0
VIASHMAIN
bash "\$tempscript" &
wait "\$!"

VIASHEOF


if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then
  # strip viash automount from file paths
  
  if [ ! -z "$VIASH_PAR_INPUT" ]; then
    VIASH_PAR_INPUT=$(ViashDockerStripAutomount "$VIASH_PAR_INPUT")
  fi
  if [ ! -z "$VIASH_PAR_FAI_REFERENCE" ]; then
    VIASH_PAR_FAI_REFERENCE=$(ViashDockerStripAutomount "$VIASH_PAR_FAI_REFERENCE")
  fi
  if [ ! -z "$VIASH_PAR_REFERENCE" ]; then
    VIASH_PAR_REFERENCE=$(ViashDockerStripAutomount "$VIASH_PAR_REFERENCE")
  fi
  if [ ! -z "$VIASH_PAR_TARGET_FILE" ]; then
    VIASH_PAR_TARGET_FILE=$(ViashDockerStripAutomount "$VIASH_PAR_TARGET_FILE")
  fi
  if [ ! -z "$VIASH_PAR_REGION_FILE" ]; then
    VIASH_PAR_REGION_FILE=$(ViashDockerStripAutomount "$VIASH_PAR_REGION_FILE")
  fi
  if [ ! -z "$VIASH_PAR_QNAME_FILE" ]; then
    VIASH_PAR_QNAME_FILE=$(ViashDockerStripAutomount "$VIASH_PAR_QNAME_FILE")
  fi
  if [ ! -z "$VIASH_PAR_READ_GROUP_FILE" ]; then
    VIASH_PAR_READ_GROUP_FILE=$(ViashDockerStripAutomount "$VIASH_PAR_READ_GROUP_FILE")
  fi
  if [ ! -z "$VIASH_PAR_OUTPUT" ]; then
    VIASH_PAR_OUTPUT=$(ViashDockerStripAutomount "$VIASH_PAR_OUTPUT")
  fi
  if [ ! -z "$VIASH_PAR_OUTPUT_UNSELECTED" ]; then
    VIASH_PAR_OUTPUT_UNSELECTED=$(ViashDockerStripAutomount "$VIASH_PAR_OUTPUT_UNSELECTED")
  fi
  if [ ! -z "$VIASH_PAR_TAG_FILE" ]; then
    VIASH_PAR_TAG_FILE=$(ViashDockerStripAutomount "$VIASH_PAR_TAG_FILE")
  fi
  if [ ! -z "$VIASH_META_RESOURCES_DIR" ]; then
    VIASH_META_RESOURCES_DIR=$(ViashDockerStripAutomount "$VIASH_META_RESOURCES_DIR")
  fi
  if [ ! -z "$VIASH_META_EXECUTABLE" ]; then
    VIASH_META_EXECUTABLE=$(ViashDockerStripAutomount "$VIASH_META_EXECUTABLE")
  fi
  if [ ! -z "$VIASH_META_CONFIG" ]; then
    VIASH_META_CONFIG=$(ViashDockerStripAutomount "$VIASH_META_CONFIG")
  fi
  if [ ! -z "$VIASH_META_TEMP_DIR" ]; then
    VIASH_META_TEMP_DIR=$(ViashDockerStripAutomount "$VIASH_META_TEMP_DIR")
  fi
fi


# check whether required files exist
if [ ! -z "$VIASH_PAR_OUTPUT" ] && [ ! -e "$VIASH_PAR_OUTPUT" ]; then
  ViashError "Output file '$VIASH_PAR_OUTPUT' does not exist."
  exit 1
fi


exit 0
