Mercurial > repos > jdv > nanonet
changeset 0:decd5688d719 draft
planemo upload for repository https://github.com/jvolkening/galaxy-tools/tree/master/tools/nanonet commit bf5788ad5a3293446a50a3246b44ba09174c9b71
author | jdv |
---|---|
date | Wed, 30 Aug 2017 02:53:02 -0400 |
parents | |
children | 57447db0ec78 |
files | nanonet_1D.py nanonet_1D.xml test-data/test_data.fast5.tar.gz test-data/test_data.fastq |
diffstat | 4 files changed, 162 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nanonet_1D.py Wed Aug 30 02:53:02 2017 -0400 @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 + +import sys, os +import glob +import tarfile +import subprocess +import shutil +import h5py +import numpy as np + +def main(): + tar_file = sys.argv[1] + out_file = sys.argv[2] + threads = sys.argv[3] + + extract_fast5(tar_file) + + subprocess.call(["nanonetcall", + "--jobs", threads, + "--fastq", + "--output", out_file, + "in_dir" ]) + +def extract_fast5(fn): + + try: + in_dir = "in_dir" + if not os.path.exists(in_dir): + os.makedirs(in_dir) + + tar = tarfile.open(fn, mode='r') + tar.extractall(path=in_dir) + + files = glob.glob( + os.path.join(in_dir, "**", "*.fast5"), + recursive=True + ) + if len(files) < 1: + raise ValueError('No FAST5 files found') + for f in files: + shutil.copy(f, in_dir) + + except OSError as e: + print("Unexpected error:", e.strerror) + raise + + except: + print("Unexpected error:", sys.exc_info()[0]) + raise + +if __name__ == "__main__" : + main()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nanonet_1D.xml Wed Aug 30 02:53:02 2017 -0400 @@ -0,0 +1,86 @@ +<tool id="nanonet_1D" name="Nanonet 1D" version="2.0.0"> + + <description>ONT development basecaller</description> + + <!-- ***************************************************************** --> + + <!-- + <requirements> + <requirement type="package" version="2.0.0">nanonet</requirement> + </requirements> + --> + + <!-- ***************************************************************** --> + + <version_command>echo "2.0.0"</version_command> + + <!-- ***************************************************************** --> + + <command detect_errors="aggressive"> + <![CDATA[ + + python3 $__tool_directory__/nanonet_1D.py $input $output \${GALAXY_SLOTS:-1} + + ]]> + </command> + + <!-- ***************************************************************** --> + + <inputs> + + <param name="input" type="data" format="fast5_archive" label="Input reads" /> + + </inputs> + + <!-- ***************************************************************** --> + + <outputs> + + <data name="output" format="fastq" label="${tool.name} on ${on_string} (called.fastq)" /> + + </outputs> + + <!-- ***************************************************************** --> + + <tests> + <!-- multithreaded output is non-deterministic, so simply compare file + sizes --> + <test> + <param name="input" value="test_data.fast5.tar.gz" ftype="fast5_archive" /> + <output name="output" file="test_data.fastq" compare="sim_size" delta="0" /> + </test> + </tests> + + <!-- ***************************************************************** --> + + <help> + <![CDATA[ + +**Description** + +Nanonet provides recurrent neural network basecalling for Oxford Nanopore +MinION data. It represents the first generation of such a basecaller from +Oxford Nanopore Technologies, and is provided as a technology demonstrator. +Nanonet is provided unsupported by Oxford Nanopore Technologies, see +LICENSE.md for more information. + +For training networks, Nanonet leverages currennt to run recurrent neural +networks. Currennt is generally run with GPUs to aid performance but can be +run in a CPU only environment. The basecaller does not require currennt, and +is written in pure python with minimal requirements. + +The Galaxy wrapper has modified nanonet to take a gzip tarball of FAST5 reads +as input, such as can be produced by `poretools combine`, and always outputs a +single FASTQ file. + +This is the 1D basecaller. + + ]]> + </help> + + <!-- ***************************************************************** --> + + <citations> + </citations> + +</tool>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/test_data.fastq Wed Aug 30 02:53:02 2017 -0400 @@ -0,0 +1,24 @@ +@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12091_ch_399_strand +TCAACTACAGGGCTGGGAGAATGCAGCAGTGCAGGAGGCTGCTGAGGAGGCAGAAGCGGAGGCAAGCACTCAGAACAGCAGCAATCAGGCTGGGGCAGGCTGCTCAGCTCGCCAGGCGGTGCAGGCGGGAAGCTGAGTAAATGCTGGGGGCTCAAACTCGCTGGAATCAGAATGGGGAGGCATCCTCAGTCTCAGCCAAGGCATATAGCAGGGAAGCTGGGGCTCAGGCTCAGGCAGTCAGGGAGGCACGTCAAGGCAGCCAGGGCTGAGGCTCTGCTGGGGCTGGGAAGCAAGGCTCAGGCATAATCACTTCAGAGAATCTCAGGGAGGTCAGATGGCTCAAGCAGGCTGGGAAACGGCGGGGCTCCGCCCAGCAAGAATGGGTGGGGCAGTGGCCGGGCAGAGGCATCTTGAGGCTGGTCAGTGGGGCTCAGGGCGCAGCTCACTCAGGAAACTGCAGAGGGCTCAGGAGAAACACAGGCATGCTGGGGGCTGGGGCGCTGAAATGAGGGTCAAAGTGCAGGCTCAGTCTCATGGGGGCTCAGAAATGATCTTTTGGGGCTAGGAATCCTGCCTCGAGGCTCAGAGGCTGAGGAGGCGGGAAGCAGAGTGAGGGCGCTCACTCAGGAAGCAGAAGCAGGAAATGAGGGGGCAATCAGGGCCGAGAACTGAGAAACAGGCAGTAGAGGGGTGCGGCGCGGTCAAGGCAGAGGCAGAGCAGGCTGGGAATCAGGCAGCAGGCTCGCGGCTGCTCAAGCAGGGGCAAGGCAAGGCTCAGGCTCAAAATAGAAACACGCTTTT ++ +%$%$$%#$$*'$#$#')$&##$###"##$"#%$%&#'%$#&&#$#'&#%&#$&##$#%%#$$#%&&&$$#$#$##$##$$%%$#$%#%%%&$)'###''$$#%$$#%'&%"#$$'($%%$%%$'$#$&'%$#$$$$%#$%$$$$%%%&&###$%%&&#$$$$%'$(%%&$$##$'*&#&&$"$$$#%##$%%%$%#$((&*'%$######$%%$%###&('&##%$(&"##$'&$#%$$"&()$#$%%&$&$$#)$#$#$%%),'$###$'&%$###$$%)%##%''###%$$%&$$#$#"$######"#$$$%$$&$%#$%&$(/*%'%###&#$#$$$'&$$###&&$$&%$$%&%'$'''%$#$%$$$#$"###%#$##$&$%(+(%$%#"##$%**&#&$%(&##$"#$#'&##$$#""&"$$&%$#%%&%%$$%$$%$$#%%'#%'$$##$"$#%"('$$$'$()%&%%$&$%$#$$$%"###&+)($%'%'''%$$"#%%#%#)'$##$$%#####&'"$##%#$%%%$$(*+*')(&$%%$####$###$%'%##$$%&##$$$##$##"$#&%&%%#&#&%#$##%&%''#%''&%$$#%"&#'$)))%$$#&#$$%$&%$#%$&'%$%%#'''&&$%$())%$#%$%&$'&$&&$#'###$$#$$$###)*$$$#$$#&(+'$%%%'%&&%($$&&%&$#'$(&&$%$&%%'(&%&)'%%&&###%"$$#$#%$%#$$%%$$$$$#$###(('%##$'%$"####$#%$###$#%&%#'$%&%%#&#####" +@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12153_ch_399_strand +TAGAACTGGGTCACTCCAGCCTCAGGCGGGGGCTGGAGGGGCGGGAATCCTGACCTCAAGTGATCTCAGGCAGCTAAATCCCAGCTAGAGGCTCAAGGTGCTCAGGGCTCAAGCTGCAGGGCTCAGAATCAAGAGTGGCTCAGGAGGTGGGCTGCAAGAACCTTCCTTCCCGGCTGTGGCTGCTCCGCCTCCCAAGTAAGCGTGGCTGCGCTCCCTCCGCCGCTGGGGGCTGCAGTGTCAGTGCTGGGAGTGGGATGCACTCGCTGGGAGTGGAGGCACTCCTCATCCCAGGCTGTGATGGGGCACGAAATCGGCGTGGCTGGGCGCGGGAGTGGGGGTCCCGCTGCCTAAGCAGCCAGCTGCGTAGCTATCAGTGGCGGTGCAGTGCAAAATAAGGCTGGCTCTCAGGGAGTCACTGAGGAGCTCAGGCATCAAATCTCAGGCTGGCGCTGCTCAAAGCTGGTGGCACAGAGCGCAGCACTTCAGCTCAAGTCAGAATCCCA ++ +"%%$#$$#%%$$"#$&(##%#$&%'($&'''&$$(($$%*'%%)(&$$$#"""&'$%('%"&###$(%&''$%%$#%$$#%%$$###$#&$"##%'('%$%$$"*($"##''#$$#$#%&%$$%$%$$###'%$$##$#$#"&(#%$#$$$#$$%&('$$%##$%%$$&$##%##$$$$##"$%$%$%%$&%%####$&&&$##'&$$&#$$('&##&#%&#$#$)-*$$##$#$$#$$$$##$$#'&#%%&)&$##$#%%'#$#$&)###&($(&%#%%&&%$##$$$$$$$#$"&$$%(&%$#$$#$%$&#'&'&%%$#&%#%#$$(*$&%''((#$$&%"$##$$$###$%#$$#"#&&%#$##%$#$$$""$$#%(#%$"&"###%#"#$$'&$#""#$$#$#%&&#$$$"##$#()$&&$$#$$$#$$$%#$$#$"%(%#%&%#$#####$&%##"$####%%&%#%%$#$%$$#$#%#""##%%#&###$$$###%% +@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12081_ch_399_strand +CAGCACGCTCAGGCTGCATGTCGCCTGCAGCAGCACTCAGCTGCAGAGGCTGGGGAGGCAGCTTCCCAGGCAGCTCAGAGAGGCGCTGCTCGAAGCAGGCTGCAGGCTCAGCAGCTCAGCTCAAGCCTGCAGTGGCTCCGCAACAGCACTTCCCAAAATCAGCTGCTACAGGCTTACTGCTCAGGCAACAAAGCAGCTGCTGCTGGGGAAGCAGGAGGCCCTCACATCTGCAAGCAGCACCTGCTCACAAAACTGAGGGAAATGCCCATAGCAAAGAACTCTAGAGGCTCAGGCTGGCAGGCAGCGCTGCATACGGCAAAGCAGGAGGCTGGGGAAGGCAGGCCGCTGGCTTCAAGTGTACCTCAGAGAGCAGAGGCTGCTGGCTGGCTGCTTCCAGCTGAAATGAGGCTGCAGCTCAGCTGCAGGCTCAGGAAGCTTTCAGGAACGCTCACTGGGACAAGGGAACGCACATAAAATAAATAAAGAGCTCAAGCCATAAGAAACACATGAAATAAGAAATGGCAGAGAAATAGAGGAAATAAAGGCATAATGAGATATAAGATAAAGCACATGGCAGAAATGGCTGATAAAACGAAAGCAATAACACTCAAGGGAGGCTGATAAAGTGAGGCAAGAAATAGAAATGGCTAAAATAAATCAGGCAAAGAAATATGAAACTCGGCGTGGCAGAATCATCCGCACTCGCAGCTCAGAGGCTCAAGGGGCTCCAGCTGGCATGGCAGCAGCTCAGCAAGCAGTGAGGCTGGGCGGCAGCAGCACAAAGCGCGAGAGTGGCTCAGAGGCAAAGCAAGCGAGGCTGGGAATGTCAGGCTCAGGGGCCGCGCGCTCGGGGTGGGGGCTGCAGAGCAAAGGCCACTGCACAAATGCATGGGGCAGCAAAGGCCTCAGCTGGGCAGAGGCCATGGCTGAGGCGCGGCTGCTTCAAGCTCTCGCAAGCACTGGAAGCAGGCTCCTCGCTCACTGGCGCGGGGTGCGCCAGCGGGGCTCGCTGCACAGGGCTCGCTCCGCCACAGGCGTCGGCTCTGTGGCGTGCTGGGGCTCGCTGGCTCGGCGCAGCAGGCTGGGGCAGGGGCTCGCTCAGGC ++ +$"#$$&$&$$$&%$%#&$%$%%#$##"#%"$##$"%#$#$$$##$&$&)%$&%*(%&&##"$$%$%##$#"$####$$$%$'%%###"##$#$$#$#$%##$$#'%$&$&"#%###$#"##&&)#$###$$$#"""#$&#%%$%&#$####%%%$%&%%&"##%&&%#$#%$##%$$##$$&&#$#####%%#%$#$#####$$$'('%%#$#')$&$$$&$$#$#$$$%%'&$$$#$$%$#"###$$#$$#%$'$((&(*&$"$%$#%#%%&'%%$$&))&&%%$%&$&&$$$###$%$&%%%&$$$"%#%#%$%$#%&$$#(&$$%""&%''$$&&$"$$$&$$$&%$#$$$$####"%%$'%%$%#'%$%$('%$$$#%%$#$$$##$$#$$%$%$$#$"###%%$#####$#&$###"$###"#$&%%####"#$%#$&$#$$###$$#&&$$$%&'(%%&$#%(%'$&%$&"%%&#&$##%##$#$$#$#$#$%#%$$####"###$$$%$$%$##$#%&$$&'%#'$%&%&%$"$$$###$#$%$#$$#$$$#$%##&'&#$$%$""###%$%%$#$####$$$$$#$$%$"#"%####$###%)(+&%&$$#$%%%%%%"%#&$"%(#'&$%##$%#"###$&%%%$(''&&%%($$$&%%$##$#$%(&$##$$"$"###$$$$"#%#$#"##$#$$$#$$#'&*#'%##%&&')&#$$%&###"$$##$$%&####$$$$$$$#""$"$"%#,*%#$%&#$%####"#$"$$%$$##$&#(#%#$$$%%&&#%%"$$##$$$$#%$('$$'(&%$#"###%&####$%$$&&$$$%#$$$#$$$##$&%$###$#%#$%&'&%)&%"$$"&"#####$%##%''%$#$&%%$$$$$#$#%%$%$$$%#$''$$""$###%"'&#$"%'$%#%%%$$$$"#$###$$$#$"%#$'$%###%$$#%&$%#%$%#$"%&$$$&'(&#%%#$$#$$%$$$%%%$$"#$$&#'(%$#%#$#$&#%%"$#$%#%#$#$#$%$$"#$$##$$##%&$#$%"$####$$$$"#%$%%#&&#$$%%$$#&)'&%%%"$$##"$" +@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12113_ch_399_strand +CAGGTGGGAACTGAGGAATCAGGCAGGCGCTGAGGCAGGCAGAAACTTCAGGGAGGCTGCACATCTCAATGAGGGAACCGCTCTCAGCTCTTCAGGCTCAATCCCGGGAGCTCAAGAGGCATGTTCAAGGCTGGCTCTCAGCTGTTCCTTTCAGAAATCCCAGTGGCTTGGAATAAAACAGCTCAGCTTCCAGAGCAGCAGCAGGCTGCCAAGCAGGCAAGGTGGAGGTGGCATGTGGGCAGTGTGGGGCTGGGAGGCTCAGGGCTTCCTTCACAGCAAGTCGCTCAAAGTCATAAATGGGGCTGCAGTCCCTTCCGGCGTGCTCAATCAGGCTGCTCAGGAGGCGTGAGGCTGCAGCTCCTTCCCAGCTGCAGGGAGTGAGGCAGGCTGGGGTGCAGGCTCAGAATAAAGCTGGGAGTCAGCAGAGCCAGCAGGTGGCTGCTAAGTAGCTCGCTCAGTGGCTCCTGCGGGGGCGCAAACTGCACTCAGGGTCAGGCGTAGAGCCGAGGCTCCATCAGGCTGCTTCATCAATCATCAGAACAAATGCTCAAGCAGGCGGGGCGGAGGCGGCTCAGGTGGGGCTGCCAGGTGGCTCAGGGTCCTTCCTCCTCAGGAATCAAGCTCATCGCTGCGCGGGAAAGCTCACAGGCTCAAGGGCTGCCGGGAATCGCTGTGGCAGCTGCACTCAGGGCTCACTCAAGGCAGGCTGAAATCCGGGGGCGTCTCAGTCTGCTCCAAGTGGGCAGAAATGCTGAGGCTGGCTCAGAAACTCAGCGCGTGTCAGGAAACTCAAAGTCATGTTGTAAAGCTCCTGCAACAA ++ +'&$%$%'&$#$#&$+(%&##$$###$%%%%$%#&$$%'###%$%$$$&&$**&#$%"#$$#$##%#$#####%&)#%%%$&%$$$$%&%%#%$$&$##"$$&''&$&%%$%##$%&$$####"""#$%&$$##"##%%&##$##%%$#"###$#'(#''%$#%$&&&$%%%%$%%&%$#"#&%&#"#%$&&#$&%&#######""$$%%%%'$$$$###"'(#'+&''$%#$$$$##&%####$#$&($"#%()#%&$$%%'(%$$%&$###"%&%()&$$%##$&&&$%#$$#'('%&+.(&$#$%##%$$$%&&$'&$$###$%%$%%%(%####$$&'#$%#$###%&$#$%##$&%#"#$'$'$$$"$$&)(###$$(&$$&&$$$%'%##&$%$#$$%%#$#$'%%'%%'&#$#$$%%$'#%$$$%&#&&$%#$##$########%%$%$$"(###"#&%"#$%-/*(%$#%&&%'$&$%#$"$%#"##'*&#$"%#)&&$#&$##$###$#((###&%&&$#$$%$"$$$$$$##&(%$$$$%$$#&$&%%#()&%(+$'(&&'&&%(*(%&()(%$$$'%(("##$#%$&($#$%%(('&'%#$$%&%%%%%&#$##"$%"$$$%$#'&&##$%%%$#$#$###%&&&'$&%#%$$')$$$%#%$$$#$$##$##%#$$&$(&#$#%#$#$%#$%##%)$#&$&$#%$).*'(#%$%%$#'$%$$%&%#%%"#$&&$$#$$##"%"%#&&##$#$$$#$$%%$'*"%%$$$$#%'''('%$&&&(*'$%%$%$$%#"#&%"#$$#$"#$$"$# +@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12085_ch_399_strand +TCACAAGGTAAGTCAGGCTGGCAGAAACTGCAGGAGGCGGGGGTAAAGTAGAGGCAGTGGCACAAGGGCAGATGGCGTGAAACACAGGCTCAGCTAGGTAGCTCATCGGGGAATCAGGCAGGCAGAGGCAGAGGCCGGGAGATGTAGTAATGGGAAACTCACTCAGGCAAAGCTGGCTGAGCAAGGCTGGGGGCAGGAGTGGGGCTCCGAGCCACTCAAGTAGCTCAGGCAATGAGGCGCCTCAAGTGGCTCAGAGGCTCACTCAGGGGCTGGAGGCATGGAGGCTGTGAGCTCCAGGGCTGCCTTCAGCTCAGGGAACTGCAGCAAATGGGGCTGCTCGCGGCAGGCTGTGCAGAAGCGGGGCTGGCGTGCAAGTGCTGGGGAGGCGCGTGGCGCTGGGCGGGGAATCAGGCTCAAATGCCTCAGGGGCGGGGGCTGAGGCTGCCGCTGAGAGCAGAAGCTGCTCAAAGGCAAAATAGGCAGGCAGCTCAGGCACCAGGCCTCTGCAGGCTCAAGCTGTCACTCCTCAGGAAAATGGGGAGCAGGCGCAGCAGGAGGCAGCAAGTTTCGGCAGCAAGCCGCTCACTGCACGCGCTCACTGGCGCTGTGGCTCAAGTGGCTCACAGCAC ++ ++*&,)(#$$&&%'$#%&###%%%%''#(#"##%&%'&$''++%"#%%%#$(#&$#$%$$%)%'%$)-&%#%#$%$#%#%$$$&#$###"#$#$&$$#&$#$#"###$$&('$%$(#&)'$%#$###&&$%%$&$%$&*)$&"#""###$%##%'&(%%$$$$$$#$$$&&&$##&%$#$$%%%$'&#%&'('&&#*+$#%'(&##$'&"$#%&#&%'&$#$##$$%$'(&%$$%#'&##$%#%&&%%"""#$&$%%'%&$"$$%$)+)'%#$&$###"##%#&&%%&###%&&'&$&'%#$"%%#&&$$&'%$'*($$##"$##%%%&%'&-'$####$$##$$#&&"##$#%#$$$$#%(+&$#$$##$$%%$""$##%-/*$'%#%%$$$$$####$&$**+)$%%%%#%$#%$%##$%$$%#'('%#%()'&$$%#'$#$$%&#%%%#&#%$##%%$%$#$$%#%$&&%"#$)%'(&%$(%%##$$#$(&&#%$#$%#$$$####%(&&$#$"#$#$$"$$%'#%#&'$#%%#"&+'##%%&)$$#$%%$%'$&'%##$##$"#$%$%###$#$$#&"$%%"%%#&$%%&''$'"##&%$$$$##%$$#$##$##$$#%%##"##" +@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12103_ch_399_strand +GGCTAAGCTGGCAAATTCGCGGCCCCGTCAGGCTGAGGCGCGAGTGAGGAGGCAGAGGCAGGGGCTGTCAGCTCAGAGCCGAGGGGATCTCCTCAAAGCTCTGCTCAGGCGTGGTGCTGGGGCTGCTCAGGCTGCAGGCAGGCTGCAACAGGCGCTGCAAACGCTCGCACTGGGAGGCTGCAGCGGGCAGGGCTGAGCGCAAGGCCTGCAGGCAGCGGAGGCTGGGGCTGCTCAAAGCGCCAGGTGGCAGCCTCAGGAAGCGTCAGAACTTCAGAACAAGTCGCTAAAAACAAGGCTGCTCAGGGGCTGGGGCAAACAAATCTCAGCGGCAACTCAGAGTCAGGAGGGCCTCCGCAGGCTCAGCTGCCTCGAAATCAGGTAAATGGGGACTACAGGCTGGGAATGAAATCACTGCAGGGTAAAACACAAAGCTCCATGACCTTCGTAAAATTCCAGCTCAAAACAAATGCCAGGAGGCATAAGCTGTGGGAGGCAGGCTCGGCTCACTCAGGCTCATCAGCTATCAAGTCTCAGAAATATAGTAATGGGGCAGGGAGGCTGTCAATGGCTGCAGGCTCAGGGCAGCCTCACAGGCTCAAGTAAAGCTCAAGCAGGCTCAAGCACAAATGGGGCGCTCGCTGCAAAGCAGGCAGAAATGAAATGAGGCATGGCTGGGCTCTCAAATCTGCCAAATCAAGTCCCAGGCAGAGGCAGAAATCACTCAGGAGGCTCCAGCAAACATTCAGATCAAGCACAAGCTGCAGCAAACTCGCTTCACA ++ +$'"$$#$$#####$$%$'"$##$$$##%&$$%$#&$&(%&&%$&#&$'($$$"$&$'%%#))'$$#""$####$$'%''%&%&&('##%#$%"$$&''(((''&'%$&)&''&$$###&((&$#"##$$&%###$#&$$$''$##$####$$$###$#$$$$##$$#$#%$%+,%''$##%"$%$&%##')&$#$$#%"%#$''#$####&%$#$%'*$'%$$(,+(%&%)-&')&$%$$'&&&$##$%%(%$$#'(%&$#%###$#$#$&$$(#$$$$"##"##$)))'$%%$%$%$%$%#%&'&$$$$%%#%###$&%#$$%#%%%#$##$%#$%$$$$#&&#%'%$$$%%#%#$%#%$""$$$&%#####%#$$$&##$###&('%$$"$#%($#$&$#""#$$##$#$$#$%'&###&&%&#$#%%""#%&""#"##$%&%#$&$$$%''%"##$%&&$####$$&&$)*#('%#$##$$$#"$&'%'%"#(&$#$$%$$&"$#$#$##"#####"##$%&#$$#$$&&$()%&&'&%&%%%#&)&%%)*-&'&$%&'%##$&'%&&%%##%%%$$(('##('&'"$$$%##$$%"#%()%%$%$$#$$$&#'#$$$$#%%&%$&(&%$$$#$#$%###$$$##$$##$#%$$$#%'%$$)'$#$$%%%$$$#$&&%$$$$&%$$##$&"$'%#$%&%#%&$%$%%&$"$#$$%%$&&'&(($$$##$#$##%$$$%$%%$$()($$#$##$%#$$$$"#$$$$$&$##$&%&&#