Introduction
The below code is written for the Agriculture Victoria BASC computing
cluster.
This workflow currently only works with insect COI sequencing using a
single primer set
Clone the pipeRline github repository
# Define the directory you will be running the analysis in
working_dir=/group/pathogens/IAWS/Personal/Alexp/metabarcoding/marine_surveillance #CHANGE TO YOUR DIRECTORY
git clone https://github.com/alexpiper/piperline.git $working_dir
cd $working_dir
Updating the pipeline
To update to the latest version of the pipeline, run the below code
in the terminal.
cd $working_dir
git pull
# if an error occurs, run:
git stash
git pull
Prior to analysis
The PipeRline workflow assumes that your sequencing data meets
certain criteria:
- Samples have been demultiplexed, i.e. split into individual
per-sample fastq files. If you want the pipeline to calculate the
index-switching rate, the fastq files need to be re-demultiplexed as the
miseq does not put indexes in fasta headers by default
- For paired-end sequencing data, the forward and reverse reads are in
separate files (ie. not interleaved) with reads arranged in matched
order.
The output directory should be unique for each sequencing run, named
as the flowcell id, within a directory called data
For example:
root/
├── data/
├── CJL7D/
Demultiplex MiSeq run
For this workflow to run, we will need some sequencing runs to work
with. If you are working with MiSeq data, it is recommended that the
data is demultiplexed again using bcl2fastq, as the miseq does not put
indexes in fasta headers by default which is required for the index
swtiching calculation.
The below code is written for the Agriculture Victoria BASC computing
cluster, and the locations will be different if you are using a
different HPC cluster.
#load module
module load bcl2fastq2/2.20.0-foss-2018b
#raise amount of available file handles
ulimit -n 4000
###Run1
#Set up input and outputs
inputdir=/group/sequencing/210219_M03633_0489_000000000-JDYG3 #CHANGE TO YOUR SEQ RUN
fcid=$(echo $input_dir | sed 's/^.*-//')
outputdir=$working_dir/data/$fcid
samplesheet=$input_dir/SampleSheet.csv
# convert samplesheet to unix format
dos2unix $samplesheet
#Demultiplex
bcl2fastq -p 12 --runfolder-dir $input_dir \
--output-dir $outputdir \
--sample-sheet $samplesheet \
--no-lane-splitting --barcode-mismatches 1
# Copy other necessary files and move fastqs
cd $outputdir
cp -r $input_dir/InterOp $outputdir
cp $input_dir/RunInfo.xml $outputdir
cp $input_dir/[Rr]unParameters.xml $outputdir
cp $samplesheet $outputdir
mv **/*.fastq.gz $outputdir
# Append fcid to start of sample names if missing
for i in *.fastq.gz; do
if ! [[ $i == $fcid* ]]; then
new=$(echo ${fcid} ${i}) #append together
new=$(echo ${new// /_}) #remove any white space
mv -v "$i" "$new"
fi
done
Reference databases
The pipeRline workflow uses the IDTAXA
and BLAST software to assign taxonomy to the sequence reads. These
require a pre-trained IDTAXA model, and a fasta file with heirarchial
taxonomy. For insects, these
Copy reference databases
Reference databases are stored in the referencedata directory on
BASC
# Change 'folder-name' to the directory you are running the analysis in
cp /group/referencedata/mspd-db/metabarcoding/arthropod/imappests_coi_18_08_2020/* $working_dir/reference/.
Submit job with parameters
The parameters for the run are parsed along with the slurm
script.
if you wish to use multiple values (i.e. multiple reference
databases, multiple primers per index) encapsulate them in a ’’ and
seperate them with a ;
You will need to change your email address and account code
below, see BASC
account code lists
# Change 'folder-name' to the directory you are running the analysis in
cd $working_dir
# Submit slurm job - CHANGE EMAIL TO YOUR OWN EMAIL
sbatch --mail-user=your.name@email.com --account=your.account --cpus-per-task=10 \
supplementary_scripts/basc_shifter.slurm \
--pcr_primers fwhF2-fwhR2n \
--for_primer_seq GGDACWGGWTGAACWGTWTAYCCHCC \
--rev_primer_seq GTRATWGCHCCDGCTARWACWGG \
--target_gene COI \
--max_primer_mismatch 0 \
--read_min_length 20 \
--read_max_length Inf \
--read_max_ee 1 \
--read_trunc_length 150 \
--read_trim_left 0 \
--read_trim_right 0 \
--asv_min_length 195 \
--asv_max_length 215 \
--high_sensitivity TRUE \
--concat_unmerged FALSE \
--genetic_code SGC4 \
--coding TRUE \
--phmm reference/folmer_fullength_model.rds \
--idtaxa_db reference/idtaxa_bftrimmed.rds \
--ref_fasta reference/insecta_hierarchial_bftrimmed.fa.gz \
--idtaxa_confidence 60 \
--run_blast TRUE \
--blast_min_identity 97 \
--blast_min_coverage 90 \
--target_kingdom Metazoa \
--target_phylum Arthropoda \
--target_class NA \
--target_order NA \
--target_family NA \
--target_genus NA \
--target_species NA \
--min_sample_reads 1000 \
--min_taxa_reads NA \
--min_taxa_ra 1e-4 \
--start_fresh FALSE
Parameter descriptions
- Primer parameters:
- pcr_primers - Name of PCR primers
- for_primer_seq - Forward primer sequence
- rev_primer_seq - Reverse primer sequence
- target_gene - Name of target gene
- max_primer_mismatch - How much mismatch to allow
when detecting primer sequences
- Read filtering:
- read_min_length - Minimum length of primer trimmed
reads
- read_max_length - Maximum length of primer trimmed
reads
- read_max_ee - Maximum expected errors of primer
trimmed reads
- read_trunc_length - Length to cut all longer reads
to
- read_trim_left - Remove this many bp from left side
of primer trimmed reads
- read_trim_right - Remove this many bp from right
side of primer trimmed reads
- ASV filtering
- asv_min_length - Minimum length of amplicon
- asv_max_length - Maximum length of amplicon
- high_sensitivity - Option to turn on pseudo pooling,
setting this to FALSE greatly speeds up ASV inference at the expense of
detecting fewer rare (<5 reads) taxa.
- concat_unmerged - Retain any unmerged read pairs by
concatenating them together separated by a string of 10 N bases
- genetic_code - Genetic code for amplicon - see
Biostrings::GENETIC_CODE_TABLE
- coding - Is the amplicon from a protein coding
gene
- phmm - Path to profile hidden markov model
(Optional)
- Taxonomic assignment:
- idtaxa_db - Path to trained IDTAXA model
- ref_fasta - Path to fasta file of reference
database
- idtaxa_confidence - Minimum bootstrap confidence
for IDTAXA
- run_blast - Whether a blast top hit search should
be conducted in addition to IDTAXA
- blast_min_identity - Minimum nucleotide identity
for BLAST
- blast_min_coverage - Minimum query coverage for
BLAST
- target_kingdom - Subset to target kingdom
- target_phylum - Subset to target phylum
- target_class - Subset to target class
- target_order - Subset to target order
- target_family - Subset to target family
- target_genus - Subset to target genus
- target_species - Subset to target species
- Sample & Taxon filtering:
- min_sample_reads - Minimum reads per sample after
filtering
- min_taxa_reads - Minimum reads per ASV to
retain
- min_taxa_ra - Minimum relative abundance per ASV to
retain. 1e-4 is 0.01%
- General pipeline parameters
- threads - Number of CPU threads to run the pipeline
across - NOT USED FOR BASC
- start_fresh - Whether to remove all intermediate
files and start the pipeline fresh
LS0tDQp0aXRsZTogIlBpcGVSbGluZSINCnN1YnRpdGxlOiAiQkFTQyBleGFtcGxlIHVzaW5nIFNMVVJNIg0KYXV0aG9yOiAiQS5NLiBQaXBlciINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgaGlnaGxpZ2h0ZXI6IG51bGwNCiAgICB0aGVtZTogImZsYXRseSINCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQgICAgDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBLbml0ciBnbG9iYWwgc2V0dXAgLSBjaGFuZ2UgZXZhbCB0byB0cnVlIHRvIHJ1biBjb2RlDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh0YXJnZXRzKQ0KbGlicmFyeSh0YXJjaGV0eXBlcykNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGVycm9yPUZBTFNFLCBmaWcuc2hvdyA9ICJob2xkIiwgZmlnLmtlZXAgPSAiYWxsIikNCm9wdHNfY2h1bmskc2V0KGRldiA9ICdwbmcnKQ0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQoNClRoZSBiZWxvdyBjb2RlIGlzIHdyaXR0ZW4gZm9yIHRoZSBBZ3JpY3VsdHVyZSBWaWN0b3JpYSBCQVNDIGNvbXB1dGluZyBjbHVzdGVyLg0KDQpUaGlzIHdvcmtmbG93IGN1cnJlbnRseSBvbmx5IHdvcmtzIHdpdGggaW5zZWN0IENPSSBzZXF1ZW5jaW5nIHVzaW5nIGEgc2luZ2xlIHByaW1lciBzZXQNCg0KIyBDbG9uZSB0aGUgcGlwZVJsaW5lIGdpdGh1YiByZXBvc2l0b3J5DQoNCmBgYHtiYXNofQ0KIyBEZWZpbmUgdGhlIGRpcmVjdG9yeSB5b3Ugd2lsbCBiZSBydW5uaW5nIHRoZSBhbmFseXNpcyBpbg0Kd29ya2luZ19kaXI9L2dyb3VwL3BhdGhvZ2Vucy9JQVdTL1BlcnNvbmFsL0FsZXhwL21ldGFiYXJjb2RpbmcvbWFyaW5lX3N1cnZlaWxsYW5jZSAjQ0hBTkdFIFRPIFlPVVIgRElSRUNUT1JZDQoNCmdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYWxleHBpcGVyL3BpcGVybGluZS5naXQgJHdvcmtpbmdfZGlyDQpjZCAkd29ya2luZ19kaXINCmBgYA0KDQoNCiMjIFVwZGF0aW5nIHRoZSBwaXBlbGluZQ0KDQpUbyB1cGRhdGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwaXBlbGluZSwgcnVuIHRoZSBiZWxvdyBjb2RlIGluIHRoZSB0ZXJtaW5hbC4NCg0KYGBge2Jhc2h9DQpjZCAkd29ya2luZ19kaXINCmdpdCBwdWxsDQoNCiMgaWYgYW4gZXJyb3Igb2NjdXJzLCBydW46DQpnaXQgc3Rhc2gNCmdpdCBwdWxsDQpgYGANCg0KDQojIFByaW9yIHRvIGFuYWx5c2lzDQpUaGUgUGlwZVJsaW5lIHdvcmtmbG93IGFzc3VtZXMgdGhhdCB5b3VyIHNlcXVlbmNpbmcgZGF0YSBtZWV0cyBjZXJ0YWluIGNyaXRlcmlhOg0KDQoxLiBTYW1wbGVzIGhhdmUgYmVlbiBkZW11bHRpcGxleGVkLCBpLmUuIHNwbGl0IGludG8gaW5kaXZpZHVhbCBwZXItc2FtcGxlIGZhc3RxIGZpbGVzLiBJZiB5b3Ugd2FudCB0aGUgcGlwZWxpbmUgdG8gY2FsY3VsYXRlIHRoZSBpbmRleC1zd2l0Y2hpbmcgcmF0ZSwgdGhlIGZhc3RxIGZpbGVzIG5lZWQgdG8gYmUgcmUtZGVtdWx0aXBsZXhlZCBhcyB0aGUgbWlzZXEgZG9lcyBub3QgcHV0IGluZGV4ZXMgaW4gZmFzdGEgaGVhZGVycyBieSBkZWZhdWx0DQoyLiBGb3IgcGFpcmVkLWVuZCBzZXF1ZW5jaW5nIGRhdGEsIHRoZSBmb3J3YXJkIGFuZCByZXZlcnNlIHJlYWRzIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcyAoaWUuIG5vdCBpbnRlcmxlYXZlZCkgd2l0aCByZWFkcyBhcnJhbmdlZCBpbiBtYXRjaGVkIG9yZGVyLg0KDQpUaGUgb3V0cHV0IGRpcmVjdG9yeSBzaG91bGQgYmUgdW5pcXVlIGZvciBlYWNoIHNlcXVlbmNpbmcgcnVuLCBuYW1lZCBhcyB0aGUgZmxvd2NlbGwgaWQsIHdpdGhpbiBhIGRpcmVjdG9yeSBjYWxsZWQgZGF0YQ0KDQpGb3IgZXhhbXBsZToNCg0KICAgIHJvb3QvDQogICAgICDilJzilIDilIAgZGF0YS8NCiAgICAgICAgIOKUnOKUgOKUgCBDSkw3RC8NCiAgICAgICAgIA0KICAgICAgICAgDQojIERlbXVsdGlwbGV4IE1pU2VxIHJ1bg0KDQpGb3IgdGhpcyB3b3JrZmxvdyB0byBydW4sIHdlIHdpbGwgbmVlZCBzb21lIHNlcXVlbmNpbmcgcnVucyB0byB3b3JrIHdpdGguIElmIHlvdSBhcmUgd29ya2luZyB3aXRoIE1pU2VxIGRhdGEsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGRhdGEgaXMgZGVtdWx0aXBsZXhlZCBhZ2FpbiB1c2luZyBiY2wyZmFzdHEsIGFzIHRoZSBtaXNlcSBkb2VzIG5vdCBwdXQgaW5kZXhlcyBpbiBmYXN0YSBoZWFkZXJzIGJ5IGRlZmF1bHQgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHRoZSBpbmRleCBzd3RpY2hpbmcgY2FsY3VsYXRpb24uDQoNClRoZSBiZWxvdyBjb2RlIGlzIHdyaXR0ZW4gZm9yIHRoZSBBZ3JpY3VsdHVyZSBWaWN0b3JpYSBCQVNDIGNvbXB1dGluZyBjbHVzdGVyLCBhbmQgdGhlIGxvY2F0aW9ucyB3aWxsIGJlIGRpZmZlcmVudCBpZiB5b3UgYXJlIHVzaW5nIGEgZGlmZmVyZW50IEhQQyBjbHVzdGVyLg0KDQpgYGB7YmFzaCBkZW11bHRpcGxleCAxIG1pc21hdGNofQ0KI2xvYWQgbW9kdWxlDQptb2R1bGUgbG9hZCBiY2wyZmFzdHEyLzIuMjAuMC1mb3NzLTIwMThiDQoNCiNyYWlzZSBhbW91bnQgb2YgYXZhaWxhYmxlIGZpbGUgaGFuZGxlcw0KdWxpbWl0IC1uIDQwMDANCg0KIyMjUnVuMQ0KDQojU2V0IHVwIGlucHV0IGFuZCBvdXRwdXRzDQppbnB1dGRpcj0vZ3JvdXAvc2VxdWVuY2luZy8yMTAyMTlfTTAzNjMzXzA0ODlfMDAwMDAwMDAwLUpEWUczICNDSEFOR0UgVE8gWU9VUiBTRVEgUlVODQoNCmZjaWQ9JChlY2hvICRpbnB1dF9kaXIgfCBzZWQgJ3MvXi4qLS8vJykNCm91dHB1dGRpcj0kd29ya2luZ19kaXIvZGF0YS8kZmNpZA0Kc2FtcGxlc2hlZXQ9JGlucHV0X2Rpci9TYW1wbGVTaGVldC5jc3YNCg0KIyBjb252ZXJ0IHNhbXBsZXNoZWV0IHRvIHVuaXggZm9ybWF0DQpkb3MydW5peCAkc2FtcGxlc2hlZXQNCg0KI0RlbXVsdGlwbGV4DQpiY2wyZmFzdHEgLXAgMTIgLS1ydW5mb2xkZXItZGlyICRpbnB1dF9kaXIgXA0KLS1vdXRwdXQtZGlyICRvdXRwdXRkaXIgXA0KLS1zYW1wbGUtc2hlZXQgJHNhbXBsZXNoZWV0IFwNCi0tbm8tbGFuZS1zcGxpdHRpbmcgLS1iYXJjb2RlLW1pc21hdGNoZXMgMQ0KDQojIENvcHkgb3RoZXIgbmVjZXNzYXJ5IGZpbGVzIGFuZCBtb3ZlIGZhc3Rxcw0KY2QgJG91dHB1dGRpcg0KY3AgLXIgJGlucHV0X2Rpci9JbnRlck9wICRvdXRwdXRkaXINCmNwICRpbnB1dF9kaXIvUnVuSW5mby54bWwgJG91dHB1dGRpcg0KY3AgJGlucHV0X2Rpci9bUnJddW5QYXJhbWV0ZXJzLnhtbCAkb3V0cHV0ZGlyDQpjcCAkc2FtcGxlc2hlZXQgJG91dHB1dGRpcg0KbXYgKiovKi5mYXN0cS5neiAkb3V0cHV0ZGlyDQoNCiMgQXBwZW5kIGZjaWQgdG8gc3RhcnQgb2Ygc2FtcGxlIG5hbWVzIGlmIG1pc3NpbmcNCmZvciBpIGluICouZmFzdHEuZ3o7IGRvDQogIGlmICEgW1sgJGkgPT0gJGZjaWQqIF1dOyB0aGVuDQogIG5ldz0kKGVjaG8gJHtmY2lkfSAke2l9KSAjYXBwZW5kIHRvZ2V0aGVyDQogIG5ldz0kKGVjaG8gJHtuZXcvLyAvX30pICNyZW1vdmUgYW55IHdoaXRlIHNwYWNlDQogIG12IC12ICIkaSIgIiRuZXciDQogIGZpDQpkb25lDQoNCmBgYA0KDQojIFJlZmVyZW5jZSBkYXRhYmFzZXMgDQoNClRoZSBwaXBlUmxpbmUgd29ya2Zsb3cgdXNlcyB0aGUgW0lEVEFYQV0oaHR0cHM6Ly9taWNyb2Jpb21lam91cm5hbC5iaW9tZWRjZW50cmFsLmNvbS9hcnRpY2xlcy8xMC4xMTg2L3M0MDE2OC0wMTgtMDUyMS01KSBhbmQgQkxBU1Qgc29mdHdhcmUgdG8gYXNzaWduIHRheG9ub215IHRvIHRoZSBzZXF1ZW5jZSByZWFkcy4gVGhlc2UgcmVxdWlyZSBhIHByZS10cmFpbmVkIElEVEFYQSBtb2RlbCwgYW5kIGEgZmFzdGEgZmlsZSB3aXRoIGhlaXJhcmNoaWFsIHRheG9ub215LiBGb3IgaW5zZWN0cywgdGhlc2UgDQoNCiMjIENvcHkgcmVmZXJlbmNlIGRhdGFiYXNlcw0KDQpSZWZlcmVuY2UgZGF0YWJhc2VzIGFyZSBzdG9yZWQgaW4gdGhlIHJlZmVyZW5jZWRhdGEgZGlyZWN0b3J5IG9uIEJBU0MNCg0KYGBge2Jhc2h9DQojIENoYW5nZSAnZm9sZGVyLW5hbWUnIHRvIHRoZSBkaXJlY3RvcnkgeW91IGFyZSBydW5uaW5nIHRoZSBhbmFseXNpcyBpbg0KY3AgL2dyb3VwL3JlZmVyZW5jZWRhdGEvbXNwZC1kYi9tZXRhYmFyY29kaW5nL2FydGhyb3BvZC9pbWFwcGVzdHNfY29pXzE4XzA4XzIwMjAvKiAkd29ya2luZ19kaXIvcmVmZXJlbmNlLy4NCmBgYA0KDQojIFN1Ym1pdCBqb2Igd2l0aCBwYXJhbWV0ZXJzDQoNClRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcnVuIGFyZSBwYXJzZWQgYWxvbmcgd2l0aCB0aGUgc2x1cm0gc2NyaXB0Lg0KDQppZiB5b3Ugd2lzaCB0byB1c2UgbXVsdGlwbGUgdmFsdWVzIChpLmUuIG11bHRpcGxlIHJlZmVyZW5jZSBkYXRhYmFzZXMsIG11bHRpcGxlIHByaW1lcnMgcGVyIGluZGV4KSBlbmNhcHN1bGF0ZSB0aGVtIGluIGEgJycgYW5kIHNlcGVyYXRlIHRoZW0gd2l0aCBhIDsNCg0KKipZb3Ugd2lsbCBuZWVkIHRvIGNoYW5nZSB5b3VyIGVtYWlsIGFkZHJlc3MgYW5kIGFjY291bnQgY29kZSBiZWxvdywgc2VlIFtCQVNDIGFjY291bnQgY29kZSBsaXN0c10oaHR0cHM6Ly91c2Vycy5iYXNjLnNjaWVuY2UuZGVwaS52aWMuZ292LmF1L2pvYnMvc2x1cm0vc2x1cm1fYWNjb3VudHMvKSoqDQoNCmBgYHtiYXNofQ0KIyBDaGFuZ2UgJ2ZvbGRlci1uYW1lJyB0byB0aGUgZGlyZWN0b3J5IHlvdSBhcmUgcnVubmluZyB0aGUgYW5hbHlzaXMgaW4NCmNkICR3b3JraW5nX2Rpcg0KDQojIFN1Ym1pdCBzbHVybSBqb2IgLSBDSEFOR0UgRU1BSUwgVE8gWU9VUiBPV04gRU1BSUwNCnNiYXRjaCAtLW1haWwtdXNlcj15b3VyLm5hbWVAZW1haWwuY29tIC0tYWNjb3VudD15b3VyLmFjY291bnQgLS1jcHVzLXBlci10YXNrPTEwIFwNCnN1cHBsZW1lbnRhcnlfc2NyaXB0cy9iYXNjX3NoaWZ0ZXIuc2x1cm0gXA0KICAtLXBjcl9wcmltZXJzIGZ3aEYyLWZ3aFIybiBcDQogIC0tZm9yX3ByaW1lcl9zZXEgR0dEQUNXR0dXVEdBQUNXR1RXVEFZQ0NIQ0MgXA0KICAtLXJldl9wcmltZXJfc2VxIEdUUkFUV0dDSENDREdDVEFSV0FDV0dHIFwNCiAgLS10YXJnZXRfZ2VuZSBDT0kgXA0KICAtLW1heF9wcmltZXJfbWlzbWF0Y2ggMCBcDQogIC0tcmVhZF9taW5fbGVuZ3RoIDIwIFwNCiAgLS1yZWFkX21heF9sZW5ndGggSW5mIFwNCiAgLS1yZWFkX21heF9lZSAxIFwNCiAgLS1yZWFkX3RydW5jX2xlbmd0aCAxNTAgXA0KICAtLXJlYWRfdHJpbV9sZWZ0IDAgXA0KICAtLXJlYWRfdHJpbV9yaWdodCAwIFwNCiAgLS1hc3ZfbWluX2xlbmd0aCAxOTUgXA0KICAtLWFzdl9tYXhfbGVuZ3RoIDIxNSBcDQogIC0taGlnaF9zZW5zaXRpdml0eSBUUlVFIFwNCiAgLS1jb25jYXRfdW5tZXJnZWQgRkFMU0UgXA0KICAtLWdlbmV0aWNfY29kZSBTR0M0IFwNCiAgLS1jb2RpbmcgVFJVRSBcDQogIC0tcGhtbSByZWZlcmVuY2UvZm9sbWVyX2Z1bGxlbmd0aF9tb2RlbC5yZHMgXA0KICAtLWlkdGF4YV9kYiByZWZlcmVuY2UvaWR0YXhhX2JmdHJpbW1lZC5yZHMgXA0KICAtLXJlZl9mYXN0YSByZWZlcmVuY2UvaW5zZWN0YV9oaWVyYXJjaGlhbF9iZnRyaW1tZWQuZmEuZ3ogXA0KICAtLWlkdGF4YV9jb25maWRlbmNlIDYwIFwNCiAgLS1ydW5fYmxhc3QgVFJVRSBcDQogIC0tYmxhc3RfbWluX2lkZW50aXR5IDk3IFwNCiAgLS1ibGFzdF9taW5fY292ZXJhZ2UgOTAgXA0KICAtLXRhcmdldF9raW5nZG9tIE1ldGF6b2EgXA0KICAtLXRhcmdldF9waHlsdW0gQXJ0aHJvcG9kYSBcDQogIC0tdGFyZ2V0X2NsYXNzIE5BIFwNCiAgLS10YXJnZXRfb3JkZXIgTkEgXA0KICAtLXRhcmdldF9mYW1pbHkgTkEgXA0KICAtLXRhcmdldF9nZW51cyBOQSBcDQogIC0tdGFyZ2V0X3NwZWNpZXMgTkEgXA0KICAtLW1pbl9zYW1wbGVfcmVhZHMgMTAwMCBcDQogIC0tbWluX3RheGFfcmVhZHMgTkEgXA0KICAtLW1pbl90YXhhX3JhIDFlLTQgXA0KICAtLXN0YXJ0X2ZyZXNoIEZBTFNFDQoNCmBgYA0KDQojIFBhcmFtZXRlciBkZXNjcmlwdGlvbnMNCg0KKiAqKlByaW1lciBwYXJhbWV0ZXJzOioqDQogICAgKyAqKnBjcl9wcmltZXJzKiogLSBOYW1lIG9mIFBDUiBwcmltZXJzIA0KICAgICsgKipmb3JfcHJpbWVyX3NlcSoqIC0gRm9yd2FyZCBwcmltZXIgc2VxdWVuY2UNCiAgICArICoqcmV2X3ByaW1lcl9zZXEqKiAtIFJldmVyc2UgcHJpbWVyIHNlcXVlbmNlDQogICAgKyAqKnRhcmdldF9nZW5lKiogLSBOYW1lIG9mIHRhcmdldCBnZW5lDQogICAgKyAqKm1heF9wcmltZXJfbWlzbWF0Y2gqKiAtIEhvdyBtdWNoIG1pc21hdGNoIHRvIGFsbG93IHdoZW4gZGV0ZWN0aW5nIHByaW1lciBzZXF1ZW5jZXMNCg0KKiAqKlJlYWQgZmlsdGVyaW5nOioqDQogICAgKyAqKnJlYWRfbWluX2xlbmd0aCoqIC0gTWluaW11bSBsZW5ndGggb2YgcHJpbWVyIHRyaW1tZWQgcmVhZHMNCiAgICArICoqcmVhZF9tYXhfbGVuZ3RoKiogLSBNYXhpbXVtIGxlbmd0aCBvZiBwcmltZXIgdHJpbW1lZCByZWFkcw0KICAgICsgKipyZWFkX21heF9lZSoqIC0gTWF4aW11bSBleHBlY3RlZCBlcnJvcnMgb2YgcHJpbWVyIHRyaW1tZWQgcmVhZHMNCiAgICArICoqcmVhZF90cnVuY19sZW5ndGgqKiAtIExlbmd0aCB0byBjdXQgYWxsIGxvbmdlciByZWFkcyB0bw0KICAgICsgKipyZWFkX3RyaW1fbGVmdCoqIC0gUmVtb3ZlIHRoaXMgbWFueSBicCBmcm9tIGxlZnQgc2lkZSBvZiBwcmltZXIgdHJpbW1lZCByZWFkcw0KICAgICsgKipyZWFkX3RyaW1fcmlnaHQqKiAtIFJlbW92ZSB0aGlzIG1hbnkgYnAgZnJvbSByaWdodCBzaWRlIG9mIHByaW1lciB0cmltbWVkIHJlYWRzDQoNCiogKipBU1YgZmlsdGVyaW5nKioNCiAgICArICoqYXN2X21pbl9sZW5ndGgqKiAtIE1pbmltdW0gbGVuZ3RoIG9mIGFtcGxpY29uDQogICAgKyAqKmFzdl9tYXhfbGVuZ3RoKiogLSBNYXhpbXVtIGxlbmd0aCBvZiBhbXBsaWNvbg0KICAgICsgKipoaWdoX3NlbnNpdGl2aXR5KiogLSBPcHRpb24gdG8gdHVybiBvbiBbcHNldWRvIHBvb2xpbmddKGh0dHBzOi8vYmVuampuZWIuZ2l0aHViLmlvL2RhZGEyL3BzZXVkby5odG1sKSwgc2V0dGluZyB0aGlzIHRvIEZBTFNFIGdyZWF0bHkgc3BlZWRzIHVwIEFTViBpbmZlcmVuY2UgYXQgdGhlIGV4cGVuc2Ugb2YgZGV0ZWN0aW5nIGZld2VyIHJhcmUgKDw1IHJlYWRzKSB0YXhhLg0KICAgICsgKipjb25jYXRfdW5tZXJnZWQqKiAtIFJldGFpbiBhbnkgdW5tZXJnZWQgcmVhZCBwYWlycyBieSBjb25jYXRlbmF0aW5nIHRoZW0gdG9nZXRoZXIgc2VwYXJhdGVkIGJ5IGEgc3RyaW5nIG9mIDEwIE4gYmFzZXMNCiAgICArICoqZ2VuZXRpY19jb2RlKiogLSBHZW5ldGljIGNvZGUgZm9yIGFtcGxpY29uIC0gc2VlIEJpb3N0cmluZ3M6OkdFTkVUSUNfQ09ERV9UQUJMRQ0KICAgICsgKipjb2RpbmcqKiAtIElzIHRoZSBhbXBsaWNvbiBmcm9tIGEgcHJvdGVpbiBjb2RpbmcgZ2VuZQ0KICAgICsgKipwaG1tKiogLSBQYXRoIHRvIHByb2ZpbGUgaGlkZGVuIG1hcmtvdiBtb2RlbCAoT3B0aW9uYWwpDQoNCiogKipUYXhvbm9taWMgYXNzaWdubWVudDoqKg0KICAgICsgKippZHRheGFfZGIqKiAtIFBhdGggdG8gdHJhaW5lZCBJRFRBWEEgbW9kZWwNCiAgICArICoqcmVmX2Zhc3RhKiogLSBQYXRoIHRvIGZhc3RhIGZpbGUgb2YgcmVmZXJlbmNlIGRhdGFiYXNlDQogICAgKyAqKmlkdGF4YV9jb25maWRlbmNlKiogLSBNaW5pbXVtIGJvb3RzdHJhcCBjb25maWRlbmNlIGZvciBJRFRBWEENCiAgICArICoqcnVuX2JsYXN0KiogLSBXaGV0aGVyIGEgYmxhc3QgdG9wIGhpdCBzZWFyY2ggc2hvdWxkIGJlIGNvbmR1Y3RlZCBpbiBhZGRpdGlvbiB0byBJRFRBWEENCiAgICArICoqYmxhc3RfbWluX2lkZW50aXR5KiogLSBNaW5pbXVtIG51Y2xlb3RpZGUgaWRlbnRpdHkgZm9yIEJMQVNUDQogICAgKyAqKmJsYXN0X21pbl9jb3ZlcmFnZSoqIC0gTWluaW11bSBxdWVyeSBjb3ZlcmFnZSBmb3IgQkxBU1QNCiAgICArICoqdGFyZ2V0X2tpbmdkb20qKiAtIFN1YnNldCB0byB0YXJnZXQga2luZ2RvbQ0KICAgICsgKip0YXJnZXRfcGh5bHVtKiogLSBTdWJzZXQgdG8gdGFyZ2V0IHBoeWx1bQ0KICAgICsgKip0YXJnZXRfY2xhc3MqKiAtIFN1YnNldCB0byB0YXJnZXQgY2xhc3MNCiAgICArICoqdGFyZ2V0X29yZGVyKiogLSBTdWJzZXQgdG8gdGFyZ2V0IG9yZGVyDQogICAgKyAqKnRhcmdldF9mYW1pbHkqKiAtIFN1YnNldCB0byB0YXJnZXQgZmFtaWx5DQogICAgKyAqKnRhcmdldF9nZW51cyoqIC0gU3Vic2V0IHRvIHRhcmdldCBnZW51cw0KICAgICsgKip0YXJnZXRfc3BlY2llcyoqIC0gU3Vic2V0IHRvIHRhcmdldCBzcGVjaWVzDQoNCiogKipTYW1wbGUgJiBUYXhvbiBmaWx0ZXJpbmc6KioNCiAgICArICoqbWluX3NhbXBsZV9yZWFkcyoqIC0gTWluaW11bSByZWFkcyBwZXIgc2FtcGxlIGFmdGVyIGZpbHRlcmluZw0KICAgICsgKiptaW5fdGF4YV9yZWFkcyoqIC0gTWluaW11bSByZWFkcyBwZXIgQVNWIHRvIHJldGFpbg0KICAgICsgKiptaW5fdGF4YV9yYSoqIC0gTWluaW11bSByZWxhdGl2ZSBhYnVuZGFuY2UgcGVyIEFTViB0byByZXRhaW4uIDFlLTQgaXMgMC4wMSUNCiAgICANCiAgICANCiogKipHZW5lcmFsIHBpcGVsaW5lIHBhcmFtZXRlcnMqKg0KICAgICsgKip0aHJlYWRzKiogLSBOdW1iZXIgb2YgQ1BVIHRocmVhZHMgdG8gcnVuIHRoZSBwaXBlbGluZSBhY3Jvc3MgLSAqKk5PVCBVU0VEIEZPUiBCQVNDKioNCiAgICArICoqc3RhcnRfZnJlc2gqKiAtIFdoZXRoZXIgdG8gcmVtb3ZlIGFsbCBpbnRlcm1lZGlhdGUgZmlsZXMgYW5kIHN0YXJ0IHRoZSBwaXBlbGluZSBmcmVzaA0K