From 785720651b2d2bdbd18bcdc9b37da67ecc0bec98 Mon Sep 17 00:00:00 2001 From: Andries van Tonder Date: Wed, 26 Nov 2025 14:39:35 +0000 Subject: [PATCH 1/9] template updates --- .github/workflows/linting.yml | 6 +- .nf-core.yml | 2 +- .prettierignore | 2 + modules.json | 36 ++--- .../bcftools/filter/tests/main.nf.test | 2 +- .../nf-core/bcftools/index/tests/main.nf.test | 2 +- .../nf-core/bcftools/query/tests/main.nf.test | 6 +- .../bcftools/query/tests/nextflow.config | 2 +- .../nf-core/bcftools/sort/tests/main.nf.test | 2 +- .../nf-core/bcftools/stats/tests/main.nf.test | 2 +- modules/nf-core/bowtie2/align/meta.yml | 2 +- .../bowtie2/align/tests/large_index.config | 2 +- .../nf-core/bowtie2/align/tests/sam.config | 2 +- .../nf-core/bowtie2/align/tests/sam2.config | 2 +- modules/nf-core/bowtie2/align/tests/tags.yml | 2 - modules/nf-core/bwamem2/index/environment.yml | 6 +- modules/nf-core/bwamem2/index/main.nf | 4 +- modules/nf-core/bwamem2/mem/environment.yml | 6 +- modules/nf-core/bwamem2/mem/main.nf | 4 +- .../bwamem2/mem/tests/main.nf.test.snap | 40 ++--- modules/nf-core/bwamem2/mem/tests/tags.yml | 2 - modules/nf-core/fastp/environment.yml | 3 +- modules/nf-core/fastp/main.nf | 6 +- modules/nf-core/fastp/meta.yml | 2 +- modules/nf-core/fastp/tests/main.nf.test.snap | 144 +++++++++--------- .../nf-core/minimap2/align/tests/main.nf.test | 2 +- modules/nf-core/minimap2/align/tests/tags.yml | 2 - .../nf-core/minimap2/index/tests/main.nf.test | 2 +- modules/nf-core/minimap2/index/tests/tags.yml | 2 - modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 33 ++-- modules/nf-core/multiqc/meta.yml | 4 +- .../multiqc/tests/custom_prefix.config | 5 + modules/nf-core/multiqc/tests/main.nf.test | 26 ++++ .../nf-core/multiqc/tests/main.nf.test.snap | 24 +-- modules/nf-core/porechop/porechop/main.nf | 2 +- .../nf-core/porechop/porechop/tests/tags.yml | 2 - .../nf-core/samtools/faidx/tests/main.nf.test | 2 +- modules/nf-core/samtools/flagstat/main.nf | 14 +- .../samtools/flagstat/tests/main.nf.test.snap | 8 +- .../nf-core/samtools/sort/tests/main.nf.test | 4 +- modules/nf-core/seqtk/comp/main.nf | 2 +- modules/nf-core/seqtk/comp/meta.yml | 2 +- modules/nf-core/seqtk/comp/tests/main.nf.test | 5 +- .../local/shortread_adapterremoval/main.nf | 72 ++++----- subworkflows/local/shortread_fastp/main.nf | 51 +++---- .../local/shortread_preprocessing/main.nf | 55 ++++--- .../tests/main.nf.test.snap | 24 +-- tests/default.nf.test.snap | 96 ++++++------ workflows/bactmap.nf | 10 +- 50 files changed, 387 insertions(+), 353 deletions(-) delete mode 100644 modules/nf-core/bowtie2/align/tests/tags.yml delete mode 100644 modules/nf-core/bwamem2/mem/tests/tags.yml delete mode 100644 modules/nf-core/minimap2/align/tests/tags.yml delete mode 100644 modules/nf-core/minimap2/index/tests/tags.yml create mode 100644 modules/nf-core/multiqc/tests/custom_prefix.config delete mode 100644 modules/nf-core/porechop/porechop/tests/tags.yml diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 30e6602..7a527a3 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,7 +11,7 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Set up Python 3.14 uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 @@ -71,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: linting-logs path: | diff --git a/.nf-core.yml b/.nf-core.yml index 1a471a8..dcb387f 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,6 +1,6 @@ repository_type: pipeline -nf_core_version: 3.4.1 +nf_core_version: 3.5.1 lint: {} diff --git a/.prettierignore b/.prettierignore index 2255e3e..dd749d4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -12,3 +12,5 @@ testing* bin/ .nf-test/ ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/modules.json b/modules.json index 05bcf1b..830a3bd 100644 --- a/modules.json +++ b/modules.json @@ -12,27 +12,27 @@ }, "bcftools/filter": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "bcftools/index": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["bam_variant_calling_sort_freebayes_bcftools"] }, "bcftools/query": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["bam_variant_calling_sort_freebayes_bcftools"] }, "bcftools/stats": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "bedtools/subtract": { @@ -42,7 +42,7 @@ }, "bowtie2/align": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "bowtie2/build": { @@ -52,12 +52,12 @@ }, "bwamem2/index": { "branch": "master", - "git_sha": "b2902040b9cb9b7b32b62400f1c024a709bd4812", + "git_sha": "d86336f3e7ae0d5f76c67b0859409769cfeb2af2", "installed_by": ["modules"] }, "bwamem2/mem": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "d86336f3e7ae0d5f76c67b0859409769cfeb2af2", "installed_by": ["modules"] }, "cat/fastq": { @@ -72,7 +72,7 @@ }, "fastp": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "d9ec4ef289ad39b8a662a7a12be50409b11df84b", "installed_by": ["modules"] }, "fastqc": { @@ -102,17 +102,17 @@ }, "minimap2/align": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "e10b76ca0c66213581bec2833e30d31f239dec0b", + "git_sha": "8deffd6a402233ebf905c66dbf804bd4c2637946", "installed_by": ["modules"] }, "nanoq": { @@ -127,17 +127,17 @@ }, "porechop/porechop": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { @@ -152,7 +152,7 @@ }, "samtools/sort": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "samtools/stats": { @@ -162,7 +162,7 @@ }, "seqtk/comp": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "snpsites": { @@ -176,7 +176,7 @@ "nf-core": { "bam_stats_samtools": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { diff --git a/modules/nf-core/bcftools/filter/tests/main.nf.test b/modules/nf-core/bcftools/filter/tests/main.nf.test index fadff0e..9933835 100644 --- a/modules/nf-core/bcftools/filter/tests/main.nf.test +++ b/modules/nf-core/bcftools/filter/tests/main.nf.test @@ -284,4 +284,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/nf-core/bcftools/index/tests/main.nf.test b/modules/nf-core/bcftools/index/tests/main.nf.test index 9b37485..24bbf94 100644 --- a/modules/nf-core/bcftools/index/tests/main.nf.test +++ b/modules/nf-core/bcftools/index/tests/main.nf.test @@ -110,4 +110,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/nf-core/bcftools/query/tests/main.nf.test b/modules/nf-core/bcftools/query/tests/main.nf.test index 39e67b3..45759b2 100644 --- a/modules/nf-core/bcftools/query/tests/main.nf.test +++ b/modules/nf-core/bcftools/query/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { when { process { """ - input[0] = [ + input[0] = [ [ id:'out' ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) @@ -45,7 +45,7 @@ nextflow_process { when { process { """ - input[0] = [ + input[0] = [ [ id:'out' ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) @@ -74,7 +74,7 @@ nextflow_process { when { process { """ - input[0] = [ + input[0] = [ [ id:'out' ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) diff --git a/modules/nf-core/bcftools/query/tests/nextflow.config b/modules/nf-core/bcftools/query/tests/nextflow.config index da81c2a..8547ec1 100644 --- a/modules/nf-core/bcftools/query/tests/nextflow.config +++ b/modules/nf-core/bcftools/query/tests/nextflow.config @@ -1,3 +1,3 @@ process { ext.args = "-f '%CHROM %POS %REF %ALT[%SAMPLE=%GT]'" -} \ No newline at end of file +} diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test b/modules/nf-core/bcftools/sort/tests/main.nf.test index b9bdd76..7d580e4 100644 --- a/modules/nf-core/bcftools/sort/tests/main.nf.test +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test @@ -219,4 +219,4 @@ nextflow_process { } } -} \ No newline at end of file +} diff --git a/modules/nf-core/bcftools/stats/tests/main.nf.test b/modules/nf-core/bcftools/stats/tests/main.nf.test index be618b0..0ced6fc 100644 --- a/modules/nf-core/bcftools/stats/tests/main.nf.test +++ b/modules/nf-core/bcftools/stats/tests/main.nf.test @@ -179,4 +179,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/nf-core/bowtie2/align/meta.yml b/modules/nf-core/bowtie2/align/meta.yml index f38da12..0c12b28 100644 --- a/modules/nf-core/bowtie2/align/meta.yml +++ b/modules/nf-core/bowtie2/align/meta.yml @@ -14,7 +14,7 @@ tools: sequencing reads to long reference sequences. homepage: http://bowtie-bio.sourceforge.net/bowtie2/index.shtml documentation: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml - doi: 10.1038/nmeth.1923 + doi: 10.1186/gb-2009-10-3-r25 licence: ["GPL-3.0-or-later"] identifier: "" input: diff --git a/modules/nf-core/bowtie2/align/tests/large_index.config b/modules/nf-core/bowtie2/align/tests/large_index.config index fdc1c59..b2f0c40 100644 --- a/modules/nf-core/bowtie2/align/tests/large_index.config +++ b/modules/nf-core/bowtie2/align/tests/large_index.config @@ -2,4 +2,4 @@ process { withName: BOWTIE2_BUILD { ext.args = '--large-index' } -} \ No newline at end of file +} diff --git a/modules/nf-core/bowtie2/align/tests/sam.config b/modules/nf-core/bowtie2/align/tests/sam.config index c1d8c35..14d94e9 100644 --- a/modules/nf-core/bowtie2/align/tests/sam.config +++ b/modules/nf-core/bowtie2/align/tests/sam.config @@ -2,4 +2,4 @@ process { withName: BOWTIE2_ALIGN { ext.args2 = '--output-fmt SAM' } -} \ No newline at end of file +} diff --git a/modules/nf-core/bowtie2/align/tests/sam2.config b/modules/nf-core/bowtie2/align/tests/sam2.config index 4e85ff0..c39156f 100644 --- a/modules/nf-core/bowtie2/align/tests/sam2.config +++ b/modules/nf-core/bowtie2/align/tests/sam2.config @@ -2,4 +2,4 @@ process { withName: BOWTIE2_ALIGN { ext.args2 = '-O SAM' } -} \ No newline at end of file +} diff --git a/modules/nf-core/bowtie2/align/tests/tags.yml b/modules/nf-core/bowtie2/align/tests/tags.yml deleted file mode 100644 index ac47d1c..0000000 --- a/modules/nf-core/bowtie2/align/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -bowtie2/align: - - modules/nf-core/bowtie2/align/** diff --git a/modules/nf-core/bwamem2/index/environment.yml b/modules/nf-core/bwamem2/index/environment.yml index c069e28..f363744 100644 --- a/modules/nf-core/bwamem2/index/environment.yml +++ b/modules/nf-core/bwamem2/index/environment.yml @@ -6,8 +6,8 @@ channels: dependencies: # renovate: datasource=conda depName=bioconda/bwa-mem2 - - bwa-mem2=2.2.1 + - bwa-mem2=2.3 # renovate: datasource=conda depName=bioconda/htslib - - htslib=1.21 + - htslib=1.22.1 # renovate: datasource=conda depName=bioconda/samtools - - samtools=1.21 + - samtools=1.22.1 diff --git a/modules/nf-core/bwamem2/index/main.nf b/modules/nf-core/bwamem2/index/main.nf index 529c66e..62af1e3 100644 --- a/modules/nf-core/bwamem2/index/main.nf +++ b/modules/nf-core/bwamem2/index/main.nf @@ -6,8 +6,8 @@ process BWAMEM2_INDEX { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9ac054213e67b3c9308e409b459080bbe438f8fd6c646c351bc42887f35a42e7/data' : - 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:e1f420694f8e42bd' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e0/e05ce34b46ad42810eb29f74e4e304c0cb592b2ca15572929ed8bbaee58faf01/data' : + 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:db98f81f55b64113' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/bwamem2/mem/environment.yml b/modules/nf-core/bwamem2/mem/environment.yml index c069e28..f363744 100644 --- a/modules/nf-core/bwamem2/mem/environment.yml +++ b/modules/nf-core/bwamem2/mem/environment.yml @@ -6,8 +6,8 @@ channels: dependencies: # renovate: datasource=conda depName=bioconda/bwa-mem2 - - bwa-mem2=2.2.1 + - bwa-mem2=2.3 # renovate: datasource=conda depName=bioconda/htslib - - htslib=1.21 + - htslib=1.22.1 # renovate: datasource=conda depName=bioconda/samtools - - samtools=1.21 + - samtools=1.22.1 diff --git a/modules/nf-core/bwamem2/mem/main.nf b/modules/nf-core/bwamem2/mem/main.nf index eab662a..27910cf 100644 --- a/modules/nf-core/bwamem2/mem/main.nf +++ b/modules/nf-core/bwamem2/mem/main.nf @@ -4,8 +4,8 @@ process BWAMEM2_MEM { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9ac054213e67b3c9308e409b459080bbe438f8fd6c646c351bc42887f35a42e7/data' : - 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:e1f420694f8e42bd' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e0/e05ce34b46ad42810eb29f74e4e304c0cb592b2ca15572929ed8bbaee58faf01/data' : + 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:db98f81f55b64113' }" input: tuple val(meta), path(reads) diff --git a/modules/nf-core/bwamem2/mem/tests/main.nf.test.snap b/modules/nf-core/bwamem2/mem/tests/main.nf.test.snap index ec90701..b7d40a6 100644 --- a/modules/nf-core/bwamem2/mem/tests/main.nf.test.snap +++ b/modules/nf-core/bwamem2/mem/tests/main.nf.test.snap @@ -1,17 +1,17 @@ { "sarscov2 - [fastq1, fastq2], index, fasta, false": { "content": [ - "9505760d66e1d5a5d34ab79a98228c6", + "e414c2d48e2e44c2c52c20ecd88e8bd8", "57aeef88ed701a8ebc8e2f0a381b2a6", [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.7" }, - "timestamp": "2025-03-27T10:57:52.782442426" + "timestamp": "2025-09-23T11:44:52.73673293" }, "sarscov2 - [fastq1, fastq2], index, fasta, true - stub": { "content": [ @@ -44,7 +44,7 @@ ] ], "5": [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ], "bam": [ [ @@ -74,56 +74,56 @@ ], "versions": [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.7" }, - "timestamp": "2025-03-27T10:58:37.140104324" + "timestamp": "2025-09-23T11:45:14.834888709" }, "sarscov2 - [fastq1, fastq2], index, fasta, true": { "content": [ - "e0c38d5772ca5f4d5d9999f4477e933c", + "716ed1ef39deaad346ca7cf86e08f959", "af8628d9df18b2d3d4f6fd47ef2bb872", [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.7" }, - "timestamp": "2025-03-27T10:58:19.047052261" + "timestamp": "2025-09-23T11:45:04.750057645" }, "sarscov2 - fastq, index, fasta, false": { "content": [ - "58d05395bbb819e929885bde415947ae", + "283a83f604f3f5338acedfee349dccf4", "798439cbd7fd81cbcc5078022dc5479d", [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.7" }, - "timestamp": "2025-03-27T10:56:53.456559296" + "timestamp": "2025-09-23T11:44:28.57550711" }, "sarscov2 - fastq, index, fasta, true": { "content": [ - "276189f6f003f99a87664e74fad2893d", + "ed99048bb552cac58e39923b550b6d5b", "94fcf617f5b994584c4e8d4044e16b4f", [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.7" }, - "timestamp": "2025-03-27T10:57:21.949711746" + "timestamp": "2025-09-23T11:44:40.437183765" } } \ No newline at end of file diff --git a/modules/nf-core/bwamem2/mem/tests/tags.yml b/modules/nf-core/bwamem2/mem/tests/tags.yml deleted file mode 100644 index 134efb2..0000000 --- a/modules/nf-core/bwamem2/mem/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -bwamem2/mem: - - "modules/nf-core/bwamem2/mem/**" diff --git a/modules/nf-core/fastp/environment.yml b/modules/nf-core/fastp/environment.yml index 0c36eed..b297639 100644 --- a/modules/nf-core/fastp/environment.yml +++ b/modules/nf-core/fastp/environment.yml @@ -4,5 +4,4 @@ channels: - conda-forge - bioconda dependencies: - # renovate: datasource=conda depName=bioconda/fastp - - bioconda::fastp=1.0.1 + - bioconda::fastp=0.24.0 \ No newline at end of file diff --git a/modules/nf-core/fastp/main.nf b/modules/nf-core/fastp/main.nf index ecac5b9..8862506 100644 --- a/modules/nf-core/fastp/main.nf +++ b/modules/nf-core/fastp/main.nf @@ -4,8 +4,8 @@ process FASTP { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/527b18847a97451091dba07a886b24f17f742a861f9f6c9a6bfb79d4f1f3bf9d/data' : - 'community.wave.seqera.io/library/fastp:1.0.1--c8b87fe62dcc103c' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/88/889a182b8066804f4799f3808a5813ad601381a8a0e3baa4ab8d73e739b97001/data' : + 'community.wave.seqera.io/library/fastp:0.24.0--62c97b06e8447690' }" input: tuple val(meta), path(reads) @@ -122,4 +122,4 @@ process FASTP { fastp: \$(fastp --version 2>&1 | sed -e "s/fastp //g") END_VERSIONS """ -} +} \ No newline at end of file diff --git a/modules/nf-core/fastp/meta.yml b/modules/nf-core/fastp/meta.yml index b867327..f4c276a 100644 --- a/modules/nf-core/fastp/meta.yml +++ b/modules/nf-core/fastp/meta.yml @@ -124,4 +124,4 @@ authors: - "@kevinmenden" maintainers: - "@drpatelh" - - "@kevinmenden" + - "@kevinmenden" \ No newline at end of file diff --git a/modules/nf-core/fastp/tests/main.nf.test.snap b/modules/nf-core/fastp/tests/main.nf.test.snap index 5b5eeb6..9e2aaf3 100644 --- a/modules/nf-core/fastp/tests/main.nf.test.snap +++ b/modules/nf-core/fastp/tests/main.nf.test.snap @@ -39,7 +39,7 @@ ], "6": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ], "html": [ [ @@ -78,15 +78,15 @@ ], "versions": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:42.073182" + "timestamp": "2025-03-31T13:40:51.8619133" }, "test_fastp_paired_end": { "content": [ @@ -96,7 +96,7 @@ "id": "test", "single_end": false }, - "test.fastp.json:md5,8073d8e7bd8966ece6c8177a784d016b" + "test.fastp.json:md5,7cf3bff1922b512bcca58439eb2d3679" ] ], [ @@ -118,14 +118,14 @@ ], [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:54:30.613836" + "timestamp": "2025-03-31T13:39:15.121411815" }, "test_fastp_paired_end_merged_adapterlist": { "content": [ @@ -135,7 +135,7 @@ "id": "test", "single_end": false }, - "test.fastp.json:md5,538d8d0527d9c98a4c1f49bebbac1df0" + "test.fastp.json:md5,533983f8c11cc3f2ccdcea01531f68ae" ] ], [ @@ -163,14 +163,14 @@ ] ], [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:54:55.200243" + "timestamp": "2025-03-31T13:39:51.561598206" }, "test_fastp_single_end_qc_only": { "content": [ @@ -180,7 +180,7 @@ "id": "test", "single_end": true }, - "test.fastp.json:md5,dac771d6fc18baf9bd0b7067bdc04d52" + "test.fastp.json:md5,93f407199ee8b94c023c291bddfc4dce" ] ], [ @@ -202,14 +202,14 @@ ], [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:00.224217" + "timestamp": "2025-03-31T13:39:56.392912049" }, "test_fastp_paired_end_trim_fail": { "content": [ @@ -247,18 +247,18 @@ "id": "test", "single_end": false }, - "test.fastp.json:md5,23ba6ce04e9d1c49bad55741a0e7eced" + "test.fastp.json:md5,5009a892192f2084c2af69c153d88d6c" ] ], [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:54:45.32191" + "timestamp": "2025-03-31T13:39:38.690242568" }, "fastp - stub test_fastp_interleaved": { "content": [ @@ -306,7 +306,7 @@ ], "6": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ], "html": [ [ @@ -351,15 +351,15 @@ ], "versions": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:19.47199" + "timestamp": "2025-03-31T13:40:23.678200076" }, "test_fastp_single_end - stub": { "content": [ @@ -407,7 +407,7 @@ ], "6": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ], "html": [ [ @@ -452,15 +452,15 @@ ], "versions": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:09.617001" + "timestamp": "2025-03-31T13:40:08.756547678" }, "test_fastp_paired_end_merged_adapterlist - stub": { "content": [ @@ -517,7 +517,7 @@ ] ], "6": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ], "html": [ [ @@ -571,15 +571,15 @@ ] ], "versions": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:37.413738" + "timestamp": "2025-03-31T13:40:47.596331823" }, "test_fastp_paired_end_merged - stub": { "content": [ @@ -636,7 +636,7 @@ ] ], "6": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ], "html": [ [ @@ -690,15 +690,15 @@ ] ], "versions": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:32.965652" + "timestamp": "2025-03-31T13:40:39.962303534" }, "test_fastp_paired_end_merged": { "content": [ @@ -708,7 +708,7 @@ "id": "test", "single_end": false }, - "test.fastp.json:md5,6f716765d4cee428c41a4b361bb0db07" + "test.fastp.json:md5,8f99097bfa04b629891105b8af9c429f" ] ], [ @@ -736,14 +736,14 @@ ] ], [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:54:50.001244" + "timestamp": "2025-03-31T13:39:46.300238743" }, "test_fastp_paired_end - stub": { "content": [ @@ -794,7 +794,7 @@ ], "6": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ], "html": [ [ @@ -842,15 +842,15 @@ ], "versions": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:14.414258" + "timestamp": "2025-03-31T13:40:16.309925689" }, "test_fastp_single_end": { "content": [ @@ -860,7 +860,7 @@ "id": "test", "single_end": true }, - "test.fastp.json:md5,26b6549bf45cafb7b1127a8d32338754" + "test.fastp.json:md5,81dc86dd695967bb5c015e0a978bf20c" ] ], [ @@ -879,14 +879,14 @@ ], [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:54:25.511975" + "timestamp": "2025-03-31T13:39:07.133909607" }, "test_fastp_single_end_trim_fail - stub": { "content": [ @@ -940,7 +940,7 @@ ], "6": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ], "html": [ [ @@ -991,15 +991,15 @@ ], "versions": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:23.871395" + "timestamp": "2025-03-31T13:40:28.086573661" }, "test_fastp_paired_end_trim_fail - stub": { "content": [ @@ -1060,7 +1060,7 @@ ], "6": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ], "html": [ [ @@ -1118,15 +1118,15 @@ ], "versions": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:28.399328" + "timestamp": "2025-03-31T13:40:35.606162029" }, "fastp test_fastp_interleaved": { "content": [ @@ -1145,18 +1145,18 @@ "id": "test", "single_end": true }, - "test.fastp.json:md5,c4e4093a100ef3fa9740620d42bf90c4" + "test.fastp.json:md5,101003b8ac634ca5fd381656ac2b8b9f" ] ], [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:54:35.970659" + "timestamp": "2025-03-31T13:39:23.114582408" }, "test_fastp_single_end_trim_fail": { "content": [ @@ -1166,7 +1166,7 @@ "id": "test", "single_end": true }, - "test.fastp.json:md5,27307e0f9154fc37e1cb84f207bf33e0" + "test.fastp.json:md5,d721f75d68a382c819b6499e6325a942" ] ], [ @@ -1191,14 +1191,14 @@ ], [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:54:40.611616" + "timestamp": "2025-03-31T13:39:30.757538842" }, "test_fastp_paired_end_qc_only": { "content": [ @@ -1208,7 +1208,7 @@ "id": "test", "single_end": false }, - "test.fastp.json:md5,f411d75c34448fcad813ccd9b3d0fa3d" + "test.fastp.json:md5,1ad31d6559ff5d4d275f501f3f5c02b9" ] ], [ @@ -1230,14 +1230,14 @@ ], [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:04.894274" + "timestamp": "2025-03-31T13:40:01.381972575" }, "test_fastp_paired_end_qc_only - stub": { "content": [ @@ -1279,7 +1279,7 @@ ], "6": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ], "html": [ [ @@ -1318,14 +1318,14 @@ ], "versions": [ - "versions.yml:md5,c4974822658d02533e660fae343f281b" + "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "24.10.5" }, - "timestamp": "2025-09-11T09:55:46.696419" + "timestamp": "2025-03-31T13:40:56.392034947" } } \ No newline at end of file diff --git a/modules/nf-core/minimap2/align/tests/main.nf.test b/modules/nf-core/minimap2/align/tests/main.nf.test index 4072c17..6506140 100644 --- a/modules/nf-core/minimap2/align/tests/main.nf.test +++ b/modules/nf-core/minimap2/align/tests/main.nf.test @@ -438,4 +438,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/nf-core/minimap2/align/tests/tags.yml b/modules/nf-core/minimap2/align/tests/tags.yml deleted file mode 100644 index 39dba37..0000000 --- a/modules/nf-core/minimap2/align/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -minimap2/align: - - "modules/nf-core/minimap2/align/**" diff --git a/modules/nf-core/minimap2/index/tests/main.nf.test b/modules/nf-core/minimap2/index/tests/main.nf.test index 97840ff..eec743c 100644 --- a/modules/nf-core/minimap2/index/tests/main.nf.test +++ b/modules/nf-core/minimap2/index/tests/main.nf.test @@ -29,4 +29,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/nf-core/minimap2/index/tests/tags.yml b/modules/nf-core/minimap2/index/tests/tags.yml deleted file mode 100644 index e5ef8e1..0000000 --- a/modules/nf-core/minimap2/index/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -minimap2/index: - - modules/nf-core/minimap2/index/** diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index dd513cb..d02016a 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.31 + - bioconda::multiqc=1.32 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 5288f5c..abbef45 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,11 +3,11 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ef/eff0eafe78d5f3b65a6639265a16b89fdca88d06d18894f90fcdb50142004329/data' : - 'community.wave.seqera.io/library/multiqc:1.31--1efbafd542a23882' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : + 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" input: - path multiqc_files, stageAs: "?/*" + path multiqc_files, stageAs: "?/*" path(multiqc_config) path(extra_multiqc_config) path(multiqc_logo) @@ -15,10 +15,10 @@ process MULTIQC { path(sample_names) output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions + path "*.html" , emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when @@ -26,21 +26,21 @@ process MULTIQC { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' - def config = multiqc_config ? "--config $multiqc_config" : '' - def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + def config = multiqc_config ? "--config ${multiqc_config}" : '' + def extra_config = extra_multiqc_config ? "--config ${extra_multiqc_config}" : '' def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' def replace = replace_names ? "--replace-names ${replace_names}" : '' def samples = sample_names ? "--sample-names ${sample_names}" : '' """ multiqc \\ --force \\ - $args \\ - $config \\ - $prefix \\ - $extra_config \\ - $logo \\ - $replace \\ - $samples \\ + ${args} \\ + ${config} \\ + ${prefix} \\ + ${extra_config} \\ + ${logo} \\ + ${replace} \\ + ${samples} \\ . cat <<-END_VERSIONS > versions.yml @@ -52,6 +52,7 @@ process MULTIQC { stub: """ mkdir multiqc_data + touch multiqc_data/.stub mkdir multiqc_plots touch multiqc_report.html diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index ce30eb7..9ac86fd 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -57,10 +57,10 @@ input: - edam: http://edamontology.org/format_3475 # TSV output: report: - - "*multiqc_report.html": + - "*.html": type: file description: MultiQC report file - pattern: "multiqc_report.html" + pattern: ".html" ontologies: [] data: - "*_data": diff --git a/modules/nf-core/multiqc/tests/custom_prefix.config b/modules/nf-core/multiqc/tests/custom_prefix.config new file mode 100644 index 0000000..b30b135 --- /dev/null +++ b/modules/nf-core/multiqc/tests/custom_prefix.config @@ -0,0 +1,5 @@ +process { + withName: 'MULTIQC' { + ext.prefix = "custom_prefix" + } +} diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test index 33316a7..0745e25 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -36,6 +36,32 @@ nextflow_process { } + test("sarscov2 single-end [fastqc] - custom prefix") { + config "./custom_prefix.config" + + when { + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) + input[1] = [] + input[2] = [] + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.report[0] ==~ ".*/custom_prefix.html" }, + { assert process.out.data[0] ==~ ".*/custom_prefix_data" } + ) + } + + } + test("sarscov2 single-end [fastqc] [config]") { when { diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 17881d1..a88bafd 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:57:36.139055243" + "timestamp": "2025-10-27T13:33:24.356715" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:59:15.142230631" + "timestamp": "2025-10-27T13:34:11.103619" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-09-08T20:58:29.629087066" + "timestamp": "2025-10-27T13:34:04.615233" } } \ No newline at end of file diff --git a/modules/nf-core/porechop/porechop/main.nf b/modules/nf-core/porechop/porechop/main.nf index 34daf3e..dd148cf 100644 --- a/modules/nf-core/porechop/porechop/main.nf +++ b/modules/nf-core/porechop/porechop/main.nf @@ -3,7 +3,7 @@ process PORECHOP_PORECHOP { label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/2b/2bce1f10c51906a66c4c4d3a7485394f67e304177192ad1cce6cf586a3a18bae/data' : 'community.wave.seqera.io/library/porechop_pigz:d1655e5b5bad786c' }" diff --git a/modules/nf-core/porechop/porechop/tests/tags.yml b/modules/nf-core/porechop/porechop/tests/tags.yml deleted file mode 100644 index 743645c..0000000 --- a/modules/nf-core/porechop/porechop/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -porechop/porechop: - - "modules/nf-core/porechop/porechop/**" diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test b/modules/nf-core/samtools/faidx/tests/main.nf.test index 64219b7..a505abc 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test @@ -216,4 +216,4 @@ nextflow_process { } } -} \ No newline at end of file +} diff --git a/modules/nf-core/samtools/flagstat/main.nf b/modules/nf-core/samtools/flagstat/main.nf index 9e71843..f148f56 100644 --- a/modules/nf-core/samtools/flagstat/main.nf +++ b/modules/nf-core/samtools/flagstat/main.nf @@ -35,7 +35,19 @@ process SAMTOOLS_FLAGSTAT { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.flagstat + cat <<-END_FLAGSTAT > ${prefix}.flagstat + 1000000 + 0 in total (QC-passed reads + QC-failed reads) + 0 + 0 secondary + 0 + 0 supplementary + 0 + 0 duplicates + 900000 + 0 mapped (90.00% : N/A) + 1000000 + 0 paired in sequencing + 500000 + 0 read1 + 500000 + 0 read2 + 800000 + 0 properly paired (80.00% : N/A) + 850000 + 0 with mate mapped to a different chr + 50000 + 0 with mate mapped to a different chr (mapQ>=5) + END_FLAGSTAT cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap index 79960bc..0a0a9b1 100644 --- a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap @@ -8,7 +8,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "1": [ @@ -20,7 +20,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "versions": [ @@ -32,7 +32,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-10T13:31:17.098789" + "timestamp": "2025-09-15T15:02:00.813612" }, "BAM": { "content": [ @@ -67,6 +67,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-10T13:31:12.661288" + "timestamp": "2025-09-15T15:01:55.232954" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/sort/tests/main.nf.test b/modules/nf-core/samtools/sort/tests/main.nf.test index fa27787..ff06919 100644 --- a/modules/nf-core/samtools/sort/tests/main.nf.test +++ b/modules/nf-core/samtools/sort/tests/main.nf.test @@ -71,7 +71,7 @@ nextflow_process { ) } } - + test("bam_csi_index") { config "./nextflow.config" @@ -173,7 +173,7 @@ nextflow_process { ) } } - + test("multiple bam csi index") { config "./nextflow.config" diff --git a/modules/nf-core/seqtk/comp/main.nf b/modules/nf-core/seqtk/comp/main.nf index 8ae9e02..3a5ead4 100644 --- a/modules/nf-core/seqtk/comp/main.nf +++ b/modules/nf-core/seqtk/comp/main.nf @@ -39,7 +39,7 @@ process SEQTK_COMP { """ echo "" > ${prefix}.seqtk_stats.tsv - + cat <<-END_VERSIONS > versions.yml "${task.process}": seqtk: \$(seqtk |& sed '/Version/!d; s/.* //') diff --git a/modules/nf-core/seqtk/comp/meta.yml b/modules/nf-core/seqtk/comp/meta.yml index 48565b9..a64d7e2 100644 --- a/modules/nf-core/seqtk/comp/meta.yml +++ b/modules/nf-core/seqtk/comp/meta.yml @@ -8,7 +8,7 @@ keywords: tools: - "seqtk_comp": description: | - Seqtk is a fast and lightweight tool for processing sequences in the FASTA or FASTQ format. + Seqtk is a fast and lightweight tool for processing sequences in the FASTA or FASTQ format. The seqtk comp command computes base composition, sequence length, and GC content for quality control. homepage: https://github.com/lh3/seqtk diff --git a/modules/nf-core/seqtk/comp/tests/main.nf.test b/modules/nf-core/seqtk/comp/tests/main.nf.test index 19581de..8149813 100644 --- a/modules/nf-core/seqtk/comp/tests/main.nf.test +++ b/modules/nf-core/seqtk/comp/tests/main.nf.test @@ -13,7 +13,7 @@ nextflow_process { when { process { - """ + """ input[0] = [ [ id:'test', single_end:true ], file( params.modules_testdata_base_path + 'genomics/prokaryotes/bacteroides_fragilis/genome/genome.fna.gz', checkIfExists: true), @@ -40,7 +40,7 @@ nextflow_process { when { process { - """ + """ input[0] = [ [ id:'test', single_end:true ], file( params.modules_testdata_base_path + 'genomics/prokaryotes/bacteroides_fragilis/genome/genome.fna.gz', checkIfExists: true), @@ -57,4 +57,3 @@ nextflow_process { } } } - diff --git a/subworkflows/local/shortread_adapterremoval/main.nf b/subworkflows/local/shortread_adapterremoval/main.nf index 99376e7..f42bd45 100644 --- a/subworkflows/local/shortread_adapterremoval/main.nf +++ b/subworkflows/local/shortread_adapterremoval/main.nf @@ -2,66 +2,62 @@ // Process short raw reads with AdapterRemoval // -include { ADAPTERREMOVAL as ADAPTERREMOVAL_SINGLE } from '../../../modules/nf-core/adapterremoval/main' -include { ADAPTERREMOVAL as ADAPTERREMOVAL_PAIRED } from '../../../modules/nf-core/adapterremoval/main' -include { CAT_FASTQ } from '../../../modules/nf-core/cat/fastq/main' +include { ADAPTERREMOVAL as ADAPTERREMOVAL_SINGLE } from '../../../modules/nf-core/adapterremoval/main' +include { ADAPTERREMOVAL as ADAPTERREMOVAL_PAIRED } from '../../../modules/nf-core/adapterremoval/main' +include { CAT_FASTQ } from '../../../modules/nf-core/cat/fastq/main' workflow SHORTREAD_ADAPTERREMOVAL { - take: - reads // [[meta], [reads]] + reads // [[meta], [reads]] adapterlist // file main: - ch_versions = Channel.empty() + ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() - ch_input_for_adapterremoval = reads - .branch{ - single: it[0].single_end - paired: !it[0].single_end - } + ch_input_for_adapterremoval = reads.branch { + single: it[0].single_end + paired: !it[0].single_end + } - ADAPTERREMOVAL_SINGLE ( ch_input_for_adapterremoval.single, adapterlist ) - ADAPTERREMOVAL_PAIRED ( ch_input_for_adapterremoval.paired, adapterlist ) + ADAPTERREMOVAL_SINGLE(ch_input_for_adapterremoval.single, adapterlist) + ADAPTERREMOVAL_PAIRED(ch_input_for_adapterremoval.paired, adapterlist) /* * Due to the ~slightly~ very ugly output implementation of the current AdapterRemoval2 version, each file * has to be exported in a separate channel and we must manually recombine when necessary. */ - if ( params.shortread_qc_mergepairs && params.shortread_qc_includeunmerged ) { + if (params.shortread_qc_mergepairs && params.shortread_qc_includeunmerged) { ch_concat_fastq = Channel.empty() .mix( ADAPTERREMOVAL_PAIRED.out.collapsed, ADAPTERREMOVAL_PAIRED.out.collapsed_truncated, ADAPTERREMOVAL_PAIRED.out.singles_truncated, - ADAPTERREMOVAL_PAIRED.out.paired_truncated + ADAPTERREMOVAL_PAIRED.out.paired_truncated, ) - .map { meta, reads -> - [meta + [single_end: true], reads] + .map { meta, adapterremoved_reads -> + [meta + [single_end: true], adapterremoved_reads] } .groupTuple() - // Paired-end reads cause a nested tuple during grouping. - // We want to present a flat list of files to `CAT_FASTQ`. .map { meta, fastq -> [meta, fastq.flatten()] } - + // Paired-end reads cause a nested tuple during grouping. + // We want to present a flat list of files to `CAT_FASTQ`, thus the flatten CAT_FASTQ(ch_concat_fastq) - ch_adapterremoval_reads_prepped = CAT_FASTQ.out.reads - .mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) - - } else if ( params.shortread_qc_mergepairs && !params.shortread_qc_includeunmerged ) { + ch_adapterremoval_reads_prepped = CAT_FASTQ.out.reads.mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) + } + else if (params.shortread_qc_mergepairs && !params.shortread_qc_includeunmerged) { ch_concat_fastq = Channel.empty() .mix( ADAPTERREMOVAL_PAIRED.out.collapsed, - ADAPTERREMOVAL_PAIRED.out.collapsed_truncated + ADAPTERREMOVAL_PAIRED.out.collapsed_truncated, ) - .map { meta, reads -> - [meta + [single_end: true], reads] + .map { meta, input_reads -> + [meta + [single_end: true], input_reads] } .groupTuple() .map { meta, fastq -> [meta, fastq.flatten()] } @@ -69,27 +65,23 @@ workflow SHORTREAD_ADAPTERREMOVAL { CAT_FASTQ(ch_concat_fastq) - ch_adapterremoval_reads_prepped = CAT_FASTQ.out.reads - .mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) - - } else { - - ch_adapterremoval_reads_prepped = ADAPTERREMOVAL_PAIRED.out.paired_truncated - .mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) + ch_adapterremoval_reads_prepped = CAT_FASTQ.out.reads.mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) + } + else { + ch_adapterremoval_reads_prepped = ADAPTERREMOVAL_PAIRED.out.paired_truncated.mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) } - ch_versions = ch_versions.mix( ADAPTERREMOVAL_SINGLE.out.versions.first() ) - ch_versions = ch_versions.mix( ADAPTERREMOVAL_PAIRED.out.versions.first() ) - ch_versions = ch_versions.mix( CAT_FASTQ.out.versions.first() ) + ch_versions = ch_versions.mix(ADAPTERREMOVAL_SINGLE.out.versions.first()) + ch_versions = ch_versions.mix(ADAPTERREMOVAL_PAIRED.out.versions.first()) ch_multiqc_files = ch_multiqc_files.mix( ADAPTERREMOVAL_PAIRED.out.settings, - ADAPTERREMOVAL_SINGLE.out.settings + ADAPTERREMOVAL_SINGLE.out.settings, ) emit: - reads = ch_adapterremoval_reads_prepped // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_adapterremoval_reads_prepped // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/shortread_fastp/main.nf b/subworkflows/local/shortread_fastp/main.nf index bde47a4..7e1bf81 100644 --- a/subworkflows/local/shortread_fastp/main.nf +++ b/subworkflows/local/shortread_fastp/main.nf @@ -2,41 +2,36 @@ // Process short raw reads with FastP // -include { FASTP as FASTP_SINGLE } from '../../../modules/nf-core/fastp/main' -include { FASTP as FASTP_PAIRED } from '../../../modules/nf-core/fastp/main' +include { FASTP as FASTP_SINGLE } from '../../../modules/nf-core/fastp/main' +include { FASTP as FASTP_PAIRED } from '../../../modules/nf-core/fastp/main' workflow SHORTREAD_FASTP { take: - reads // [[meta], [reads]] + reads // [[meta], [reads]] adapterlist main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = Channel.empty() + ch_multiqc_files = Channel.empty() - ch_input_for_fastp = reads - .branch{ - single: it[0]['single_end'] == true - paired: it[0]['single_end'] == false - } + ch_input_for_fastp = reads.branch { + single: it[0]['single_end'] == true + paired: it[0]['single_end'] == false + } - FASTP_SINGLE ( ch_input_for_fastp.single, adapterlist, false, false, false ) + FASTP_SINGLE(ch_input_for_fastp.single, adapterlist, false, false, false) // Last parameter here turns on merging of PE data - FASTP_PAIRED ( ch_input_for_fastp.paired, adapterlist, false, false, params.shortread_qc_mergepairs ) - - if ( params.shortread_qc_mergepairs ) { - ch_fastp_reads_prepped_pe = FASTP_PAIRED.out.reads_merged - .map { - meta, reads -> - def meta_new = meta + [single_end: true] - [ meta + [single_end:true], [ reads ].flatten() ] - } + FASTP_PAIRED(ch_input_for_fastp.paired, adapterlist, false, false, params.shortread_qc_mergepairs) - ch_fastp_reads_prepped = ch_fastp_reads_prepped_pe.mix( FASTP_SINGLE.out.reads ) + if (params.shortread_qc_mergepairs) { + ch_fastp_reads_prepped_pe = FASTP_PAIRED.out.reads_merged.map { meta, merged_reads -> + [meta + [single_end: true], [merged_reads].flatten()] + } - } else { - ch_fastp_reads_prepped = FASTP_PAIRED.out.reads - .mix( FASTP_SINGLE.out.reads ) + ch_fastp_reads_prepped = ch_fastp_reads_prepped_pe.mix(FASTP_SINGLE.out.reads) + } + else { + ch_fastp_reads_prepped = FASTP_PAIRED.out.reads.mix(FASTP_SINGLE.out.reads) } ch_versions = ch_versions.mix(FASTP_SINGLE.out.versions.first()) @@ -44,11 +39,11 @@ workflow SHORTREAD_FASTP { ch_processed_reads = ch_fastp_reads_prepped - ch_multiqc_files = ch_multiqc_files.mix( FASTP_SINGLE.out.json ) - ch_multiqc_files = ch_multiqc_files.mix( FASTP_PAIRED.out.json ) + ch_multiqc_files = ch_multiqc_files.mix(FASTP_SINGLE.out.json) + ch_multiqc_files = ch_multiqc_files.mix(FASTP_PAIRED.out.json) emit: - reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/shortread_preprocessing/main.nf b/subworkflows/local/shortread_preprocessing/main.nf index 3cb355a..7cc7ef0 100644 --- a/subworkflows/local/shortread_preprocessing/main.nf +++ b/subworkflows/local/shortread_preprocessing/main.nf @@ -1,6 +1,12 @@ -include { SHORTREAD_FASTP } from '../shortread_fastp/main' -include { SHORTREAD_ADAPTERREMOVAL } from '../shortread_adapterremoval/main' -include { FASTQC as FASTQC_PROCESSED } from '../../../modules/nf-core/fastqc/main' +// +// Perform read trimming and merging +// + + +include { SHORTREAD_FASTP } from '../shortread_fastp/main' +include { SHORTREAD_ADAPTERREMOVAL } from '../shortread_adapterremoval/main' +include { FASTQC as FASTQC_PROCESSED } from '../../../modules/nf-core/fastqc/main' +include { FALCO as FALCO_PROCESSED } from '../../../modules/nf-core/falco/main' workflow SHORTREAD_PREPROCESSING { take: @@ -8,27 +14,38 @@ workflow SHORTREAD_PREPROCESSING { adapterlist // file main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() - if ( params.shortread_qc_tool == "fastp" ) { - ch_processed_reads = SHORTREAD_FASTP ( reads, adapterlist ).reads - ch_versions = ch_versions.mix( SHORTREAD_FASTP.out.versions ) - ch_multiqc_files = ch_multiqc_files.mix( SHORTREAD_FASTP.out.mqc ) - } else if ( params.shortread_qc_tool == "adapterremoval" ) { - ch_processed_reads = SHORTREAD_ADAPTERREMOVAL ( reads, adapterlist ).reads - ch_versions = ch_versions.mix( SHORTREAD_ADAPTERREMOVAL.out.versions ) - ch_multiqc_files = ch_multiqc_files.mix( SHORTREAD_ADAPTERREMOVAL.out.mqc ) - } else { + if (params.shortread_qc_tool == "fastp") { + SHORTREAD_FASTP(reads, adapterlist) + ch_processed_reads = SHORTREAD_FASTP.out.reads + ch_versions = ch_versions.mix(SHORTREAD_FASTP.out.versions) + ch_multiqc_files = ch_multiqc_files.mix(SHORTREAD_FASTP.out.mqc) + } + else if (params.shortread_qc_tool == "adapterremoval") { + SHORTREAD_ADAPTERREMOVAL(reads, adapterlist) + ch_processed_reads = SHORTREAD_ADAPTERREMOVAL.out.reads + ch_versions = ch_versions.mix(SHORTREAD_ADAPTERREMOVAL.out.versions) + ch_multiqc_files = ch_multiqc_files.mix(SHORTREAD_ADAPTERREMOVAL.out.mqc) + } + else { ch_processed_reads = reads } - FASTQC_PROCESSED ( ch_processed_reads ) - ch_versions = ch_versions.mix( FASTQC_PROCESSED.out.versions ) - ch_multiqc_files = ch_multiqc_files.mix( FASTQC_PROCESSED.out.zip ) + if (params.preprocessing_qc_tool == 'fastqc') { + FASTQC_PROCESSED(ch_processed_reads) + ch_versions = ch_versions.mix(FASTQC_PROCESSED.out.versions) + ch_multiqc_files = ch_multiqc_files.mix(FASTQC_PROCESSED.out.zip) + } + else if (params.preprocessing_qc_tool == 'falco') { + FALCO_PROCESSED(ch_processed_reads) + ch_versions = ch_versions.mix(FALCO_PROCESSED.out.versions) + ch_multiqc_files = ch_multiqc_files.mix(FALCO_PROCESSED.out.txt) + } emit: - reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap index fa4a194..dadc71a 100644 --- a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap @@ -17,7 +17,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "2": [ @@ -40,7 +40,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -72,7 +72,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-10T13:37:48.492968" + "timestamp": "2025-09-15T15:20:35.417926" }, "test_bam_stats_samtools_single_end - stub": { "content": [ @@ -92,7 +92,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "2": [ @@ -115,7 +115,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -147,7 +147,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-10T13:37:43.4053" + "timestamp": "2025-09-15T15:20:25.439222" }, "test_bam_stats_samtools_paired_end_cram - stub": { "content": [ @@ -167,7 +167,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "2": [ @@ -190,7 +190,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -222,7 +222,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-10T13:37:53.52248" + "timestamp": "2025-09-15T15:20:46.02738" }, "test_bam_stats_samtools_single_end": { "content": [ @@ -263,7 +263,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-10T13:37:27.672053" + "timestamp": "2025-09-15T15:20:00.064679" }, "test_bam_stats_samtools_paired_end": { "content": [ @@ -304,7 +304,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-10T13:37:32.985079" + "timestamp": "2025-09-15T15:20:08.141202" }, "test_bam_stats_samtools_paired_end_cram": { "content": [ @@ -345,6 +345,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-10T13:37:38.347584" + "timestamp": "2025-09-15T15:20:16.06318" } } \ No newline at end of file diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 562b7a3..1b292e3 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -36,7 +36,7 @@ "bowtie2": "2.5.4" }, "FASTP_PAIRED": { - "fastp": "1.0.1" + "fastp": "0.24.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -256,7 +256,6 @@ "multiqc/multiqc_plots/pdf/fastp-seq-quality-plot_Read_2_Before_filtering.pdf", "multiqc/multiqc_plots/pdf/fastp_filtered_reads_plot-cnt.pdf", "multiqc/multiqc_plots/pdf/fastp_filtered_reads_plot-pct.pdf", - "multiqc/multiqc_plots/pdf/fastqc-1-status-check-heatmap.pdf", "multiqc/multiqc_plots/pdf/fastqc-1_per_base_n_content_plot.pdf", "multiqc/multiqc_plots/pdf/fastqc-1_per_base_sequence_quality_plot.pdf", "multiqc/multiqc_plots/pdf/fastqc-1_per_sequence_gc_content_plot_Counts.pdf", @@ -265,7 +264,6 @@ "multiqc/multiqc_plots/pdf/fastqc-1_sequence_counts_plot-cnt.pdf", "multiqc/multiqc_plots/pdf/fastqc-1_sequence_counts_plot-pct.pdf", "multiqc/multiqc_plots/pdf/fastqc-1_sequence_duplication_levels_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", @@ -294,7 +292,6 @@ "multiqc/multiqc_plots/png/fastp-seq-quality-plot_Read_2_Before_filtering.png", "multiqc/multiqc_plots/png/fastp_filtered_reads_plot-cnt.png", "multiqc/multiqc_plots/png/fastp_filtered_reads_plot-pct.png", - "multiqc/multiqc_plots/png/fastqc-1-status-check-heatmap.png", "multiqc/multiqc_plots/png/fastqc-1_per_base_n_content_plot.png", "multiqc/multiqc_plots/png/fastqc-1_per_base_sequence_quality_plot.png", "multiqc/multiqc_plots/png/fastqc-1_per_sequence_gc_content_plot_Counts.png", @@ -303,7 +300,6 @@ "multiqc/multiqc_plots/png/fastqc-1_sequence_counts_plot-cnt.png", "multiqc/multiqc_plots/png/fastqc-1_sequence_counts_plot-pct.png", "multiqc/multiqc_plots/png/fastqc-1_sequence_duplication_levels_plot.png", - "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", @@ -332,7 +328,6 @@ "multiqc/multiqc_plots/svg/fastp-seq-quality-plot_Read_2_Before_filtering.svg", "multiqc/multiqc_plots/svg/fastp_filtered_reads_plot-cnt.svg", "multiqc/multiqc_plots/svg/fastp_filtered_reads_plot-pct.svg", - "multiqc/multiqc_plots/svg/fastqc-1-status-check-heatmap.svg", "multiqc/multiqc_plots/svg/fastqc-1_per_base_n_content_plot.svg", "multiqc/multiqc_plots/svg/fastqc-1_per_base_sequence_quality_plot.svg", "multiqc/multiqc_plots/svg/fastqc-1_per_sequence_gc_content_plot_Counts.svg", @@ -341,7 +336,6 @@ "multiqc/multiqc_plots/svg/fastqc-1_sequence_counts_plot-cnt.svg", "multiqc/multiqc_plots/svg/fastqc-1_sequence_counts_plot-pct.svg", "multiqc/multiqc_plots/svg/fastqc-1_sequence_duplication_levels_plot.svg", - "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", @@ -396,15 +390,15 @@ [ "01.fa:md5,17e6433115d1ad1b4ffdf384d783dc29", "02.fa:md5,9048642262df13a6fc427b2d971b7546", - "01.filtered.vcf.gz:md5,9f24409ae4638b0ed0fa8891bec1659b", + "01.filtered.vcf.gz:md5,c88bdfab2ce3be45e0e6a7af63d3ebc9", "01.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "02.filtered.vcf.gz:md5,1253ca69cd259bdf2f14a378a4df96e5", + "02.filtered.vcf.gz:md5,d1d38c6df971afedde985fa871892d84", "02.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "01.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "02.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "01.sorted.vcf.gz:md5,b70e6dd2223d07d8d233d9eb54f16fb1", + "01.sorted.vcf.gz:md5,60d8b9c025605a5c9c57ef2a0a28ac85", "01.sorted.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "02.sorted.vcf.gz:md5,208451945ce7c9be754fea959aa083c1", + "02.sorted.vcf.gz:md5,4ef2aa7bf7f0720e9e3bc35c8977e18c", "02.sorted.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "01.bcftools_stats.txt:md5,defae651d5565681d95172331c428d9d", "02.bcftools_stats.txt:md5,64ce5bc394014836c039d2f98503ee8e", @@ -421,34 +415,34 @@ "genome.fna.rev.1.bt2:md5,a1cc6383eb8d90710502a540f87bfa13", "genome.fna.rev.2.bt2:md5,871b69582268b9404cb1884a401cdc39", "versions.yml:md5,f986bc29ed66b12ac01d6a64a13c3227", - "01_test_1.fastp.html:md5,14e71d9c1f15f781897369739c461176", - "01_test_1.fastp.json:md5,8c5669f673278a2178784d153de87050", - "01_test_1.fastp.log:md5,b55b929ce1d3387d19e9310fc83b4cb9", - "02_test_2.fastp.html:md5,b815b81b18cd8876e8bb1c255da785d2", - "02_test_2.fastp.json:md5,09d0c941bb86ac309d93bc24d27fbd9b", - "02_test_2.fastp.log:md5,f3c8e20f1004e380dbe89b639f462c70", - "01_test_1_processed_1_fastqc.html:md5,9bd362ca57f59414f87dff6874cc0cfc", - "01_test_1_processed_1_fastqc.zip:md5,e0e90e71511d97a735c094a83bd72134", - "01_test_1_processed_2_fastqc.html:md5,7b433a3300a18167c5ba77206f65ce29", - "01_test_1_processed_2_fastqc.zip:md5,560fe56d458e32af3a8533cece92bfe5", - "02_test_2_processed_1_fastqc.html:md5,94979e55cae0f243e7ee9ac8889baa50", - "02_test_2_processed_1_fastqc.zip:md5,774c632f16a113a663a92128615336b5", - "02_test_2_processed_2_fastqc.html:md5,6f0e819a782f2de05489cf666278186d", - "02_test_2_processed_2_fastqc.zip:md5,946cb78c801cd2fa706da3e562861d84", - "01_test_1_raw_1_fastqc.html:md5,b9a29b3ea3beaf5a3e71e5f57a2a6871", - "01_test_1_raw_1_fastqc.zip:md5,2adf6891d78ff09ebeb50300ffa1668a", - "01_test_1_raw_2_fastqc.html:md5,b2f3607d678ea3aa66685d9f6bd14617", - "01_test_1_raw_2_fastqc.zip:md5,3278ca109e0e87c66501f1b511ea6a0c", - "02_test_2_raw_1_fastqc.html:md5,be150d5833bb946e941e100756bb3e98", - "02_test_2_raw_1_fastqc.zip:md5,1b1387115d48acbf1d55749905423955", - "02_test_2_raw_2_fastqc.html:md5,56ea6990e2e0457bf1dcb1b5416c9e2b", - "02_test_2_raw_2_fastqc.zip:md5,c020a963ba6f09ef6fe02c6ae4552929", + "01_test_1.fastp.html:md5,a37d818950547053a0a72e1a125f24ec", + "01_test_1.fastp.json:md5,3344250923cc58a7bb7f840a76051dd0", + "01_test_1.fastp.log:md5,6d6d688a242b5e5d297a4551984e2fe6", + "02_test_2.fastp.html:md5,fb9867a86b0bd68f2acda0d0690b028d", + "02_test_2.fastp.json:md5,a499231c7f816760797450f27df719e5", + "02_test_2.fastp.log:md5,93481c8b4b3eb7e673718d98e166f53a", + "01_test_1_processed_1_fastqc.html:md5,2ca35eb9e08eea70918edb79b43d6a41", + "01_test_1_processed_1_fastqc.zip:md5,5d6d394e70d89b918554455da5d0f942", + "01_test_1_processed_2_fastqc.html:md5,8d644d03687511ed06a31244f36a40c1", + "01_test_1_processed_2_fastqc.zip:md5,e0578de918da35336a5f84c5118b9fb9", + "02_test_2_processed_1_fastqc.html:md5,d2233aad19207c507f481681ad926d57", + "02_test_2_processed_1_fastqc.zip:md5,c4ef3dea3d371d9a3feac63931feeb71", + "02_test_2_processed_2_fastqc.html:md5,89be54e5f088450d0e8f16101589931e", + "02_test_2_processed_2_fastqc.zip:md5,9c7db4c4d78a3dab48095217070ff585", + "01_test_1_raw_1_fastqc.html:md5,b89b8de8f6dec78932b37314c320d0f3", + "01_test_1_raw_1_fastqc.zip:md5,380a42d052ef9ba5029a43bf6c981b3a", + "01_test_1_raw_2_fastqc.html:md5,8d6a242614af2ba9d62d8a56969bf261", + "01_test_1_raw_2_fastqc.zip:md5,eef31590eb5904a048af6c02932a1723", + "02_test_2_raw_1_fastqc.html:md5,b78725323250884de12582882a6c8409", + "02_test_2_raw_1_fastqc.zip:md5,d3d8ea3725599ad1061c2c2782fff9b3", + "02_test_2_raw_2_fastqc.html:md5,0017a0e0ffbbab349a721555548d5e8a", + "02_test_2_raw_2_fastqc.zip:md5,3a1cc5c692d328fe68d043d54eefdbe8", "01_test_1.processed.json:md5,125efed1942221fbf536885fbf475e66", "02_test_2.processed.json:md5,78fbdb421671f255b1c0e12cfe0653a4", "01_test_1.raw.json:md5,39066d3164d2dbdc7a198468cacaf838", "02_test_2.raw.json:md5,3cb79d84ea9de94940e4d1799c0e1c2b", - "01.vcf.gz:md5,1803ee1ae2773c7b85d833d435b544dc", - "02.vcf.gz:md5,293004bea2752b8f1f5f6ee8634eb374", + "01.vcf.gz:md5,99151019e740881f6dc260fd6684346b", + "02.vcf.gz:md5,881dd02b25859968d66acca7e0cefd8a", "genome.fna:md5,dafd38f5454b54fbea38245d773062a5", "genome.mmi:md5,76c23f17ce1cade4a054bf2763b081db", "fastp-insert-size-plot.txt:md5,162036bf69d2dc7386b43f2bdadac877", @@ -467,12 +461,12 @@ "fastp_filtered_reads_plot.txt:md5,b0bb82fc4a23564c834ef8c4f4706faf", "fastqc-1-status-check-heatmap.txt:md5,2958bbda783b97cef0b64530cbdbb01d", "fastqc-1_per_base_n_content_plot.txt:md5,ab8e8d876edde1e457b3153888c88107", - "fastqc-1_per_base_sequence_quality_plot.txt:md5,9e8b520d210127656adab7a734f0191e", - "fastqc-1_per_sequence_gc_content_plot_Counts.txt:md5,f1542e9e7398dda884460eaf46795ff5", - "fastqc-1_per_sequence_gc_content_plot_Percentages.txt:md5,86db46ff07ff526eee61d9de82ed76c0", - "fastqc-1_per_sequence_quality_scores_plot.txt:md5,67c58bd6be8e3404ebc1b438d9fcbf2c", - "fastqc-1_sequence_counts_plot.txt:md5,93e8c72254cab3431a2230298d970619", - "fastqc-1_sequence_duplication_levels_plot.txt:md5,c11a44d8967bcc3fd978b70c497dbd9a", + "fastqc-1_per_base_sequence_quality_plot.txt:md5,ebfcb629f7713a7de62f8cc714227258", + "fastqc-1_per_sequence_gc_content_plot_Counts.txt:md5,64b4384f9eef2f7c6256b3df0d68d56a", + "fastqc-1_per_sequence_gc_content_plot_Percentages.txt:md5,d2a0fc017d5ba88e777c855bf89732b9", + "fastqc-1_per_sequence_quality_scores_plot.txt:md5,c2bc0602f70325f7fb82678c235ad3be", + "fastqc-1_sequence_counts_plot.txt:md5,8f0b661870c70fa37b74c81d61be0ad5", + "fastqc-1_sequence_duplication_levels_plot.txt:md5,aa27aa03b7e4eeb2a22b8b7ac24194fe", "fastqc-status-check-heatmap.txt:md5,7d06360e828f3e153a0b21051d23911b", "fastqc_per_base_n_content_plot.txt:md5,ea371a265a80840751645c2476c98754", "fastqc_per_base_sequence_quality_plot.txt:md5,6362bc88473fc3c3e6d69a650fce6b3b", @@ -481,15 +475,15 @@ "fastqc_per_sequence_quality_scores_plot.txt:md5,3e61d4e1bc67d2cf85c00d020f6a32a8", "fastqc_sequence_counts_plot.txt:md5,d1c81af14b6675c3f9f04125c1ecb484", "fastqc_sequence_duplication_levels_plot.txt:md5,e32366bc23f5fb89aa60ef7b0f29de03", - "fastqc_sequence_length_distribution_plot.txt:md5,cb379474706e24255b725ac25b7d141e", - "llms-full.txt:md5,dd007f04c1c596fc6d2cdf44b3b41d98", - "multiqc.parquet:md5,f43674dc04859e0fd3660d488247ece1", + "fastqc_sequence_length_distribution_plot.txt:md5,e7bcd66dce7ca3b41a70e518608c4586", + "llms-full.txt:md5,03bf7eac9ff5bba648e4e584ab3b198a", + "multiqc.parquet:md5,632d8fc3bc249038cbd097bb6dc3b637", "multiqc_bcftools_stats_bcftools.txt:md5,c3ed02e08a492df1f0f889fcd03e331d", "multiqc_citations.txt:md5,57db2426be011862828d18f767d25b57", - "multiqc_fastp.txt:md5,699888aa8b30449fc313819952c69876", + "multiqc_fastp.txt:md5,d646c6b7ae38839c05130fb0b41359e6", "multiqc_fastqc.txt:md5,1dbca9f02b1b75f5df2ac02c81d78411", - "multiqc_fastqc_fastqc-1.txt:md5,6fb9e3135beb3f43f193bdcb67d247b2", - "multiqc_general_stats.txt:md5,314ca8131542969bbf41ffe8be336796", + "multiqc_fastqc_fastqc-1.txt:md5,e49ae5a350035d161d70d5fc97a0b2d6", + "multiqc_general_stats.txt:md5,123a961824ccf20f0258292694a3425d", "multiqc_samtools_stats_samtools.txt:md5,bc33622a9e4c162e1cb0ff5cabede2a6", "samtools-stats-dp.txt:md5,4b8fe2e0db527dc98fc21d27f2df0e11", "samtools_alignment_plot.txt:md5,164ec8a3eceb8d56809f7970f1d0290b", @@ -503,9 +497,9 @@ "01_test_1.read_stats.csv:md5,ff40aaa6720a766448a3b8bde72f530f", "02_test_2.read_stats.csv:md5,c0186b0b0464a58d780334ebb63cc70a", "genome.fna.fai:md5,aa44b24652a42e538478dea3492480dd", - "01.sorted.bam:md5,dc79ff95cc093e543bb490711b961551", - "01.sorted.bam.bai:md5,194c81a937bc1defaffe2e0aa1ddd8e6", - "02.sorted.bam:md5,8ac62b020645a540c193f507086697b4", + "01.sorted.bam:md5,0d0a6e5a988197b107d6727a44ce2ced", + "01.sorted.bam.bai:md5,d57d3efec086eada423f3cbaf7ab8638", + "02.sorted.bam:md5,10ab7cd638de4a381da05be92742daac", "02.sorted.bam.bai:md5,40d3309085ab80106f2f0c67b5dab19d", "01.sorted.flagstat:md5,4f152687b9140a16a48856b0bb216289", "01.sorted.idxstats:md5,aa16d5da39ddbdc94dbeb52ed994c515", @@ -525,6 +519,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-15T15:01:03.587767" + "timestamp": "2025-11-26T14:37:38.561842" } } \ No newline at end of file diff --git a/workflows/bactmap.nf b/workflows/bactmap.nf index f841a85..57c527e 100644 --- a/workflows/bactmap.nf +++ b/workflows/bactmap.nf @@ -184,10 +184,12 @@ workflow BACTMAP { SUBWORKFLOW: PERFORM PREPROCESSING */ - if ( params.perform_shortread_qc ) { - ch_shortreads_preprocessed = SHORTREAD_PREPROCESSING ( ch_input.fastq, adapterlist ).reads - ch_versions = ch_versions.mix( SHORTREAD_PREPROCESSING.out.versions ) - } else { + if (params.perform_shortread_qc) { + SHORTREAD_PREPROCESSING(ch_input.fastq, adapterlist) + ch_shortreads_preprocessed = SHORTREAD_PREPROCESSING.out.reads + ch_versions = ch_versions.mix(SHORTREAD_PREPROCESSING.out.versions) + } + else { ch_shortreads_preprocessed = ch_input.fastq } From 6765766febea7e6167a5119c31807574fc0e3612 Mon Sep 17 00:00:00 2001 From: Andries van Tonder Date: Mon, 12 Jan 2026 11:31:07 +0000 Subject: [PATCH 2/9] adjust mapping --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index f22bb75..51ad5eb 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -443,7 +443,7 @@ process { } withName: 'FREEBAYES' { - ext.args = '-p 2 -P 0 -C 2 -F 0.05 --min-coverage 10 --min-repeat-entropy 1.0 -q 13 -m 60 --strict-vcf' + ext.args = '-p 1 -P 0 -C 2 -F 0.05 --min-coverage 10 --min-repeat-entropy 1.0 -q 13 -m 30 --strict-vcf' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/freebayes" }, From c245512242bd39ba47d542db068c299a93c08ad6 Mon Sep 17 00:00:00 2001 From: Andries van Tonder Date: Fri, 16 Jan 2026 13:12:50 +0000 Subject: [PATCH 3/9] pipeline fixes --- conf/modules.config | 24 +- modules.json | 36 +- modules/nf-core/bcftools/index/main.nf | 2 - modules/nf-core/bcftools/norm/environment.yml | 10 + modules/nf-core/bcftools/norm/main.nf | 74 ++ modules/nf-core/bcftools/norm/meta.yml | 93 +++ .../nf-core/bcftools/norm/tests/main.nf.test | 563 +++++++++++++ .../bcftools/norm/tests/main.nf.test.snap | 758 ++++++++++++++++++ .../bcftools/norm/tests/nextflow.bcf.config | 4 + .../norm/tests/nextflow.bcf_gz.config | 4 + .../bcftools/norm/tests/nextflow.config | 4 + .../bcftools/norm/tests/nextflow.vcf.config | 4 + .../norm/tests/nextflow.vcf_gz.config | 4 + .../bcftools/norm/tests/vcf_gz_index.config | 4 + .../norm/tests/vcf_gz_index_csi.config | 4 + .../norm/tests/vcf_gz_index_tbi.config | 4 + modules/nf-core/bcftools/sort/main.nf | 3 +- modules/nf-core/bcftools/view/environment.yml | 10 + modules/nf-core/bcftools/view/main.nf | 75 ++ modules/nf-core/bcftools/view/meta.yml | 98 +++ .../nf-core/bcftools/view/tests/main.nf.test | 298 +++++++ .../bcftools/view/tests/main.nf.test.snap | 333 ++++++++ .../bcftools/view/tests/nextflow.config | 3 + .../bcftools/view/tests/vcf_gz_index.config | 4 + .../view/tests/vcf_gz_index_csi.config | 4 + .../view/tests/vcf_gz_index_tbi.config | 4 + modules/nf-core/cat/fastq/main.nf | 22 +- modules/nf-core/cat/fastq/meta.yml | 28 +- .../nf-core/cat/fastq/tests/main.nf.test.snap | 200 +++-- modules/nf-core/cat/fastq/tests/tags.yml | 2 - modules/nf-core/fastp/environment.yml | 3 +- modules/nf-core/fastp/main.nf | 27 +- modules/nf-core/fastp/meta.yml | 12 +- modules/nf-core/fastp/tests/main.nf.test | 313 +++++--- modules/nf-core/fastp/tests/main.nf.test.snap | 283 +++---- modules/nf-core/fastqc/main.nf | 16 +- modules/nf-core/fastqc/meta.yml | 51 +- modules/nf-core/fastqc/tests/main.nf.test | 12 +- .../nf-core/fastqc/tests/main.nf.test.snap | 228 ++++-- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 17 +- modules/nf-core/multiqc/meta.yml | 39 +- modules/nf-core/multiqc/tests/main.nf.test | 6 +- .../nf-core/multiqc/tests/main.nf.test.snap | 52 +- modules/nf-core/samtools/faidx/main.nf | 13 +- modules/nf-core/samtools/faidx/meta.yml | 27 +- .../nf-core/samtools/faidx/tests/main.nf.test | 78 +- .../samtools/faidx/tests/main.nf.test.snap | 188 +++-- .../samtools/faidx/tests/nextflow.config | 2 +- .../samtools/faidx/tests/nextflow2.config | 6 - modules/nf-core/samtools/sort/main.nf | 10 +- modules/nf-core/samtools/sort/meta.yml | 29 +- .../nf-core/samtools/sort/tests/main.nf.test | 20 +- .../samtools/sort/tests/main.nf.test.snap | 349 +++----- modules/nf-core/samtools/stats/main.nf | 12 +- modules/nf-core/samtools/stats/meta.yml | 28 +- .../samtools/stats/tests/main.nf.test.snap | 80 +- modules/nf-core/seqtk/comp/main.nf | 12 +- modules/nf-core/seqtk/comp/meta.yml | 32 +- .../seqtk/comp/tests/main.nf.test.snap | 36 +- subworkflows/local/longread_mapping/main.nf | 23 +- subworkflows/local/shortread_fastp/main.nf | 7 +- .../nf-core/bam_stats_samtools/main.nf | 1 - .../tests/main.nf.test.snap | 63 +- .../nf-core/utils_nfcore_pipeline/main.nf | 2 +- .../nf-core/utils_nfschema_plugin/main.nf | 41 +- .../utils_nfschema_plugin/tests/main.nf.test | 56 ++ .../tests/nextflow.config | 2 +- 68 files changed, 3792 insertions(+), 1062 deletions(-) create mode 100644 modules/nf-core/bcftools/norm/environment.yml create mode 100644 modules/nf-core/bcftools/norm/main.nf create mode 100644 modules/nf-core/bcftools/norm/meta.yml create mode 100644 modules/nf-core/bcftools/norm/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/norm/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/norm/tests/nextflow.bcf.config create mode 100644 modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config create mode 100644 modules/nf-core/bcftools/norm/tests/nextflow.config create mode 100644 modules/nf-core/bcftools/norm/tests/nextflow.vcf.config create mode 100644 modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config create mode 100644 modules/nf-core/bcftools/norm/tests/vcf_gz_index.config create mode 100644 modules/nf-core/bcftools/norm/tests/vcf_gz_index_csi.config create mode 100644 modules/nf-core/bcftools/norm/tests/vcf_gz_index_tbi.config create mode 100644 modules/nf-core/bcftools/view/environment.yml create mode 100644 modules/nf-core/bcftools/view/main.nf create mode 100644 modules/nf-core/bcftools/view/meta.yml create mode 100644 modules/nf-core/bcftools/view/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/view/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/view/tests/nextflow.config create mode 100644 modules/nf-core/bcftools/view/tests/vcf_gz_index.config create mode 100644 modules/nf-core/bcftools/view/tests/vcf_gz_index_csi.config create mode 100644 modules/nf-core/bcftools/view/tests/vcf_gz_index_tbi.config delete mode 100644 modules/nf-core/cat/fastq/tests/tags.yml delete mode 100644 modules/nf-core/samtools/faidx/tests/nextflow2.config diff --git a/conf/modules.config b/conf/modules.config index 51ad5eb..e627732 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -501,8 +501,8 @@ process { } withName: 'BCFTOOLS_FILTER' { - ext.args = '--write-index=tbi --output-type z --soft-filter LowQual' - //ext.args = '--write-index=tbi --output-type z --soft-filter LowQual --exclude "%QUAL<25 || FORMAT/DP<10"' + //ext.args = '--write-index=tbi --output-type z --soft-filter LowQual' + ext.args = '--write-index=tbi --output-type z -i "QUAL > 20 && INFO/SAF > 0 && INFO/SAR > 0 && (INFO/SRF > 0 || INFO/SRR > 0) && (INFO/AO / INFO/DP) > 0.9"' ext.prefix = { "${meta.id}.filtered" } publishDir = [ path: { "${params.outdir}/bcftools/filter" }, @@ -511,6 +511,26 @@ process { ] } + withName: 'BCFTOOLS_VIEW' { + ext.args = '-f PASS --write-index=tbi --output-type z' + ext.prefix = { "${meta.id}.filtered.pass" } + publishDir = [ + path: { "${params.outdir}/bcftools/view" }, + mode: params.publish_dir_mode, + pattern: '*.vcf.gz' + ] + } + + withName: 'BCFTOOLS_NORM' { + ext.args = '--output-type z -m -any --write-index=tbi' + ext.prefix = { "${meta.id}.normalised" } + publishDir = [ + path: { "${params.outdir}/bcftools/view" }, + mode: params.publish_dir_mode, + pattern: '*.vcf.gz' + ] + } + withName: 'BCFTOOLS_STATS' { ext.args = '' ext.prefix = { "${meta.id}" } diff --git a/modules.json b/modules.json index 830a3bd..70e3cb1 100644 --- a/modules.json +++ b/modules.json @@ -17,9 +17,14 @@ }, "bcftools/index": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "94a767478097e92dca1386ea623d9dae9edc025a", "installed_by": ["bam_variant_calling_sort_freebayes_bcftools"] }, + "bcftools/norm": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["modules"] + }, "bcftools/query": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", @@ -27,7 +32,7 @@ }, "bcftools/sort": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "1a2aa4aaf1916cca388cf27c7a6d8238bb5ad68b", "installed_by": ["bam_variant_calling_sort_freebayes_bcftools"] }, "bcftools/stats": { @@ -35,6 +40,11 @@ "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, + "bcftools/view": { + "branch": "master", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "installed_by": ["modules"] + }, "bedtools/subtract": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", @@ -62,7 +72,7 @@ }, "cat/fastq": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "f4743b089085121497b7c1c81a28810ce2740dde", "installed_by": ["modules"] }, "falco": { @@ -72,12 +82,12 @@ }, "fastp": { "branch": "master", - "git_sha": "d9ec4ef289ad39b8a662a7a12be50409b11df84b", + "git_sha": "b8f1de0ac853ae5b56c63450d47438f899c553d0", "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", "installed_by": ["modules"] }, "fastqscan": { @@ -112,7 +122,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "8deffd6a402233ebf905c66dbf804bd4c2637946", + "git_sha": "80cba9452fb1e9bb79884976fa1ca0e671949aa2", "installed_by": ["modules"] }, "nanoq": { @@ -132,7 +142,7 @@ }, "samtools/faidx": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", "installed_by": ["modules"] }, "samtools/flagstat": { @@ -152,17 +162,17 @@ }, "samtools/sort": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", "installed_by": ["bam_stats_samtools", "modules"] }, "seqtk/comp": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "a46713779030a5f508117080cbf4b693dd4c6e33", "installed_by": ["modules"] }, "snpsites": { @@ -176,7 +186,7 @@ "nf-core": { "bam_stats_samtools": { "branch": "master", - "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", + "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { @@ -186,12 +196,12 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "dcd088f483cede0c3df4034d405126f05a764cc7", + "git_sha": "ff506dcada6fc826ed0c641dc2ed1e98f7345fbe", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/bcftools/index/main.nf b/modules/nf-core/bcftools/index/main.nf index 16ff775..ad1feb1 100644 --- a/modules/nf-core/bcftools/index/main.nf +++ b/modules/nf-core/bcftools/index/main.nf @@ -20,7 +20,6 @@ process BCFTOOLS_INDEX { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" """ bcftools \\ @@ -37,7 +36,6 @@ process BCFTOOLS_INDEX { stub: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" def extension = args.contains("--tbi") || args.contains("-t") ? "tbi" : "csi" """ diff --git a/modules/nf-core/bcftools/norm/environment.yml b/modules/nf-core/bcftools/norm/environment.yml new file mode 100644 index 0000000..ba863b3 --- /dev/null +++ b/modules/nf-core/bcftools/norm/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/norm/main.nf b/modules/nf-core/bcftools/norm/main.nf new file mode 100644 index 0000000..f245771 --- /dev/null +++ b/modules/nf-core/bcftools/norm/main.nf @@ -0,0 +1,74 @@ +process BCFTOOLS_NORM { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': + 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + + input: + tuple val(meta), path(vcf), path(tbi) + tuple val(meta2), path(fasta) + + output: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi, optional: true + tuple val(meta), path("*.csi") , emit: csi, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf.gz" + + """ + bcftools norm \\ + --fasta-ref ${fasta} \\ + --output ${prefix}.${extension} \\ + $args \\ + --threads $task.cpus \\ + ${vcf} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf.gz" + def index = '' + if (extension in ['vcf.gz', 'bcf', 'bcf.gz']) { + if (['--write-index=tbi', '-W=tbi'].any { args.contains(it) } && extension == 'vcf.gz') { + index = 'tbi' + } else if (['--write-index=tbi', '-W=tbi', '--write-index=csi', '-W=csi', '--write-index', '-W'].any { args.contains(it) }) { + index = 'csi' + } + } + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = index ? "touch ${prefix}.${extension}.${index}" : "" + + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/norm/meta.yml b/modules/nf-core/bcftools/norm/meta.yml new file mode 100644 index 0000000..bda9125 --- /dev/null +++ b/modules/nf-core/bcftools/norm/meta.yml @@ -0,0 +1,93 @@ +name: bcftools_norm +description: Normalize VCF file +keywords: + - normalize + - norm + - variant calling + - VCF +tools: + - norm: + description: | + Normalize VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + The vcf file to be normalized + e.g. 'file1.vcf' + pattern: "*.{vcf,vcf.gz}" + ontologies: [] + - tbi: + type: file + description: | + An optional index of the VCF file (for when the VCF is compressed) + pattern: "*.vcf.gz.tbi" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: FASTA reference file + pattern: "*.{fasta,fa}" + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{vcf,vcf.gz,bcf,bcf.gz}": + type: file + description: One of uncompressed VCF (.vcf), compressed VCF (.vcf.gz), compressed + BCF (.bcf.gz) or uncompressed BCF (.bcf) normalized output file + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + ontologies: [] + tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.tbi": + type: file + description: Alternative VCF file index + pattern: "*.tbi" + ontologies: [] + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.csi": + type: file + description: Default VCF file index + pattern: "*.csi" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@abhi18av" + - "@ramprasadn" +maintainers: + - "@abhi18av" + - "@ramprasadn" diff --git a/modules/nf-core/bcftools/norm/tests/main.nf.test b/modules/nf-core/bcftools/norm/tests/main.nf.test new file mode 100644 index 0000000..9cd5c11 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/main.nf.test @@ -0,0 +1,563 @@ +nextflow_process { + + name "Test Process BCFTOOLS_NORM" + script "../main.nf" + process "BCFTOOLS_NORM" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/norm" + + test("sarscov2 - [ vcf, [] ], fasta") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } } + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi") { + + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } } + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } } + ).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + test("sarscov2 - [ vcf, tbi ], fasta") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf output") { + + config "./nextflow.vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf_gz output") { + + config "./nextflow.vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf output") { + + config "./nextflow.bcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf_gz output") { + + config "./nextflow.bcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, [] ], fasta - stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, tbi ], fasta -stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf output -stub") { + + config "./nextflow.vcf.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf_gz output - stub") { + + config "./nextflow.vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf output - stub") { + + config "./nextflow.bcf.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf_gz output - stub") { + + config "./nextflow.bcf_gz.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index - stub") { + + config "./vcf_gz_index.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi - stub") { + + config "./vcf_gz_index_csi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi - stub") { + + config "./vcf_gz_index_tbi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + +} diff --git a/modules/nf-core/bcftools/norm/tests/main.nf.test.snap b/modules/nf-core/bcftools/norm/tests/main.nf.test.snap new file mode 100644 index 0000000..aca1b5f --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/main.nf.test.snap @@ -0,0 +1,758 @@ +{ + "sarscov2 - [ vcf, tbi ], fasta - vcf_gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:46.221551" + }, + "sarscov2 - [ vcf, [] ], fasta - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:30.84993" + }, + "sarscov2 - [ vcf, tbi ], fasta - vcf output": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:11.25102" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:28:00.817863" + }, + "sarscov2 - [ vcf, tbi ], fasta - vcf_gz output": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + + ], + [ + + ], + [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:15.720417" + }, + "sarscov2 - [ vcf, [] ], fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:26:45.743173" + }, + "sarscov2 - [ vcf, tbi ], fasta - vcf output -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:41.556719" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf_gz output": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,bf88706ef69c44ca9e287bc953ba3593" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,bf88706ef69c44ca9e287bc953ba3593" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:25.351662" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:28:05.288206" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-05T13:53:28.356741947" + }, + "sarscov2 - [ vcf, tbi ], fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:06.16527" + }, + "sarscov2 - [ vcf, tbi ], fasta -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:36.335307" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf_gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:56.393941" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-05T07:52:58.381931979" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:51.326069" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:28:09.716294" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-05T13:53:09.808834237" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf output": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,638c3c25bdd495c90ecbccb69ee77f07" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,638c3c25bdd495c90ecbccb69ee77f07" + ] + ], + "versions": [ + "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:27:20.370229" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.bcf.config b/modules/nf-core/bcftools/norm/tests/nextflow.bcf.config new file mode 100644 index 0000000..b79af86 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.bcf.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type b --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config b/modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config new file mode 100644 index 0000000..f36f397 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type u --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.config b/modules/nf-core/bcftools/norm/tests/nextflow.config new file mode 100644 index 0000000..510803b --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.vcf.config b/modules/nf-core/bcftools/norm/tests/nextflow.vcf.config new file mode 100644 index 0000000..10bf93e --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.vcf.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type v --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config b/modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config new file mode 100644 index 0000000..b31dd2d --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type z ---no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/vcf_gz_index.config b/modules/nf-core/bcftools/norm/tests/vcf_gz_index.config new file mode 100644 index 0000000..7dd696e --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/vcf_gz_index.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index --no-version" +} diff --git a/modules/nf-core/bcftools/norm/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/norm/tests/vcf_gz_index_csi.config new file mode 100644 index 0000000..aebffb6 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/vcf_gz_index_csi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=csi --no-version" +} diff --git a/modules/nf-core/bcftools/norm/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/norm/tests/vcf_gz_index_tbi.config new file mode 100644 index 0000000..b192ae7 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/vcf_gz_index_tbi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=tbi --no-version" +} diff --git a/modules/nf-core/bcftools/sort/main.nf b/modules/nf-core/bcftools/sort/main.nf index 294d476..2c939b8 100644 --- a/modules/nf-core/bcftools/sort/main.nf +++ b/modules/nf-core/bcftools/sort/main.nf @@ -27,12 +27,13 @@ process BCFTOOLS_SORT { args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : "vcf" - + def max_memory = task.memory ? "--max-mem ${task.memory.toUnit('MB') * 0.9}M" : "" """ bcftools \\ sort \\ --output ${prefix}.${extension} \\ --temp-dir . \\ + $max_memory \\ $args \\ $vcf diff --git a/modules/nf-core/bcftools/view/environment.yml b/modules/nf-core/bcftools/view/environment.yml new file mode 100644 index 0000000..ba863b3 --- /dev/null +++ b/modules/nf-core/bcftools/view/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/view/main.nf b/modules/nf-core/bcftools/view/main.nf new file mode 100644 index 0000000..72b3120 --- /dev/null +++ b/modules/nf-core/bcftools/view/main.nf @@ -0,0 +1,75 @@ +process BCFTOOLS_VIEW { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': + 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + + input: + tuple val(meta), path(vcf), path(index) + path(regions) + path(targets) + path(samples) + + output: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi") , emit: tbi, optional: true + tuple val(meta), path("*.csi") , emit: csi, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def regions_file = regions ? "--regions-file ${regions}" : "" + def targets_file = targets ? "--targets-file ${targets}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + """ + bcftools view \\ + --output ${prefix}.${extension} \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + $args \\ + --threads $task.cpus \\ + ${vcf} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" + def stub_index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : + args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : + args.contains("--write-index") || args.contains("-W") ? "csi" : + "" + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = extension.endsWith(".gz") && stub_index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${stub_index}" : "" + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/view/meta.yml b/modules/nf-core/bcftools/view/meta.yml new file mode 100644 index 0000000..e9df974 --- /dev/null +++ b/modules/nf-core/bcftools/view/meta.yml @@ -0,0 +1,98 @@ +name: bcftools_view +description: View, subset and filter VCF or BCF files by position and filtering expression. + Convert between VCF and BCF +keywords: + - variant calling + - view + - bcftools + - VCF +tools: + - view: + description: | + View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + The vcf file to be inspected. + e.g. 'file.vcf' + ontologies: [] + - index: + type: file + description: | + The tab index for the VCF file to be inspected. + e.g. 'file.tbi' + ontologies: [] + - regions: + type: file + description: | + Optionally, restrict the operation to regions listed in this file. + e.g. 'file.vcf' + ontologies: [] + - targets: + type: file + description: | + Optionally, restrict the operation to regions listed in this file (doesn't rely upon index files) + e.g. 'file.vcf' + ontologies: [] + - samples: + type: file + description: | + Optional, file of sample names to be included or excluded. + e.g. 'file.tsv' + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{vcf,vcf.gz,bcf,bcf.gz}": + type: file + description: VCF normalized output file + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + ontologies: [] + tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.tbi": + type: file + description: Alternative VCF file index + pattern: "*.tbi" + ontologies: [] + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.csi": + type: file + description: Default VCF file index + pattern: "*.csi" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@abhi18av" +maintainers: + - "@abhi18av" diff --git a/modules/nf-core/bcftools/view/tests/main.nf.test b/modules/nf-core/bcftools/view/tests/main.nf.test new file mode 100644 index 0000000..8281c17 --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/main.nf.test @@ -0,0 +1,298 @@ +nextflow_process { + + name "Test Process BCFTOOLS_VIEW" + script "../main.nf" + process "BCFTOOLS_VIEW" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/view" + + test("sarscov2 - [vcf, tbi], [], [], []") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi") { + + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.versions + ).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + + test("sarscov2 - [vcf, tbi], vcf, tsv, []") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + input[2] = file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.targets.tsv.gz', checkIfExists: true) + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.vcf[0][1]).name, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index - stub") { + + config "./vcf_gz_index.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi - stub") { + + config "./vcf_gz_index_csi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi - stub") { + + config "./vcf_gz_index_tbi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + + } + +} diff --git a/modules/nf-core/bcftools/view/tests/main.nf.test.snap b/modules/nf-core/bcftools/view/tests/main.nf.test.snap new file mode 100644 index 0000000..38b61e4 --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/main.nf.test.snap @@ -0,0 +1,333 @@ +{ + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ], + "csi": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:59:19.949819" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + + ], + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.tbi" + ] + ], + [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:59:00.329884" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ], + "csi": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:59:15.546282" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:59:24.406961" + }, + "sarscov2 - [vcf, tbi], vcf, tsv, []": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out.vcf:md5,1bcbd0eff25d316ba915d06463aab17b" + ] + ], + [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:59:05.680096" + }, + "sarscov2 - [vcf, tbi], [], [], [] - stub": { + "content": [ + "out.vcf", + [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:59:10.959586" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:58:50.932203" + }, + "sarscov2 - [vcf, tbi], [], [], []": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out.vcf:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:58:45.877214" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi" + ] + ], + [ + + ], + [ + "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-09-11T14:58:55.616644" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/view/tests/nextflow.config b/modules/nf-core/bcftools/view/tests/nextflow.config new file mode 100644 index 0000000..932e3ba --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = '--no-version --output-type v' +} diff --git a/modules/nf-core/bcftools/view/tests/vcf_gz_index.config b/modules/nf-core/bcftools/view/tests/vcf_gz_index.config new file mode 100644 index 0000000..7dd696e --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/vcf_gz_index.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index --no-version" +} diff --git a/modules/nf-core/bcftools/view/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/view/tests/vcf_gz_index_csi.config new file mode 100644 index 0000000..aebffb6 --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/vcf_gz_index_csi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=csi --no-version" +} diff --git a/modules/nf-core/bcftools/view/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/view/tests/vcf_gz_index_tbi.config new file mode 100644 index 0000000..b192ae7 --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/vcf_gz_index_tbi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=tbi --no-version" +} diff --git a/modules/nf-core/cat/fastq/main.nf b/modules/nf-core/cat/fastq/main.nf index acfb6d0..8480e38 100644 --- a/modules/nf-core/cat/fastq/main.nf +++ b/modules/nf-core/cat/fastq/main.nf @@ -12,7 +12,7 @@ process CAT_FASTQ { output: tuple val(meta), path("*.merged.fastq.gz"), emit: reads - path "versions.yml", emit: versions + tuple val("${task.process}"), val("cat"), eval("cat --version 2>&1 | head -n 1 | sed 's/^.*coreutils) //; s/ .*\$//'"), emit: versions_cat, topic: versions when: task.ext.when == null || task.ext.when @@ -24,11 +24,6 @@ process CAT_FASTQ { if (readList.size >= 1) { """ cat ${readList.join(' ')} > ${prefix}.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS """ } else { error("Could not find any FASTQ files to concatenate in the process input") @@ -42,11 +37,6 @@ process CAT_FASTQ { """ cat ${read1.join(' ')} > ${prefix}_1.merged.fastq.gz cat ${read2.join(' ')} > ${prefix}_2.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS """ } else { error("Could not find any FASTQ file pairs to concatenate in the process input") @@ -60,11 +50,6 @@ process CAT_FASTQ { if (readList.size >= 1) { """ echo '' | gzip > ${prefix}.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS """ } else { error("Could not find any FASTQ files to concatenate in the process input") @@ -75,11 +60,6 @@ process CAT_FASTQ { """ echo '' | gzip > ${prefix}_1.merged.fastq.gz echo '' | gzip > ${prefix}_2.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS """ } else { error("Could not find any FASTQ file pairs to concatenate in the process input") diff --git a/modules/nf-core/cat/fastq/meta.yml b/modules/nf-core/cat/fastq/meta.yml index 40d2f62..8fc03bd 100644 --- a/modules/nf-core/cat/fastq/meta.yml +++ b/modules/nf-core/cat/fastq/meta.yml @@ -34,13 +34,29 @@ output: description: Merged fastq file pattern: "*.{merged.fastq.gz}" ontologies: [] + versions_cat: + - - ${task.process}: + type: string + description: The process the versions were collected from + - cat: + type: string + description: The tool name + - cat --version 2>&1 | head -n 1 | sed 's/^.*coreutils) //; s/ .*\$//': + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - cat: + type: string + description: The tool name + - cat --version 2>&1 | head -n 1 | sed 's/^.*coreutils) //; s/ .*\$//': + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/cat/fastq/tests/main.nf.test.snap b/modules/nf-core/cat/fastq/tests/main.nf.test.snap index ee5ab36..e2a9424 100644 --- a/modules/nf-core/cat/fastq/tests/main.nf.test.snap +++ b/modules/nf-core/cat/fastq/tests/main.nf.test.snap @@ -22,7 +22,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -33,16 +37,20 @@ "test.merged.fastq.gz:md5,4161df271f9bfcd25d5845a1e220dbec" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:04.902821069" + "timestamp": "2025-12-10T14:31:42.84401526" }, "test_cat_fastq_paired_end_same_name": { "content": [ @@ -60,7 +68,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -74,16 +86,20 @@ ] ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:23:57.476357974" + "timestamp": "2025-12-10T14:31:36.820489323" }, "test_cat_fastq_paired_end_same_name - stub": { "content": [ @@ -101,7 +117,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -115,16 +135,20 @@ ] ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:34.615815265" + "timestamp": "2025-12-10T14:32:06.262192935" }, "test_cat_fastq_single_end": { "content": [ @@ -139,7 +163,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -150,16 +178,20 @@ "test.merged.fastq.gz:md5,ee314a9bd568d06617171b0c85f508da" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:23:32.489874386" + "timestamp": "2025-12-10T14:31:18.859169785" }, "test_cat_fastq_single_end_same_name": { "content": [ @@ -174,7 +206,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -185,16 +221,20 @@ "test.merged.fastq.gz:md5,3ad9406595fafec8172368f9cd0b6a22" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:23:49.184759506" + "timestamp": "2025-12-10T14:31:30.942615287" }, "test_cat_fastq_single_end - stub": { "content": [ @@ -209,7 +249,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -220,16 +264,20 @@ "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:12.857293744" + "timestamp": "2025-12-10T14:31:48.827990633" }, "test_cat_fastq_paired_end_no_files": { "content": [ @@ -264,7 +312,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -275,16 +327,20 @@ "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:27.816080065" + "timestamp": "2025-12-10T14:32:00.586584379" }, "test_cat_fastq_paired_end": { "content": [ @@ -302,7 +358,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -316,16 +376,20 @@ ] ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:23:41.739469187" + "timestamp": "2025-12-10T14:31:25.159365603" }, "test_cat_fastq_single_end_no_files": { "content": [ @@ -353,7 +417,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -367,16 +435,20 @@ ] ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:21.178950408" + "timestamp": "2025-12-10T14:31:54.850702874" }, "test_cat_fastq_single_end_single_file - stub": { "content": [ @@ -391,7 +463,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -402,15 +478,19 @@ "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:40.851404993" + "timestamp": "2025-12-10T14:32:11.746498148" } } \ No newline at end of file diff --git a/modules/nf-core/cat/fastq/tests/tags.yml b/modules/nf-core/cat/fastq/tests/tags.yml deleted file mode 100644 index 6ac4361..0000000 --- a/modules/nf-core/cat/fastq/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -cat/fastq: - - modules/nf-core/cat/fastq/** diff --git a/modules/nf-core/fastp/environment.yml b/modules/nf-core/fastp/environment.yml index b297639..0c36eed 100644 --- a/modules/nf-core/fastp/environment.yml +++ b/modules/nf-core/fastp/environment.yml @@ -4,4 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::fastp=0.24.0 \ No newline at end of file + # renovate: datasource=conda depName=bioconda/fastp + - bioconda::fastp=1.0.1 diff --git a/modules/nf-core/fastp/main.nf b/modules/nf-core/fastp/main.nf index 8862506..7538fc3 100644 --- a/modules/nf-core/fastp/main.nf +++ b/modules/nf-core/fastp/main.nf @@ -4,12 +4,11 @@ process FASTP { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/88/889a182b8066804f4799f3808a5813ad601381a8a0e3baa4ab8d73e739b97001/data' : - 'community.wave.seqera.io/library/fastp:0.24.0--62c97b06e8447690' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/527b18847a97451091dba07a886b24f17f742a861f9f6c9a6bfb79d4f1f3bf9d/data' : + 'community.wave.seqera.io/library/fastp:1.0.1--c8b87fe62dcc103c' }" input: - tuple val(meta), path(reads) - path adapter_fasta + tuple val(meta), path(reads), path(adapter_fasta) val discard_trimmed_pass val save_trimmed_fail val save_merged @@ -30,9 +29,9 @@ process FASTP { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def adapter_list = adapter_fasta ? "--adapter_fasta ${adapter_fasta}" : "" - def fail_fastq = save_trimmed_fail && meta.single_end ? "--failed_out ${prefix}.fail.fastq.gz" : save_trimmed_fail && !meta.single_end ? "--failed_out ${prefix}.paired.fail.fastq.gz --unpaired1 ${prefix}_1.fail.fastq.gz --unpaired2 ${prefix}_2.fail.fastq.gz" : '' - def out_fq1 = discard_trimmed_pass ?: ( meta.single_end ? "--out1 ${prefix}.fastp.fastq.gz" : "--out1 ${prefix}_1.fastp.fastq.gz" ) - def out_fq2 = discard_trimmed_pass ?: "--out2 ${prefix}_2.fastp.fastq.gz" + def fail_fastq = save_trimmed_fail && meta.single_end ? "--failed_out ${prefix}.fail.fastq.gz" : save_trimmed_fail && !meta.single_end ? "--failed_out ${prefix}.paired.fail.fastq.gz --unpaired1 ${prefix}_R1.fail.fastq.gz --unpaired2 ${prefix}_R2.fail.fastq.gz" : '' + def out_fq1 = discard_trimmed_pass ?: ( meta.single_end ? "--out1 ${prefix}.fastp.fastq.gz" : "--out1 ${prefix}_R1.fastp.fastq.gz" ) + def out_fq2 = discard_trimmed_pass ?: "--out2 ${prefix}_R2.fastp.fastq.gz" // Added soft-links to original fastqs for consistent naming in MultiQC // Use single ended for interleaved. Add --interleaved_in in config. if ( task.ext.args?.contains('--interleaved_in') ) { @@ -79,11 +78,11 @@ process FASTP { } else { def merge_fastq = save_merged ? "-m --merged_out ${prefix}.merged.fastq.gz" : '' """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -sf ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -sf ${reads[1]} ${prefix}_2.fastq.gz + [ ! -f ${prefix}_R1.fastq.gz ] && ln -sf ${reads[0]} ${prefix}_R1.fastq.gz + [ ! -f ${prefix}_R2.fastq.gz ] && ln -sf ${reads[1]} ${prefix}_R2.fastq.gz fastp \\ - --in1 ${prefix}_1.fastq.gz \\ - --in2 ${prefix}_2.fastq.gz \\ + --in1 ${prefix}_R1.fastq.gz \\ + --in2 ${prefix}_R2.fastq.gz \\ $out_fq1 \\ $out_fq2 \\ --json ${prefix}.fastp.json \\ @@ -106,9 +105,9 @@ process FASTP { stub: def prefix = task.ext.prefix ?: "${meta.id}" def is_single_output = task.ext.args?.contains('--interleaved_in') || meta.single_end - def touch_reads = (discard_trimmed_pass) ? "" : (is_single_output) ? "echo '' | gzip > ${prefix}.fastp.fastq.gz" : "echo '' | gzip > ${prefix}_1.fastp.fastq.gz ; echo '' | gzip > ${prefix}_2.fastp.fastq.gz" + def touch_reads = (discard_trimmed_pass) ? "" : (is_single_output) ? "echo '' | gzip > ${prefix}.fastp.fastq.gz" : "echo '' | gzip > ${prefix}_R1.fastp.fastq.gz ; echo '' | gzip > ${prefix}_R2.fastp.fastq.gz" def touch_merged = (!is_single_output && save_merged) ? "echo '' | gzip > ${prefix}.merged.fastq.gz" : "" - def touch_fail_fastq = (!save_trimmed_fail) ? "" : meta.single_end ? "echo '' | gzip > ${prefix}.fail.fastq.gz" : "echo '' | gzip > ${prefix}.paired.fail.fastq.gz ; echo '' | gzip > ${prefix}_1.fail.fastq.gz ; echo '' | gzip > ${prefix}_2.fail.fastq.gz" + def touch_fail_fastq = (!save_trimmed_fail) ? "" : meta.single_end ? "echo '' | gzip > ${prefix}.fail.fastq.gz" : "echo '' | gzip > ${prefix}.paired.fail.fastq.gz ; echo '' | gzip > ${prefix}_R1.fail.fastq.gz ; echo '' | gzip > ${prefix}_R2.fail.fastq.gz" """ $touch_reads $touch_fail_fastq @@ -122,4 +121,4 @@ process FASTP { fastp: \$(fastp --version 2>&1 | sed -e "s/fastp //g") END_VERSIONS """ -} \ No newline at end of file +} diff --git a/modules/nf-core/fastp/meta.yml b/modules/nf-core/fastp/meta.yml index f4c276a..324025f 100644 --- a/modules/nf-core/fastp/meta.yml +++ b/modules/nf-core/fastp/meta.yml @@ -25,11 +25,11 @@ input: respectively. If you wish to run interleaved paired-end data, supply as single-end data but with `--interleaved_in` in your `modules.conf`'s `ext.args` for the module. ontologies: [] - - adapter_fasta: - type: file - description: File in FASTA format containing possible adapters to remove. - pattern: "*.{fasta,fna,fas,fa}" - ontologies: [] + - adapter_fasta: + type: file + description: File in FASTA format containing possible adapters to remove. + pattern: "*.{fasta,fna,fas,fa}" + ontologies: [] - discard_trimmed_pass: type: boolean description: | @@ -124,4 +124,4 @@ authors: - "@kevinmenden" maintainers: - "@drpatelh" - - "@kevinmenden" \ No newline at end of file + - "@kevinmenden" diff --git a/modules/nf-core/fastp/tests/main.nf.test b/modules/nf-core/fastp/tests/main.nf.test index 30dbb8a..5125705 100644 --- a/modules/nf-core/fastp/tests/main.nf.test +++ b/modules/nf-core/fastp/tests/main.nf.test @@ -13,14 +13,19 @@ nextflow_process { process { """ + adapter_fasta = [] // empty list for no adapter file! + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -31,11 +36,11 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("single end (151 cycles)") }, { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 99") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads_fail, process.out.reads_merged, - process.out.versions).match() } + process.out.versions).match() + } ) } } @@ -46,20 +51,22 @@ nextflow_process { process { """ - adapter_fasta = [] - save_trimmed_pass = true - save_trimmed_fail = false - save_merged = false + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -70,7 +77,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("The input has little adapter percentage (~0.000000%), probably it's trimmed before.") }, { assert path(process.out.log.get(0).get(1)).getText().contains("Q30 bases: 12281(88.3716%)") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads_fail, process.out.reads_merged, @@ -85,14 +91,19 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -106,7 +117,6 @@ nextflow_process { { assert process.out.reads_merged == [] }, { assert snapshot( process.out.reads, - process.out.json, process.out.versions).match() } ) } @@ -118,14 +128,19 @@ nextflow_process { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = true + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = true - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -136,7 +151,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("single end (151 cycles)") }, { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 99") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads_fail, process.out.reads_merged, @@ -151,15 +165,22 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = true + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = true - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -173,7 +194,6 @@ nextflow_process { process.out.reads, process.out.reads_fail, process.out.reads_merged, - process.out.json, process.out.versions).match() } ) } @@ -184,15 +204,22 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = true + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = true + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -203,7 +230,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("The input has little adapter percentage (~0.000000%), probably it's trimmed before.") }, { assert path(process.out.log.get(0).get(1)).getText().contains("total reads: 75") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads_fail, process.out.reads_merged, @@ -217,15 +243,22 @@ nextflow_process { when { process { """ + adapter_fasta = file(params.modules_testdata_base_path + 'delete_me/fastp/adapters.fasta', checkIfExists: true) + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = true + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = Channel.of([ file(params.modules_testdata_base_path + 'delete_me/fastp/adapters.fasta', checkIfExists: true) ]) + input[1] = false input[2] = false - input[3] = false - input[4] = true + input[3] = true """ } } @@ -236,7 +269,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("
") }, { assert path(process.out.log.get(0).get(1)).getText().contains("total bases: 13683") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads_fail, process.out.reads_merged, @@ -250,14 +282,20 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = true + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = true - input[3] = false - input[4] = false + + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -268,7 +306,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("single end (151 cycles)") }, { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 99") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads, process.out.reads_fail, @@ -285,15 +322,22 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = true + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = [] - input[2] = true - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -304,7 +348,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("The input has little adapter percentage (~0.000000%), probably it's trimmed before.") }, { assert path(process.out.log.get(0).get(1)).getText().contains("Q30 bases: 12281(88.3716%)") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads, process.out.reads_fail, @@ -324,14 +367,19 @@ nextflow_process { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -352,20 +400,20 @@ nextflow_process { process { """ - adapter_fasta = [] - save_trimmed_pass = true - save_trimmed_fail = false - save_merged = false + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -386,14 +434,19 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -414,14 +467,19 @@ nextflow_process { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = true + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = true - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -442,15 +500,20 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = true + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)] + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = true - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -470,15 +533,20 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = true + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = true + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -498,15 +566,22 @@ nextflow_process { when { process { """ + adapter_fasta = file(params.modules_testdata_base_path + 'delete_me/fastp/adapters.fasta', checkIfExists: true) + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = true + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = Channel.of([ file(params.modules_testdata_base_path + 'delete_me/fastp/adapters.fasta', checkIfExists: true) ]) - input[2] = false - input[3] = false - input[4] = true + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -526,14 +601,19 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = true + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = true - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -553,15 +633,20 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = true + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = true - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -573,4 +658,4 @@ nextflow_process { ) } } -} \ No newline at end of file +} diff --git a/modules/nf-core/fastp/tests/main.nf.test.snap b/modules/nf-core/fastp/tests/main.nf.test.snap index 9e2aaf3..2276fc0 100644 --- a/modules/nf-core/fastp/tests/main.nf.test.snap +++ b/modules/nf-core/fastp/tests/main.nf.test.snap @@ -39,7 +39,7 @@ ], "6": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ], "html": [ [ @@ -78,27 +78,18 @@ ], "versions": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-03-31T13:40:51.8619133" + "timestamp": "2025-09-11T09:55:42.073182" }, "test_fastp_paired_end": { "content": [ - [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,7cf3bff1922b512bcca58439eb2d3679" - ] - ], [ [ { @@ -106,8 +97,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", - "test_2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" + "test_R1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", + "test_R2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" ] ] ], @@ -118,26 +109,17 @@ ], [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-03-31T13:39:15.121411815" + "timestamp": "2025-12-22T14:32:22.887952042" }, "test_fastp_paired_end_merged_adapterlist": { "content": [ - [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,533983f8c11cc3f2ccdcea01531f68ae" - ] - ], [ [ { @@ -145,8 +127,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", - "test_2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" + "test_R1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", + "test_R2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" ] ] ], @@ -163,26 +145,17 @@ ] ], [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-03-31T13:39:51.561598206" + "timestamp": "2025-12-22T14:32:53.752975682" }, "test_fastp_single_end_qc_only": { "content": [ - [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.json:md5,93f407199ee8b94c023c291bddfc4dce" - ] - ], [ ], @@ -202,14 +175,14 @@ ], [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-03-31T13:39:56.392912049" + "timestamp": "2025-09-19T16:23:36.149003" }, "test_fastp_paired_end_trim_fail": { "content": [ @@ -220,8 +193,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,6ff32a64c5188b9a9192be1398c262c7", - "test_2.fastp.fastq.gz:md5,db0cb7c9977e94ac2b4b446ebd017a8a" + "test_R1.fastp.fastq.gz:md5,6ff32a64c5188b9a9192be1398c262c7", + "test_R2.fastp.fastq.gz:md5,db0cb7c9977e94ac2b4b446ebd017a8a" ] ] ], @@ -233,8 +206,8 @@ }, [ "test.paired.fail.fastq.gz:md5,409b687c734cedd7a1fec14d316e1366", - "test_1.fail.fastq.gz:md5,4f273cf3159c13f79e8ffae12f5661f6", - "test_2.fail.fastq.gz:md5,f97b9edefb5649aab661fbc9e71fc995" + "test_R1.fail.fastq.gz:md5,4f273cf3159c13f79e8ffae12f5661f6", + "test_R2.fail.fastq.gz:md5,f97b9edefb5649aab661fbc9e71fc995" ] ] ], @@ -242,23 +215,14 @@ ], [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,5009a892192f2084c2af69c153d88d6c" - ] - ], - [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-03-31T13:39:38.690242568" + "timestamp": "2025-12-22T14:32:41.270456637" }, "fastp - stub test_fastp_interleaved": { "content": [ @@ -306,7 +270,7 @@ ], "6": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ], "html": [ [ @@ -351,15 +315,15 @@ ], "versions": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-03-31T13:40:23.678200076" + "timestamp": "2025-09-11T09:55:19.47199" }, "test_fastp_single_end - stub": { "content": [ @@ -407,7 +371,7 @@ ], "6": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ], "html": [ [ @@ -452,15 +416,15 @@ ], "versions": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-03-31T13:40:08.756547678" + "timestamp": "2025-09-11T09:55:09.617001" }, "test_fastp_paired_end_merged_adapterlist - stub": { "content": [ @@ -472,8 +436,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -517,7 +481,7 @@ ] ], "6": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ], "html": [ [ @@ -553,8 +517,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -571,15 +535,15 @@ ] ], "versions": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-03-31T13:40:47.596331823" + "timestamp": "2025-12-22T14:33:44.204950729" }, "test_fastp_paired_end_merged - stub": { "content": [ @@ -591,8 +555,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -636,7 +600,7 @@ ] ], "6": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ], "html": [ [ @@ -672,8 +636,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -690,27 +654,18 @@ ] ], "versions": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-03-31T13:40:39.962303534" + "timestamp": "2025-12-22T14:33:38.518882433" }, "test_fastp_paired_end_merged": { "content": [ - [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,8f99097bfa04b629891105b8af9c429f" - ] - ], [ [ { @@ -718,8 +673,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", - "test_2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" + "test_R1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", + "test_R2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" ] ] ], @@ -736,14 +691,14 @@ ] ], [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-03-31T13:39:46.300238743" + "timestamp": "2025-12-22T14:32:47.366974895" }, "test_fastp_paired_end - stub": { "content": [ @@ -755,8 +710,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -794,7 +749,7 @@ ], "6": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ], "html": [ [ @@ -830,8 +785,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -842,27 +797,18 @@ ], "versions": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-03-31T13:40:16.309925689" + "timestamp": "2025-12-22T14:33:16.494574544" }, "test_fastp_single_end": { "content": [ - [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.json:md5,81dc86dd695967bb5c015e0a978bf20c" - ] - ], [ [ { @@ -879,14 +825,14 @@ ], [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-03-31T13:39:07.133909607" + "timestamp": "2025-09-19T16:23:08.469846" }, "test_fastp_single_end_trim_fail - stub": { "content": [ @@ -940,7 +886,7 @@ ], "6": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ], "html": [ [ @@ -991,15 +937,15 @@ ], "versions": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-03-31T13:40:28.086573661" + "timestamp": "2025-09-11T09:55:23.871395" }, "test_fastp_paired_end_trim_fail - stub": { "content": [ @@ -1011,8 +957,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -1051,8 +997,8 @@ }, [ "test.paired.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -1060,7 +1006,7 @@ ], "6": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ], "html": [ [ @@ -1096,8 +1042,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -1109,8 +1055,8 @@ }, [ "test.paired.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -1118,15 +1064,15 @@ ], "versions": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-03-31T13:40:35.606162029" + "timestamp": "2025-12-22T14:33:32.863505882" }, "fastp test_fastp_interleaved": { "content": [ @@ -1140,35 +1086,17 @@ ] ], [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.json:md5,101003b8ac634ca5fd381656ac2b8b9f" - ] - ], - [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-03-31T13:39:23.114582408" + "timestamp": "2025-09-19T16:23:16.479494" }, "test_fastp_single_end_trim_fail": { "content": [ - [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.json:md5,d721f75d68a382c819b6499e6325a942" - ] - ], [ [ { @@ -1191,26 +1119,17 @@ ], [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-03-31T13:39:30.757538842" + "timestamp": "2025-09-19T16:23:20.299076" }, "test_fastp_paired_end_qc_only": { "content": [ - [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,1ad31d6559ff5d4d275f501f3f5c02b9" - ] - ], [ ], @@ -1230,14 +1149,14 @@ ], [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-03-31T13:40:01.381972575" + "timestamp": "2025-09-19T16:23:40.113724" }, "test_fastp_paired_end_qc_only - stub": { "content": [ @@ -1279,7 +1198,7 @@ ], "6": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ], "html": [ [ @@ -1318,14 +1237,14 @@ ], "versions": [ - "versions.yml:md5,3799377c4173131ba9392346e1c40bb9" + "versions.yml:md5,c4974822658d02533e660fae343f281b" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.6" }, - "timestamp": "2025-03-31T13:40:56.392034947" + "timestamp": "2025-09-11T09:55:46.696419" } } \ No newline at end of file diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 23e1663..4b3041d 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -11,9 +11,9 @@ process FASTQC { tuple val(meta), path(reads) output: - tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "versions.yml" , emit: versions + tuple val(meta) , path("*.html") , emit: html + tuple val(meta) , path("*.zip") , emit: zip + tuple val("${task.process}"), val('fastqc'), eval('fastqc --version | sed "/FastQC v/!d; s/.*v//"'), emit: versions_fastqc, topic: versions when: task.ext.when == null || task.ext.when @@ -43,11 +43,6 @@ process FASTQC { --threads ${task.cpus} \\ --memory ${fastqc_memory} \\ ${renamed_files} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS """ stub: @@ -55,10 +50,5 @@ process FASTQC { """ touch ${prefix}.html touch ${prefix}.zip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS """ } diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index c8d9d02..49164c8 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -53,13 +53,28 @@ output: description: FastQC report archive pattern: "*_{fastqc.zip}" ontologies: [] + versions_fastqc: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" - "@grst" @@ -70,3 +85,27 @@ maintainers: - "@grst" - "@ewels" - "@FelixKrueger" +containers: + conda: + linux_amd64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-af7a5314d5015c29_1/condalock + linux_arm64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-df99cb252670875a_2/condalock + docker: + linux_amd64: + build_id: bd-af7a5314d5015c29_1 + name: community.wave.seqera.io/library/fastqc:0.12.1--af7a5314d5015c29 + scanId: sc-a618548acbee5a8a_30 + linux_arm64: + build_id: bd-df99cb252670875a_2 + name: community.wave.seqera.io/library/fastqc:0.12.1--df99cb252670875a + scanId: sc-b5913ed5d42b22d2_18 + singularity: + linux_amd64: + build_id: bd-104d26ddd9519960_1 + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--104d26ddd9519960 + https: https://community.wave.seqera.io/v2/library/fastqc/blobs/sha256:e0c976cb2eca5fee72618a581537a4f8ea42fcae24c9b201e2e0f764fd28648a + linux_arm64: + build_id: bd-d56b505a93aef38a_1 + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--d56b505a93aef38a + https: https://community.wave.seqera.io/v2/library/fastqc/blobs/sha256:fd39534bf298698cbe3ee4d4a6f1e73330ec4bca44c38dd9a4d06cb5ea838017 diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test index e9d79a0..66c44da 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ b/modules/nf-core/fastqc/tests/main.nf.test @@ -30,7 +30,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -58,7 +58,7 @@ nextflow_process { { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -82,7 +82,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -106,7 +106,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -142,7 +142,7 @@ nextflow_process { { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -166,7 +166,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap index d5db309..c8ee120 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ b/modules/nf-core/fastqc/tests/main.nf.test.snap @@ -1,15 +1,21 @@ { "sarscov2 custom_prefix": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:16.374038" + "timestamp": "2025-10-28T16:39:14.518503" }, "sarscov2 single-end [fastq] - stub": { "content": [ @@ -33,7 +39,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -44,8 +54,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -59,10 +73,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:24.993809" + "timestamp": "2025-10-28T16:39:19.309008" }, "sarscov2 custom_prefix - stub": { "content": [ @@ -86,7 +100,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -97,8 +115,12 @@ "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -112,58 +134,82 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:03:10.93942" + "timestamp": "2025-10-28T16:39:44.94888" }, "sarscov2 interleaved [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:42.355718" + "timestamp": "2025-10-28T16:38:45.168496" }, "sarscov2 paired-end [bam]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:53.276274" + "timestamp": "2025-10-28T16:38:53.268919" }, "sarscov2 multiple [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:05.527626" + "timestamp": "2025-10-28T16:39:05.050305" }, "sarscov2 paired-end [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:31.188871" + "timestamp": "2025-10-28T16:38:37.2373" }, "sarscov2 paired-end [fastq] - stub": { "content": [ @@ -187,7 +233,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -198,8 +248,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -213,10 +267,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:34.273566" + "timestamp": "2025-10-28T16:39:24.450398" }, "sarscov2 multiple [fastq] - stub": { "content": [ @@ -240,7 +294,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -251,8 +309,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -266,22 +328,28 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:03:02.304411" + "timestamp": "2025-10-28T16:39:39.758762" }, "sarscov2 single-end [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:19.095607" + "timestamp": "2025-10-28T16:38:29.555068" }, "sarscov2 interleaved [fastq] - stub": { "content": [ @@ -305,7 +373,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -316,8 +388,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -331,10 +407,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:44.640184" + "timestamp": "2025-10-28T16:39:29.193136" }, "sarscov2 paired-end [bam] - stub": { "content": [ @@ -358,7 +434,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -369,8 +449,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -384,9 +468,9 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:53.550742" + "timestamp": "2025-10-28T16:39:34.144919" } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index d02016a..009874d 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.32 + - bioconda::multiqc=1.33 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index abbef45..3b0e975 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : - 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/34/34e733a9ae16a27e80fe00f863ea1479c96416017f24a907996126283e7ecd4d/data' : + 'community.wave.seqera.io/library/multiqc:1.33--ee7739d47738383b' }" input: path multiqc_files, stageAs: "?/*" @@ -18,7 +18,8 @@ process MULTIQC { path "*.html" , emit: report path "*_data" , emit: data path "*_plots" , optional:true, emit: plots - path "versions.yml", emit: versions + tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions + // MultiQC should not push its versions to the `versions` topic. Its input depends on the versions topic to be resolved thus outputting to the topic will let the pipeline hang forever when: task.ext.when == null || task.ext.when @@ -42,11 +43,6 @@ process MULTIQC { ${replace} \\ ${samples} \\ . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ stub: @@ -55,10 +51,5 @@ process MULTIQC { touch multiqc_data/.stub mkdir multiqc_plots touch multiqc_report.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ } diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index 9ac86fd..861cd7f 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -74,12 +74,15 @@ output: pattern: "*_data" ontologies: [] versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - multiqc: + type: string + description: The tool name + - multiqc --version | sed "s/.* //g": + type: eval + description: The expression to obtain the version of the tool authors: - "@abhi18av" - "@bunop" @@ -90,3 +93,27 @@ maintainers: - "@bunop" - "@drpatelh" - "@jfy133" +containers: + conda: + linux/amd64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-ee7739d47738383b_1/condalock + linux/arm64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-58d7dee710ab3aa8_1/condalock + docker: + linux/amd64: + build_id: bd-ee7739d47738383b_1 + name: community.wave.seqera.io/library/multiqc:1.33--ee7739d47738383b + scanId: sc-6ddec592dcadd583_4 + linux/arm64: + build_id: bd-58d7dee710ab3aa8_1 + name: community.wave.seqera.io/library/multiqc:1.33--58d7dee710ab3aa8 + scanId: sc-a04c42273e34c55c_2 + singularity: + linux/amd64: + build_id: bd-e3576ddf588fa00d_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/34/34e733a9ae16a27e80fe00f863ea1479c96416017f24a907996126283e7ecd4d/data + name: oras://community.wave.seqera.io/library/multiqc:1.33--e3576ddf588fa00d + linux/arm64: + build_id: bd-2537ca5f8445e3c2_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/78/78b89e91d89e9cc99ad5ade5be311f347838cb2acbfb4f13bc343b170be09ce4/data + name: oras://community.wave.seqera.io/library/multiqc:1.33--2537ca5f8445e3c2 diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test index 0745e25..d1ae8b0 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -30,7 +30,7 @@ nextflow_process { { assert process.success }, { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_single") } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } ) } @@ -82,7 +82,7 @@ nextflow_process { { assert process.success }, { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_config") } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } ) } } @@ -110,7 +110,7 @@ nextflow_process { { assert snapshot(process.out.report.collect { file(it).getName() } + process.out.data.collect { file(it).getName() } + process.out.plots.collect { file(it).getName() } + - process.out.versions ).match("multiqc_stub") } + process.out.findAll { key, val -> key.startsWith("versions")} ).match() } ) } diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index a88bafd..d72d35b 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -1,41 +1,61 @@ { - "multiqc_versions_single": { + "sarscov2 single-end [fastqc]": { "content": [ - [ - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" - ] + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nextflow": "25.10.2" }, - "timestamp": "2025-10-27T13:33:24.356715" + "timestamp": "2025-12-09T10:10:43.020315838" }, - "multiqc_stub": { + "sarscov2 single-end [fastqc] - stub": { "content": [ [ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nextflow": "25.10.2" }, - "timestamp": "2025-10-27T13:34:11.103619" + "timestamp": "2025-12-09T10:11:14.131950776" }, - "multiqc_versions_config": { + "sarscov2 single-end [fastqc] [config]": { "content": [ - [ - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" - ] + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nextflow": "25.10.2" }, - "timestamp": "2025-10-27T13:34:04.615233" + "timestamp": "2025-12-09T10:11:07.15692209" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index ed2d70a..57a0349 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -17,7 +17,7 @@ process SAMTOOLS_FAIDX { tuple val(meta), path ("*.sizes") , emit: sizes, optional: true tuple val(meta), path ("*.fai") , emit: fai, optional: true tuple val(meta), path ("*.gzi") , emit: gzi, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools when: task.ext.when == null || task.ext.when @@ -32,11 +32,6 @@ process SAMTOOLS_FAIDX { $args ${get_sizes_command} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -51,11 +46,5 @@ process SAMTOOLS_FAIDX { fi ${get_sizes_command} - - cat <<-END_VERSIONS > versions.yml - - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml index b7a2e0c..163c301 100644 --- a/modules/nf-core/samtools/faidx/meta.yml +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -86,13 +86,28 @@ output: description: Optional gzip index file for compressed inputs pattern: "*.gzi" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test b/modules/nf-core/samtools/faidx/tests/main.nf.test index a505abc..02ba504 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test @@ -8,10 +8,14 @@ nextflow_process { tag "modules_nfcore" tag "samtools" tag "samtools/faidx" + config "./nextflow.config" test("test_samtools_faidx") { when { + params { + module_args = '' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -23,9 +27,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } @@ -33,6 +37,9 @@ nextflow_process { test("test_samtools_faidx_bgzip") { when { + params { + module_args = '' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -44,18 +51,19 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } test("test_samtools_faidx_fasta") { - config "./nextflow.config" - when { + params { + module_args = 'MT192765.1 -o extract.fa' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -68,18 +76,20 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } test("test_samtools_faidx_stub_fasta") { - config "./nextflow2.config" - + options "-stub" when { + params { + module_args = '-o extract.fa' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -92,16 +102,20 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } test("test_samtools_faidx_stub_fai") { + options "-stub" when { + params { + module_args = '' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -113,9 +127,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } @@ -123,6 +137,9 @@ nextflow_process { test("test_samtools_faidx_get_sizes") { when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -136,9 +153,9 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } @@ -146,6 +163,9 @@ nextflow_process { test("test_samtools_faidx_get_sizes_bgzip") { when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -159,9 +179,9 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } @@ -171,6 +191,9 @@ nextflow_process { options "-stub" when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -184,9 +207,9 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } @@ -196,6 +219,9 @@ nextflow_process { options "-stub" when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -209,9 +235,9 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap index 3be7b82..565d20e 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap @@ -21,7 +21,11 @@ ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -41,16 +45,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:38.874686" + "timestamp": "2025-12-23T14:02:40.159309157" }, "test_samtools_faidx_get_sizes_bgzip - stub": { "content": [ @@ -83,7 +91,11 @@ ] ], "4": [ - "versions.yml:md5,8e7d141eb8c2944042dfb5e942bffe08" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -112,16 +124,20 @@ "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,8e7d141eb8c2944042dfb5e942bffe08" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:10:10.958397" + "timestamp": "2025-12-23T14:03:39.550619177" }, "test_samtools_faidx_get_sizes": { "content": [ @@ -149,7 +165,11 @@ ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -173,16 +193,20 @@ "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" ] ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:59.237249" + "timestamp": "2025-12-23T14:03:16.844965756" }, "test_samtools_faidx_bgzip": { "content": [ @@ -212,7 +236,11 @@ ] ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -238,16 +266,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:42.949204" + "timestamp": "2025-12-23T14:02:47.301476131" }, "test_samtools_faidx_fasta": { "content": [ @@ -271,7 +303,11 @@ ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ [ @@ -291,16 +327,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:46.914038" + "timestamp": "2025-12-23T09:44:40.559583279" }, "test_samtools_faidx_get_sizes - stub": { "content": [ @@ -328,7 +368,11 @@ ], "4": [ - "versions.yml:md5,8e7d141eb8c2944042dfb5e942bffe08" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -352,16 +396,20 @@ "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,8e7d141eb8c2944042dfb5e942bffe08" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:10:06.961912" + "timestamp": "2025-12-23T14:03:31.989929281" }, "test_samtools_faidx_stub_fasta": { "content": [ @@ -372,7 +420,7 @@ "id": "test", "single_end": false }, - "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "extract.fa:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "1": [ @@ -385,7 +433,11 @@ ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ [ @@ -393,7 +445,7 @@ "id": "test", "single_end": false }, - "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "extract.fa:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "fai": [ @@ -405,16 +457,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:51.226016" + "timestamp": "2025-12-23T09:44:48.295693103" }, "test_samtools_faidx_stub_fai": { "content": [ @@ -431,14 +487,18 @@ "id": "test", "single_end": false }, - "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "3": [ ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -449,7 +509,7 @@ "id": "test", "single_end": false }, - "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "gzi": [ @@ -458,16 +518,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:55.423005" + "timestamp": "2025-12-23T14:03:09.784289542" }, "test_samtools_faidx_get_sizes_bgzip": { "content": [ @@ -500,7 +564,11 @@ ] ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -529,15 +597,19 @@ "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" ] ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:10:03.04872" + "timestamp": "2025-12-23T14:03:24.814967939" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/nextflow.config b/modules/nf-core/samtools/faidx/tests/nextflow.config index f76a3ba..202c036 100644 --- a/modules/nf-core/samtools/faidx/tests/nextflow.config +++ b/modules/nf-core/samtools/faidx/tests/nextflow.config @@ -1,7 +1,7 @@ process { withName: SAMTOOLS_FAIDX { - ext.args = 'MT192765.1 -o extract.fa' + ext.args = params.module_args } } diff --git a/modules/nf-core/samtools/faidx/tests/nextflow2.config b/modules/nf-core/samtools/faidx/tests/nextflow2.config deleted file mode 100644 index 33ebbd5..0000000 --- a/modules/nf-core/samtools/faidx/tests/nextflow2.config +++ /dev/null @@ -1,6 +0,0 @@ -process { - - withName: SAMTOOLS_FAIDX { - ext.args = '-o extract.fa' - } -} diff --git a/modules/nf-core/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf index d4bd5a3..6b5aa31 100644 --- a/modules/nf-core/samtools/sort/main.nf +++ b/modules/nf-core/samtools/sort/main.nf @@ -19,7 +19,7 @@ process SAMTOOLS_SORT { tuple val(meta), path("${prefix}.${extension}.crai"), emit: crai, optional: true tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true tuple val(meta), path("${prefix}.${extension}.bai"), emit: bai, optional: true - path "versions.yml", emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools when: task.ext.when == null || task.ext.when @@ -53,10 +53,6 @@ process SAMTOOLS_SORT { -o ${output_file} \\ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -78,9 +74,5 @@ process SAMTOOLS_SORT { touch ${prefix}.${extension} ${index} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml index 4c4010b..6996830 100644 --- a/modules/nf-core/samtools/sort/meta.yml +++ b/modules/nf-core/samtools/sort/meta.yml @@ -76,7 +76,6 @@ output: description: Sorted SAM file pattern: "*.{sam}" ontologies: [] - crai: - - meta: type: map @@ -110,13 +109,29 @@ output: description: BAM index file (optional) pattern: "*.bai" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool + authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/samtools/sort/tests/main.nf.test b/modules/nf-core/samtools/sort/tests/main.nf.test index ff06919..df47bb2 100644 --- a/modules/nf-core/samtools/sort/tests/main.nf.test +++ b/modules/nf-core/samtools/sort/tests/main.nf.test @@ -34,7 +34,7 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.bai, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -66,7 +66,7 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.bai, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -98,7 +98,7 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.csi, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -133,7 +133,7 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -168,7 +168,7 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.bai.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -203,7 +203,7 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -235,7 +235,7 @@ nextflow_process { { assert snapshot( process.out.cram.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.crai.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -265,7 +265,7 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match() } ) } } @@ -296,7 +296,7 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match() } ) } } @@ -325,7 +325,7 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match() } ) } } diff --git a/modules/nf-core/samtools/sort/tests/main.nf.test.snap b/modules/nf-core/samtools/sort/tests/main.nf.test.snap index 473e174..4e618fa 100644 --- a/modules/nf-core/samtools/sort/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/sort/tests/main.nf.test.snap @@ -19,80 +19,21 @@ "test.sorted.cram.crai" ] ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-09-10T14:43:31.395604" - }, - "bam - stub": { - "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - - ], - "6": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ], - "bai": [ - - ], - "bam": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + "SAMTOOLS_SORT", + "samtools", + "1.22.1" ] - ], - "crai": [ - - ], - "cram": [ - - ], - "csi": [ - - ], - "sam": [ - - ], - "versions": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:37.387063" + "timestamp": "2025-10-29T12:47:01.171084" }, "bam_csi_index": { "content": [ @@ -114,15 +55,39 @@ "test.sorted.bam.csi:md5,01394e702c729cb478df914ffaf9f7f8" ] ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:06.976036" + "timestamp": "2025-10-29T12:46:00.961675" + }, + "bam - stub": { + "content": [ + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-29T12:47:12.154354" }, "multiple bam bai index": { "content": [ @@ -144,80 +109,39 @@ "test.sorted.bam.bai" ] ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:18.72271" + "timestamp": "2025-10-29T12:46:25.488622" }, "cram - stub": { "content": [ { - "0": [ - - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.sorted.cram:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - - ], - "6": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ], - "bai": [ - - ], - "bam": [ - - ], - "crai": [ - - ], - "cram": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.sorted.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + "SAMTOOLS_SORT", + "samtools", + "1.22.1" ] - ], - "csi": [ - - ], - "sam": [ - - ], - "versions": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:48.734367" + "timestamp": "2025-10-29T12:47:28.485045" }, "multiple bam": { "content": [ @@ -233,80 +157,39 @@ [ ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:12.989244" + "timestamp": "2025-10-29T12:46:13.168476" }, "multiple bam - stub": { "content": [ { - "0": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam:md5,cd4eb0077f25e9cff395366b8883dd1f" + "SAMTOOLS_SORT", + "samtools", + "1.22.1" ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - - ], - "6": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ], - "bai": [ - - ], - "bam": [ - [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam:md5,cd4eb0077f25e9cff395366b8883dd1f" - ] - ], - "crai": [ - - ], - "cram": [ - - ], - "csi": [ - - ], - "sam": [ - - ], - "versions": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:43.196638" + "timestamp": "2025-10-29T12:47:21.628088" }, "bam_no_index": { "content": [ @@ -322,15 +205,21 @@ [ ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:42:54.926504" + "timestamp": "2025-10-29T12:45:47.139418" }, "multiple bam csi index": { "content": [ @@ -352,45 +241,21 @@ "test.sorted.bam.csi" ] ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-09-10T14:43:25.059178" - }, - "bam": { - "content": [ - [ - [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam:md5,34aa85e86abefe637f7a4a9887f016fc" - ] - ], - [ - [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam.csi" + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] ] - ], - [ - "versions.yml:md5,2659b187d681241451539d4c53500b9f" - ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.09.0" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-10-08T11:59:46.372244" + "timestamp": "2025-10-29T12:46:51.5531" }, "bam_bai_index": { "content": [ @@ -412,14 +277,20 @@ "test.sorted.bam.bai:md5,50dd467c169545a4d5d1f709f7e986e0" ] ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:00.82974" + "timestamp": "2025-10-29T12:45:52.796936" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index c06ad3b..cc8ee59 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -13,7 +13,7 @@ process SAMTOOLS_STATS { output: tuple val(meta), path("*.stats"), emit: stats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval('samtools version | sed "1!d;s/.* //"'), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when @@ -28,21 +28,11 @@ process SAMTOOLS_STATS { ${reference} \\ ${input} \\ > ${prefix}.stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/stats/meta.yml b/modules/nf-core/samtools/stats/meta.yml index 6dc5188..5c59cce 100644 --- a/modules/nf-core/samtools/stats/meta.yml +++ b/modules/nf-core/samtools/stats/meta.yml @@ -55,13 +55,29 @@ output: description: File containing samtools stats output pattern: "*.{stats}" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: Name of the process + - samtools: + type: string + description: Name of the tool + - samtools version | sed "1!d;s/.* //": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: Name of the process + - samtools: + type: string + description: Name of the tool + - samtools version | sed "1!d;s/.* //": + type: eval + description: The expression to obtain the version of the tool + authors: - "@drpatelh" - "@FriederikeHanssen" diff --git a/modules/nf-core/samtools/stats/tests/main.nf.test.snap b/modules/nf-core/samtools/stats/tests/main.nf.test.snap index a451c04..94d981b 100644 --- a/modules/nf-core/samtools/stats/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/stats/tests/main.nf.test.snap @@ -12,7 +12,11 @@ ] ], "1": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -23,16 +27,20 @@ "test.stats:md5,f4aec6c41b73d34ac2fc6b3253aa39ba" ] ], - "versions": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T15:05:52.878044" + "timestamp": "2025-11-01T02:27:18.460724" }, "bam - stub": { "content": [ @@ -47,7 +55,11 @@ ] ], "1": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -58,16 +70,20 @@ "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T15:05:56.722672" + "timestamp": "2025-11-01T02:27:30.245839" }, "cram - stub": { "content": [ @@ -82,7 +98,11 @@ ] ], "1": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -93,16 +113,20 @@ "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T15:06:13.766719" + "timestamp": "2025-11-01T02:27:39.041649" }, "bam": { "content": [ @@ -117,7 +141,11 @@ ] ], "1": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -128,15 +156,19 @@ "test.stats:md5,41ba8ad30ddb598dadb177a54c222ab9" ] ], - "versions": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T15:05:30.301153" + "timestamp": "2025-11-01T02:26:55.988241" } } \ No newline at end of file diff --git a/modules/nf-core/seqtk/comp/main.nf b/modules/nf-core/seqtk/comp/main.nf index 3a5ead4..627279f 100644 --- a/modules/nf-core/seqtk/comp/main.nf +++ b/modules/nf-core/seqtk/comp/main.nf @@ -13,7 +13,7 @@ process SEQTK_COMP { output: tuple val(meta), path("*.seqtk_stats.tsv"), emit: seqtk_stats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('seqtk'), eval("seqtk 2>&1 | sed -n 's/^Version: //p'"), emit: versions_seqtk, topic: versions when: task.ext.when == null || task.ext.when @@ -26,11 +26,6 @@ process SEQTK_COMP { seqtk comp \\ ${args} \\ ${fastx} > ${prefix}.seqtk_stats.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - seqtk: \$(seqtk |& sed '/Version/!d; s/.* //') - END_VERSIONS """ stub: @@ -39,10 +34,5 @@ process SEQTK_COMP { """ echo "" > ${prefix}.seqtk_stats.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - seqtk: \$(seqtk |& sed '/Version/!d; s/.* //') - END_VERSIONS """ } diff --git a/modules/nf-core/seqtk/comp/meta.yml b/modules/nf-core/seqtk/comp/meta.yml index a64d7e2..bcdd15d 100644 --- a/modules/nf-core/seqtk/comp/meta.yml +++ b/modules/nf-core/seqtk/comp/meta.yml @@ -39,20 +39,34 @@ output: e.g. [ id:'sample1', single_end:false ] - "*.seqtk_stats.tsv": type: file - description: The output TSV file summarizing sequence statistics with columns - for sequence name, length, counts of A, C, G, T, and N bases, and GC content - percentage." + description: The output TSV file summarizing sequence statistics with + columns for sequence name, length, counts of A, C, G, T, and N bases, + and GC content percentage." pattern: "*.seqtk_stats.tsv" ontologies: - edam: http://edamontology.org/format_3475 # TSV + versions_seqtk: + - - ${task.process}: + type: string + description: The name of the process + - seqtk: + type: string + description: The name of the tool + - "seqtk 2>&1 | sed -n 's/^Version: //p'": + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - seqtk: + type: string + description: The name of the tool + - "seqtk 2>&1 | sed -n 's/^Version: //p'": + type: eval + description: The expression to obtain the version of the tool authors: - "@sainsachiko" maintainers: diff --git a/modules/nf-core/seqtk/comp/tests/main.nf.test.snap b/modules/nf-core/seqtk/comp/tests/main.nf.test.snap index c93834a..a78f282 100644 --- a/modules/nf-core/seqtk/comp/tests/main.nf.test.snap +++ b/modules/nf-core/seqtk/comp/tests/main.nf.test.snap @@ -12,7 +12,11 @@ ] ], "1": [ - "versions.yml:md5,f374db7a2510fc66d62d68e309971657" + [ + "SEQTK_COMP", + "seqtk", + "1.4-r122" + ] ], "seqtk_stats": [ [ @@ -23,16 +27,20 @@ "test.seqtk_stats.tsv:md5,46c8788954c64c718a799c0f6a41ecdc" ] ], - "versions": [ - "versions.yml:md5,f374db7a2510fc66d62d68e309971657" + "versions_seqtk": [ + [ + "SEQTK_COMP", + "seqtk", + "1.4-r122" + ] ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nextflow": "25.10.2" }, - "timestamp": "2025-03-26T19:53:51.1946864" + "timestamp": "2026-01-14T12:07:29.217316713" }, "bacteroides_fragilis - fasta - stub": { "content": [ @@ -47,7 +55,11 @@ ] ], "1": [ - "versions.yml:md5,f374db7a2510fc66d62d68e309971657" + [ + "SEQTK_COMP", + "seqtk", + "1.4-r122" + ] ], "seqtk_stats": [ [ @@ -58,15 +70,19 @@ "test.seqtk_stats.tsv:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,f374db7a2510fc66d62d68e309971657" + "versions_seqtk": [ + [ + "SEQTK_COMP", + "seqtk", + "1.4-r122" + ] ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nextflow": "25.10.2" }, - "timestamp": "2025-03-26T19:53:56.444250615" + "timestamp": "2026-01-14T12:07:37.125237854" } } \ No newline at end of file diff --git a/subworkflows/local/longread_mapping/main.nf b/subworkflows/local/longread_mapping/main.nf index 87ff5f3..cf790a7 100644 --- a/subworkflows/local/longread_mapping/main.nf +++ b/subworkflows/local/longread_mapping/main.nf @@ -7,7 +7,8 @@ include { BAM_SORT_STATS_SAMTOOLS } from '../../nf-core/bam_sort_stats_samtools/ include { CLAIR3 } from '../../../modules/local/clair3/main' include { BCFTOOLS_SORT } from '../../../modules/nf-core/bcftools/sort/main' include { BCFTOOLS_INDEX } from '../../../modules/nf-core/bcftools/index/main' -include { BCFTOOLS_FILTER } from '../../../modules/nf-core/bcftools/filter/main' +include { BCFTOOLS_VIEW } from '../../../modules/nf-core/bcftools/view/main' +include { BCFTOOLS_NORM } from '../../../modules/nf-core/bcftools/norm/main' include { BCFTOOLS_STATS } from '../../../modules/nf-core/bcftools/stats/main' include { CONSENSUS_BCFTOOLS } from '../consensus_bcftools/main' include { SEQTK_COMP } from '../../../modules/nf-core/seqtk/comp/main.nf' @@ -46,17 +47,21 @@ workflow LONGREAD_MAPPING { BCFTOOLS_INDEX ( BCFTOOLS_SORT.out.vcf ) ch_versions = ch_versions.mix(BCFTOOLS_INDEX.out.versions.first()) - ch_bcftool_filter_input = BCFTOOLS_SORT.out.vcf.join(BCFTOOLS_INDEX.out.tbi) - BCFTOOLS_FILTER ( ch_bcftool_filter_input ) - ch_versions = ch_versions.mix(BCFTOOLS_FILTER.out.versions.first()) + ch_bcftool_view_input = BCFTOOLS_SORT.out.vcf.join(BCFTOOLS_INDEX.out.tbi) + BCFTOOLS_VIEW ( ch_bcftool_view_input ) + ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions.first()) - ch_bcftool_stats_input = BCFTOOLS_FILTER.out.vcf.join(BCFTOOLS_FILTER.out.tbi) + ch_bcftool_norm_input = BCFTOOLS_VIEW.out.vcf.join(BCFTOOLS_VIEW.out.tbi) + BCFTOOLS_NORM ( ch_bcftool_norm_input, ch_fasta ) + ch_versions = ch_versions.mix(BCFTOOLS_NORM.out.versions.first()) + + ch_bcftool_stats_input = BCFTOOLS_NORM.out.vcf.join(BCFTOOLS_NORM.out.tbi) BCFTOOLS_STATS ( ch_bcftool_stats_input, [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ] ) ch_multiqc_files = ch_multiqc_files.mix( BCFTOOLS_STATS.out.stats ) ch_versions = ch_versions.mix(BCFTOOLS_STATS.out.versions.first()) - CONSENSUS_BCFTOOLS ( BAM_SORT_STATS_SAMTOOLS.out.bam, BCFTOOLS_FILTER.out.vcf, BCFTOOLS_FILTER.out.tbi, ch_fasta ) + CONSENSUS_BCFTOOLS ( BAM_SORT_STATS_SAMTOOLS.out.bam, BCFTOOLS_NORM.out.vcf, BCFTOOLS_NORM.out.tbi, ch_fasta ) ch_versions = ch_versions.mix( CONSENSUS_BCFTOOLS.out.versions ) SEQTK_COMP( CONSENSUS_BCFTOOLS.out.consensus ) @@ -65,9 +70,9 @@ workflow LONGREAD_MAPPING { emit: bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] bai = BAM_SORT_STATS_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] - vcf = BCFTOOLS_FILTER.out.vcf // channel: [meta, vcf] - csi = BCFTOOLS_FILTER.out.csi // channel: [ val(meta), path(csi) ] - tbi = BCFTOOLS_FILTER.out.tbi // channel; [meta, tbi] + vcf = BCFTOOLS_NORM.out.vcf // channel: [meta, vcf] + csi = BCFTOOLS_NORM.out.csi // channel: [ val(meta), path(csi) ] + tbi = BCFTOOLS_NORM.out.tbi // channel; [meta, tbi] stats = BCFTOOLS_STATS.out.stats // channel: [meta, stats] consensus = CONSENSUS_BCFTOOLS.out.consensus // channel: [ val(meta), path(consensus) ] seqtk_stats = SEQTK_COMP.out.seqtk_stats // channel: [meta, stats] diff --git a/subworkflows/local/shortread_fastp/main.nf b/subworkflows/local/shortread_fastp/main.nf index 7e1bf81..672f905 100644 --- a/subworkflows/local/shortread_fastp/main.nf +++ b/subworkflows/local/shortread_fastp/main.nf @@ -19,9 +19,12 @@ workflow SHORTREAD_FASTP { paired: it[0]['single_end'] == false } - FASTP_SINGLE(ch_input_for_fastp.single, adapterlist, false, false, false) + ch_fastp_input_single = ch_input_for_fastp.single.join(adapterlist) + ch_fastp_input_paired = ch_input_for_fastp.paired.join(adapterlist) + + FASTP_SINGLE(ch_fastp_input_single, false, false, false) // Last parameter here turns on merging of PE data - FASTP_PAIRED(ch_input_for_fastp.paired, adapterlist, false, false, params.shortread_qc_mergepairs) + FASTP_PAIRED(ch_fastp_input_paired, false, false, params.shortread_qc_mergepairs) if (params.shortread_qc_mergepairs) { ch_fastp_reads_prepped_pe = FASTP_PAIRED.out.reads_merged.map { meta, merged_reads -> diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf index 44d4c01..90fcbf8 100644 --- a/subworkflows/nf-core/bam_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -15,7 +15,6 @@ workflow BAM_STATS_SAMTOOLS { ch_versions = Channel.empty() SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) - ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions) SAMTOOLS_FLAGSTAT ( ch_bam_bai ) ch_versions = ch_versions.mix(SAMTOOLS_FLAGSTAT.out.versions) diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap index dadc71a..3c54319 100644 --- a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap @@ -31,8 +31,7 @@ ], "3": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ], "flagstat": [ [ @@ -63,16 +62,15 @@ ], "versions": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T15:20:35.417926" + "timestamp": "2025-11-01T02:39:28.707989" }, "test_bam_stats_samtools_single_end - stub": { "content": [ @@ -106,8 +104,7 @@ ], "3": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ], "flagstat": [ [ @@ -138,16 +135,15 @@ ], "versions": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T15:20:25.439222" + "timestamp": "2025-11-01T02:39:20.473816" }, "test_bam_stats_samtools_paired_end_cram - stub": { "content": [ @@ -181,8 +177,7 @@ ], "3": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ], "flagstat": [ [ @@ -213,16 +208,15 @@ ], "versions": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T15:20:46.02738" + "timestamp": "2025-11-01T02:39:37.697552" }, "test_bam_stats_samtools_single_end": { "content": [ @@ -255,15 +249,14 @@ ], [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T15:20:00.064679" + "timestamp": "2025-11-01T02:38:50.143087" }, "test_bam_stats_samtools_paired_end": { "content": [ @@ -296,15 +289,14 @@ ], [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T15:20:08.141202" + "timestamp": "2025-11-01T02:39:01.02311" }, "test_bam_stats_samtools_paired_end_cram": { "content": [ @@ -337,14 +329,13 @@ ], [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T15:20:16.06318" + "timestamp": "2025-11-01T02:39:12.503355" } } \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index bfd2587..2f30e9a 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -98,7 +98,7 @@ def workflowVersionToYAML() { // Get channel of software versions used in pipeline in YAML format // def softwareVersionsToYAML(ch_versions) { - return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML())) + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(channel.of(workflowVersionToYAML())) } // diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index 4994303..acb3972 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -4,6 +4,7 @@ include { paramsSummaryLog } from 'plugin/nf-schema' include { validateParameters } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' workflow UTILS_NFSCHEMA_PLUGIN { @@ -15,32 +16,58 @@ workflow UTILS_NFSCHEMA_PLUGIN { // when this input is empty it will automatically use the configured schema or // "${projectDir}/nextflow_schema.json" as default. This input should not be empty // for meta pipelines + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline main: + if(help || help_full) { + help_options = [ + beforeText: before_text, + afterText: after_text, + command: command, + showHidden: show_hidden, + fullHelp: help_full, + ] + if(parameters_schema) { + help_options << [parametersSchema: parameters_schema] + } + log.info paramsHelp( + help_options, + params.help instanceof String ? params.help : "", + ) + exit 0 + } + // // Print parameter summary to stdout. This will display the parameters // that differ from the default given in the JSON schema // + + summary_options = [:] if(parameters_schema) { - log.info paramsSummaryLog(input_workflow, parameters_schema:parameters_schema) - } else { - log.info paramsSummaryLog(input_workflow) + summary_options << [parametersSchema: parameters_schema] } + log.info before_text + log.info paramsSummaryLog(summary_options, input_workflow) + log.info after_text // // Validate the parameters using nextflow_schema.json or the schema // given via the validation.parametersSchema configuration option // if(validate_params) { + validateOptions = [:] if(parameters_schema) { - validateParameters(parameters_schema:parameters_schema) - } else { - validateParameters() + validateOptions << [parametersSchema: parameters_schema] } + validateParameters(validateOptions) } emit: dummy_emit = true } - diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test index 8fb3016..c977917 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -25,6 +25,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -51,6 +57,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -77,6 +89,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -103,6 +121,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -114,4 +138,36 @@ nextflow_workflow { ) } } + + test("Should create a help message") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = true + input[4] = false + input[5] = false + input[6] = "Before" + input[7] = "After" + input[8] = "nextflow run test/test" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 443e828..f6537cc 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,5 +1,5 @@ plugins { - id "nf-schema@2.4.2" + id "nf-schema@2.6.1" } validation { From 97cf9b8ddbf800d378872ab5ea4e18df6e8a66e8 Mon Sep 17 00:00:00 2001 From: Andries van Tonder Date: Fri, 16 Jan 2026 17:03:15 +0000 Subject: [PATCH 4/9] pipeline fixes --- assets/nf-core-bactmap_logo_light.png | Bin 75729 -> 73513 bytes conf/modules.config | 32 +- docs/images/nf-core-bactmap_logo_dark.png | Bin 28573 -> 28349 bytes docs/images/nf-core-bactmap_logo_light.png | Bin 24636 -> 24366 bytes docs/output.md | 38 +- main.nf | 5 +- modules/local/clair3/environment.yml | 2 +- modules/local/clair3/main.nf | 31 +- nextflow.config | 31 +- subworkflows/local/longread_mapping/main.nf | 8 +- .../local/longread_preprocessing/main.nf | 2 +- subworkflows/local/shortread_fastp/main.nf | 6 +- subworkflows/local/shortread_mapping/main.nf | 2 +- .../local/shortread_preprocessing/main.nf | 2 +- .../utils_nfcore_bactmap_pipeline/main.nf | 31 +- .../nf-core/bam_sort_stats_samtools/main.nf | 2 +- tests/default.nf.test.snap | 486 +----------------- workflows/bactmap.nf | 30 +- 18 files changed, 150 insertions(+), 558 deletions(-) diff --git a/assets/nf-core-bactmap_logo_light.png b/assets/nf-core-bactmap_logo_light.png index 47f376d82d8ea6f72a04c485049cb28464b9b5df..4f70a0a475da539451818925dea6dead6343c905 100644 GIT binary patch literal 73513 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 literal 75729 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 SUbK<8Bf8UlNAZ9BfBV1T`r3#9 diff --git a/conf/modules.config b/conf/modules.config index e627732..ae65e1e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -78,6 +78,24 @@ process { ] } + withName: 'FALCO' { + ext.prefix = { "${meta.id}_${meta.run_accession}_raw_falco" } + publishDir = [ + path: { "${params.outdir}/falco/raw" }, + mode: params.publish_dir_mode, + pattern: '*.{html,txt,zip}', + ] + } + + withName: 'FALCO_PROCESSED' { + ext.prefix = { "${meta.id}_${meta.run_accession}_processed_falco" } + publishDir = [ + path: { "${params.outdir}/falco/processed" }, + mode: params.publish_dir_mode, + pattern: '*.{html,txt,zip}', + ] + } + withName: 'FASTP_SINGLE' { ext.args = [ // trimming options @@ -357,7 +375,7 @@ process { ext.prefix = { "${meta.id}" } publishDir = [ [ - path: { "${params.outdir}/analysis_ready_fastqs" }, + path: { "${params.outdir}/run_merging" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', enabled: params.save_analysis_ready_fastqs, @@ -476,7 +494,7 @@ process { publishDir = [ path: { "${params.outdir}/clair3/" }, mode: params.publish_dir_mode, - pattern: '*.{vcf.gz,tbi}' + pattern: '*.vcf.gz' ] } @@ -499,13 +517,13 @@ process { pattern: '*.{tbi,csi}' ] } - + //final Illumina vcf file withName: 'BCFTOOLS_FILTER' { //ext.args = '--write-index=tbi --output-type z --soft-filter LowQual' ext.args = '--write-index=tbi --output-type z -i "QUAL > 20 && INFO/SAF > 0 && INFO/SAR > 0 && (INFO/SRF > 0 || INFO/SRR > 0) && (INFO/AO / INFO/DP) > 0.9"' ext.prefix = { "${meta.id}.filtered" } publishDir = [ - path: { "${params.outdir}/bcftools/filter" }, + path: { "${params.outdir}/filtered_variants" }, mode: params.publish_dir_mode, pattern: '*.{vcf.gz,tbi,csi}' ] @@ -520,12 +538,12 @@ process { pattern: '*.vcf.gz' ] } - + //final ONT vcf file withName: 'BCFTOOLS_NORM' { ext.args = '--output-type z -m -any --write-index=tbi' - ext.prefix = { "${meta.id}.normalised" } + ext.prefix = { "${meta.id}.filtered" } publishDir = [ - path: { "${params.outdir}/bcftools/view" }, + path: { "${params.outdir}/filtered_variants" }, mode: params.publish_dir_mode, pattern: '*.vcf.gz' ] diff --git a/docs/images/nf-core-bactmap_logo_dark.png b/docs/images/nf-core-bactmap_logo_dark.png index 9e7daef524cad4349f42c9732b1ece524dcfcaf6..d14fae3616f95b5007e6170879cd9bbfed2aa9b8 100644 GIT binary patch literal 28349 zcmdSAWmglW1%}Z1h?RB!Gc?GcLKp3g1a~F5?q4QxVsY|xVr>*cNy;YnfVd3 zR)49kbE{@h;T*S4AE<;kD8xm+Os?BxU(Hd$H9E5;@r%P!n%$&naqUHUxvl+- zvRTbmBeCh?D4^3%XGfcsoXT~W(;-lQycOE;WBh=3e9vp#J!{PUgC@BaRS~xbSqiiH zrePN^iJm=Ir{Q1#Iua49xW=HVsmM(IxF^A1w9=l8Ka|YtsCdy~k)~>M|`2>rWX(u2u?^ zLK1IUFz>GTx#`h9?{R`#Z9iK!|J10$sL?KySPH>rfFOVo;>crzf(U@Lt$cfJI}g5D zwd_@WlzdL6F0Q7x4~LZBUB`IOEY6-hv+rmD0i?kH-~D>F;b~f6{*UaROnXE=OVPoE8*dlY^W@`1sc|F@by!ZpMGT9+t3A9&D@_1*4k zD#q6rKq@E#DS!@8E{YHX=wd{fiK4p@dKjmg7h+0r#QT4DZnwQ)GwbIJz0#AmYv(T^ zg8U&NLeB`pZ}6|YsKD(`2ThqK(CHPP{`FhM>!fmX20()8e|$Z2TXZlp_rtJ)Hhf?e zA%!hRrh82gpPRNOZF0;-s0xJTRIAu#A+LfL2El*-=(M)gKlEt5(TQHlU27fAP!1vs ziiPR1q!bfLEd-5>f7IfsRnTeLR{*?|8iDGw?YMR;M|;V%=3Q`!fO|dtOlC zKVzTQe_K{i_)Ghfp+@ZUf3zgTHg-OzrqHXtjctVk*usDA7FD#L5~e@;yrt#FpndCw zpu`9Vc#=-d3%Z|R_=X$RFMa+f{=cn}P6n6pzh1t)O3=5XRz8}rw!L*$zHTC5u2$%a zc>Ryc_{o?}w6amAXFJ@jQ6?&_O)K{QkA)Yf{mf|}P{w!6g~`dqe|AfFRRrOH{i*(s zEJ*Aku0=uP_#4r`?5ANBAO1<3L-D>LJ83t{ZI%-4`l!dV@hVn83C@3PpEc#P(l7@x(D|EDVd1EM&?sa z^(`8Di~pIa72?HSwUSp`zD^N?T;z{qJRwVugpEl?d}eS*%UKc&%@(-(z9VG zTI^`*?DVDjMn1;(Y|jp;Vw|_y-Ohu*o_MDw1x)h4UC3eX?OZOq=36qf2xRyEpnc`k zALZ#^oDoTFGWR-%qqOe#|8F^}dQ8nujQ;$(2BTcqq{gR3_)&pVX^VwD4nStq&v>&tzc@Kk4|xtngQsbcUL4{5h=H)UPKP;s(IG`I6UUv?(8R()`Kr20lBQ z6euzcio4bFkf&HzTl#vwXxB~InUKm}(Cv*v7sFjoK4`UwJ*JFe44=HqOs!}S_MyyaZP3u1SxD4JkHGE^mm(F;Nz4S)L3P{Gkld;}fS!sv=lXY4DbpUD-+`xS-udAvqL*8}03V_(25f@;>VU>Nq(M*_?IrgvwuZv>gM z2J^R{9zdE#W06Lb?)4kP%l7o#8uU21KgppOkRV4Z5;O*g?R9^1|BCrGN&?ieZ9ED$k1n^zy!}-;~7+oms9b zcw1wPzbNjE!M&dsJ@%F%@Zd2^F}2U~3^EspRkz8uEpDh4U%ZckH8O9A3Jzpc54%>B z`(^E$>q`X;x9hthKjdnBCX-)ch^tWVOT2xCdll5B>o+Q0HSdad-%Uu}1d9A8E(*En zcHm}zKDIM)$TV89EC~05FmBa;>9ngv#9OHL=q7(CrpPJty1tqu(`8ewoa#M(&K33O z28B{kW_WJkWEw4$0i&iWkD;6z*GCR)s{&8}eyBNSn6@W!@->%@6zQsi;x0^-;P-Addi_h%u6h<^kpFBh zsQdduKmr*70xRmeU;N`l;Go{m^^nf>SI@n_HzmH@ux(Q*{TWn1kv&ndt2Wmn5U1fH ziG272qnH<33&3Q)13~sSRv$})S5-&p;=E&($>2GENYPdjUY*8q%^k(Q|5Q9*+%mbW zQo!w*s;HZK3*$`aU}WW>&GQs zIODNtbf-ASvI9uJ=|hT{-CR8=^w*0yaJgP{h1)P&0CKww<*B@?Cl}33JBWZtHP^!* zAk8h`X@B_eT7PpytO*U>KM4?@=F28o^+@sM|6&c;vlj>LbUi}pQIIGEav?i`VC}g> zXa?vaTmXBqeHFYE_+q(vH=c?0wGdLk$bxc z>5_7zhJK%)yHhWjb5Kd8^ou{XGZwL@Vg>yf30hW679{cb1lA-1J~Sa{>+yKDig^59 zwfXM>EE&rNgx==HCHOqqn7R;%o{~W%ME=Ko^bkD3hp%0MIfG#TS%1afuRVlL2XKDf z4O~+10T1j2&`w!qdGcAgo(rVg@N?DBk?JQ5pZ;C4g`d5Y{%3bKVO?1y&$R$f-i(z4 z{+l)-!E%k&ti!`O;j+4zc$%q&bs@YneiP(z$1i0;0lPchI60@Z$dmLSaHnj`?e_(p zSqh{1>kKhfL_Z6_!C!{nS9sP7$TPc~810_hc4q>m795}q#t;PdW@Z$H0c10G`XXoF zJ>DFxCeo_hukij}aSl)mg3tv92G%}4{{6Oh|9X#-CuezQ{zrR6no|R&O9irUlY1^! z_u0)=L{wM^^88jgnh~ZTjJpvM;v$NEg^IutCE^`pO?brfr1_V9;H>JOvmNcrOVjv; z({jRfcvp}6d`5e4ZW9%(wIqxyK>UhqieD@PPNO3Ah6e+S-I^A^4p|XC&34rzBbljb zE0Qy3CIR#>AL7PL*D_ylt-%LMX5>4unhoQ@7umY*Wwa(~?NB*Ug_svQ*?Jb3V^G#x z!E5^guL4}zwQ@*}Xz#$npTu%t_NIh`n{Xh>;7x%bH{VDHi+D;5@;9%ov3%IE6P!d3 z;*TfNQmyVOj9>dK#CX)m67xkkEEoQa?)7Ek(YmET_Zld+=+0_8MT0ucBN|~+g~+#h zCj{;sB*p8H=<4Z}R%qQiv0+9L{RIE&kx6R|Q{lEb!Eg9&`Hi!6*xg}H3M?(H!*&^f z9KO{CVNS}E{dgiv+k=~2>u!B0=o`C^E~JGoQ@#8-+Kxv-GyfN)Ww`Ng%?#sf&^mZ) zbYT0gh(2ggs%>1JllqsShb1CY#J@Qnl1@ZDShADQxzaX>Q@WU%L?4`IMjqA$OO2pJ z76NU=0;{ZgA1wV;a^OKrGvJ)``ZE!YH6fWoyv05*YfC#vsrTm|;-ESZ(3C!(@%+)2 zi1^r%cAR<$-6c`h(`(m`8nkzaNA8EDxXDbrfHRY%gaE8ILP@ zpN=F8LsdKbD?$db5`7M+10CS&vHP3rL#_y#1JRgc3KO5BQQr@479O4^7U}qWz?LlF z96-9HO{mkT${FQ~uOp%kdnpiLV1dqEsa?NY>9qUTVwt^x74rFFjU+Eo`x`6qhp*$4 z1A?CM{RuH?sY|-ixto$li!mDKw%BwxlH&F!iphG@^YinpL^Ro+$tJCqP>fK#7{s9V zFmo&8gs4c~6^%%qx2Ozy%r*>&n+D~h5^yumvDwSDb&2ntDw}vp8nUjDuq~gZg;$9) z%m`>(rsj*ZRjnQ{9hYoL^L)&EmU_ryf{LN( zGBQGSC~MZzQK=NUj90>JQ2xwSQZ60#N|suQ|KE`A?Z2YA>GxU#l@-O}Z#gQ&tMD%r z$-akn(xRS{@Zpn~lY;c}Eyo}Bm0Cm$ZCr2gby^^vR(^p%KcauPfFQ=JG!HZlLNiP& zYZY{=(;SWu^GB%Q&l3WGYes@dT%r545n@Z{JJbsPe@PxP56kHcfxUy)-{rDYI022m z9Ga2ns@c~^EAkla7rxn_y}F2lYmPw^k9ATP*fQyimO?wAb0vyjT;ks6y(?@SUNHf# zLB*$P1eJ)mOh{ICHhWWB`7wfDOd@{iwBcZ7L;;>0VRWex4et55f}X4!NN134HUuJ| zWl4A0y~+pUEW&xiymzosZm=+)kiWK?8z;D|NQRtINS3p*2F+siG#9Eq%3Ik~oPNrG z!Ogp;gQDw9`x*UVRDrUrsCS%Y^mOrkb#?}BPG>UJd8K8QCT!E^YgJy}h5ZRmB}%4z zA@Y`|=nB@za;MPt)}*JJG=kFbItCo98Bfs8tpJAzXAUQOc`v`vY?Y{^f}a#`1v%^Gw`)n^R+DCz|g{_a&D)iX|!b)q4#GBfF_zHM%+@xBOQR zoM%gSjj=SX=0DNf=z^Gg!g-9_q;!zh!;~>)YT@L`vVjA0s&bg;b<#~+-&gUHHqnw0 zznG?+v(mytjiZpiC$ngCHGC}e?NQJH^L`G^d!Uq9Xh^zSdEX zBlKe!FqKk&R*-rs9UM;`XW)bslv8(`htC&V&QYg{}F5uwEmSTVneE zm=k%XM?YOV)J<}kUI6z>r>&xg5$>8@Ln zck)&zsp76CS}s)*&ncj1*?KOOg=8-MyDEuXxB`n7NwiIJ=#77K6~VvTft9!Zi*{N< z<2AwnAun_Dee@)m9TLlA`Oj-4g^Fk6clJ)(Be`NZO5P!n`jim$TE3CtRr;jHHiy@8oot!;O6l552GLhVF`o9s)ZUCe>Hc%UDZKBcN<%a_ zV+GS^zUKROv*m0{j%0SfK6dNo*Cy8s?hr2sZeh4NJ3A%jt(B{ieLP~{W+3{1m|%FWG0MZ{H0$TfyxW>V;f3jR-h`T znvLVL6>cv%#@D1#S=vAnhUZfY8b+Z9`a6Z6twD3r(?7HEdQ%cvk*W%e+YqFQPOZVL zHYQNd1=^*zY%Ws+;*2f$Iqnfg3D%n6@16(_VdFJd_4Op;`s(JGTFFGF^&XOt3m%im zUw@wF87i~|VCq{GEd(sR+gaPVkzl%S5(|qAOZt5LiToojbkivJX!Bg z@_4<~JTafmQr#d;jez>mbP}uXio2>o=f(vqEUia-2xwUEE2bLSw0MBAmOf4;Z& z$ko20`Rvr?VasZ6v(A;Q^s3sLQ>|Cc{O^HmOlPWZr&fd4*i+~ELOY2-o-%EwE>zHo zQ6;>}?e_X|eC`96PPd~V|ATL?LXVFIw!I-&4Ndi{-?~I!1w95%tP$SjS=2!yMRKOw z1qL@rL&0f}R<;Hyrt{kP>rW=NRa^(>$HN`wm#N~d(rDUW7-l7eM#8G0HuzM*yEa#* z!uXTZ?BIY+gN6*&^X8M?MW{@nu8Bi^oHunC;$AP!F8`kQ9w&LlA^-Db1Y%0I{RN*< zWF@MgU^7Pqjz_9ISaTH_T$xT7e9y$AP+`I?Y|(;2?xjaNJ1-rmtCS)8Ca&Z86PQU~ zArW5A@0UJ9Q#N}jpI~7mAvWDMSV?DN>bm7LxP`0KKG}RIjX4|Q*!(PGeB3s9sqY}z z0D4x8y!f~;qQ25FszA*Dnio^av%`+gXu~A*8Xu8D;yaX{F6Sp;wdrXa1GfFfCFMS- zKW)j)jH@|>#p3Nz{V3<1v zdE@cjE+a9+dLZvOZ>@ga$(q^eVwMhhB&WMnn=-B=j~C4c$5A#8j=DhgN4QV^bGAbl zKc|MddIO8NOi>HYr|Um*CcvK6-r*VZ5_*n2ZSAniE1Z`rFb-3g6_nPcsKjrp3^@3Lo=y zUeTh_Uz6D|C2~!sJKp|R?y$`m0(Z@OjjF6a-b;F~KK&QCFCRTp$IiP6P!GfY9vX|j zxLY(%Gi!*`;>-T>90Ccg#GhqSG4}4-XHnq5wvm zyl7X7rSVTzdPe4drM?t-l~Ed_-;A2KS9ra0FFV}X&-rlMI{Q;=(5}&0j5i+?1YOP$ zxOMX7Khaj-WT^6pKJEU2YK$S}Z?H#wQrSoF@9&|T1gT`l7qw1=rX$bT;2r3j z%!;<41TtOdD@jQ$`#Ac5;a5_C(c-~Kd9$Unk%tT+5c|E8N*>p-7eGwZqxXdCl;I<7 zMPFUq)%SWAAc42yWM64w@ENF!&34AL(;O=lr84(dQU!{gEyCFhQY5E}cKvPD8xpe; z{8`iG9|Po#7|3}m-lp9gb=kXHcyw(3+wl?k$Kp=~A8Hc^J`PJ?@&#Oo%iMsxotm{4 z6!*$Un>U*uwc)N2ZfmfPRmhyOjJx2#iR{rAp>Miwu5e%3>h!!~=DQ?MBMBfXS2k8jbO%?nG_kSBoq9*1OnDXFU1#tEedXbbX>z+aUR5Uus&LZ?2U_0 zz3bdui)2CeXaEL(2hx!m??`oKYq!h5i@YUX)F@r1-y}}rnNcsc91i`I>Z0|BK6mp; zi=&R+G=W{isA*FkrH`oCJ=~A0X?(m}Mv2f@6o8Q52(Cd@RHjSu?Iwl!4H;t?gUgb5 zDv{dC2Lh00{R-9D(#+YOf%7g>q7o9PO@AqK1gzI>H>O8phl&!!ym4a{8LC}r8SqnF+vq8_9oo^!wl!WWU^xGh{Ij-B3;PM$?Gy=Er6$Go`6F0TL zg>b>Wh4bWZ{-I<@THw90)`03uN*I*Ou@;@AVaqmTQfO3R`3vS z_}gSep=~>JM80Xe0kLnEJ)?%QoPTqQFjILj7S&(~v$=jN)C5c7@+uddRM;xFEN=M3 zT(T1EeJf#O-Hg4Ss~g*Qo-Xw>v3{r|b;FJTOGBY|haYqSWBgZqfb#8k)GAHTc{J$R zrhJCitF!w{?l?l9(u*3GD-&50{hQ0(su>4Gg@n<_P8mn{7T(rU+k(?3E>M2}?84Hq zZ9%-$-4l!&YJYni#Z&;*YjxoQw3p*wJTn;N;}OLPHLB8aGE^K=N?+1LuH#n7+N2$Y z_yT%!we{eQ|8{kCdBN+hOenkRi{W)fLxQswha&VP#9|I5RwTJrl^_4j%3tj zb9jN<%7&}?(+mUT&rb4dI;3NxT}Tn{V`-Y3rmiNn{WW`M?4#%xvzb4J2bo{iE~J0;2?DL~pX>-rNJI<4f|%fw<|( zc@}5P%S(V~z511RLK(%J{rBDbbl&9-ox?MEF8^6NenaNA%W@252oju8iTQ6b+6-8M zv7UPR@nBl^u_y(HuOMa&^~`8!|?{%CM5OgZd!mE-Hv_aweOt9;>V zyHxzwJJqYtovRP7eheY1Z)iEyET?hStlp1Tc|A5d7yig&dbv;mr}AgP5GxSuIH=Mr zbX}>las#q8xb-#WJoxqXHE9Ad1j)g*l*{zYGzBHw#l`g?uKjZr@M3{{dB;7gO}0Du z&2r}+()6C#qJMohj5`SMOpIsthxdnSxbIM$tz*HWo-aD0(dq8qn_xF>ewU}5q|X&c+`h3 zv?niyS*{nez8|_7mXcTQWO+VktHk0Aj$StHu7QFR?&HAjQ3?iV?!>{eE-IJD5Qn=jWD`7_vL{f|J#sTf73 z=UIOYcyLZqvHI@qYtzr2NlG6fGH>6l31(Y=)?=u*3U?6_%GgyMoOtS2ksFc9Q&g8I zY+U1lLwr1iRP8+N#UxsvAJKFgI3!yzB1)e-XU~1hmO|e$-#Tu|R6$KnJK2P*b&n=R zmq2?>R2uZ|P*hNnAPSL4z4j^!WEWd{ybF#Sc2%1x#oeOD=Etu$;d5I#B?AVrmAK+Y zYFe%2lOVt{c74Xc*ZGX~kf1~b{)@g7tOFQ*0$W6%4v<4Shg_pgJv!m45bg^#PZ2mp zRG+B;&)3FAJZ~Xf-_9>-lxbp{$^}9UEmSHGkt2t-g7@FbTvfGi`B!`sXWcAwrpeoe zrul{)L90?Lb+GjD`$_(N0yFyIrti@s+vfRM{$w)(>OH%zdxw@O#l{EmjL1cg9lZt) zS`06wFF<2MB%5yrlb=-M_6Lux*T=Zj=#r3VrwlGlGN^|r_>gzi%4V}Jjc2saN~1VO z*NW2WsRNX4wAeDa?bZN*XK3|8nAy{J2Sdo5hbtcDia+2mb`mqe_s;V1;~LFi`FDYEU^$pHjYdcMoVR31;|WyC>5vpr6t`_8v*(-dzRS)~ zVVRvav6a1N6rO@`6$4xIXh8xkbg)GdTgg+rHq1hS_wj4G09J>=N;4Y?l^Vg)E6`u2 zuxibzDi&KKXNR)3tmD-JJb-ysl5r<)_}m`_Y@zLCHa5a^`pVP;B73X^YrVV~XwG$e zsZfozht>qjhgZ!y;~Ef|YN*ozSM-)(tYN>~@56mg4P-;{rI=Fo0OQmK0QYmkRg{-f~Rh8 z%QA2$cO@kpK~0Zmwm)gnP^-$cnZU)8gtmfbNilHuQmD-aY=F}z@-XCRX1`Yovmw9F z0<4bh+IkAa%7RblI5}Pd5?oZwSu)}9RmxK`ziict1jK#5^G+*`WW@4s3TxlRUyAT6 z#+|XUYKYh$Eg4R=$S*XVaJLLmYryK5YzS0P&WoAjYDbBsxh75kgz8JeCo5*eO$HFw z>h9c-aVpwE3G~T7MWdBV0!z&pH0mMUZGz;!hspG1!WWmMsL+4}Hxat+`GkmmP!>ay zOup$Ji7SLFj@KIN@{7kNEda0nlRTM`7r!E!ObK=VtmP<025P%#7+?=;HMMeG6N{1= z(S|66v23F!*oL-DT#UWl)lLzepP~(`g2e}^+Q5;e9>O-0qTrDp+=S;p!LSubRVS|d z5;%_i_61jl0$y!3UJX;Ng}P}5u`|YF;Vv9OeRX(N`6mr_efYKo#ll^wjkNeO!Ur=? zW_XzGn_EK$DaaACsk@>m40)g6KK2|m9mU<{(e{q}&$1ADp@Q9VJF=EbJgdv5d6>dg zTHIOz-9W^$^YIXx_(IL1Yr?%RkHm}kdlOaG9EDu586@JDE5sCdT*>Lse`bB6(x}`0 z$3!Ulwf4pr<4L93M1}@&f7TL^5ML$6G3<{pMe~ndC?a0w`wd75*Om0FxXOeb zRc&3$wlQAQNe)Ehc5xnw^$EaPcZ}Ds16sLf+z6;EHCFEAs z7v;#~VQ7QNZM1e5@pc^D|Fo6|J2M{t`jVzrP~Lqy9;Kmk$Y`d;RZsNv&ruQL(K)HY zZcjAu6>=Eyv3riX>Ve8F`a=wWeR(!$NNm3IxrZkK`p`CBs3+qpq{LQRM9*RQZ~AJ< zNQC4qzoY8>8n%~RXati+Rid2#`T|vN=xvuMbklA-F@GS}(OmnJqLopQ*$Hw?%7pN_ z8m(>?|6MNudsXpG_(1{3PZKdhK-!r9ti{YyHmQ+LG7x)`cQ{q4jP4zEv9X#RS*=Sf zYYvC?Pdy#lQ(bKX0Z`n;+if?Iy-PD(J9j5Ud<-+w-kSoO!){NOB15Zf$^urleu_BH zC)%EnqU>uhFuo@b*5Yru)j#3oMS?^hd=Mdts z=^oajYB2u|Xg{~^3!u8@m)VK)lk5Gp4tCH^HmQX%{B|jU9ZcE~n-ZdFSPisnH6ax~ zzM2R?ppRC1gdpeI0lNyIJeL-|dOyt~tsq*mc^Qxfw6*p$CofKWmfM#H1F^(Q2AjO! zvm#;{ljR5zDOh0pT~Q2g2u*rCMj5i0A+i95ay17k!^gVn98Kg@R=8?S+ltL@ z8&o_3qoUb{h+jG8eEA7VFIHR#m-%w4CH0luD}z!6gpL`CfocA)`p*zUn0rG+^_%-+T4t%NnF?{ z2g+8moqkNA-uUgZ*)UQgu`UsEGF;7! z4r|9o{LaP(I0jPh1pXgm%I#i+6 z&48ge$@mkwNN&$g0zUX%K~Y?Yu*M@4L9uc}{i(=*%SutaO3fOM(0 zp0(k<4z=3>w@B+CgMTaIb=p1V zT)LwOA`B;vfI2cjGRj^t>;5o`aq-;$o+^yV$4U=A3v*q3#QP^VVLVf_W3WCfXo)jZ z8{o9pizh1PEq3a*7qYaaOY-r`!{+$!WX5vR+;g-*ZswB&Uo<^`Z(hmr84%cd5BuTN z`LaMfNQ>^bv0(Qx)w^LQ1X4D`eO~)Zwjnmm#2xc4;K)8c8{WBO z+ZV2j5(2Ja;9%c*RW88(j(mvOSiud0T!HJ8EbCh$-s_ot8@@<}6_MZ%7S7pX97#ZV ztIwQpd|iY0ddFu5lZOt$=%;Xxz4RtJOozTnXMslsR0HNvokRK@m73jXO!BHA>Dq6= z(whl89I(uh9yS3n2Q$syf>s9mCtN(Q{owBA2+{LK|G5+ko7?YJ!LIn6S&0cge*;yj zorY4f8&KzT#VwY8dLWR~A?yj-)_E%s+bqJ$bkART&IFPsze$MAH;|vY`~9;jkL2YZ zu*Zz^6#&aw73j@cI-8xXrL_hkH{itLaIPDr=+%??94^*JI zkI)tR8hHd8>;08$q3X1@hWzVbp4CaeeTn z4S4c16juc;BHz`ux%`n(b@%SeK)RK_mHRJ>x;5dWg{7 z+Kyd%qN7gNAPkDUmpU$YO4_Hf*=%7OZG{I3v4N-K42h1B z9`=@FGwG5y1x6B0H=L0(9y=T|qJ2F=BT1e$krEMDtL`MTtkTF=*oX5!4cu)PZ6=aF z&``^0TLQ3V&ueL8UpLFsg)v+-Y z*$VmuF>eNIZvoW^xhckf$MeT+C#e@Ji_JgjKh8LPEmJ@^TPM)HRS~&o1Xr+xWc^_y zkom~q8M6%N^EN(b7Mnmaw?R$mb0_G)02pKmdOu=L^xEqeZPa9cPXDxg$Vo^R#B=da zM{THWw$Na83B|q~2s{$#fp?hOtcLd_n`TKuQ?jppbnb7ofO{AE zJO>_EHABhQ2Y?$LAmi~m{&N5-arqF`ruV#S@$lxK$Ut{160}|*yFNWdC`?&jMnIF6 zvtEj&D@G@WEon# zEoGOd$lDoFXezgvtb;$7fMQ#Ju5uK0C&pXQl@lRfdMMe+&f+xQ~o2RC3)MQuT zO;Wd6=XQ6g+JZp{QvYKSH6G)ez~vq^Yvf${v!iXu6}TER96yE^QXqsxA~+k)JXiQ9 zyBU0EW}MCHjVSqbmX4W%GouDBsRamDN!=Ff$*)S(t$#Pdj$EQA9q0AIJ8o^F6q9jH zFgkf6_LFj)2EhNVRjKK3biGH}U-YOnA-iSzaUOZXCNNYmT3IM#JZh5QPuX4lbx@7+UID7CDCt#?+1`$6FR)sl`KMYE`Bg(lGq^UA900DSMRz zXRAZy98yGR^(0w4h5oc|f?;99O!D4NVS}#)IG_+b9|q8mw^+Z{+tFow2-z1Qr1e?R zR@)8Mz)_>>yO-K6O%ZJIc(FRw+gz_dp1iL9tMT9(wO_uOH?DgMT$iqM%O@J0(`a*# z2-e8Hu~2@bQ?*1QAUk!8eQ7eE`VoZdPxVcvyk018<26a+K0IXH^&_M}he9V%Ro@Zu z3qB6+dyj;TuYv6JYS);ewXG+(sz`l%WVkoE`iBSG9?}kKJG`p;1+u+qJ7YQMOU z*3?z^6+RdX>-10xzXxj45z=(HrdsvusoT@;K*u-&kM}6%R%NX{(tg0A7 z#!qbI{`RqDqGWGO7H~{iaCRDqgf!Mh>r`WnI2%s=7{J;I`=4mAXCUV5LhV zx<}h&*`KJJdimzAC0B+}d^0HUz-{NbgFheJL(kHplahH}U&Pf|CbWLBIluDD^sMP6 zj5CnCk|aQ=f`l!`&4BEy$rV-4CNkCA(Eo#$3<76x=R-5zD@Cr62ru0gWV;6*jvVj1o;0PA+_}ITc(ND zjP^?rSHsF^Adwk5O`dNA*|+(DtQDEZAXZEbR{oEfo^mD1&DhkekRg&9>vKx@X9Jt# z09&8aLy*#zo`*~CkcsiLAo-fWE#ndFd$rJ?J}|z z=G+I?E3#KEHeUre3|~b>e(bdbM}O-xJUIOL=LQbEI8L`HR?)Ue$(rNa>{E5d4JZ2j z?bY#d3SVXVrAYN!*Xo<}W-T3_gdfkgQQNx7W??{r-t~XD_HpT%O$VX=J1K4zLXHw^>F%O+b$)%GUXVkq1%GY*t7&ohRwy~z>L=B8u zoi;`*x>jsZ(3DgagL6UBul%H63W$)OM%VIQSU4K!BxuDulntu^@1snHPVNPl`MJ5d zxXGB$Jbno&W;XQh*u%*fCM|AV zC<+w0nlyGgC%=4|OL-Z@-Xg4LEfp=-lGDMD-D;Mh%J1NAUbua297r{2oa)L7G_+4# zpYNO7byb<+SH;z?*Gg+{Px~c=QQ);O{KuOVn|=*sC?w6 ze=@5c?n|h!e~rW?H?q1(@<4;vUZzcYY#OZP1gjBWe1{oO|D~QLjgrzsnM=W-`RCO| zo!fhPf-VQNgcIJ|O*m|x6}}TOI$AF-`b|&AXnRpL-5_S-cRyLse4RnNhtP&6=?xyMs>Qso)HWA-Sz zIzLXL)>ZeGA=@-qTFARAUEM&)RwMxiv)aCki8996RLKTiTa#`G5j@f0xurAA$x0Dm zrFc;7yJDfgg(NIKvT8PX7mlN^si1ATkhZ9U^-OFY#z&78U@{8o@MlA-)d>y+6DT$6 zT@c$P#oWHSy20C*#i9n~P)9{{^`Vvzy3$l(tP<#HqRSOt(VQAktYw$`{$|V%QvYuA z^E|XrWrgk2CV_(%-%>6hS>@1EvgMRZlijn zUQgf;;Mn{-RhHZPwT}~UE>8Z45_CQVJh#kqi{-l2$~|GYCTvz1=MNm8i|-ZhU!?%L zA(6kT6JB8g?!8Z%?NG?maNGET*`2xV16C3%Nw-=|W2TQj?>mJ0W)g}K3#UJWsgX0u zQpWidx=&rn8P=f9(T+ozK;PA#wI&Dp4niVW-F^lO z{K^_+e>AIM;El_?BRA3f&3Wvk4C_-+kSAuBEr25?0+!HNCY}A%Ev0`6&`bb474H+0 z^jm)iD?0i92Lk0sg4fIg;Bdc`Gi%kr<1*|2-J85PL!NA5>`uXmMA4TbJN*FBwfrGl zfR!@1c_Sco? z-OUZ7-Az;bKtP%NI)?NrS{uszg@VbI;d{d^w31P1GrkRN{zncwd@|`zT87d&s1CRH z;Y`UfPD>k}Zu-+UO5 z3rp7cQ$u&Uh{r7TeLmaU%bBQ&&c zM(x}uwyWXSA4w$qbYV}WNg6eRgjVoeOs)6+7f8L2m?{FZ3nS|5Q$i<|+3mxU@G_}+ zfC)dQ?l(9_-bbJA1L&50*Q{&CnBYeciw~K#eR`qq~sy!sthNqmf`f#V1J zln{EYQOBG3>YwuguPJb-+5wInZ7~=WU4+Cw58??GyTAW8t!lyFm0rhcTBl0Fxp%u9 z#VQm(!jH0-O+wpu^`~EWY;NsD{seRY1AP6xL!-+^%b4&H(DjH%^FPRR(xvO|9AVjAfFl` zpFnhcbLM+@#3Tj{9o<`!$>ASAkJBrS5kW^-LBr1EE&;b+SjduxjUi0Rn`>(y4r2I#fr0>(NK@P!?LZq|T-}Q^Ob^G1?oPp!7%S%&y?`0!_ zo;Ito(^@k9aH^})wp2%k(~be7a4)wE@)vIW8}>;5SVIli{#m+LWK5M@hVxMy$HDh- zo@wpRLnz>)j1Co-QQ)DbfpYcK<$s(;|L5%zJ$EY`<;4x3{ho+R^mPtV*=GGWBj|1Y z{}lJ0@oc{D|8P2KQAxF`RV%b=H%84;8v3DBjT*5VJ9g|C)fz$Q$5w*UqDJgc6s-{y zK@qh#HB+@`{#SqB@9)w7$$dY#U-y$d$m`nIc^v0)zQ=L7>@(}HnAz(K+)&nPHW2jK zr1E@9FwFFvQA&J-@LhP<^F z+b$blvI8(Cz!EKq+Z(}v*C%0hJ!$f|ayC={2=(t=NnK;N#!UT45JbV&na%t2@e+-& zXoJj$6JeP9t#c_EzRR|%8`Xwce%vAc49^ufSq4(<66~^H?2XJ`_IS6{#0C9ma{X(} zneDfRc(;BIU0Lh7|2nBf%WMg0kHw%D^3V2_+wW8b(7%OX+YCx-_L*;2-@n<$nwL&M zyMCd~mrjoTa%VLST-07dhh!9Pq5eYhTpGNnzM=W;a^nnZw~`c z2t$bshR$ZXjBQSbzKjkm41%(n-U44dv#AI=Bt1_KSl-lY{2Y`sCU5*-H@F#~w(>;b zpBg_f5pvGaplCkjvIzPsB#d-P|No#Zf{Jv%ds}AYC%1HP-00XXz{(Abszq3zvdq%6 zi?0AlH(K>;0^f`?l`m&N)%tJ9y}sY?nfMi&LpWm@%&K|eURB)xT$YM9gD{BxI09W# z5K~MPCZ~-7#;m_)blh_!5&56vc1HbA_yK3&w18dc-E)#MfYz zWWLT$?0#RWlrFF{n;tOqRMM4O1t_B@Q7&96SkQA9*P_2yxCsXya24103S1PT4D@O% z@t3|FPmLgGX`yd#VQj|MNdrlHK#4*L_~u{=dHb{}-ECdr)<-9e+*&*UH-^ zX?x?f=!YN~I3vr%1K=R%AUvRXs=sq{_jS;|SueO8p#Q)+mq3E&&YioStN$9y3Q3r; zh!aZbdI4fP`)UW9`pgp(*4YCX@=Qyt*+D-?WcN&=qnAMYO?K`L(z*ILm;q!{00bc5 zoR3-ok3w+$T&#TZM$J^v6*(|8Eje#FfUpCFj)q`ad1ejZl60Uv3{?n5`hmMC;SsWc zN5e?MT^0OirXkQeF3`r=S7QJXD-SJ+5Pgl!JNNYpz@6i;y~?czaLJn8t;?WaqmNoL z))4T3s}L^b)?E1ZBl?+B-GXf}^a@USY_z|8>rsC>7{csWnStIy;usQj8NlxBL8n-I z)?p-Hjt1dvcG_pI^RJ}fRhJ=#SNj9iz~1^7(l{NFqgT8Dd1N5 z)PHEh7e+CerLEjAC%+ACZ0b3rc_{7qAiFJI;%X2mD!f&SCD5gLK0E)sK_JQdU?F97 z?yb_PA7V9y#P;^jBsGti=^&!Led`VO;_fJ_v_1o^bSI~%nAnujag)bKX7VTyG;IkT zosz8)f|4ajzi}n^g};2+>&iekDYtSt5`sx@m_4}_e8a)9v9QL}(hCereClaI;kAmE zIQI@r(+^CrJm^@Iv@e8Ox3~pKgMVz;1JFlJj*Z@|6BOuY`N)G9CwAsrr%cUErd&a08$7yxbH14^;hI8I;a-q&vP~0z&T2g0jL)mmlhFHs z$hLvFdjR)z!)^MJYdMU%@2baZCr8cV=Q>*-l55#P({v=Zpe1>g4yEJYEhi>Uf99rI)*i%Gdv9Qy2WE08XvK{8RnoXC#|Kx__M6a?)HFs!@FJ+z9i z7$IZ6bXKhOP)2*@hsV!Hhv@+qqZL1|YMh)=oG2HKy;4P4zXp(xqDbX8_5683o zsBd&v49T@(;{jVeh8%wLaSD%bqba2pO)qLq6>ovepTX%I2sLW0aZnyw)mdt9s-0xi z-YE}gUlC%K#@9);dOh>5cJGueckmrg=!asW9!ewJaY_|B*PEcC%;!D>dpBFCNc802{?Ed0SAEh?4HNUkpxfM@leu>M{ zjGwnn1>wNpES$c`&}Ld46a0rb-9)R}m?d_6WYK!(MtP9&kOqbZPhX{=!Q|6A=#y zx&;A5!wZz}NkT`9OX~f)Vl}9B@gA zF7cpJb8>rX$Eul9FQCN)xrI;;qmkDcD_th)Y8N~XfPd;>B+YH~0~Py;G@B8Vqr<}> zDXSQWe{81uz*n(lBWCaM&Mnx_kQ6&2xi;D{Hre^Hz>Ws1VE{hzsv)~+Zz~(xn|@}= zIQgM#@mmvufp!JuR2S9oc`|(SnxW>2uSP*+{TU>^d@zPe^Xd|*IVMoj0^KLy6DPw< zy-p5651k7Ezx-)n7DsQ{w1t4glzWzp$Ep3h%>)cTZ2 zVQKu>D7(^?L`vN%99lWLTlY|95Af|XL50-ggVhJNHB)cD>5e7WYE!P>t_~CKQjF*8 zls`atk9Jo-iHkOM1F5yv3<3>~B&8TmR)G^a7ae(!8x+;!AIlk=4$YiKP%B}JEklkw z^N}uZ`zEko9pn75GSHwL;9eOM-p{?zXedMwI45IIavl7`VT&ho5FP<~!dGf7(HqEj zS(p=z*bWIV&Ls|%l~OX6{93fWS3{uZ)E@An`^^_}UsFDBz;5YoNyx}eJT#IQkn?jX&ckY7{3MX+FLYzko7*JD<79X?@IYnq(%BS<^77)?+|tsPe-wPfwsJe%tk zuM8g%MfP8=r}C*6n6Z5FZ|;lP@mX)YIG)ctTLe5nC^c6-`=XFF<+=sN>PsM{)5`7 zDS~-!x-D@zm0?HbBc`OC&F*>g`r*0n9mUhc)rYMMxsF~N`h+VpgM8|4A6>hQ?sUzc zV5oGc+}N{_O|io&%E=D3ig)R%l2CvteE!&KDgtKR!nk!@91f3apy5g36=1``zXk1I}IlG~( zTJP;;3L@QRWDI1f5--9qp#?-HBvP$5b$JKm7Dzu+?NR%sf&w`?w@M+5iIaTGV2hF< zUk4EfWLI*AaMvzSM!t_3q%&1iqqh=(PF_VGo6*mB!%cyroyF8FqDglwRDM#xA&tB_ zNd;=W?#^}u%E#eDpWHRjDGy}H-tAL8dSfEJkl$dwPG-sAEGWg`z>7X4x=ztlFv-Ys zaWBZtt!!|3Sh@$JBo_KrfIpKNWO{i~mVy|vj#z_iz6LjImbh2XEN@!E;dX+#pZk3E zmRjEU;QY?hmatd`ZdY#&7m?w8Rnb{_(Lq%vZFA7HG)yg1(~ZY0v!fW8h6w2ooYM*o zicS!#vOo=-o#+p-!!Frud*6v!INE4fV%RY$;lg4~1yKh;?*>2Jg(O{kyNBTL$7q;` zS48mHSG+Rvf$4ZcE$iKC3{*;2(x0kFeR#u~#sNJI!Jd+?3jvIIf|NT1)f>Ta`!?Q% zFd-OPMhDs4Q5;3c*Syf_9J{M7o@+qowd`9OKe(~A!p1u_m-V~Sg%IeuvoeITBjY<0 zIuAQHRnuqiCSVmAZj!G8l#@*LWenx^a8m4N|k!HicIoVXmaTfK)gVmIudPGV^fu`Rw8H912 z1&Jas{2)_xI2R)i{yd1Qin7tS^5`+Ve)Go}!*W+!`H~y&_&T2vZU@8j4wS;djsNm> z?y=wN>w>Pif_`ryj*jr?BVVco5L|SzXpR^;ZXRg*gkp{ClsM?#wHJuWWONI|zP~RO($O^+C?(_|&yN+pWvprDKse!1DwQglUi=4@ zAQaR{>qy{)ruCBdvHPy1)J6l5HlEOjwag*z9}T4DE+V^YvA%ovES4e%xj}9sLsMtI z+8Nu2gB4u}3$I5A+sh}w3ZdyBE6f|JiSTcxi^bv>9Us!ABJL6QvSiCsr?8p1Hq)mAFnUr&s5-EyI_)rp6b6sN#6r0qtb0`vNF)BSs^{4RS)HL zGkc?goxMF81#zUiG~Px~JOX`vY9TSU!2f-LyJ63woWkjXla&GLdG1+@TVO->3lKvi z)YKEW7$8oNt9Xz3=Iz2f_mA_Rs!>@VwR5wMAGl|=hf6JjtI!*121lOo`QoFn!*f=D zez2S^x>(v$Ge2V_nlf^pwgPTW;0@%uEK^_UWxMyfr-ON|VJXds_K_GA2V4A;ljA6n zK^4kC`&?i5MRj5D%YGUXV;r7+%3rLjf^}&Bju!7;qMlqLDr4;kB9(44%{-`eZ2~d> z7Sfk=q?~)rZ3#&80z+8GvpM~=J`lMAwCjgs@KuyKljEF^FsgnvBO0hA1 zx?t_glz=tGZHfbg5aBtX7MT=}TRR|ZH=*rr92k+EosiJ;;`BndYJ zEZJQ>$(!QdLS3PlJO{ZFsNSz2e|1Y@7_c7BXPb+N_EwX!^Wl7WMYK#L8lFjP7+~9i zqSkkizl3QqG2iM$X}zZdf2KeMw0@4mnhh2?Js%q8OCBWgnhFvvYVk@r`1AV-*V6r zWiq@dv%I=`q>9^&5J5a+wzr55?R-UF9CP1wQo-A_p-NRLZbCNNU1IF_k4FIdewmHm z_pUa)$!SI*y`qE(P*Yt;j(@=JM9BmAh41r2%>j0XjE)$V5g+&WXCV`V&ASH{B2G9-qit*wMgQ;{viCKHW3{Ck%KO~8XHSfi+afiOqp%5g*Ek_X0X^*~ z@u5gS;^lTZB_hhGd?oG!d{F=S+xxZ4k&;YEs0Ggih zu8!{6Mp2620fWj;DAyMHl7?NlTKx|b0_A7h9p_f`B)Xz7u;w=|*ZWyCUX6!Km2C|n=8Oq2FVw0g2r(ouLyXd2g{i0I;al>b zzdQfT?S{(qjRS3wiR>A^cViw>{&0nEOp_r{#utBIn;)y0al(CI%Rt{YZa??)4Nqv( zRR}-d0vw0e%gw!n2EsAlFeOFm2<*6)t6y-sG58~KUbgb*ck`|@9kT5%bD>2D)HBV)N9nyj zIn);>&ow5#tLHLYe4yEn*eVPK#P>XKOXtj{M+^&+FLCJi7x3sOyt5-P(hUcK9gg0j z#H90-hZjRIH|7ck)cf|g4?G-k{q6?8z-R3~FY$$sU)riF9)eo+czy{J8sMEZ!*)dK zUC7S=^x}apaql!nqu`{9;#B*+plOL6GkhI0%Inc7NH*%FvZjlSV6S035f{zKPMubtIR~ap5f)Pe^tNkD*#?v zf(kvr;VP!k(o=fJewS#^o&N%I0}{()axK7O+94v(>TB$TetlUK6sOpr=9H=?t{#%V6HAaVAOhw5r`3Jvm^1)fUuK4vOPt<;={ZC zU4DBMCoD#95;_|H_`}&~RYwaQ)XfxTeB*tPBp20x*lPd-4=3x zfi+ZD+of*`-eynulzqS8 zUj?J|?53uyq-R26$j4&_MMD`#T-E>rJ_LDDlNzH!kOmpd!Uuk%TPt)+;;*)^`OvZJNq=EaK_!yk4>o15llCSA3XSU@V; z5_$ql>cU2C0Br%uU?cBY#`l+%*LUubb5#s0gH8_pGzyr9GY0A-ZU0Poi7$A(OS$OP zKM)D?9%eL3eQq7;Cb7M@mr@}tkKyIdc8 z-k1$x?w3~W;?UVdme+kmK6Q^|nC+_ffnjVwuXMohlRO{$fpTCV+ZdCA%EJO2Z|3SF ztp;8LIdjX}m{gm8*)HvFj*bLBOMd|cF`$uef;Q--^*qJFNIN{|$!mB@C{wst^i>m65hh42XPMd1x<9$*DFsp{p;Q4?QeP>D4HUNp{~vk9k4 zcnYs_Oq|jN7VT{WPxJ8*f9f0bMheIcSbngAe9KHlD?b;Bn$<}PBdV}ntBDDG@4mmo zRtjTcbseYJcmW4sbl3VdhsVz0<9*?HWksz4m0UT;j2Z9M;nJm6!dupn2yRV2a_tG& zz1<){7)3o?VVh%yZ1Q7$BZ$dU5dq>v&t+Xil|AH0)&N-JZ-bk^u+51AxdXDv4f+{* zPV2H-?@nv08md7n&ckdcGFvz5Da$35$A4oIu{sfDWa=2HtS+$Ax7fIZAA2D{EVIw= z;&7p#xdQS<#q%k#FRZQ!w-JYBtoT!+_pclU%Px_nNCDZ{3o#-_0L0fb2sPEwx4en` zygQo-`keqh0*78&d`>=ZKB(J6twV3f!${1@T??2e2XZD=z8*eYpyOL0(HU;Y(m2f+ z^;YahxOurHq#qsSVp0iG{4vRTsR1Wb>v|C?s2@>gKn`apcd71^fULXV1m@j3pT3?v z!T^silIShzPON>|6UO4}QBOxlmws?M70sDnE&Rii38wt(Jl4K6XN=N1R8veWb$(>( zd<{N-=a882Q0tAZBNaL}q>)8n;K5!n`&)&izrxy<8#iG03uH6@XfBoOG}drbfuNaF zK!-8MOYfQsSRDI|hP`i>-}XB@m68M8VdQ&*oN$J!8-Hp&$PZ^4f|;S=m)58SHyjnu ze%*@NT^`R;I+#xY)WhMB5aJ~j`gZqLZHE3pQ@n2_gdbSJcbiuY1Ogp~>~m7Oex9Yc zxvIj0-N`SaKgQ1-SrW|t&0D^yJKl1jbd*C-CBV_69 zqimZ9?|y5M=EDb53sqND32%h`V_Bx7P~il&9^K2_DT9z5L6 zg1*eg+|xAo&qLbs+atS;$+e{bgTMY$GgLd-My#X4DH66Q4#y(~%NuMpY;AT47vDBi z0g>K#9tck`BqhlHf||LPotpnA{|`~$ASzALn{>S`rK${lH49veg=|q zeWZkS9Hs)rKbNj$x=kMkPeAwaEH-0z`mzF|nNpEm5I2y6!iEtxxsT1f(uNYGPm;s|`w5LAy&HQUrs~ zc0~Zh)CA1g(lG&9V~hB?2T~af(egMxb@OR_{qLCwE=8ZoFMeUk>}RGQ*~jFG8O8HW zp~($BhHNX|f>|=NpuOsgwhB z+=mG^sWml^#L}MIWQvRc=72`xt|iF#I;6n}ML_tK)&{$gC+dKiV6*9Jor&djsSj^| zHoA3uiAa;jrmZ(*1c7>Jftr|#4Qg<);?L>b0BEtWz+a)A z(aVw&a!;nOFNdl%pR+TQ926v@&kQ!kFnwRov28ef5zl8RRmXJXU}LHWS_4^?LvL98No-ua&|V4*uIc*#i&z9xM*s|8qx>1Dp7?yqr1!3-jTDbPP zn-Y4zLdkCPBhmK8zcF@lxlCQv? zvvb+6GG93+(6g=zoZU5rIOx*trd7Q4vlNY7JLj>LqwB~o>~gO*)8In^rM?SuC+sG% zfZzh{@uZa>ycy2Q5)dmS#c-|(M;jR)ZYTfHvclB@GCH)7ju)ek+;}8KUYFpNLloVd z(h%5{Z#i5mIdyp9DVY1Sose{|wLKD>axcqi=UAR8cW_6FRu}0K)yESG7X33>DyG|M z`Q}97m|gg^N5#ShSpS3a~OzPce==WsU*0 zNeb$7T0OV`n*#mAUg%h5n-FO~d(^2w#JTVw(}-s#K;Sm) z<+riXVbraSQ8YLl|HmpP9qLIBuxTZ1b1BgV;`WPXu9bbCiMj>jXA?pZ?(1U!*f=TQ z?+mF+k7Y5Uj9NhYrR%ILXK%y>egd*;uhSh1fI2@=r=MY%a3eD^gR%R-&iXRqj(osT zZ;|cVhE_0b`JZ+bj+;iC`0Hdo zF*$Vd{oHw0FXFoO3@n;8UAE1$ECn}*y5Y@ zaaRE4eT_ATs2Gvje_haNUcLv6dE**-JFB%B>m>MgIJo(7#&OB;?G-=2-(95C@N+(O zHygQl&X-UR3%#{C!#cIvFBR9hKBJ$prk-TUIhQT$mR)Ga&{R?D>e$bP97n3H%BXeJ zV|t}&WYtPO%pgZR^!G5^+-#2VFX;&4?!~2X9sE|f{N5F|SDr-%!chOG^daY@M~4No ziv*H1YTDVf8F_@)TbEuR)ugSqNCP)G%$ELDtP^k^5Gyx2 z68($!PSb(!o>cV}GVk+*0lTjC8_CQ^TsyJ{PQPKKw^x{$IDll?C=uR%8-QJ1>0YG_ zeqd-H%XwkJ`H4Znh0f$!3@o2}_VJusK<~}JEtJmigfh3Wp|hn7hO-sR0Hl9z5>uky zu~#dy0F$}ei3yJ13sU9B+Ga}tfZpC@FzrMP=u8Ks4a<|8w|ke6ZxmfRFtiMCvlTG% zK0M*{v&MKVTnoj{8flfR9^J{2nml@2j3BPCWik?XxSK!P&E{({Jr_-BdIF!?o8&4= zd`Y|T48P~OIS>btT>q!`dGI^gw0;cD4t`usIW)n3zDl~pnMkc&%4Dw@bE!|^nKg!c zej-+ji%aXu=Y;K>t}dD7C;K?ugt*WCpv~!DC9s-_Gy~17InTV>0w$=VHlS9XL*h!+ z;Nppy)Z0#xL$KYZ#g5m(+X(!6TW8@%H*o>`u1Z=EP}7Deh| zGK)#$1XF5=2F;V25w2UhRq>z_*CHF#2~8G@M2=L39{etm%S#@B#mHpF$r7Ap6HO~MAL zeogwe!b)>lvT{?9sHy(p5{$%fix6zw6rQW=5LDS2fC`db){>s^L>Ez*{@R*izAm$*G+6m=;yzwg`NO20GEi8EHCfWyd|d-gUo?OWTc zk+u)sB?=l_zrHoFAL$l9fh*dTp!V)T2$n^+#k3Q<7M_gsbJo#A3xT&ns6GA%7uWT= z`*Eu=jHD>K(H-Oj`g*P%B)=e(%NYavquc!k^!xsBK7M+ax`xL9<>5t8@0}b%qw(UHSsGG#byN5C@;OYHE zP79y%f+F%0XR)f!CXd~4aYvu816{N}ua?vstOLTlIdKOk9m@%T$eRoYy0wIa8~_XV zUU%}k27F8?cR#Ir)+gWA>IHGNObrmj9h|^DBVgfENx2E%94vk@)|mrJN3lon+;88$ z$pSl~zwA{$rq?s#yF!c7H+`=$mpoApIr9KkG;O} zv5}Nim6MdDQFU>&w6U`Q06cTt64zNm)JTR!`GCtn!#1Y|o?5=KnLpB*JhpP&7Hx}b zPwLBE-%sepS6}K{fAMM56 zzX(9`bFKOM*0)bC-S+>8Plv4Pn{%=K0Ra0|Ik32@i>eMfI*zNLfWBsFX%es$XHZZ9ViAp+DNr&) zXnNJ{gkbzZMhjbb0RCmRX1{iS|KiCvi?sA$&Br0kU{_>QC=gcyoi_CUcNdcU@>PWY zCRXHX?f2?IL`XKI+wL|+oZJ_;}I{1yzS*Zptx0Knrk z)R<4E$&WG8q)zS#1IX#RjRweIc}tIoKm)|pQh!6-56SEQ`EnBRk;6gbmhwllAmBf% zHLv>^U!7y}oT}B#R^!qka+hbRf&jJebpZ8R{Zgr+(6=bOW-~}9s!67AUcbM!V1fCL zKD+Vxg|B37+!Snyizk6jiVls6%HUMPBWjgxtc*mLX8KI)d)OrU`0vS{KPx3o^nr|HBLP5l?sYZhu;cj{?Al{{Ff?qB3HA~GoleBePTn29FLa?4v%x! zRO_Aor;sNCrlcZ`s55k6z?O#S{XY&_{hDubmUtNdtsM@l^Zb!wOzAi;es0e00d&5;iNZSp0;HCzoVW%qcExj7b!qs-9#)qDs~Wf zs&&%;dk>$>r%~J61Aq>CZZBK7X>uQ)iTnJu^S=e>agNh!RSe=3K{-s?IH4Z0tFrj4 zuX8ca@thzngPW=_{vg3aVAwHOqSRetpY{Lav~)(KztV$;Xueye1(DBf98v< z?S)_9_WweZpmfWWh1xsP7g^9z>+PBr6}PCHS|SgkiFBS?LI3wp$O`DRV4c%(zXe^N zpzzwQhQ<4!FB`+fxY|~Z&*tbd!Ha zM@As|O}Efr%KUwoNEaChz`#D0Z-S)`43PTQu#5Gg1v$GUnM|ix4lS}|HZ5p#m>%kRvY$|D zdput_CJDnWBFgXz_E_}#J@EEB5EjJR*`UiR!h=!hMp$acrK?iSmNcAbf!&8k|3;g5 z;V#>8pO?VLxcozR1_>HBgkyhrJcu*OtOkL+y!UWps{2oPJ6fIY&lq-JLhwy**gAV> zz_@Ud(;M2M%C8o6Ah|}FQ-_EII^f_&vG%?~F`>Q;sDzQ5PMoa{m}Ff2I>;OepW|d0 zn&cUI#y_o%HsbfvK?vrkz>v(UkIWNK>9R`UMeX1(^s(Lqu7)BWbyhfr7}fS$6|Yuj zhgbWh8LLk~Qu)wDItdu=j%0^t6J=G@2Rr7Rq#_BHDAaV4k)c>wO{e`&iNDcE`ID=e z)FL-<`zom24N#FBt*i4UM&nnlSrGfH|Df9F9|}rOqAslyJ88wIZcH z5Bx=zIuliLg$>5 z8w~*fHa(q>vK|-Q66~wz4v-pC7_L0(Xoq=8VjfD1t_Y15bgt?sP-r z0Qt{uFpe*K9|d)u2LNBlIBjakSKPeF%IZFJx|#9jF=HzNQKg`bZV%(*sP36d3W*03 z*yuDhfSTS+w3K@`=iB`Eb?x^Zb9r|QbZoj1F&m?6Cgw$*Q&Y@j7TQpffsFYRLZO~F zZkl8?>VOF7u&s;R0uk}D7I!~W_1;*bbJ0{YCO-DyerV|kfaK79#fgxx-qu^)+g%#* zQya%Z+;_c`WGJe4o^jcgsdk3<3%+>`8k&{jaiQw&pbP4POz*IKBW#a9{=Q9M-sFqX z%svu}vD=U0F;OH)vf|{SlWT3~Dev$7q_l5_Z)gWeb`5QU_}tw|9Gp7U(boi#3_V;Lgf$!Y?)`<;*!Sn66PB?U*@|M^_9+x%gBuI6 zL~#(lL9$&|kL$^_%rTN^;qXn3p@!w`AUY70|B9wa;PY6Kz`T*C@~>bjN&3Eh)1hIV zN-#B-VN>1f&SY8Z(PVOy#S-l1!^g`Y&6-J%w1%&g9(x~!$>3$0s25F$SGzyOeZGVj z;Nr!|nO%u@rW-nfzP?qWPV_@25iW7Q%7Jq5!-xvw-zS;6F{1|E8fJ#mgyI@tz|)yw zQ4yp8ux9Dg#V1Y{M=IFwEIzBvuwfg?k6#P@_^*l$WEr`{esAY8D5Gxwqgx5b71zH? zEUg=R>ASnoZ=3*0;8)}DdTfSWyy1`cOJ-U4fcTzFlXK#UzLYCO6`gh{gGcGDdH=6) zgPHbVF;yMBF-nTFUVYQ&tKAc&v~C4`rQK>JVPdQqZs&qRqYiX=c&*x`RbP5sHV1X4 z)ItRowdC9-@3gRN6snaOTj!}@e47r!0m&Z18K#)$8=~aJ$q45QOJa#wKa92!5(AQ2 zo{%}RH47E;Y+sKQ3Fzn{bj>KbYm=FI&&WVktYgb*M_f7|w0pl@r;GYnzIqmmDp&uB zkUPGN0hKgKEmH6H9mYQ0FJu30h{22h4U{8uQ{%-S(fA-{D(8LZo-bTz+Q$ROm6Git zwJ2kqw#Z6aq;ZF-bCXiDe%Kx2f>JQWRf_)itnjH;&*{Qb*FgrqTKUVO1xB;)OIMRr zC7aH=uKT^#u9@J)TWZmRUlRb&iPx}wW_<%=e*$CDc0{@UBd=jor1saN2-{dK0R7Z@ zeP(D_vVHQv5j(M1UnR&|KohH?`}j|881YuCbBomG)uRRN9Nw1r6l1#?kjGSDJ!X|8 z!b`{ZzqaMuR))Nmr~w$XLmZaJZ`N{6CdwVv$v~m`WJPGww9Tb9e8g%$6?a|I*AKYF zqDpn$cg-p2b*Fe|f)IyoO!HzX?ubaSEuY7t(@k2st`gtSf_*$sOln&eTl1!{K%ugP zJv{P-ycTOkt;(pU@7$G?t;y&XWN;@HcAjsin2zEtO5}oPgRm}ma8q5zCf)~T9^3e7 zN}x|t!K?X)6x3>03MMnhs?u5X zx|ETAD^bYbasO-XBxf#En$Lu9fTJOnY8;p z&=5{)x_|$!`V2IZ%b^jm`dz)QgJX7EPrRx*B6-&4@Q5< z);E)E8H<45v($i7fDm3>CJQ4sF@hrU6qBCx_cv;PqM`vj++_fDOXXyGy|<=pfe66; zEVXucHGmKy1waqDELF-jG%+#3ph4RBRHzl2sepupq~YTYC)_PZzr{~fs;rwVXmQ8w zWdPPVW7zOG#v)FJzQZ|Kp#amOyffl>{Ek-K^g{u}f4H_tR?3L|Zot z7egL|&)4S@Wk)zxC0`VRrMMm2JQ)X^tq|R}#C*ig?7(?);OPeIyBVvf=nOl|pMgrf zctSrrlz2e7uB#{qg)?M>w>)^l^3l|8OfR$75$_eoAEetU83zVu;Ecgc@pmz{W#&6f z4rPkZ9K7K<)Ict00!V4nyhUbxscu5S%_HzV5CUMZ+#>VQQgn60gFac2?bE=)OE5{J}$?MGK5H724 z76~G6g$Y*8V%s~AJh1$bQsC%%tEAHwE%7({ZawQ^c^MBXEgWS9jm zlo1jHDuI&FQr_=pu(QNtf!DlfR{4>78{LPw)jzQ})C?cb8*>ei`-{gO((0Mmv$#DChx*rv^37!$cVHTtZ$kF~R~tgH;eo&(SMtoN;M?jCv2 z69XNM`+^mcZ11~!nx+tDw`GVx<4GO4S2*J9ioQ8&-f-(w^@oy#BqN>vryg=wmH<_4 z+^Wk$FOD%Iu#%Nd#x`a+0yqD+^wUWD=_K~6@Ca7XgQ}ZW`T`st2K?$(f6u;g_NhKH{;Z&41PVa^ zc#38ZIWPoLO|M>~D;b4eQqgE^61mZv0C=RNiZs!?4zCkgJUrfI?bvAPsJs1s#2!Kb z%+d?_8jJdclA}g@+cA)N7DwZ+oizrRZ%AL1t z>etCK1ulkVQ0CKrr}R^n{JkPYye6+ry$(;Z#!F@SnVHO3l77e)X303m6(n(0Q}af( z;CBAG@3L`w;*Uy*O~qI4pV0szZXnVd+H2-*OfVK=|I|BnX5IzMH9$^(T|J00}6?Z8nz$Dd@lQz`FIW0?5Ub#}> z|98I9O5s}9b85%sZN^Pqnf4pw)J*D<-|0?3r_RQaGnejH<3Ni#HS#U5Jh@T(19khn z?H)0&xl_>AN%OZ|+{sGIo1^b0V&IpeluzZ24|DIe1dH6>FGhpxB>ui==v_PSzgDS# z&`^8fK6IhnbWVJ|5p#LV+VsrJ#c^R1jV~=>{etIq6L10v^b_P;Vf}0-y1P7$Xt7b6 zA=UUqQE2QPGM+tIVhC?gX57u9W1L((nft0Z1kdnV!9F=XF4Z}qsm{woZV~$?Y0_u= zd!eOLM(^N@kZW10)iDn(s%c|mX#$|cz)kR7O20RC;|;6-=z51uLD_;>5|Nr*0fVhe z#C6(A%!B+{U|vyPCP_+)Ip9Ntm`ZyAHFMd1D>>Sj-!>L`WKi#d;09n zF`FzZT*)?ds2?GJyk{4P3zsrQT?zt6lRRa_!olf=X)+5tj!k_#fA*BRkK|XJr@=#j z|1Rm~(N1CksCEQ!iA{SRBm$$EmHOcelP)%&c^4vx9@6DcJP!^lZmJbN)~Gc7(HwZ@ z2j-Z_!q3JdMh~!Q;_wJ!<)2-Tu|!_Z7}2O%tzerSn51H(v82*gRx0@!-z`Uxg?mgf zr4!>lYo|v@P@pjx$sJl8c?+%&*`-QdTT8Rq?_QSAt#0W0Q8YQ57Q)!ZWtb#DgB5pq z-x~_)@T&zdIaa7qyvaevXvJj&I?0vqupgnR@=0jrMPBc%Zhx*&=XlIbHT7J3c5dO1 zDNJ8}B^gLh0m-;v73Y1Oar%s_wxnp{VWHamQp>mVn?%T*eEwq$2oWSf-q|T(xYu;( zVt>>_(Be=EO|uv_s97U0_ig7IYQDIFrm&<>(A3nb>c8#mHm<_0}2f17hT07A+J--!r2rU!j| zviJH%>(cnWuY@WPHDX>RSJi)cT;nQd@ER5IZsb%FAErJD{PmcenP4I&v7W=Zi)2s@ z>#b5oUw{4gLg!5M3$|g@h7@;pE!3ONyzi;E&7d!wN{cOL))UPlR`=>*YNUBh0l2ux#Gv{jn<=+1}tJ)`M4Y|gW zH=2O^w6J}p9o;_fmY@99UfW-U%vnqIZ!xE)w3h%q<*SyM1@a;r#h>hvEt-YDz1DDq zNN0r3Q*!ys9RUSR&Peu^QX|j1bMD$MM}r3j@9brpo40;T5w{LNPHdYBdC1@zOkzUN zJumC7?FbW`N!k=A-y;-Yc?WTIXCGr-Fwe|1{5wYHN{EMn65_I7N81mYzP{aHEVWNH zMCd)&F={aX_fO~h$M9SH>$6r(&VjL>eKN|)U=)e|%ylzY>$1(6kmze!DyMwp({Jv> zbmwx@K_8hdx{FfS<5IN~j!0i0(ZwxKc~jo4%0lTRbdjV(^e-EJ-w=9xc$#`}S6=g> z0MRu4YTJeO>Efa~W>|DCuFw0QjjocX>#Ox<12zPV%D&%n&va`hbcQam1h3_x$R~M| zbN*JZl^LnIV$m9M!{M`7qDbT4*t(Taw)qoX%nh^$qo$4UIG!^<@V*PP{@AvYFsbYF zpXr`P_cqAkV{pJ-KX=0OLljJX^U&q4eV1!H5@ni!D4@MC;PjhPh;U1-1nO7mopj|x z(k{DetQKhBbty=s?t4gN0U<5hLxS@1g(P+1r#VVJ|DD-@46lJ7Ws5w%SQsba+B``R z13~czgL>v6WlLV^qXSuE{LTo9G zMWvtp)+;}6{qHdbU`R1W3)|IOmEISYWau`|8M#5(%omX+|3jsPJ06>yPcdQR*S*=t$7{XQs&=)3@XjA*btCmYf7^S-L&e`JcqrxvX zMaz0NB-3Y;4QH!;uTqf|CT>T4%wrufL~8YNqzq2JLDb4#@iGGL5$oc}wTNGT+bIcj)EcVtrqDIHip&x<2%w$Moc?R6aN9RVKDGc|~H1@1g4WkB@w%&O#k)G?n&6u8lvDneU zm!9W8tCRM6Ste%-6m~mCJC4C?WiUwX`UTty%u_!*VYq>XzybWePIJvc9%DIklHfV} zGMNfhPFanYY^$lmb+RbPe>Lt??(dW5ahv@mGTlIWT_wn_c$RXW$7vYaH^Fym)RuX; zDIF3}ZWuw&Uou{P{q*#jQ z$d(q^0=~FPE@zPHLxJT9+!vvxA$GqBRD{$tLopA$SedZF-R-I$>|80-hdUq7)u7%M ze;lRP&YiFV-|RpBOP*!dPZw=Gxa_+qRXHB(wH1_X5(7JlAae%%4ddwQsvwd~%Xht^ zPRsY-cFbCoDLaS->CzQyk5pf;s`~Uad;jJ@(&S9zzOe<|e0wd->2Fydbdu>g$f9bS z^|{m)6vMTbsVWe5r6)U6_%yPFsSyj{X>8XNND}CFb`l0JK21ihAkPml6crFHPM}tyEJ`$Da#8(> z3hKB!x{G-0du-~OA?$O_q+fw_z%+&{XBdQrL|6pc@_X?>1u!A+Wv6 zo-esBU7-u zxP&+Z&%wgNf&(fBB5#EdzpIlMU$jhdq3=^?-jNr#STb;HI344EkP=d~!GmE3-*}K} zq;TASQq1$Y%d(<+8l;>n=N`~rX9I&>qvd|Sy%1mk^6!SI-5$ygEh!E82TLK#^O)~z zTtDL8IiX3eDkM^CX$x2UB5{hkiI(hNx^BFVq#0BI6xK0dEU9z)WvkvIUGdsnx=zR8Q{`Ad(_ZtB#Fwm1A{fQ|0w8psgIS6fBkADU2xDMbS41MQot|NHH ze>5;WvJc6YZ_E%6wNd-Aswxw#RbzDCee~pieMS6S#kIc|ZqQ(T5g^if7<+8A&ctE4 z#^LE9-BhD98(IRN^jok0j(MmkAE*e*&<(Z=c86UFtOd{Ak^|6b2RcLk|DN5%#Q*DAF-@IBl{=5e@rrmBpMAEG4LP4(2I^@QnOq(;5*;Kxe8|B@h~dVl z!z-8c_%2aYTELh*9wE^gadi6*+i|7f`T2PfSzlF0=OZ5ar4n%TDvz?~65rBaf1ca- z^8s6nL{>+OX8p%FF;gR`U8||qk=K?WMu5-VF8O^@mEPSx3!0@#)5cL~)I|y}$IsOy z7}3|s+B-ffNr!eg-2WP(s_bUQ4KqdQL-}F4ioLU2{P(hApsim!F719Uynlbmz5HhJ(hUwPP@;UhCnI6SovSDO^&kcDu zetIrTs0Jtx4c*9B)VPT!?mi7ua%=k9(t6MO@X_Mvg+}JU6bk`t%bp{M+k27~1tYj3 z#3-}QhQn_@k@Bar%O}};V9rSz_(+{T`Z9fC;}PJsd}j9_CMM{ zJjmSjC}5kp%X^Zy_p(FNaizy+L01!xM+6DBHI@&kJ~Gv6=%6(bzqJR8r&ZK1Qo*y; z+q7L!GTDt&YQq(u*9=Va`SiXUQe#fPt4wTFSI)Mf!xWb&+&Y>S15^O%Sh?wy12&qIYa=%^oCz9Q$>4o5aL}-hOAQwdoBvgh6u%Zl}hOMow5qaH!G`AI2a;xG5+9qrJ z$3j+(yzx6Y`^<}`&+W>XW4@F*ZT4gdh~U+DjQe4NsmGgyU4^iFKW0an4L|I5Z>)M< z!TEu(K$6;%wy=s}bfCAUjcpqzA09$tz$bi=8@F72Wm?`@>hi9!M<4YE(C{{O!Vg#) z>TD2jICF^MLBtW|wy;uT1?@yX_V7$Ab-Z?eOODCub3N+J4i{PK>=qP;ouZy9{#QRJ z7L^o{JT60b5ZAQ@UwUvlMgGG)NycbK!jGlW0F{*3(SoJTp)O9>x|`!bAvPCzCeIU8 zU-bFEI8H2J&1;cP`~nWXhV)_sB9$`J9jcSnm$VtJakXad4_j>QDk+I=Aa_M0xssNW~h z;i-QlpN7=y$BDJhX|0()EPMF%%Y%db2HgV?L;MCeaubSuPZ~$1WA{19E1T_X5G&-> zQMB%8we*(dwO*9>+t)!%$Uv|ZO)>enf2N+)#w~*~Szm+-u9D}c8xj3#L-rHIolLJ$ z?yplcr@}wX&(5@mQY@Ys`#P_@hRyLN^Wdv)$w?NA#>j_ht=l}P-J9p{2ulpVdtdoc z+`XAKrB#o|12;pnN-whF%(5S>=1dLMC%#I;u=$79^$e2q>;ypdMUyyWFmzM@jvQ$l zUc0aKx{}E8Z)0I7WrE6AWCEV^<|Q|EC~m~V0D zA3Z6aG%ZHZ_@@jvBMZ77;U3Y2zEa{p#+|5(U^4 zSNtQfdR&h*1yXN@9(#JHEk*I1w~2kV&81uAw>j{K*(CPqOm3@dB+vTpc7lnhS6IMc zM*n0znm=!X5~Umx!NH0Fi0!>~sakK{iUPJ&PTmyFVJLQenfDWIvkdLu*H1FV7XLiQ zqp{&?SS*jJ)t+T2?szpfh4Gv0H^%3@hYEU~*?ij~DQT@FreeG}X&wx_s~wO&wyVQi z;1bjPp*S$`l%U9d0vAebE}SpB&3gWmrr$)LiU3cNcE0gF91HTL4rHlZwPnk=<0O`M zl%gI9pU{U=+v>3n-leBRf#$uihJ6f+;z++OtJ@%*JPy1bwVw2UNH~BJ0(=XR1(ATE z^T`jhllC3m3RQT7lApTdugHzG$roDwF+x+o*mfu=q5vsoQ(5lCf+u)Ed+|=z>;MK3suem^Z#O@;f9Moj zI#K04v(B-M(Xoz~rPb%DvcF_Ll+-f3NwXgRig5JriKX7{2Df7WT&iWTBF!+frURvl zO-J+TqW!Ntg0|$c`~mTKtOf0;R=y$=%88)>;O*ZqO&eiHjmIk3su%$ z;m({P+`~9GGLz|+Ri}T1LL5wx($H>6<6u=cV&I%FJ5fg)zgyA%MT92{t=FE_W;MzsE$4e_Z{M!` z1i{r0YC)XWudNPmoOKw;`FN(712ufhgc4d`s`>%TAU9wJegMGgq)=uD ziIDT7!ZbsgW|<>xhS0&Y>?o*86P+M#2>mJ}GX-p=HUZ_&7wn5*Ba%dM+aVM{*jSf9%un~nP|0HkW&^DMyYX1)Txr8Z~8 z4957UGgK@90mw%EmvQ!23oBB{E{@J^N@Yv0W~_s*05?>H#lB)W23NNjN7#f?zfw8NPI=^y*l*$lf&kDA#5 z^I`%J_1HI)XbjU zmJEo{TzmF4v9pEIDvy&aOAf3*HP*!T!`%6IXLXc6+kTcC&o6mBNk|W$aZ6QehQ(s2 z_Thw20Dhu~@9h*;CsEv&{ zrx}>IY?q0<^OmTEvtPRJCTL&YAr#Cs{csP(|E=*a1KqQ>SpsBB#u^@;jO4&h`VZwR z;KRp;gtQod3x|p_-I9}%mq8uiixz1IFcDj9fVcjW67O?pr2dptc?O5t5LRbpaAkGD zDI?^N!@$`P!6~-$(1|GC-hKcpdPNCBClg1nTSPk>mUf`*qMcyM>K2pJ-GgG=;t6(se-a}nn$h-zxT&s$HXsAOtry;KvnIl+MCpUc=ruapFbsI>c z6F;+*zcps$VPqF&?O*Ix599_);#X6A#!B1sR!njH>iu5s1HxS=i3|?RtM#)qUZA}h zXSRi&HX^@`IWcAG2%l8}meVo9YjUnNTE~-XN*adQ41#T@c~;iGv>O_9)-OV$qiuv; z%Rrv))@>-5H2um~tYRGB=-G6O4w$6cE9-|xKiLs9v1X&1g7>Aje?%(Hz&3%*t9fjW zq_UCTLRr>*(R7+3MQq-v2UscFM-Vu`8zbUG&D9Oq6z*+mAcc9l8jgEXT3QXG8 z(=REQH3Vj@SYy7EK@BPuy8A054=AD1MxyV-H%j0)$waXX=bLN1@jwx$H#P`k#n`F~JUwSo-Ao0(f_{{W zAdR=r8$dm%+z+*2JOd1rf9A6U@)nY`eN7vzwc1w}thfgw(br&_>`F-WUp^NdD8HUb z&VhNhme4RyoKXX+l(sEf(-|Aka@nSw}p?48lq9B6+uehKMfdz zevz~cpDG=sHL|ncoTtNEu{PgH^7t2aHG@nC69=t{{rFQ{jJwn(4(1r0&KSkAmhuDa zysB5iM@U#FuQL8TDcQgEe#4zGk^x)E(D}O@TNpBDxh0ukJc}9zlsba9JiN;_e?MIt2jCD8SF1P`69Rra!V!w4=In59cO{pV{h zTtn;&@;)h~i3moR;pG;P<~B>|vTPB)%?HJ#F7rRDLhPaoXSg)ut(W|NZ;-iEmt`?oB1G9E4P_h?)Dz zSBtV%&JwlVmEKL7PZeuZScGR5Nu!%=sq{Oi5`CAvpL)MDa0Nzw*C*GyNk&%q^8F0~ zL$%pPP*+pC`6&%-!f8Br<u*2nfRc< z^#=K5ZddLYK@+w2!~I5w+d=6!zQ#$(&m40@3*PeFo+nhZaxMcO!uT9QBVUP+B7jpQ zP5*K0ic4nfvcoGHSag7=rdg1`yV|`JZSm&TWanA0Ce~hXn59;?!8}5%DQbjZFFxlX zVk#?R7Ip_*nG=}~X_>0~;@`$_45zcUbMDr$%gqY_dA>_uU zo1K@&6U`pJMoYhba&ofX@?#UB9NsKHeaS|9yRMus@>H-%MUCh1)2Et5sClZ+rS{Ro z>qgC$xCt94Uw!Fv&`h7{o78J|(5M6&TF#1tO>0(dug}0mD%r}3QFhrK)pVDCz=h$* zUv^OqxY|VMcgB_$m_GH-k>pE$UOO)kmN+8#%S@?tTL zX=T&soBlsv$gdRb@Ph8%kdV&psLmald_T?QzbPv%bt$MwJsj_16tbdwBAH%@+~ZYMJV;DVv7!ZQ zYujT~I(AV%^HrIb%-7Cz#I}Vq=!dLpvOBa3G%9!E@#X3V+r+?lm3I~EeS#lqZnQr8 z<9GFh=L)uW7@J8ln}|G4ZLH`>oZd(r)Y;nOMD-1HR@bta!9Fm)#JaGrQFOfqb*t&v zRZb~(x{m3Ngwt`d^zz%m4c8y4#f05*V50_y^|{FCw_FzqS#rmjq_5EGD~$@*nOQoEe&Y9_Vx(Oa_{g+ zVONOpX5yE}wCSmij26!Y5Z@1RXN$P~9k{{SoMwpWzqY%J)RX;Ur)3W$Wh;o$PH?nK z+%<*(rZazRnh%3%pV%z@h4HWjQT%;&i{gYi`(H+_76WXdJ#t{doS(z+rHAt<+O~k% zp*)h12{*ffPxXuKL`Wgq`G1%CNcwtT!Z#)ufVnsA<~vIVEyRJ2;TzPLeNP`cPF)8c zPm`f@)hllEMy>5Bau!3@UZ`DO;>hu+lV@<>wz<-`0RHf?6LI@2j=LfF(8FPpH#FfRqhE2% z9L1{0f4&w6htwKAe>m_oS_>^Hy|$16{~kIpD@cFxH!%DI5yr57l~wyYdfi#}q44Oq-wO~xDxr|+QV$f}APfiQy6~JqnbN8Ed07k?Ap_!i!e}FOk&BUs2 zDV*q;>qt*oBkx_Cc-l%!*d@W0wB8>oGDbEmYMvXY6)eZ@Qh2e$2+NQ2RHbxSyCTjR zhAX7!oz13=m0E1n=(E`6n&N5sFOCS(4x(GG`K(S&DCP>?2oJFLe}4_5@$trUB4!ZB zE^DAbaO}QX>>bH#)*ai2zlDJ(1v&HyzDZ~)V)+bxm4eYppl1h|$Ikw>4eefNHYW7F zCWmGBm|%1#@z45KzA1){s`F(BWC^Fs>wG{+2$dk36WDF13Gy1RtAJ{A2`<9(PcLsDa$XED(N zBm)u>(Solr&`X18UsaI0RUSWAHtMe~cGx;LwwE@v8}GMs?&XC)0)CSn&SH{@W;e*a zdgvH;avG~kc}Lk9q5)k+J35e5|^4ZXAdR?Du)^;8pK*IlCz8ZE)TKmlLtXxixND)__%5#yz|q-MuwH~5I-V(m z*6-a4l9P;w0nGKDhn94>^%t3JDwB&%CgGoQAWY}ni+^L#k5@g8KQ%(EL^}-q{`}PX z{=S+s&&3CZok1&V!97WX$3Iyp-s5h>c@WKe!N&Xi zUOO*?FeOre=dSdGRdo_b*L;Ob?q4)3%MDqwuQXJmmiO{gWXts{1M)qtfjD+%W82aO zf+y+8H+XxWmzQU86kkRu51S%@FCIvqip~xl&s5ZDQT3(1BY}EQx*w*#s?4v*lMVlC zJ>lzC+`QlR+ZgTrpe$T4OEGnyocFZ6`x*$S+FvN8JSLL3yBi#2I`1!@sQm_zY_9Vj zwCkwbAk#F*YdqF@=iP%e7E!9zYpVLdYOID+m0x+F;p)YVJV8Gf@4unyg#{^RaP$rP zou9Pel-Q@pfJf2W&WRM!n`cHHiaMg6>=f@eYP{D+d5lQCC66jI3&7XpVm_(lc3m$` zs%AF88WID!`xPIVk@*4&=aeJ&ap&G9kPha12MRAMa&`QWB7f5?nCA|Zf6lN#vclVY zX>M>GI)A7Qf0g`A#r%)fj6WL&U!KYi^D?md297wSdW53m;QhA6iS-t2JauR2v^y@s zq(a?uMioXH6cYm!kMxd%7aqD8)2O?~ho?$kyQ)4%ezhypHipS!T{`k%U#_f)lEm+^ zmDc45(FzyUm00OQFrvTd_HiOQ|Ne2?_N(8X{9g33#cIAskLeH=i_odMUf@L~Ds1&% zCBPw<^x_;6@)p=fw6x%ro0h>79C@F4H@4OpH?(lk+i=9@3f3fbC3-9dos%c2|Ev9m zIzyXOvO5po)`0Z3wlqYUUkcr%>r%z>6XI*s`C?6HOm5+NE{tbrrE0xE#Mfy z2i^$6v7jQ`hPd5u2|NIJh+8B$aEwiBfEFMJGmP%`n>L-WCr9&aoHH}-yZ4H6=C1zP z3@k}(pmz%+%G@H#RJqS|Gru&(0L&Yp1_J`K+06yDWrN=%0}Pl~h4}ezr_3etk@r~b z6)$-6TvV6DY`(g(--s~-nN3{Bc!_hp?*H9LR{Uyd@H@IcuZ`o5re&S6xmJ-*lUPJl zI}=|UDZ49rDFJ#{@kzVMLbV5Kum;c6VM%79A74+AlM|kyM|O`dtC0<3zy?Ww6QytN zUD;h@k}cpW?{v#!7OS0!5GIm^F7+_Pg2(~{!pK1B`H$7~UsZOnoZ+M&mE0t-%3dW^ z()t{c@Ve-}7jbe-dsb<0T;CR58++d=0@}6&T`0A+W&UoCt1_qD`8sGw!#uV}RbP@^ z&=zR}x*J0B@~-g^2)lw>Rz@NW0xrJb0qCC^gJ}t@#1pRpe;3swP42{&+nH7>t63o17#_eB3?n=%y zsgA3;WN2>FQh>(k!|qA?Ay~df&?gIx53w_>AZ(tdW`%Jn3YpjAWElRqjN4Bh< zQ!wgCGElQSUoPKzWY1t)4A_kstU%btU8Qv#ZC*;oq z_fi?qGg5raABe~209H2d+q)Ul-f96}sCsW&=0t%-ZgkEfl8DAskS>;cR8dBNVp5<$ zEoD@BmN@tT!8b9pCmh$9G-#fCxVWXkK+%4eWZyeC&*!Z}rh@i6A`cb3J%3<_2Kj|6 zAfUYaguEaAsu-nR;_T^#nq)dRnF`(y z&WudJA(ezD2t++daf4cM7u$vzgm0;=YNMx9-W-GqUSbrVw z{nyeMy(`u$fx>Ei`@P#~Q$oMqRJ=sn*I0(+VkmbrMn)$Ujn@+~s3kX$7m-p3zt}c#hploAXrY8v=QNyk6QBJ(vM< z4KPfiCvWh7l2*)`S^xPfNa!4$*!UDtQ94cOf>{~Onk$hBu`m>XQ~-}g!}~oUFAS~m zvz)Eef|jY|v$Nq9$L9NYaOCpXSc+GW=9LroB1by|0Vr|)*Fu1rhs;;9GCRjr<>vaj z_Sf_$UOQH}@S24OIrN6KmRy4z^JGPfPmbNzjbhbwjm?p5$nBcSVy1hUbxI&jD|*xt zG`N+P?{!7JL^*E#T8;kK<|v{>Yz?h@GmvVjia}949b3#KH#A0)BR$rB9L!N(^z=aa z?tmhs+`88yV0((Y*4v;HLaIc`JEDP3JGjsb#|Tx}*Beo0!p8MSfew$|W(yJC8XQXO zm6pDh$1-0O-Dti~cOT|jdPTinJ5%^~;{g?02TZJ^6n%;&WSEe(C7Yl5yN^^sj-@3} z7ZdtH)u_IPa=ixH-S?x;tve0z@1?!rtA;Fo!T#@e{qTz@C)9Z@f_Q+s32Bu0^{Vw^aNXJuTHoMm zs!X*h}>6V!NA-X6j$GWN!&f&!y}Z{P5*1CEuvks+O>r+{xD;1WvSUTx}MqC z*tmH`o@(puMh{}ywWarFNuw6||t40+Yr=RdW!gx$oddm2G@u!(OLaO+Bgy(l{YgO3CA zBewN#CtUu%SQh)sfjB|e7Uk1XryeO8_*MwkUo6moU)2JE^%p9^dk4&zI_x43RcuTh z!gK#OcZW5rbZh$_%?XI)Y3AIHDbU-gWb6Ow?MtJf?&G&d+$BnuVj_wpWN8{pwiHt$ zTe6PbWGsV1*0B|3Fj4lArO0mVLv|^n7^6u>w!y88h^Z`7*5}*(Kj(SC6pN|>G`hHI)8D_%sR*PI3E z8)(<*7w?ny-`7W3=9OO@7mhRZ)e;C={tCRGe;<2+$fiw$&%{E#hv zJuY(}*X!Vk*Zy|*H%fTek;Ck3A-5qfCvo6v*9-fBsR3{4{m%-3QNqCee@B1>VC{d? z5(XgV|MMj;Q?XfYXx?t^RSH}bf~I88a$J<+S$=HHO_Qe>Llopk10MGCKqM|-LpU~z zLf|5h^v$iU8%E`EI0b<-8P0X*gp=GMu@E(Zo8t`6-cWT3K?S#YM~?5yxmZa!>mL^z z$Ssbe85S_ItxRDMB!B-8E&&~Wz0e=KTP){@-?Q;;YUEBwiZ;w-cnrDphthrkK6JLw zF*{5%#*ndPfv-Cs_Urax2vtJ_MX6V?=bVv4N1f=_hpgO4{c;DPU-ts;qR!o z=L7e-Sm417%%P&x$s-WkAxb4^K7#9JO203HNSrQI zHFM}#avT9IU2*D;=lXGVT& z^1;mlse>N#Q#j8f=zLBW4~UiqQ)Zv+g@!Xy5BtNyA)H=0)iQ<0jLHoNe`?6tUHfc} z5aMAbVin<3WpktDUdk3E`y^^|1luJ9XP+_rI6%2-d5Osb!O5cStg(+ri@i3F!uJND zt69)F9s2kIoM)ug&<(t@V}{Gf%IE5qdC|ztZ>1+oNKx+ipJy0bJB{>PRiq$R5@G9z z=EC#%yudD(`6VJLq-izz386HMb%f*YA^6GJ+=(n4S`@`I_{Z3tc-e;*kc8P89vgCqx2 zmkkhYP*kcm?0n!Dwo7`TUibX!V^E?`#pMq+)L27LoS2+KZb_jp$&f>{0Vx17oGMNG zJIB!@GXl&>MM#tzz9kQ*DfQI3CBU6!s2oa}I9Mg-9qe0#_UAEMPBn$n~&!0;pPI5S1tUf0v52I{ra zq%|}K>KigFL}05o>Bz(2*0<2+KldjkijOu{I}Ek6ugI<2Gbcq>Ud<&hnQ4BLo;Hus z@EvdT%5tj<<%zL@uhNi9c8H9usvPN4ix;E!%3jncLoPCH<<_C_y-8@`R8h*M&54eUam+Ktn-m91 z{r5U)L$vRmy~myL&GdJJF@b(JQ>8uBg1RNMTb{U&F_25A34d&*G*#kiv8mEJ`X{rP zfh1L_2Xs*qo5YSfEijetKE@0W506rpE-ClQ$uA>a;_R+NsB~>?s&3hR-t6Glvo%Fb z+ZaU>aJ!jXUqsE7ve;He9f>%n*OUYHn6vb#(M0C)&%d-Q3-Y!S7TWAGBP)TjfLEZ$ z6SJI>cqod&kBT@J(}5W+w9X40q_Z0MdxQ{c%PJ-{i{HN4eN2tzuFI&tUJIxjuxhT_ zk4UU6$gS-+XR9KA=yP}BVNssaX(=iu&SmN0VlfSP82tXcP-6IT)MdmEhL+T(A^ztr z!_-Mw;ejbW=455ULP3T_-(PVUle6g)4I`LC5cXTB@)Ui^!K7B=dg|?Fv`{(P4l|nz zegvtbY7GT{IrPdIMh2W0k9GS~+OtT(fk_{(Ut;Tzq(WF7oOh4GqYDVmMd_NuQ1}t( zpCP?vI9L;L)b>fta;ZUKaXg_seD$su_v~$q?~(JGL+jQowg({PlCy_|Xl2q!yG-$# z^zb9_0wm_)ov*6ci~3G;9_{Qsd)cGA@i?{Q{@1;)XvYo;|CoFjCf)VJTcnu3rvy4@ zP(|9CTJ(Dp(6a4{qHHzNg|d$`QjAbztDo|R`1QyXXLa(nn1GIsXkT^k(}+}@ux#eRm-x-}V!;uP&O1NAjxC?{gN_tL7P)({|WLN2`^?fwg-L&jeD&*4G4B@Dt8 zLm9VCd*}-ivGodA8#A+^I}^hA1x?3WC6eTeh3}7}!Pu?t4! zqu#``7n$Rk4jlH{1qrbEfBAcAK)aUD%M^R1tf6}P?lnxubKy6hGB(}w{^sUJB-TIB zE0p#$_HLdQt9>;Oxl{lSR3V8mq7grCrq#6;qo_Nyyr~e!Ka(3v+K|R9o9zb_ZOlj~ zsA{|8!-AG`K2n)&!TCnzj*aw!RYr6?;cWBfMUc>%%V$LS;ajqC#%)7lWsNx+%;%&_ zDu$^AXuDu9drm>eVvJxF?WkT1TY^5$JFL>ts>%JzO4Hlhe>uq%({WN@=T%qN9`328 zb*B5tkI3k*4R_t~gptsjk@yf z^|D8K?!2r2KD?al@zSd6cCcaUmkCPy)a$9R^Kjr;oay5!LQnldnkO!P;C-%0j73?k z??m4N!}AGII9*OJL=$z!G}v8~$+ZwJcouHKn;10F_9^5g-O&r*0!VJrK)wK1XC_!B z^C`7T+HhCWWSDnCeCT>*)cfz>absqC}vmU3V4qbsic3=&MM8yxDaJjNkWqUikpM+EJ?|VaFET zS>}HK@dN1TbPFVAr{(_r`(ew;26)F*7t&>J4*GbxQF%&py?dz;4Bkjb%B@q;?2M9c zuaQebkSCevU^13>%BXJh<$nbQtn8WWg>T;gKQ^u8TRw!ZEc4QFcm;|Eyy+$SitXFa zBO?bhEqLhT%e#jZwMVPG2dLi|TWQGpH<|(h=@#e7+N^Cn%)DY<*`HMTc&^d(1Z$Lmq%%@0ekEO)7BUj45Lg&IE zJE4BUZXB1D;bx|(w^tSVtnslxpvTzUC=W7|puGi-n2BL(?uUvojJ`8_@nYfy`5}Yl zI7K-7IEqIfY8#_O3kaN*1sreC@A_XJCl6A z(H4ytU~JuAv@p0&I2g3~UO24;ebQA1xtW zcqoJPI}x&(9cGj&&Eq+>>NwRm3z;tr5clO4F!54*gseXVvCH(w`$w(^DHYXszI2X|HJC8p>NzZVDy}vgw~`3ky%cx%qyQ*V-&Tz= zfq2_k9e%ECG7Jtu2MXVJuGqAJzQWn4K-1*w9u=EPCIAD+=;~O1D|!>_lpA;svd!1c z(&IkDPwUrvQ7e(bdw&1^{X9B4Izk<6xIXum04)h};yp#VmM;JN1#kV?LbEvj5)flB zVmK)7^Sl`rpBDZI2)N-H*u5~cQ><$uhdm|%w>$pfN{;yr@7zE!$RvQw9^zK&=t`Wm zQEwg{_WSp3LWP48+nZSGVHX@@v3MI&io}#QRd`mBgc(~49bIVzAi)J<8@pDo;gZ9! zYc=T?$k_)GD(A?dvN2tpcMC~sUNn~_{cHj<^0cao*BYagu@w*5&d2S(qZ}baZG@A0 zRm-GB1Txt1f7|YF6Q|C^-G#sl4$U0JEaTB>{ZNpNeXFdFZN1p1l;f>e(@Djk@alrJ zp@fAR`grMRwPTxWf4ZDp{8jRHe?7fi5nam=qL?w}dxE57a^Y71D&0ur4%xOKm(>AN&zYxKoG z2kF)WcG_f$t{Qm~GP9y-^YA3s4~3Wm5RmyCiRY*8`{9aNmH>zG{Av`X3Rm{xTxh1d z2hfqQf%l!X@Y-GB?-5Cr{^KvsyH*YPaVo}{0|IAXWb*xFbP0BYTq7Dqsdc`N_`(qp zh3zsMUUPx8pfjxPXWL=(w-9TV`H}deQv2Xw;r0$mZab$+YavTnc9xw__PA#%V`F2n zkl!9stvFm6L3zjfA$$5bN{RFC5+5VljPtix%rxY80pR}^K_aS<4^FXvRv!G<4-#(f zb;fu6iP+nPj=j@xW#BH4cE^rbzZN&V+0ugKnDK)+d(4jkdwI4nT7|r(GGTE-?;?M9 zVM*}E=Zh7`o1rMBGllW-VWIn7Al+$@s3S9hl!yTC*);n2o1FF%c8OQGaLnF2k`T-< zs28e0RCU9r$Qb@A4o|Bj+F@!|83pql(XU>w5SR(D&WbS}mOip7>X=?Ak-m8zv)qPT zunCf}8PZ2Q!^5UOAPW|9+en1fs^AO?f>dJB;n(t2m~-aAyt#j`RJJ)}O@rh5=vLg(+ zl-u?^`HS~6+=2*DP1Nkw2+?mCy(bl}3TL)T;C@z~6ReUS`F^Mq1Vx}Paa}S_Rlo0& zN}=ZGNM+{auEv`WBRku|-P2w~Gc~e9ntJ(o=3+0KL~V)xug-wI3sn$=?3{FOZ z-zlzrPQN0ARN2Ayu;f5z4u+9y!dcEfM4bX$ z)M$SYgh=Y*`ay@HS_lV~DcVI=u#uwib9IHb3TmX^YhT`{jc%~nT_YMHW{lCcag$J& zoRXrP+lh5G&jhP7K_C*H2#Zo-^_FRVo`PJI>1#?PjA}9&7`(<95{zm$I;jC#(`3yh5&;vnIg~cG{Ya?xloDRbOR4`06 zyU5I^V1+m#h;;065h){m?mc0>A13W=MS-t=?g~eFKsKlh?{dIIUa7Nd57!0r(2gl^75c8p1oUEA1D8jAd|U*KjxrOWGIZ82}h zB|zvpLk_*1Pd|q`1aK7}{2!k;Vo9d=FliI&LCaE7LzHIKI-T>BLqo1j)7KH0Uw+fF znB^T9`D~7l>WSeSin7Jke)YzE9K^({_#>$IeTu-7XpR`3<7DdL@ah{IgUCH{06c0P$3A^7JIPzd4R!UxoHdhn`A4vcJ zQ?!U)=moQL*1q$yaCMb(1N{A#+wKrlybeTF{_ zPIT^yGODx9ElJPOLv(~zw@JItb6}Q5A(fCSalcHf^|}^*fk4iyk8z%Ri-&3-B^RYX zU^6&gy`Vv_dL+X9P8H&DiOa~?RKjS}*X|&pfV+_! zUa2s^_X%0hO)iVOVWe3sASD8h>+)ykUp|)hrl-jlI|#8_OjF6iBozKEhIp3q zS*h|U@_oL|(>(d5jCI-KaGa+IM0wv`KRhjrb&^MN@~EEeZQ@QODX4PnYL95kk9j9T zK2Aca@OAqHFRi@doLD;uKdg&C%_5gxZnTXvBkT);iqoYE4;qz&u;EDeLC7vmqxrQ) zh_ZkqD|hQA5p9=-Dr=Q`od}y>5mqCcXSx?5tM%}{V3@$rB|uTc2SINpZc&3?eN@r8 zjM?#r)O7u2Q`;i^m`MJTy}Tg0%Bv6^SN6Q__|LBk;5Rh4WIK~{1<^R z8F?d6D3meqwLy>jWF5VezwDEP_iK;HLi%PXq^}RE`)}?R3?AJ?u!}J&2lxWmt9(rO za>*EU_@2KVEb96L5+{so1tS|{^1c}B$*8nm$tk%*Lq=O;bV%be|?IXiqJk8Hm^{K(DQmiz zw2QZ>DF4SO{??LT8RO~TJA12+@vr809%P&kG-J>&pfgvl(2iALT%t}JrZ#l251Vaz zB7*!wJ&8$>L=$NvN7{p4O6&-x_5Ij6TJnQRH+(7==71h|xkUwGKCji_9+oxTO(~F+ z8u{K+weB`wqO>x?YuRBVr;ivsiaybBmG5DhEBb5hRxWA7hZR}<;y_sA^M5Mr1r>%U zgWAUj6}@H2$I4?#oPfeBF?e`i4Q2vFWFh#Ut4NG$YDmNB7q$xYpxLQc{zcyCx=(14 zA>l%y+jhbEq>TqO<7%X9mB?}N2MMyHzg#Z6yIo0|6L2(UC}@3{o_0R&nxAGNFTMgB z`HH&aN6gbiD%uduBaxwZYdiDX0Nod1Su)Q&6MLgKy9vat1d!v=_m`%edHktu>2|Lh z?R*0js|h351szZrH)`b$dEVUI{KVaEMaC7)P?<#K1{%m0I}KNSNyGuR@_7~Y6Pj~n zy`%l%A;LIWcJ~D|;|!}w@7@DxL!}F3iucIx{uc$SMBOF*0je3~azu56FPWwL;G+%jw3r3+;9o)kuH3i^o;6Xq6^c0b<5wqk6>fcd- zI11;x3Ziiij)$UsQ*H#a9LSCzymuqmkW*NX8^Ej&2C;*v`EdDpUXIIxRpN;-D)5eK zca{X%Abo!T!_3UmwTHO|h)ska}{ z!;v7vG&d3#MQLZ^_@oLM+AvGjlcn(|xQ{9(qpA`7J`&H{CV;S931_J0(4{!fv&_j^ zM56~BrBGS0PJ)pO{tNG;Fw4UbwSCt`l$|K6%%M?;(bs@53vO35-v4CrCjrDgm6#6P zyZKz5(PQdr$R)>Bg;A?En57X>BHc0Ga~_+_CNuw8^Rqi;RaZBmG1DBc5(!D*KS+$( zkdS_JqYG@6_m`i&FGoa0#!uXeOzdPx3?Y!HZ|g`!7mXKn{%nU;BfIoMBXI$hhM_3IEiKPTj*UZZ|cLQYFq(+Kj7Ml(S3Ii$RU z_uIoqw_pWeQe2SuuN`0$(StdvfDqMc_<$rX8J8sn4kE0L^RRM z%#2H0+rX=*-zF&AB1{JjGr8j|ohnk`N0pA}vyUHo*6b57>2GjdZ}`>rm-j|ITn?K$ zpY#D6ZOM>4KJr2;<$LQ=^}704lK+2^qa!3g^xp(G{7*-d^zMBzx`)^hseUW%hH<^7 z`kI=WWlkk57P}P1;C1SpK4V(>^@B_vSeaNO>vQ`l1o$2eiM6HPpZ>vUVDE+mX=}63b|8OL6X94< zg<SOCO%E33toe)!RAE!ZLTv!;jES1ts|J_ zJj(VjYgSkCoW5L!Z1KxlZ}vO$a>J|}+^$hedhb0HhNK+Yf|qYgZRWycM%_k{n77cZ zV@bVj2B)-Xy}<4ANOmK&-fOUx2fv>+8D0hXn1xYBj%?>ai0;0FNOE}+ zJ;GQi)P^1F0B4O={6H<8aZK-3r8QLb2=hc0N%^qkHaI===ux@$rRp{xAOWSptOnUE z4Z6xv{OPD=Cv=tj-JkXga6IfNO8doq-`0NvCy6-O%F=}&O_o9{D0`KbB7#D>;&E$u zr7ooV(P6QY^^J|F31}dKA$WWQv#AWCOn4pcXDLRB!oY$AHGmrFd-v|$q3~uD8mK4q z+GQ%LkRvj1GGD|$JNX(VLppCU>qM9ud~kgX=vat$pSQ@5JoHp+`2FyMtB7RWZu2I) zJ^oQ3A987`kv_e~mIecKFtL_NV6zPNvg1XP|3ZA5<5uw zoe0yD3!-&*celGHquSXu1NGmFMhM=8`U136?Fp;1Arxx;cO6CUB7z_Drb(?HH>mfm zbadef9$&}e16R_)@h`B)I5Ug`j_J8bRV?Kwy*1CX_EceKOQEYD(=<$GY#} z7G6W=Zc((~QSRe_vroaz_d<`XGYYt7xG_Yp;D^}1vHn(Ms&w<{YN%BB2MrNi*(}nQ zsv!-Ogqf4a&e>GA-`WjU+! zxk53=T5jE)Ir$o3KMEN}NlTzt2#IYW1@Fo9Q&sF^D_!-gnQgMg)B|^;@O8Qa^%>Nb zV=yvlWM!1ATbenkKwS4B1}T5o4(g!yP$>lyn3|4&lovvCHU?*G5sh!L1xr#YmfWtZ z$Xg@Fn5qKnpQ3cvZnRic5N*0lQon45H%k^iw#(ef!Ob&u{MM6xzk<%yd{o&vCa?qT zc6P%Loo_fRWr8>;ur5eTht3&8wty9|G7=|vI4ZdWmg63O4bT{U2s~7p!a%1hQK!bL z<|-b>?inE>5If+xhr1;Pzn9YWN=f-3i`%cQ3p>%8U9;do&Th*Kyzz@+Y-NAX1>X`! z7z(ED$dZ32NgGOV)Lt^Vb(H6yJa@aNxJ@@aaLa+X1sC)s8nO*51jUTXgy*4RlkdjrF;v8>a`DD@o>K^`KBs@AHnV(#40vv)B#VAA zMS!|wrVMXHa)mc9&{Nu@4G#wz6itYs{0>V_(kNA$&jV)tslJ_0yoo}@pevX>**qw(`d?4+F}*%I^E+;EODdZ z54W6kUApaWxBrUl&PNU%a`=))*kD`(VsclftrmpMUcLhU%G+_!}L6s8~L&b_$R9X z#F|iBF$RFpjanRzNMbF0N#Yk6xr9?cYZ$Qc7veh9HIjVB@E5QGW?Defyn-270Goe9 zoV-(K+n!8t7SgkIBQ7Vtlr~Jo06gQXtzmBOyVHe1l7el(TKO9I{*`4FB)ZS;2jEg9FB8(7mo@65vm3_YI^mO@sNoB(IQgP_s4m0Jn(HI>)r<|WaU z0e9%MT2UE*TK$NTj{{dy`Fkudiq{(cDcf-3l|1x?*r{U)_WucCda;9*vtmYT2hN1jvWj*jrU6x=isUkH;*}HiyJ^Btt7ZzmaBXwbW~<%CCN|U#MDxdKoQeL$C?N$% z_IcMHIDK5*-7Yv7|MLh*x-=se5%MzA!4@NcijXJ&W`Tob0Df|;lo{9o5GCqzgkJRx zp7m_@9BDn^eb9+}HW@5AIU5+4_ct$gnx%e83}}hC%{_Y>MlL3ex=QEAkBi(`4~n8= zqrrMF=)L%m`W041Qpd7}ele6;aWC!eJpy3v!d!~(E)R3EO^EN5SVk?y7O$&TtT?T zef}htWp>M`15`;0Nx`fCmg;+aP${wwc(LKS!8pL$DM(nrB9~bFw8VMp%P9Kzvy)+8 zp4x{@_%_=J(5_MbO0QIA;O=x z{5=2%w;LI=GZ|Ssp6a8v2DHHre^Ig+uRvdPn@3>s*pJGOh1l`DbFNa2`>@s=Mbi7d zHvyOcZ14d4>^~+DzN+3&6&SJFmW5x!>T*;KW=Hg8x%JcNPC&8P%DH6DYuOjA^F4P9 zD&UAf^o=j3rLr|{8u>=mgt12Zpf!(SQPyPpgr^r|?i3TkOu1*F=t~^ku9SAMm~#4f zNsfAMAV)XcsJv_6ZxVfz30d(n2&f~0P`$un(cP##>-_2!AfrFOgNF8CQ=oG)AZ?^< z*IFzdp+r1`&6|C?U)cw6qewjL?1j~Xln8G4kQ#Z7K2fjwB_a#*Dh22Fld)F~NM{$3 zD3jd4QbF1T;g2-R*m-$6UijwZ=0H&<)cV}QDAoN5F6tO+8_}`kyf1?ZFg}W3WA>dO z2h(t{QByRZrTuVrC@V!T*?P@8WV~oFc-9Y)rI}!BIDZ{gttQ{Ksnk7fru`G)zq|d% z;4RcF2_^v)KZR(G*7qbenfu^1XA9jC_f85-3Fy7jF-$#h%{vp|?o3dFAzj1xTb&)= zK4X{~3o(z5-gBjo+sGE1qUU$gEpCbV4sI~+oGR>s{C-N`1iZGY7vkKs=P-iH;a*Bb zS6B44RO!G3Pro48G=TyHgl?l(IL*0S%InJlxMnKmO6l-bc`0Oddbk4lcQ$FmUkW)z zPZPZsq|-X}QDy3u90}0#0*QCWyv-!YF7;qqOJZtmF7I zK@L)y;Q2h#W8@-Q31D+}jVsY;-1VWy0ESxR$$gnW$gJ#)bvN&uF z5x$Pjcmg|^nrDpY;|!IA4*{kG8QQU)1vIA=&K2iN6&~Q26x4fFZZ3NdkrWF(PHE?j z(b3}uLTek)0N-b2>GHi$MJxI$zAS=%3ld9dzbQvbCfEqk`k`|H#h-pD3}ouAebBGu z)7}1Yv&GBj!t2%{B=$31{ngISP6IYP+-U|d=m;S;MuWHK%PHC%8N${N`&Vn7gXz;*X)+4rTIBRgdR1wQrsV-;TjAE!f5VrLXd%p8m(KjpJ7YvMzra zqKN+?8UJOb{tr=CuknAr<@CS4#47{>p5H3W5o6J^^0k=bG9G;F0eoBwD#v#@8t}~? zH_~0^cb^_K#L*=Gjs+)B=RZdl3m*3>)k5J9-x1S$2l-7m_>VUGm&5vZ`2QdNy!*Dt andcxSeLvzd27Go8VtCaQQLX3l;Qs(I{{o8u diff --git a/docs/images/nf-core-bactmap_logo_light.png b/docs/images/nf-core-bactmap_logo_light.png index f86b9a7e3719e5b9a515f1b76b914c1496b82f24..862e2a975baec81b3242d25a7c5418b495929327 100644 GIT binary patch literal 24366 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 Z`>0=Ec~{5jpg#C8BRx}~M)zLae*xk+AkqK; literal 24636 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%0DMIV_J~~>PX0oEV$~7vgshQ1?7AQVM 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 diff --git a/docs/output.md b/docs/output.md index 5e97dce..fd95270 100644 --- a/docs/output.md +++ b/docs/output.md @@ -31,7 +31,8 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [SAMtools stats](#samtools-stats) - Statistics from mapping - [FreeBayes](#freebayes) - Variant calling for Illumina reads - [Clair3](#clair3) - Variant calling for Nanopore reads -- [BCFtools filter](#bcftools-filter) - Filtering of variants +- [BCFtools filter](#bcftools-filter) - Filtering of Illumina variants +- [BCFtools norm](#bcftools-norm) - Normalisation of ONT variants - [BCFtools stats](#bcftools-stats) - Statistics from variant calling - [BCFtools consensus](#bcftools-consensus) - Convert filtered bcf to pseudogenome fasta - [seqtk](#seqtk) - Summarise mapping statistics @@ -313,14 +314,14 @@ It is used with nf-core/bactmap to map short reads to the reference genome. :::info -While there is a dedicated section in the MultiQC HTML for BWA-MEM2, these values are not displayed by default in the General Stats table. Rather, alignment statistics to host genome is reported via samtools stats module in MultiQC report. +While there is a dedicated section in the MultiQC HTML for BWA-MEM2, these values are not displayed by default in the General Stats table. Rather, alignment statistics to host genome is reported via samtools stats module in MultiQC report. By default the bam files created are not saved since sorted bam files are produced in the next step ::: ### minimap2 [minimap2](https://github.com/lh3/minimap2) is an alignment tool suited to mapping long reads to reference sequences. -It is used with nf-core/bactmap to map short reads to the reference genome. +It is used with nf-core/bactmap to map long reads to the reference genome.
Output files @@ -328,8 +329,10 @@ It is used with nf-core/bactmap to map short reads to the reference genome. - `minimap2/` - `build/` - `*.mmi2`: minimap2 indices of reference genome. - -
+ - `align/` + - `.bam`: BAM file containing reads that aligned against the user-supplied reference genome as well as unmapped reads + - `.bam.bai`: Index file for the BAM file + :::info minimap2 is not yet supported as a module in MultiQC and therefore there is no dedicated section in the MultiQC HTML. Rather, alignment statistics to host genome is reported via samtools stats module in MultiQC report. @@ -373,9 +376,7 @@ FreeBayes is a haplotype-based variant detector designed to find SNPs, indels, a Output files - `freebayes/` - - `variants/` - - `.vcf.gz`: VCF file containing variants - - `.vcf.gz.tbi`: Index file for the VCF file + - `.vcf.gz`: VCF file containing variants @@ -387,10 +388,7 @@ Clair3 is a variant caller for long-read data. It is used with nf-core/bactmap t Output files - `clair3/` - - `variants/` - - `.vcf.gz`: VCF file containing variants - - `.vcf.gz.tbi`: Index file for the VCF file - - `.vcf.gz.stats`: Statistics file for the VCF + - `.vcf.gz`: VCF file containing variants @@ -401,8 +399,20 @@ The `BCFtools` software is used to call and filter variants found within the bam
Output files -- `variants/filtered` - - `.vcf.gz` filtered vcf files containing variants +- `filtered_variants` + - `.filtered.vcf.gz` filtered vcf files containing variants + +
+ +### BCFtools norm + +`BCFtools` norm is used to normalize the variant calls from ONT data. + +
+Output files + +- `filtered_variants` + - `.filtered.vcf.gz` filtered vcf files containing variants
diff --git a/main.nf b/main.nf index b9a2894..ebbd9ce 100644 --- a/main.nf +++ b/main.nf @@ -81,7 +81,10 @@ workflow { params.monochrome_logs, args, params.outdir, - params.input + params.input, + params.help, + params.help_full, + params.show_hidden ) // diff --git a/modules/local/clair3/environment.yml b/modules/local/clair3/environment.yml index e1a7b84..cc814bb 100644 --- a/modules/local/clair3/environment.yml +++ b/modules/local/clair3/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::clair3=1.0.10" + - "bioconda::clair3=1.2.0" diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 2354b63..2ea01f4 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -3,9 +3,9 @@ process CLAIR3 { label 'process_high' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/clair3:1.0.10--py39hd649744_1': - 'biocontainers/clair3:1.0.10--py39hd649744_1' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e7/e70b0f4389028f4dc88efde1aac7139927c898cf7add680e14724d97fecd3d32/data' + : 'community.wave.seqera.io/library/clair3:1.2.0--b1b03d4e9d1b6a2e'}" input: tuple val(meta), path(bam), path(bai), path(model), val(platform) @@ -33,9 +33,20 @@ process CLAIR3 { --output=. \\ --platform=$platform \\ --model_path=$model \\ - --sample_name=${prefix} \\ $args + # Rename to add prefix + for file in merge_output.vcf.gz \ + merge_output.vcf.gz.tbi \ + phased_merge_output.vcf.gz \ + phased_merge_output.vcf.gz.tbi \ + merge_output.gvcf.gz \ + merge_output.gvcf.gz.tbi; do + if [ -e "\$file" ]; then + mv "\$file" "${prefix}\$file" + fi + done + cat <<-END_VERSIONS > versions.yml "${task.process}": clair3: \$(run_clair3.sh --version |& sed '1!d ; s/Clair3 v//') @@ -44,12 +55,14 @@ process CLAIR3 { stub: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ - echo "" | gzip > ${prefix}.phased_merge_output.vcf.gz - touch ${prefix}.phased_merge_output.vcf.gz.tbi - echo "" | gzip > ${prefix}.merge_output.vcf.gz - touch ${prefix}.merge_output.vcf.gz.tbi + echo "" | gzip > ${prefix}phased_merge_output.vcf.gz + touch ${prefix}phased_merge_output.vcf.gz.tbi + echo "" | gzip > ${prefix}merge_output.vcf.gz + touch ${prefix}merge_output.vcf.gz.tbi + echo "" | gzip > ${prefix}merge_output.gvcf.gz + touch ${prefix}merge_output.gvcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/nextflow.config b/nextflow.config index 4dc9aa8..516ba5a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -323,46 +323,19 @@ manifest { description = """A mapping-based pipeline for bacterial whole genome sequences""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.10.5' + nextflowVersion = '!>=25.10.0' version = '2.0.0' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs - help { - enabled = true - command = "nextflow run nf-core/bactmap -profile --input samplesheet.csv --outdir " - fullParameter = "help_full" - showHiddenParameter = "show_hidden" - beforeText = """ --\033[2m----------------------------------------------------\033[0m- - \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m -\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m -\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m -\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m - \033[0;32m`._,._,\'\033[0m -\033[0;35m nf-core/bactmap ${manifest.version}\033[0m --\033[2m----------------------------------------------------\033[0m- -""" - afterText = """${manifest.doi ? "\n* The pipeline\n" : ""}${manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${manifest.doi ? "\n" : ""} -* The nf-core framework - https://doi.org/10.1038/s41587-020-0439-x - -* Software dependencies - https://github.com/nf-core/bactmap/blob/master/CITATIONS.md -""" - } - summary { - beforeText = validation.help.beforeText - afterText = validation.help.afterText - } } // Load modules.config for DSL2 module specific options diff --git a/subworkflows/local/longread_mapping/main.nf b/subworkflows/local/longread_mapping/main.nf index cf790a7..6db6fb4 100644 --- a/subworkflows/local/longread_mapping/main.nf +++ b/subworkflows/local/longread_mapping/main.nf @@ -21,8 +21,8 @@ workflow LONGREAD_MAPPING { reads // channel: [meta2, fasta/fastq] main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() MINIMAP2_ALIGNMENT( ch_fasta, reads ) ch_versions = ch_versions.mix(MINIMAP2_ALIGNMENT.out.versions) @@ -48,7 +48,7 @@ workflow LONGREAD_MAPPING { ch_versions = ch_versions.mix(BCFTOOLS_INDEX.out.versions.first()) ch_bcftool_view_input = BCFTOOLS_SORT.out.vcf.join(BCFTOOLS_INDEX.out.tbi) - BCFTOOLS_VIEW ( ch_bcftool_view_input ) + BCFTOOLS_VIEW ( ch_bcftool_view_input, '', '', '' ) ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions.first()) ch_bcftool_norm_input = BCFTOOLS_VIEW.out.vcf.join(BCFTOOLS_VIEW.out.tbi) @@ -65,7 +65,7 @@ workflow LONGREAD_MAPPING { ch_versions = ch_versions.mix( CONSENSUS_BCFTOOLS.out.versions ) SEQTK_COMP( CONSENSUS_BCFTOOLS.out.consensus ) - ch_versions = ch_versions.mix( SEQTK_COMP.out.versions ) + ch_versions = ch_versions.mix( SEQTK_COMP.out.versions_seqtk ) emit: bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] diff --git a/subworkflows/local/longread_preprocessing/main.nf b/subworkflows/local/longread_preprocessing/main.nf index 8e8a8a1..d6f5a3f 100644 --- a/subworkflows/local/longread_preprocessing/main.nf +++ b/subworkflows/local/longread_preprocessing/main.nf @@ -35,7 +35,7 @@ workflow LONGREAD_PREPROCESSING { } FASTQC_PROCESSED ( ch_processed_reads ) - ch_versions = ch_versions.mix( FASTQC_PROCESSED.out.versions ) + ch_versions = ch_versions.mix( FASTQC_PROCESSED.out.versions_fastqc ) ch_multiqc_files = ch_multiqc_files.mix( FASTQC_PROCESSED.out.zip ) emit: diff --git a/subworkflows/local/shortread_fastp/main.nf b/subworkflows/local/shortread_fastp/main.nf index 672f905..6559b34 100644 --- a/subworkflows/local/shortread_fastp/main.nf +++ b/subworkflows/local/shortread_fastp/main.nf @@ -19,8 +19,10 @@ workflow SHORTREAD_FASTP { paired: it[0]['single_end'] == false } - ch_fastp_input_single = ch_input_for_fastp.single.join(adapterlist) - ch_fastp_input_paired = ch_input_for_fastp.paired.join(adapterlist) + ch_fastp_input_single = ch_input_for_fastp.single + .join( channel.value(adapterlist) ) + ch_fastp_input_paired = ch_input_for_fastp.paired + .join( channel.value(adapterlist)) FASTP_SINGLE(ch_fastp_input_single, false, false, false) // Last parameter here turns on merging of PE data diff --git a/subworkflows/local/shortread_mapping/main.nf b/subworkflows/local/shortread_mapping/main.nf index 146fc47..9f2efd9 100644 --- a/subworkflows/local/shortread_mapping/main.nf +++ b/subworkflows/local/shortread_mapping/main.nf @@ -81,7 +81,7 @@ workflow SHORTREAD_MAPPING { ch_versions = ch_versions.mix( CONSENSUS_BCFTOOLS.out.versions ) SEQTK_COMP( CONSENSUS_BCFTOOLS.out.consensus ) - ch_versions = ch_versions.mix( SEQTK_COMP.out.versions ) + ch_versions = ch_versions.mix( SEQTK_COMP.out.versions_seqtk ) emit: bam = ch_bam // channel: [ val(meta), [ bam ] ] diff --git a/subworkflows/local/shortread_preprocessing/main.nf b/subworkflows/local/shortread_preprocessing/main.nf index 7cc7ef0..54dd81e 100644 --- a/subworkflows/local/shortread_preprocessing/main.nf +++ b/subworkflows/local/shortread_preprocessing/main.nf @@ -35,7 +35,7 @@ workflow SHORTREAD_PREPROCESSING { if (params.preprocessing_qc_tool == 'fastqc') { FASTQC_PROCESSED(ch_processed_reads) - ch_versions = ch_versions.mix(FASTQC_PROCESSED.out.versions) + ch_versions = ch_versions.mix(FASTQC_PROCESSED.out.versions_fastqc) ch_multiqc_files = ch_multiqc_files.mix(FASTQC_PROCESSED.out.zip) } else if (params.preprocessing_qc_tool == 'falco') { diff --git a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf index 0fe64ef..2fc384b 100644 --- a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf @@ -11,6 +11,7 @@ include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' include { paramsSummaryMap } from 'plugin/nf-schema' include { samplesheetToList } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } from '../../nf-core/utils_nfcore_pipeline' @@ -32,6 +33,9 @@ workflow PIPELINE_INITIALISATION { nextflow_cli_args // array: List of positional nextflow CLI args outdir // string: The output directory where the results will be saved input // string: Path to input samplesheet + help // boolean: Display help message and exit + help_full // boolean: Show the full help message + show_hidden // boolean: Show hidden parameters in the help message main: @@ -50,10 +54,35 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // + before_text = """ +-\033[2m----------------------------------------------------\033[0m- + \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m +\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m +\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m +\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m + \033[0;32m`._,._,\'\033[0m +\033[0;35m nf-core/bactmap ${workflow.manifest.version}\033[0m +-\033[2m----------------------------------------------------\033[0m- +""" + after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { doi -> " https://doi.org/${doi.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} +* The nf-core framework + https://doi.org/10.1038/s41587-020-0439-x + +* Software dependencies + https://github.com/nf-core/taxprofiler/blob/master/CITATIONS.md +""" + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + UTILS_NFSCHEMA_PLUGIN ( workflow, validate_params, - null + null, + help, + help_full, + show_hidden, + before_text, + after_text, + command ) // diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf index 4607263..9f6d755 100644 --- a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf @@ -16,7 +16,7 @@ workflow BAM_SORT_STATS_SAMTOOLS { ch_versions = Channel.empty() SAMTOOLS_SORT ( ch_bam, ch_fasta, '' ) - ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions.first()) + ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions_samtools.first()) SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions.first()) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 1b292e3..7068ffe 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,145 +1,17 @@ { "-profile test": { "content": [ - 61, + 3, { - "ALIGNPSEUDOGENOMES": { - "multi2single_sequence.py": 1.0 - }, - "BCFTOOLS_CONSENSUS": { - "bcftools": 1.2 - }, - "BCFTOOLS_FILTER": { - "bcftools": 1.22 - }, - "BCFTOOLS_INDEX": { - "bcftools": 1.22 - }, - "BCFTOOLS_SORT": { - "bcftools": 1.22 - }, - "BCFTOOLS_STATS": { - "bcftools": 1.22 - }, - "BEDTOOLS_GENOMECOV": { - "bedtools": "2.31.1" - }, - "BEDTOOLS_SUBTRACT": { - "bedtools": "2.31.1" - }, - "BOWTIE2_ALIGN": { - "bowtie2": "2.5.4", - "samtools": 1.21, - "pigz": 2.8 - }, - "BOWTIE2_BUILD": { - "bowtie2": "2.5.4" - }, - "FASTP_PAIRED": { - "fastp": "0.24.0" - }, - "FASTQC": { - "fastqc": "0.12.1" - }, - "FASTQC_PROCESSED": { - "fastqc": "0.12.1" - }, - "FASTQSCANPARSE_PROCESSED": { - "fastqscan_parser.py": 1.0 - }, - "FASTQSCANPARSE_RAW": { - "fastqscan_parser.py": 1.0 - }, - "FASTQSCAN_PROCESSED": { - "fastqscan": "0.4.4" - }, - "FASTQSCAN_RAW": { - "fastqscan": "0.4.4" - }, - "FREEBAYES": { - "freebayes": "1.3.10" - }, - "GET_GENOME_SIZE": { - "gawk": "5.3.0" - }, "GUNZIP": { "gunzip": 1.13 }, - "MINIMAP2_INDEX": { - "minimap2": "2.29-r1283" - }, - "RASUSA": { - "rasusa": "0.3.0" - }, - "READSTATS_PARSE": { - "read_stats_parser.py": 1.0 - }, - "READ_STATS": { - "read_stats.py": 1.0 - }, - "RENAME_FASTA_HEADER": { - "sed": 4.9 - }, - "SAMTOOLS_FAIDX": { - "samtools": "1.22.1" - }, - "SAMTOOLS_FLAGSTAT": { - "samtools": "1.22.1" - }, - "SAMTOOLS_IDXSTATS": { - "samtools": "1.22.1" - }, - "SAMTOOLS_INDEX": { - "samtools": "1.22.1" - }, - "SAMTOOLS_SORT": { - "samtools": "1.22.1" - }, - "SAMTOOLS_STATS": { - "samtools": "1.22.1" - }, - "SEQTK_COMP": { - "seqtk": "1.4-r122" - }, - "SEQTK_PARSE": { - "seqtk_parser.py": 1.0 - }, "Workflow": { "nf-core/bactmap": "v2.0.0" } }, [ - "bcftools", - "bcftools/consensus", - "bcftools/consensus/01.fa", - "bcftools/consensus/02.fa", - "bcftools/filter", - "bcftools/filter/01.filtered.vcf.gz", - "bcftools/filter/01.filtered.vcf.gz.tbi", - "bcftools/filter/02.filtered.vcf.gz", - "bcftools/filter/02.filtered.vcf.gz.tbi", - "bcftools/query", - "bcftools/query/01.txt", - "bcftools/query/02.txt", - "bcftools/sort", - "bcftools/sort/01.sorted.vcf.gz", - "bcftools/sort/01.sorted.vcf.gz.tbi", - "bcftools/sort/02.sorted.vcf.gz", - "bcftools/sort/02.sorted.vcf.gz.tbi", - "bcftools/stats", - "bcftools/stats/01.bcftools_stats.txt", - "bcftools/stats/02.bcftools_stats.txt", - "bedtools", - "bedtools/genomecov", - "bedtools/genomecov/01.bed", - "bedtools/genomecov/02.bed", - "bedtools/subtract", - "bedtools/subtract/01.subtracted.bed", - "bedtools/subtract/02.subtracted.bed", "bowtie2", - "bowtie2/align", - "bowtie2/align/01.bowtie2.log", - "bowtie2/align/02.bowtie2.log", "bowtie2/build", "bowtie2/build/bowtie2", "bowtie2/build/bowtie2/genome.fna.1.bt2", @@ -149,265 +21,15 @@ "bowtie2/build/bowtie2/genome.fna.rev.1.bt2", "bowtie2/build/bowtie2/genome.fna.rev.2.bt2", "bowtie2/build/versions.yml", - "fastp", - "fastp/01_test_1.fastp.html", - "fastp/01_test_1.fastp.json", - "fastp/01_test_1.fastp.log", - "fastp/02_test_2.fastp.html", - "fastp/02_test_2.fastp.json", - "fastp/02_test_2.fastp.log", - "fastqc", - "fastqc/processed", - "fastqc/processed/01_test_1_processed_1_fastqc.html", - "fastqc/processed/01_test_1_processed_1_fastqc.zip", - "fastqc/processed/01_test_1_processed_2_fastqc.html", - "fastqc/processed/01_test_1_processed_2_fastqc.zip", - "fastqc/processed/02_test_2_processed_1_fastqc.html", - "fastqc/processed/02_test_2_processed_1_fastqc.zip", - "fastqc/processed/02_test_2_processed_2_fastqc.html", - "fastqc/processed/02_test_2_processed_2_fastqc.zip", - "fastqc/raw", - "fastqc/raw/01_test_1_raw_1_fastqc.html", - "fastqc/raw/01_test_1_raw_1_fastqc.zip", - "fastqc/raw/01_test_1_raw_2_fastqc.html", - "fastqc/raw/01_test_1_raw_2_fastqc.zip", - "fastqc/raw/02_test_2_raw_1_fastqc.html", - "fastqc/raw/02_test_2_raw_1_fastqc.zip", - "fastqc/raw/02_test_2_raw_2_fastqc.html", - "fastqc/raw/02_test_2_raw_2_fastqc.zip", "fastqscan", - "fastqscan/processed", - "fastqscan/processed/01_test_1.processed.json", - "fastqscan/processed/02_test_2.processed.json", "fastqscan/raw", - "fastqscan/raw/01_test_1.raw.json", "fastqscan/raw/02_test_2.raw.json", - "freebayes", - "freebayes/01.vcf.gz", - "freebayes/02.vcf.gz", - "get", "gunzip", "gunzip/genome.fna", - "minimap2", - "minimap2/index", - "minimap2/index/genome.mmi", - "multiqc", - "multiqc/multiqc_data", - "multiqc/multiqc_data/fastp-insert-size-plot.txt", - "multiqc/multiqc_data/fastp-seq-content-gc-plot_Read_1_After_filtering.txt", - "multiqc/multiqc_data/fastp-seq-content-gc-plot_Read_1_Before_filtering.txt", - "multiqc/multiqc_data/fastp-seq-content-gc-plot_Read_2_After_filtering.txt", - "multiqc/multiqc_data/fastp-seq-content-gc-plot_Read_2_Before_filtering.txt", - "multiqc/multiqc_data/fastp-seq-content-n-plot_Read_1_After_filtering.txt", - "multiqc/multiqc_data/fastp-seq-content-n-plot_Read_1_Before_filtering.txt", - "multiqc/multiqc_data/fastp-seq-content-n-plot_Read_2_After_filtering.txt", - "multiqc/multiqc_data/fastp-seq-content-n-plot_Read_2_Before_filtering.txt", - "multiqc/multiqc_data/fastp-seq-quality-plot_Read_1_After_filtering.txt", - "multiqc/multiqc_data/fastp-seq-quality-plot_Read_1_Before_filtering.txt", - "multiqc/multiqc_data/fastp-seq-quality-plot_Read_2_After_filtering.txt", - "multiqc/multiqc_data/fastp-seq-quality-plot_Read_2_Before_filtering.txt", - "multiqc/multiqc_data/fastp_filtered_reads_plot.txt", - "multiqc/multiqc_data/fastqc-1-status-check-heatmap.txt", - "multiqc/multiqc_data/fastqc-1_per_base_n_content_plot.txt", - "multiqc/multiqc_data/fastqc-1_per_base_sequence_quality_plot.txt", - "multiqc/multiqc_data/fastqc-1_per_sequence_gc_content_plot_Counts.txt", - "multiqc/multiqc_data/fastqc-1_per_sequence_gc_content_plot_Percentages.txt", - "multiqc/multiqc_data/fastqc-1_per_sequence_quality_scores_plot.txt", - "multiqc/multiqc_data/fastqc-1_sequence_counts_plot.txt", - "multiqc/multiqc_data/fastqc-1_sequence_duplication_levels_plot.txt", - "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", - "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", - "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", - "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", - "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", - "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", - "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", - "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", - "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", - "multiqc/multiqc_data/llms-full.txt", - "multiqc/multiqc_data/multiqc.log", - "multiqc/multiqc_data/multiqc.parquet", - "multiqc/multiqc_data/multiqc_bcftools_stats_bcftools.txt", - "multiqc/multiqc_data/multiqc_citations.txt", - "multiqc/multiqc_data/multiqc_data.json", - "multiqc/multiqc_data/multiqc_fastp.txt", - "multiqc/multiqc_data/multiqc_fastqc.txt", - "multiqc/multiqc_data/multiqc_fastqc_fastqc-1.txt", - "multiqc/multiqc_data/multiqc_general_stats.txt", - "multiqc/multiqc_data/multiqc_samtools_stats_samtools.txt", - "multiqc/multiqc_data/multiqc_software_versions.txt", - "multiqc/multiqc_data/multiqc_sources.txt", - "multiqc/multiqc_data/samtools-stats-dp.txt", - "multiqc/multiqc_data/samtools_alignment_plot.txt", - "multiqc/multiqc_plots", - "multiqc/multiqc_plots/pdf", - "multiqc/multiqc_plots/pdf/fastp-insert-size-plot.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-content-gc-plot_Read_1_After_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-content-gc-plot_Read_1_Before_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-content-gc-plot_Read_2_After_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-content-gc-plot_Read_2_Before_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-content-n-plot_Read_1_After_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-content-n-plot_Read_1_Before_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-content-n-plot_Read_2_After_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-content-n-plot_Read_2_Before_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-quality-plot_Read_1_After_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-quality-plot_Read_1_Before_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-quality-plot_Read_2_After_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp-seq-quality-plot_Read_2_Before_filtering.pdf", - "multiqc/multiqc_plots/pdf/fastp_filtered_reads_plot-cnt.pdf", - "multiqc/multiqc_plots/pdf/fastp_filtered_reads_plot-pct.pdf", - "multiqc/multiqc_plots/pdf/fastqc-1_per_base_n_content_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc-1_per_base_sequence_quality_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc-1_per_sequence_gc_content_plot_Counts.pdf", - "multiqc/multiqc_plots/pdf/fastqc-1_per_sequence_gc_content_plot_Percentages.pdf", - "multiqc/multiqc_plots/pdf/fastqc-1_per_sequence_quality_scores_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc-1_sequence_counts_plot-cnt.pdf", - "multiqc/multiqc_plots/pdf/fastqc-1_sequence_counts_plot-pct.pdf", - "multiqc/multiqc_plots/pdf/fastqc-1_sequence_duplication_levels_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", - "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", - "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", - "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", - "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", - "multiqc/multiqc_plots/pdf/fastqc_sequence_length_distribution_plot.pdf", - "multiqc/multiqc_plots/pdf/samtools-stats-dp.pdf", - "multiqc/multiqc_plots/pdf/samtools_alignment_plot-cnt.pdf", - "multiqc/multiqc_plots/pdf/samtools_alignment_plot-pct.pdf", - "multiqc/multiqc_plots/png", - "multiqc/multiqc_plots/png/fastp-insert-size-plot.png", - "multiqc/multiqc_plots/png/fastp-seq-content-gc-plot_Read_1_After_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-content-gc-plot_Read_1_Before_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-content-gc-plot_Read_2_After_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-content-gc-plot_Read_2_Before_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-content-n-plot_Read_1_After_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-content-n-plot_Read_1_Before_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-content-n-plot_Read_2_After_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-content-n-plot_Read_2_Before_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-quality-plot_Read_1_After_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-quality-plot_Read_1_Before_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-quality-plot_Read_2_After_filtering.png", - "multiqc/multiqc_plots/png/fastp-seq-quality-plot_Read_2_Before_filtering.png", - "multiqc/multiqc_plots/png/fastp_filtered_reads_plot-cnt.png", - "multiqc/multiqc_plots/png/fastp_filtered_reads_plot-pct.png", - "multiqc/multiqc_plots/png/fastqc-1_per_base_n_content_plot.png", - "multiqc/multiqc_plots/png/fastqc-1_per_base_sequence_quality_plot.png", - "multiqc/multiqc_plots/png/fastqc-1_per_sequence_gc_content_plot_Counts.png", - "multiqc/multiqc_plots/png/fastqc-1_per_sequence_gc_content_plot_Percentages.png", - "multiqc/multiqc_plots/png/fastqc-1_per_sequence_quality_scores_plot.png", - "multiqc/multiqc_plots/png/fastqc-1_sequence_counts_plot-cnt.png", - "multiqc/multiqc_plots/png/fastqc-1_sequence_counts_plot-pct.png", - "multiqc/multiqc_plots/png/fastqc-1_sequence_duplication_levels_plot.png", - "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", - "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", - "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", - "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", - "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", - "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", - "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", - "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", - "multiqc/multiqc_plots/png/fastqc_sequence_length_distribution_plot.png", - "multiqc/multiqc_plots/png/samtools-stats-dp.png", - "multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png", - "multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png", - "multiqc/multiqc_plots/svg", - "multiqc/multiqc_plots/svg/fastp-insert-size-plot.svg", - "multiqc/multiqc_plots/svg/fastp-seq-content-gc-plot_Read_1_After_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-content-gc-plot_Read_1_Before_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-content-gc-plot_Read_2_After_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-content-gc-plot_Read_2_Before_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-content-n-plot_Read_1_After_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-content-n-plot_Read_1_Before_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-content-n-plot_Read_2_After_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-content-n-plot_Read_2_Before_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-quality-plot_Read_1_After_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-quality-plot_Read_1_Before_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-quality-plot_Read_2_After_filtering.svg", - "multiqc/multiqc_plots/svg/fastp-seq-quality-plot_Read_2_Before_filtering.svg", - "multiqc/multiqc_plots/svg/fastp_filtered_reads_plot-cnt.svg", - "multiqc/multiqc_plots/svg/fastp_filtered_reads_plot-pct.svg", - "multiqc/multiqc_plots/svg/fastqc-1_per_base_n_content_plot.svg", - "multiqc/multiqc_plots/svg/fastqc-1_per_base_sequence_quality_plot.svg", - "multiqc/multiqc_plots/svg/fastqc-1_per_sequence_gc_content_plot_Counts.svg", - "multiqc/multiqc_plots/svg/fastqc-1_per_sequence_gc_content_plot_Percentages.svg", - "multiqc/multiqc_plots/svg/fastqc-1_per_sequence_quality_scores_plot.svg", - "multiqc/multiqc_plots/svg/fastqc-1_sequence_counts_plot-cnt.svg", - "multiqc/multiqc_plots/svg/fastqc-1_sequence_counts_plot-pct.svg", - "multiqc/multiqc_plots/svg/fastqc-1_sequence_duplication_levels_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", - "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", - "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", - "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", - "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", - "multiqc/multiqc_plots/svg/fastqc_sequence_length_distribution_plot.svg", - "multiqc/multiqc_plots/svg/samtools-stats-dp.svg", - "multiqc/multiqc_plots/svg/samtools_alignment_plot-cnt.svg", - "multiqc/multiqc_plots/svg/samtools_alignment_plot-pct.svg", - "multiqc/multiqc_report.html", "pipeline_info", - "pipeline_info/nf_core_bactmap_software_mqc_versions.yml", - "pseudogenomes", - "pseudogenomes/01.fa", - "pseudogenomes/02.fa", - "pseudogenomes/aligned_pseudogenomes.fas", - "rasusa", - "rasusa/01.subsampled_1.fastq.gz", - "rasusa/01.subsampled_2.fastq.gz", - "rasusa/02.subsampled_1.fastq.gz", - "rasusa/02.subsampled_2.fastq.gz", - "read_stats", - "read_stats/01_test_1.read_stats.csv", - "read_stats/02_test_2.read_stats.csv", - "samtools", - "samtools/faidx", - "samtools/faidx/genome.fna.fai", - "samtools/sort", - "samtools/sort/01.sorted.bam", - "samtools/sort/01.sorted.bam.bai", - "samtools/sort/02.sorted.bam", - "samtools/sort/02.sorted.bam.bai", - "samtools/stats", - "samtools/stats/01.sorted.flagstat", - "samtools/stats/01.sorted.idxstats", - "samtools/stats/01.sorted.stats", - "samtools/stats/02.sorted.flagstat", - "samtools/stats/02.sorted.idxstats", - "samtools/stats/02.sorted.stats", - "seqtk", - "seqtk/01.seqtk_stats.tsv", - "seqtk/02.seqtk_stats.tsv", - "summaries", - "summaries/mapping_summary.tsv", - "summaries/processed_fastq-scan_summary.tsv", - "summaries/raw_fastq-scan_summary.tsv", - "summaries/read_stats_summary.tsv" + "pipeline_info/nf_core_bactmap_software_mqc_versions.yml" ], [ - "01.fa:md5,17e6433115d1ad1b4ffdf384d783dc29", - "02.fa:md5,9048642262df13a6fc427b2d971b7546", - "01.filtered.vcf.gz:md5,c88bdfab2ce3be45e0e6a7af63d3ebc9", - "01.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "02.filtered.vcf.gz:md5,d1d38c6df971afedde985fa871892d84", - "02.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "01.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "02.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "01.sorted.vcf.gz:md5,60d8b9c025605a5c9c57ef2a0a28ac85", - "01.sorted.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "02.sorted.vcf.gz:md5,4ef2aa7bf7f0720e9e3bc35c8977e18c", - "02.sorted.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "01.bcftools_stats.txt:md5,defae651d5565681d95172331c428d9d", - "02.bcftools_stats.txt:md5,64ce5bc394014836c039d2f98503ee8e", - "01.bed:md5,3610ca49fad02e567afc984e5ae0cce8", - "02.bed:md5,37284f438898485550db0a584251e69f", - "01.subtracted.bed:md5,3610ca49fad02e567afc984e5ae0cce8", - "02.subtracted.bed:md5,37284f438898485550db0a584251e69f", - "01.bowtie2.log:md5,81a5da4710835dc42e60430a92ad36e5", - "02.bowtie2.log:md5,c352791c3bf8ae5ecc37ee8618716f68", "genome.fna.1.bt2:md5,829b755b64d0ca0edfeacffdebef1c0b", "genome.fna.2.bt2:md5,4845f032a953c5a4da5cdf49723eebd2", "genome.fna.3.bt2:md5,6d1095f738d00d1bde2dc4f954b33179", @@ -415,110 +37,14 @@ "genome.fna.rev.1.bt2:md5,a1cc6383eb8d90710502a540f87bfa13", "genome.fna.rev.2.bt2:md5,871b69582268b9404cb1884a401cdc39", "versions.yml:md5,f986bc29ed66b12ac01d6a64a13c3227", - "01_test_1.fastp.html:md5,a37d818950547053a0a72e1a125f24ec", - "01_test_1.fastp.json:md5,3344250923cc58a7bb7f840a76051dd0", - "01_test_1.fastp.log:md5,6d6d688a242b5e5d297a4551984e2fe6", - "02_test_2.fastp.html:md5,fb9867a86b0bd68f2acda0d0690b028d", - "02_test_2.fastp.json:md5,a499231c7f816760797450f27df719e5", - "02_test_2.fastp.log:md5,93481c8b4b3eb7e673718d98e166f53a", - "01_test_1_processed_1_fastqc.html:md5,2ca35eb9e08eea70918edb79b43d6a41", - "01_test_1_processed_1_fastqc.zip:md5,5d6d394e70d89b918554455da5d0f942", - "01_test_1_processed_2_fastqc.html:md5,8d644d03687511ed06a31244f36a40c1", - "01_test_1_processed_2_fastqc.zip:md5,e0578de918da35336a5f84c5118b9fb9", - "02_test_2_processed_1_fastqc.html:md5,d2233aad19207c507f481681ad926d57", - "02_test_2_processed_1_fastqc.zip:md5,c4ef3dea3d371d9a3feac63931feeb71", - "02_test_2_processed_2_fastqc.html:md5,89be54e5f088450d0e8f16101589931e", - "02_test_2_processed_2_fastqc.zip:md5,9c7db4c4d78a3dab48095217070ff585", - "01_test_1_raw_1_fastqc.html:md5,b89b8de8f6dec78932b37314c320d0f3", - "01_test_1_raw_1_fastqc.zip:md5,380a42d052ef9ba5029a43bf6c981b3a", - "01_test_1_raw_2_fastqc.html:md5,8d6a242614af2ba9d62d8a56969bf261", - "01_test_1_raw_2_fastqc.zip:md5,eef31590eb5904a048af6c02932a1723", - "02_test_2_raw_1_fastqc.html:md5,b78725323250884de12582882a6c8409", - "02_test_2_raw_1_fastqc.zip:md5,d3d8ea3725599ad1061c2c2782fff9b3", - "02_test_2_raw_2_fastqc.html:md5,0017a0e0ffbbab349a721555548d5e8a", - "02_test_2_raw_2_fastqc.zip:md5,3a1cc5c692d328fe68d043d54eefdbe8", - "01_test_1.processed.json:md5,125efed1942221fbf536885fbf475e66", - "02_test_2.processed.json:md5,78fbdb421671f255b1c0e12cfe0653a4", - "01_test_1.raw.json:md5,39066d3164d2dbdc7a198468cacaf838", "02_test_2.raw.json:md5,3cb79d84ea9de94940e4d1799c0e1c2b", - "01.vcf.gz:md5,99151019e740881f6dc260fd6684346b", - "02.vcf.gz:md5,881dd02b25859968d66acca7e0cefd8a", - "genome.fna:md5,dafd38f5454b54fbea38245d773062a5", - "genome.mmi:md5,76c23f17ce1cade4a054bf2763b081db", - "fastp-insert-size-plot.txt:md5,162036bf69d2dc7386b43f2bdadac877", - "fastp-seq-content-gc-plot_Read_1_After_filtering.txt:md5,4edee862ece4eecb5045589a36786591", - "fastp-seq-content-gc-plot_Read_1_Before_filtering.txt:md5,e1ed0f20f9ee5f6e08a7e4deb49ceb35", - "fastp-seq-content-gc-plot_Read_2_After_filtering.txt:md5,e96f6d5adfea94d5a3c1c1f69b9447fc", - "fastp-seq-content-gc-plot_Read_2_Before_filtering.txt:md5,90b5d0855fa34315556fe0cbbb5b4ff3", - "fastp-seq-content-n-plot_Read_1_After_filtering.txt:md5,9b2e257b68d6fcc7db96f0d8630dd1b7", - "fastp-seq-content-n-plot_Read_1_Before_filtering.txt:md5,9b2e257b68d6fcc7db96f0d8630dd1b7", - "fastp-seq-content-n-plot_Read_2_After_filtering.txt:md5,9b2e257b68d6fcc7db96f0d8630dd1b7", - "fastp-seq-content-n-plot_Read_2_Before_filtering.txt:md5,353cfe0f9e9a15e5eb33e842755d9d4e", - "fastp-seq-quality-plot_Read_1_After_filtering.txt:md5,4634d3dc04a6c471c3431947d300fef4", - "fastp-seq-quality-plot_Read_1_Before_filtering.txt:md5,9dad9391b6b77bd6f4bf117e13370e8a", - "fastp-seq-quality-plot_Read_2_After_filtering.txt:md5,1716923bf26234eea1e5eff9be484423", - "fastp-seq-quality-plot_Read_2_Before_filtering.txt:md5,01f6e617cc8ed0d81678dff0fe09fe78", - "fastp_filtered_reads_plot.txt:md5,b0bb82fc4a23564c834ef8c4f4706faf", - "fastqc-1-status-check-heatmap.txt:md5,2958bbda783b97cef0b64530cbdbb01d", - "fastqc-1_per_base_n_content_plot.txt:md5,ab8e8d876edde1e457b3153888c88107", - "fastqc-1_per_base_sequence_quality_plot.txt:md5,ebfcb629f7713a7de62f8cc714227258", - "fastqc-1_per_sequence_gc_content_plot_Counts.txt:md5,64b4384f9eef2f7c6256b3df0d68d56a", - "fastqc-1_per_sequence_gc_content_plot_Percentages.txt:md5,d2a0fc017d5ba88e777c855bf89732b9", - "fastqc-1_per_sequence_quality_scores_plot.txt:md5,c2bc0602f70325f7fb82678c235ad3be", - "fastqc-1_sequence_counts_plot.txt:md5,8f0b661870c70fa37b74c81d61be0ad5", - "fastqc-1_sequence_duplication_levels_plot.txt:md5,aa27aa03b7e4eeb2a22b8b7ac24194fe", - "fastqc-status-check-heatmap.txt:md5,7d06360e828f3e153a0b21051d23911b", - "fastqc_per_base_n_content_plot.txt:md5,ea371a265a80840751645c2476c98754", - "fastqc_per_base_sequence_quality_plot.txt:md5,6362bc88473fc3c3e6d69a650fce6b3b", - "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,c8285b24c862d046d1dd1e5f8c4f1419", - "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,d78f38d530511e784a915a1a1e587e72", - "fastqc_per_sequence_quality_scores_plot.txt:md5,3e61d4e1bc67d2cf85c00d020f6a32a8", - "fastqc_sequence_counts_plot.txt:md5,d1c81af14b6675c3f9f04125c1ecb484", - "fastqc_sequence_duplication_levels_plot.txt:md5,e32366bc23f5fb89aa60ef7b0f29de03", - "fastqc_sequence_length_distribution_plot.txt:md5,e7bcd66dce7ca3b41a70e518608c4586", - "llms-full.txt:md5,03bf7eac9ff5bba648e4e584ab3b198a", - "multiqc.parquet:md5,632d8fc3bc249038cbd097bb6dc3b637", - "multiqc_bcftools_stats_bcftools.txt:md5,c3ed02e08a492df1f0f889fcd03e331d", - "multiqc_citations.txt:md5,57db2426be011862828d18f767d25b57", - "multiqc_fastp.txt:md5,d646c6b7ae38839c05130fb0b41359e6", - "multiqc_fastqc.txt:md5,1dbca9f02b1b75f5df2ac02c81d78411", - "multiqc_fastqc_fastqc-1.txt:md5,e49ae5a350035d161d70d5fc97a0b2d6", - "multiqc_general_stats.txt:md5,123a961824ccf20f0258292694a3425d", - "multiqc_samtools_stats_samtools.txt:md5,bc33622a9e4c162e1cb0ff5cabede2a6", - "samtools-stats-dp.txt:md5,4b8fe2e0db527dc98fc21d27f2df0e11", - "samtools_alignment_plot.txt:md5,164ec8a3eceb8d56809f7970f1d0290b", - "01.fa:md5,ec73cef39989caf8e39d94271a64612c", - "02.fa:md5,5a1b47e59b09692f7ea9d35da64c0558", - "aligned_pseudogenomes.fas:md5,335eef26460547a611e0f65e547c9432", - "01.subsampled_1.fastq.gz:md5,67f961708debdc99dd25b6e45199bd5e", - "01.subsampled_2.fastq.gz:md5,7d173d53ad835ed689ab7a5c5ac3d89b", - "02.subsampled_1.fastq.gz:md5,c3a57b07c737ea41807a08e4d72d5100", - "02.subsampled_2.fastq.gz:md5,900f282a3822240130b80b0ffd915652", - "01_test_1.read_stats.csv:md5,ff40aaa6720a766448a3b8bde72f530f", - "02_test_2.read_stats.csv:md5,c0186b0b0464a58d780334ebb63cc70a", - "genome.fna.fai:md5,aa44b24652a42e538478dea3492480dd", - "01.sorted.bam:md5,0d0a6e5a988197b107d6727a44ce2ced", - "01.sorted.bam.bai:md5,d57d3efec086eada423f3cbaf7ab8638", - "02.sorted.bam:md5,10ab7cd638de4a381da05be92742daac", - "02.sorted.bam.bai:md5,40d3309085ab80106f2f0c67b5dab19d", - "01.sorted.flagstat:md5,4f152687b9140a16a48856b0bb216289", - "01.sorted.idxstats:md5,aa16d5da39ddbdc94dbeb52ed994c515", - "01.sorted.stats:md5,fcd22c10723786252888ec9c5f47a14a", - "02.sorted.flagstat:md5,23ce0492dce1ce77e1350aa1632b1da9", - "02.sorted.idxstats:md5,0670671323b7d1f14f15625c3c179b9f", - "02.sorted.stats:md5,76b87ccd13bd5d913deb3070063f92a7", - "01.seqtk_stats.tsv:md5,589ff7dc5f0eec7f60c5a940b2500298", - "02.seqtk_stats.tsv:md5,bd6fe576e5972d925ff4ec45fed17eee", - "mapping_summary.tsv:md5,6107518dec4d9802ba35775df42f1e46", - "processed_fastq-scan_summary.tsv:md5,2aa64d4dff6aa9f062872634a2d5c08b", - "raw_fastq-scan_summary.tsv:md5,d175a5a6fde88f7275b7833eff01e454", - "read_stats_summary.tsv:md5,e24c3bce8a36a7ca8924ed05e45b0ae8" + "genome.fna:md5,dafd38f5454b54fbea38245d773062a5" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-11-26T14:37:38.561842" + "timestamp": "2026-01-16T16:58:28.749323" } } \ No newline at end of file diff --git a/workflows/bactmap.nf b/workflows/bactmap.nf index 57c527e..3d3f032 100644 --- a/workflows/bactmap.nf +++ b/workflows/bactmap.nf @@ -88,8 +88,8 @@ workflow BACTMAP { main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // Validate input files and create separate channels for FASTQ, FASTA, and Nanopore data ch_input = samplesheet @@ -138,7 +138,7 @@ workflow BACTMAP { [ [ id:'no_fai' ],[] ], true ) - ch_versions = ch_versions.mix( SAMTOOLS_FAIDX.out.versions ) + ch_versions = ch_versions.mix( SAMTOOLS_FAIDX.out.versions_samtools ) /* MODULE: Get genome size @@ -176,7 +176,7 @@ workflow BACTMAP { ch_versions = ch_versions.mix( FALCO.out.versions ) } else { FASTQC ( ch_input_for_fastqc ) - ch_versions = ch_versions.mix( FASTQC.out.versions ) + ch_versions = ch_versions.mix( FASTQC.out.versions_fastqc ) } } @@ -274,7 +274,7 @@ workflow BACTMAP { [ meta, [ reads ].flatten() ] } - ch_versions = ch_versions.mix(MERGE_RUNS.out.versions) + ch_versions = ch_versions.mix(MERGE_RUNS.out.versions_cat) } else { ch_reads_runmerged = ch_shortreads_preprocessed @@ -366,7 +366,25 @@ workflow BACTMAP { /* Collate and save software versions */ - softwareVersionsToYAML(ch_versions) + def topic_versions = channel.topic("versions") + .distinct() + .branch { entry -> + versions_file: entry instanceof Path + versions_tuple: true + } + + def topic_versions_string = topic_versions.versions_tuple + .map { process, tool, version -> + [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] + } + .groupTuple(by:0) + .map { process, tool_versions -> + tool_versions.unique().sort() + "${process}:\n${tool_versions.join('\n')}" + } + + softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + .mix(topic_versions_string) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_' + 'bactmap_software_' + 'mqc_' + 'versions.yml', From 4df7be663512300759aa2a01676452c06ecb2931 Mon Sep 17 00:00:00 2001 From: Andries van Tonder Date: Thu, 22 Jan 2026 11:27:03 +0000 Subject: [PATCH 5/9] pipeline fixes --- .github/workflows/nf-test.yml | 2 +- assets/multiqc_config.yml | 4 + conf/modules.config | 314 +++++------ modules.json | 37 +- modules/nf-core/bcftools/filter/main.nf | 75 +-- modules/nf-core/bcftools/filter/meta.yml | 26 +- .../bcftools/filter/tests/main.nf.test | 17 +- .../bcftools/filter/tests/main.nf.test.snap | 194 ++++--- modules/nf-core/bcftools/index/main.nf | 35 +- modules/nf-core/bcftools/index/meta.yml | 26 +- .../nf-core/bcftools/index/tests/main.nf.test | 9 +- .../bcftools/index/tests/main.nf.test.snap | 76 ++- modules/nf-core/bcftools/norm/main.nf | 63 ++- modules/nf-core/bcftools/norm/meta.yml | 26 +- .../nf-core/bcftools/norm/tests/main.nf.test | 20 +- .../bcftools/norm/tests/main.nf.test.snap | 298 +++++++---- modules/nf-core/bcftools/query/main.nf | 32 +- modules/nf-core/bcftools/query/meta.yml | 26 +- .../nf-core/bcftools/query/tests/main.nf.test | 10 +- .../bcftools/query/tests/main.nf.test.snap | 54 +- modules/nf-core/bcftools/sort/main.nf | 69 +-- modules/nf-core/bcftools/sort/meta.yml | 26 +- .../nf-core/bcftools/sort/tests/main.nf.test | 14 +- .../bcftools/sort/tests/main.nf.test.snap | 154 ++++-- modules/nf-core/bcftools/stats/main.nf | 40 +- modules/nf-core/bcftools/stats/meta.yml | 26 +- .../nf-core/bcftools/stats/tests/main.nf.test | 17 +- .../bcftools/stats/tests/main.nf.test.snap | 110 ++-- modules/nf-core/bcftools/view/main.nf | 77 +-- modules/nf-core/bcftools/view/meta.yml | 26 +- .../nf-core/bcftools/view/tests/main.nf.test | 22 +- .../bcftools/view/tests/main.nf.test.snap | 168 ++++-- modules/nf-core/bedtools/subtract/main.nf | 32 +- modules/nf-core/bedtools/subtract/meta.yml | 26 +- .../bedtools/subtract/tests/main.nf.test.snap | 20 +- modules/nf-core/cat/fastq/main.nf | 4 +- modules/nf-core/gunzip/main.nf | 12 +- modules/nf-core/gunzip/meta.yml | 28 +- .../nf-core/gunzip/tests/main.nf.test.snap | 80 ++- modules/nf-core/gunzip/tests/tags.yml | 2 - modules/nf-core/samtools/stats/main.nf | 4 +- nextflow_schema.json | 12 +- .../main.nf | 4 +- subworkflows/local/consensus_bcftools/main.nf | 4 +- .../local/fastq_align_bwamem2/main.nf | 2 +- .../local/longread_adapterremoval/main.nf | 38 +- subworkflows/local/longread_filtering/main.nf | 32 +- subworkflows/local/longread_mapping/main.nf | 5 - subworkflows/local/longread_mapping/meta.yml | 3 +- .../local/longread_preprocessing/main.nf | 65 ++- .../local/longread_preprocessing/meta.yml | 1 + subworkflows/local/minimap2_alignment/main.nf | 2 +- .../local/shortread_adapterremoval/main.nf | 8 +- subworkflows/local/shortread_fastp/main.nf | 10 +- subworkflows/local/shortread_mapping/main.nf | 7 +- .../local/shortread_preprocessing/main.nf | 5 +- .../local/shortread_preprocessing/meta.yml | 1 + .../utils_nfcore_bactmap_pipeline/main.nf | 4 +- .../nf-core/bam_sort_stats_samtools/main.nf | 3 +- .../tests/main.nf.test.snap | 84 ++- .../bam_sort_stats_samtools/tests/tags.yml | 2 - .../nf-core/bam_stats_samtools/main.nf | 2 +- .../nf-core/utils_nfschema_plugin/main.nf | 2 +- tests/default.nf.test.snap | 491 +++++++++++++++++- workflows/bactmap.nf | 74 +-- 65 files changed, 2054 insertions(+), 1108 deletions(-) delete mode 100644 modules/nf-core/gunzip/tests/tags.yml delete mode 100644 subworkflows/nf-core/bam_sort_stats_samtools/tests/tags.yml diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index afcd1fd..f1cbbb0 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -81,7 +81,7 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.10.5" + - "25.10.0" - "latest-everything" env: NXF_ANSI_LOG: false diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 622e184..fade6e7 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -35,6 +35,10 @@ report_section_order: bcftools: order: 100 +custom_logo: "nf-core-bactmap_logo_light.png" +custom_logo_url: https://nf-co.re/bactmap +custom_logo_title: "nf-core/bactmap" + # List of run modules run_modules: - fastqc diff --git a/conf/modules.config b/conf/modules.config index ae65e1e..2bcf097 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -15,70 +15,70 @@ process { publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] - withName: 'BWAMEM2_INDEX' { + withName: BWAMEM2_INDEX { publishDir = [ path: { "${params.outdir}/bwamem2/index" }, mode: params.publish_dir_mode, ] } - withName: 'BOWTIE2_BUILD' { + withName: BOWTIE2_BUILD { publishDir = [ path: { "${params.outdir}/bowtie2/build" }, mode: params.publish_dir_mode, ] } - withName: 'SAMTOOLS_FAIDX' { + withName: SAMTOOLS_FAIDX { publishDir = [ path: { "${params.outdir}/samtools/faidx" }, mode: params.publish_dir_mode, - pattern: '*.{fai,gzi}' + pattern: '*.{fai,gzi}', ] } - withName: 'FASTQSCAN_RAW' { + withName: FASTQSCAN_RAW { ext.prefix = { "${meta.id}_${meta.run_accession}.raw" } publishDir = [ path: { "${params.outdir}/fastqscan/raw" }, mode: params.publish_dir_mode, - pattern: '*.json' + pattern: '*.json', ] } - withName: 'FASTQSCANPARSE_RAW' { + withName: FASTQSCANPARSE_RAW { ext.prefix = { "raw" } publishDir = [ path: { "${params.outdir}/summaries" }, mode: params.publish_dir_mode, - pattern: '*.tsv' + pattern: '*.tsv', ] } - withName: 'FASTQC' { - ext.args = '--quiet' + withName: FASTQC { + ext.args = '--quiet' ext.prefix = { "${meta.id}_${meta.run_accession}_raw" } publishDir = [ path: { "${params.outdir}/fastqc/raw" }, mode: params.publish_dir_mode, - pattern: '*.{html,zip}' + pattern: '*.{html,zip}', ] } - withName: 'FASTQC_PROCESSED' { - ext.args = '--quiet' + withName: FASTQC_PROCESSED { + ext.args = '--quiet' ext.prefix = { "${meta.id}_${meta.run_accession}_processed" } publishDir = [ path: { "${params.outdir}/fastqc/processed" }, mode: params.publish_dir_mode, - pattern: '*.{html,zip}' + pattern: '*.{html,zip}', ] } - withName: 'FALCO' { + withName: FALCO { ext.prefix = { "${meta.id}_${meta.run_accession}_raw_falco" } publishDir = [ path: { "${params.outdir}/falco/raw" }, @@ -87,7 +87,7 @@ process { ] } - withName: 'FALCO_PROCESSED' { + withName: FALCO_PROCESSED { ext.prefix = { "${meta.id}_${meta.run_accession}_processed_falco" } publishDir = [ path: { "${params.outdir}/falco/processed" }, @@ -96,14 +96,12 @@ process { ] } - withName: 'FASTP_SINGLE' { + withName: FASTP_SINGLE { ext.args = [ - // trimming options params.shortread_qc_skipadaptertrim ? "--disable_adapter_trimming" : "", params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter1 ? "--adapter_sequence ${params.shortread_qc_adapter1}" : "", - // filtering options "--length_required ${params.shortread_qc_minlength}", - "--cut_front --cut_tail --trim_poly_x --cut_mean_quality 30 --qualified_quality_phred 30 --unqualified_percent_limit 10" + "--cut_front --cut_tail --trim_poly_x --cut_mean_quality 30 --qualified_quality_phred 30 --unqualified_percent_limit 10", ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}" } publishDir = [ @@ -111,35 +109,31 @@ process { path: { "${params.outdir}/fastp" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/fastp" }, mode: params.publish_dir_mode, - pattern: '*.{log,html,json}' + pattern: '*.{log,html,json}', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', enabled: params.save_analysis_ready_fastqs, - // Don't know why `!` doesn't work here, but `== false` makes it work... - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'FASTP_PAIRED' { + withName: FASTP_PAIRED { ext.args = [ - // collapsing options - option to retain singletons params.shortread_qc_includeunmerged ? '--include_unmerged' : '', - // trimming options params.shortread_qc_skipadaptertrim ? "--disable_adapter_trimming" : "", params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter1 ? "--adapter_sequence ${params.shortread_qc_adapter1}" : "", params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter2 ? "--adapter_sequence_r2 ${params.shortread_qc_adapter2}" : "--detect_adapter_for_pe", - // filtering options "--length_required ${params.shortread_qc_minlength}", - "--cut_front --cut_tail --trim_poly_x --cut_mean_quality 30 --qualified_quality_phred 30 --unqualified_percent_limit 10" + "--cut_front --cut_tail --trim_poly_x --cut_mean_quality 30 --qualified_quality_phred 30 --unqualified_percent_limit 10", ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}" } publishDir = [ @@ -147,29 +141,27 @@ process { path: { "${params.outdir}/fastp" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/fastp" }, mode: params.publish_dir_mode, - pattern: '*.{log,html,json}' + pattern: '*.{log,html,json}', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: params.shortread_qc_mergepairs ? '*merged.fastq.gz' : '*.fastp.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'ADAPTERREMOVAL_SINGLE' { + withName: ADAPTERREMOVAL_SINGLE { ext.args = [ - // trimming options params.shortread_qc_skipadaptertrim ? "--adapter1 ''" : params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter1 ? "--adapter1 ${params.shortread_qc_adapter1}" : "", - // filtering options - "--minlength ${params.shortread_qc_minlength}" + "--minlength ${params.shortread_qc_minlength}", ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}" } publishDir = [ @@ -177,32 +169,29 @@ process { path: { "${params.outdir}/adapterremoval" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/adapterremoval" }, mode: params.publish_dir_mode, - pattern: '*.settings' + pattern: '*.settings', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*truncated.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'ADAPTERREMOVAL_PAIRED' { + withName: ADAPTERREMOVAL_PAIRED { ext.args = [ - // collapsing options params.shortread_qc_mergepairs ? "--collapse" : "", - // trimming options - params.shortread_qc_skipadaptertrim ? "--adapter1 ''" : params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter1 ? "--adapter1 ${params.shortread_qc_adapter1}" : "", // adding adapter list happens at module input channel level + params.shortread_qc_skipadaptertrim ? "--adapter1 ''" : params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter1 ? "--adapter1 ${params.shortread_qc_adapter1}" : "", params.shortread_qc_skipadaptertrim ? "--adapter2 ''" : params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter2 ? "--adapter2 ${params.shortread_qc_adapter2}" : "", - // filtering options - "--minlength ${params.shortread_qc_minlength}" + "--minlength ${params.shortread_qc_minlength}", ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}" } publishDir = [ @@ -210,456 +199,473 @@ process { path: { "${params.outdir}/adapterremoval" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/adapterremoval" }, mode: params.publish_dir_mode, - pattern: '*.settings' + pattern: '*.settings', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*{truncated.fastq,singleton.truncated}.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && !params.shortread_qc_mergepairs && params.save_analysis_ready_fastqs ? it : null} + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && !params.shortread_qc_mergepairs && params.save_analysis_ready_fastqs ? it : null }, + ], + ] + } + + // AdapterRemoval separate output merging + withName: CAT_FASTQ { + ext.prefix = { "${meta.id}_${meta.run_accession}" } + publishDir = [ + [ + path: { "${params.outdir}/analysis_ready_fastqs" }, + mode: params.publish_dir_mode, + pattern: '*.fastq.gz', + enabled: params.save_analysis_ready_fastqs, + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null }, ] ] } - withName: 'PORECHOP_PORECHOP' { + withName: PORECHOP_PORECHOP { ext.prefix = { "${meta.id}_${meta.run_accession}_porechop" } publishDir = [ [ path: { "${params.outdir}/porechop" }, mode: params.publish_dir_mode, pattern: '*_porechop.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/porechop" }, mode: params.publish_dir_mode, - pattern: '*.log' + pattern: '*.log', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*_porechop.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && !params.perform_longread_hostremoval && params.longread_qc_skipqualityfilter && !params.longread_qc_skipadaptertrim && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && !params.perform_longread_hostremoval && params.longread_qc_skipqualityfilter && !params.longread_qc_skipadaptertrim && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'PORECHOP_ABI' { + withName: PORECHOP_ABI { ext.prefix = { "${meta.id}_${meta.run_accession}_porechop_abi" } publishDir = [ [ path: { "${params.outdir}/porechop_abi" }, mode: params.publish_dir_mode, pattern: '*_porechop_abi.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/porechop_abi" }, mode: params.publish_dir_mode, - pattern: '*.log' + pattern: '*.log', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*porechop_abi.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && !params.perform_longread_hostremoval && params.longread_qc_skipqualityfilter && !params.longread_qc_skipadaptertrim && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { (params.perform_runmerging == false || (params.perform_runmerging && !meta.is_multirun)) && !params.perform_longread_hostremoval && params.longread_qc_skipqualityfilter && !params.longread_qc_skipadaptertrim && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'FILTLONG' { - ext.args = [ + withName: FILTLONG { + ext.args = [ "--min_length ${params.longread_qc_qualityfilter_minlength}", "--keep_percent ${params.longread_qc_qualityfilter_keeppercent}", - "--target_bases ${params.longread_qc_qualityfilter_targetbases}" - ] - .join(' ').trim() + "--target_bases ${params.longread_qc_qualityfilter_targetbases}", + ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}_filtered" } publishDir = [ [ path: { "${params.outdir}/filtlong" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/filtlong" }, mode: params.publish_dir_mode, - pattern: '*.log' + pattern: '*.log', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && !params.perform_longread_hostremoval && !params.longread_qc_skipqualityfilter && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { (params.perform_runmerging == false || (params.perform_runmerging && !meta.is_multirun)) && !params.perform_longread_hostremoval && !params.longread_qc_skipqualityfilter && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'NANOQ' { - ext.args = [ + withName: NANOQ { + ext.args = [ "-vv", "--min-len ${params.longread_qc_qualityfilter_minlength}", - "--min-qual ${params.longread_qc_qualityfilter_minquality}" - ] - .join(' ').trim() + "--min-qual ${params.longread_qc_qualityfilter_minquality}", + ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}_filtered" } publishDir = [ [ path: { "${params.outdir}/nanoq" }, mode: params.publish_dir_mode, pattern: '*_filtered.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/nanoq" }, mode: params.publish_dir_mode, - pattern: '*_filtered.stats' + pattern: '*_filtered.stats', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*_filtered.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && !params.perform_longread_hostremoval && !params.longread_qc_skipqualityfilter && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { (params.perform_runmerging == false || (params.perform_runmerging && !meta.is_multirun)) && !params.perform_longread_hostremoval && !params.longread_qc_skipqualityfilter && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'FASTQSCAN_PROCESSED' { + withName: FASTQSCAN_PROCESSED { ext.prefix = { "${meta.id}_${meta.run_accession}.processed" } publishDir = [ path: { "${params.outdir}/fastqscan/processed" }, mode: params.publish_dir_mode, - pattern: '*.json' + pattern: '*.json', ] } - withName: 'FASTQSCANPARSE_PROCESSED' { + withName: FASTQSCANPARSE_PROCESSED { ext.prefix = { "processed" } publishDir = [ path: { "${params.outdir}/summaries" }, mode: params.publish_dir_mode, - pattern: '*.tsv' + pattern: '*.tsv', ] } - withName: 'READ_STATS' { + withName: READ_STATS { ext.prefix = { "${meta.id}_${meta.run_accession}" } publishDir = [ path: { "${params.outdir}/read_stats" }, mode: params.publish_dir_mode, - pattern: '*.csv' + pattern: '*.csv', ] } - withName: 'READSTATS_PARSE' { + withName: READSTATS_PARSE { publishDir = [ path: { "${params.outdir}/summaries" }, mode: params.publish_dir_mode, - pattern: '*.tsv' + pattern: '*.tsv', ] } - // AdapterRemoval separate output merging - withName: 'CAT_FASTQ' { + withName: MERGE_RUNS { ext.prefix = { "${meta.id}" } publishDir = [ [ - path: { "${params.outdir}/run_merging" }, + path: { "${params.outdir}/run_merging/" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + enabled: params.save_runmerged_reads, + ], + [ + path: { "${params.outdir}/analysis_ready_fastqs" }, + mode: params.publish_dir_mode, + pattern: '*.fastq.gz', + enabled: params.perform_runmerging && params.save_analysis_ready_fastqs, + ], ] } - withName: 'RASUSA' { + withName: RASUSA { ext.prefix = { "${meta.id}.subsampled" } ext.args = '--seed 23032021' publishDir = [ path: { "${params.outdir}/rasusa" }, mode: params.publish_dir_mode, - pattern: '*.fastq.gz' + pattern: '*.fastq.gz', ] } - withName: 'BOWTIE2_ALIGN' { + withName: BOWTIE2_ALIGN { ext.args = '' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bowtie2/align" }, mode: params.publish_dir_mode, - pattern: '*.log' + pattern: '*.log', ] } - withName: 'BWAMEM2_MEM' { + withName: BWAMEM2_MEM { ext.args = '' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bwamem2/mem" }, mode: params.publish_dir_mode, - pattern: '*.log' + pattern: '*.log', ] } - withName: 'SAMTOOLS_SORT' { + withName: SAMTOOLS_SORT { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/samtools/sort" }, mode: params.publish_dir_mode, - pattern: '*.{bam,bai}' + pattern: '*.{bam,bai}', ] } - withName: 'SAMTOOLS_INDEX' { + withName: SAMTOOLS_INDEX { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/samtools/sort" }, mode: params.publish_dir_mode, - pattern: '*.bai' + pattern: '*.bai', ] } - withName: 'SAMTOOLS_STATS' { + withName: SAMTOOLS_STATS { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/samtools/stats" }, mode: params.publish_dir_mode, - pattern: '*.stats' + pattern: '*.stats', ] } - withName: 'SAMTOOLS_FLAGSTAT' { + withName: SAMTOOLS_FLAGSTAT { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/samtools/stats" }, mode: params.publish_dir_mode, - pattern: '*.flagstat' + pattern: '*.flagstat', ] } - withName: 'SAMTOOLS_IDXSTATS' { + withName: SAMTOOLS_IDXSTATS { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/samtools/stats" }, mode: params.publish_dir_mode, - pattern: '*.idxstats' + pattern: '*.idxstats', ] } - withName: 'FREEBAYES' { + withName: FREEBAYES { ext.args = '-p 1 -P 0 -C 2 -F 0.05 --min-coverage 10 --min-repeat-entropy 1.0 -q 13 -m 30 --strict-vcf' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/freebayes" }, mode: params.publish_dir_mode, - pattern: '*.vcf.gz' + pattern: '*.vcf.gz', ] } - withName: 'MINIMAP2_INDEX' { + withName: MINIMAP2_INDEX { ext.args = '' publishDir = [ path: { "${params.outdir}/minimap2/index" }, mode: params.publish_dir_mode, - pattern: '*.mmi' + pattern: '*.mmi', ] } - withName: 'MINIMAP2_ALIGN' { + withName: MINIMAP2_ALIGN { ext.args = '--cs --MD -x map-ont' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/minimap2/align" }, mode: params.publish_dir_mode, - pattern: '*.{bam,bai}' + pattern: '*.{bam,bai}', ] } - withName: 'CLAIR3' { + withName: CLAIR3 { ext.args = '--include_all_ctgs --haploid_precise --no_phasing_for_fa --enable_long_indel' publishDir = [ path: { "${params.outdir}/clair3/" }, mode: params.publish_dir_mode, - pattern: '*.vcf.gz' + pattern: '*.vcf.gz', ] } - withName: 'BCFTOOLS_SORT' { + withName: BCFTOOLS_SORT { ext.args = '' ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/bcftools/sort" }, mode: params.publish_dir_mode, - pattern: '*.vcf.gz' + pattern: '*.vcf.gz', ] } - withName: 'BCFTOOLS_INDEX' { + withName: BCFTOOLS_INDEX { ext.args = '--tbi' ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/bcftools/sort" }, mode: params.publish_dir_mode, - pattern: '*.{tbi,csi}' + pattern: '*.{tbi,csi}', ] } + //final Illumina vcf file - withName: 'BCFTOOLS_FILTER' { + withName: BCFTOOLS_FILTER { //ext.args = '--write-index=tbi --output-type z --soft-filter LowQual' ext.args = '--write-index=tbi --output-type z -i "QUAL > 20 && INFO/SAF > 0 && INFO/SAR > 0 && (INFO/SRF > 0 || INFO/SRR > 0) && (INFO/AO / INFO/DP) > 0.9"' ext.prefix = { "${meta.id}.filtered" } publishDir = [ path: { "${params.outdir}/filtered_variants" }, mode: params.publish_dir_mode, - pattern: '*.{vcf.gz,tbi,csi}' + pattern: '*.{vcf.gz,tbi,csi}', ] } - withName: 'BCFTOOLS_VIEW' { + withName: BCFTOOLS_VIEW { ext.args = '-f PASS --write-index=tbi --output-type z' ext.prefix = { "${meta.id}.filtered.pass" } publishDir = [ path: { "${params.outdir}/bcftools/view" }, mode: params.publish_dir_mode, - pattern: '*.vcf.gz' + pattern: '*.vcf.gz', ] } + //final ONT vcf file - withName: 'BCFTOOLS_NORM' { + withName: BCFTOOLS_NORM { ext.args = '--output-type z -m -any --write-index=tbi' ext.prefix = { "${meta.id}.filtered" } publishDir = [ path: { "${params.outdir}/filtered_variants" }, mode: params.publish_dir_mode, - pattern: '*.vcf.gz' + pattern: '*.vcf.gz', ] } - withName: 'BCFTOOLS_STATS' { + withName: BCFTOOLS_STATS { ext.args = '' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bcftools/stats" }, mode: params.publish_dir_mode, - pattern: '*.txt' + pattern: '*.txt', ] } - withName: 'BCFTOOLS_QUERY' { + withName: BCFTOOLS_QUERY { ext.args = "-f'%CHROM\t%POS0\t%END\n'" ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bcftools/query" }, mode: params.publish_dir_mode, - pattern: '*.txt' + pattern: '*.txt', ] } - withName: 'BEDTOOLS_GENOMECOV' { + withName: BEDTOOLS_GENOMECOV { ext.args = '-bga' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bedtools/genomecov" }, mode: params.publish_dir_mode, - pattern: '*.bed' + pattern: '*.bed', ] } - withName: 'BEDTOOLS_SUBTRACT' { + withName: BEDTOOLS_SUBTRACT { ext.args = '' ext.prefix = { "${meta.id}.subtracted" } publishDir = [ path: { "${params.outdir}/bedtools/subtract" }, mode: params.publish_dir_mode, - pattern: '*.bed' + pattern: '*.bed', ] } - withName: 'BCFTOOLS_CONSENSUS' { + withName: BCFTOOLS_CONSENSUS { //ext.args = '-i "FORMAT/VAF > 0.90 & INFO/MQ >= 20 & FORMAT/DP >= 10"' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bcftools/consensus" }, mode: params.publish_dir_mode, - pattern: '*.fa' + pattern: '*.fa', ] } - withName: 'RENAME_FASTA_HEADER' { + withName: RENAME_FASTA_HEADER { ext.args = '' ext.prefix = { "${meta.id}.renamed" } publishDir = [ path: { "${params.outdir}/pseudogenomes/" }, - enabled: false + enabled: false, ] } - withName: 'CONCATENATE_FASTA' { + withName: CONCATENATE_FASTA { ext.args = '' publishDir = [ path: { "${params.outdir}/pseudogenomes/" }, mode: params.publish_dir_mode, - pattern: '*.fa' + pattern: '*.fa', ] } - withName: 'SEQTK_COMP' { + withName: SEQTK_COMP { ext.agrs = '' publishDir = [ path: { "${params.outdir}/seqtk/" }, mode: params.publish_dir_mode, - pattern: '*.tsv' + pattern: '*.tsv', ] } - withName: 'SEQTK_PARSE' { + withName: SEQTK_PARSE { ext.agrs = '' publishDir = [ path: { "${params.outdir}/summaries/" }, mode: params.publish_dir_mode, - pattern: 'mapping_summary.tsv' + pattern: 'mapping_summary.tsv', ] } - withName: 'ALIGNPSEUDOGENOMES' { + withName: ALIGNPSEUDOGENOMES { ext.args = '' publishDir = [ path: { "${params.outdir}/pseudogenomes/" }, mode: params.publish_dir_mode, - pattern: '*.fas' + pattern: '*.fas', ] } - withName: 'SNPSITES' { + withName: SNPSITES { ext.args = '' publishDir = [ path: { "${params.outdir}/snp-sites" }, mode: params.publish_dir_mode, - pattern: '*.{fas,txt}' + pattern: '*.{fas,txt}', ] } - withName: 'MULTIQC' { - ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } + withName: MULTIQC { + ext.args = { params.multiqc_title ? "--title \"${params.multiqc_title}\"" : '' } publishDir = [ path: { "${params.outdir}/multiqc" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] - } } diff --git a/modules.json b/modules.json index 70e3cb1..61b95dc 100644 --- a/modules.json +++ b/modules.json @@ -12,42 +12,42 @@ }, "bcftools/filter": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules"] }, "bcftools/index": { "branch": "master", - "git_sha": "94a767478097e92dca1386ea623d9dae9edc025a", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["bam_variant_calling_sort_freebayes_bcftools"] }, "bcftools/norm": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules"] }, "bcftools/query": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", - "git_sha": "1a2aa4aaf1916cca388cf27c7a6d8238bb5ad68b", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["bam_variant_calling_sort_freebayes_bcftools"] }, "bcftools/stats": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules"] }, "bcftools/view": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules"] }, "bedtools/subtract": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "88d43dad73a675e66bff49ebb57fe657a5909018", "installed_by": ["modules"] }, "bowtie2/align": { @@ -72,7 +72,7 @@ }, "cat/fastq": { "branch": "master", - "git_sha": "f4743b089085121497b7c1c81a28810ce2740dde", + "git_sha": "cf735af4433f2dc8e410f67012dff824ef9990eb", "installed_by": ["modules"] }, "falco": { @@ -107,7 +107,7 @@ }, "gunzip": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "96c57dfd98a0641886a67bd449fe33ee2ec0e374", "installed_by": ["modules"] }, "minimap2/align": { @@ -158,16 +158,16 @@ "samtools/index": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "installed_by": ["bam_sort_stats_samtools", "modules"] }, "samtools/sort": { "branch": "master", "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", - "installed_by": ["modules"] + "installed_by": ["bam_sort_stats_samtools", "modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", + "git_sha": "fe93fde0845f907fc91ad7cc7d797930408824df", "installed_by": ["bam_stats_samtools", "modules"] }, "seqtk/comp": { @@ -184,11 +184,16 @@ }, "subworkflows": { "nf-core": { - "bam_stats_samtools": { + "bam_sort_stats_samtools": { "branch": "master", - "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", + "git_sha": "eed5d14302a6c9070dcc25feeab707a27a4b3254", "installed_by": ["subworkflows"] }, + "bam_stats_samtools": { + "branch": "master", + "git_sha": "eed5d14302a6c9070dcc25feeab707a27a4b3254", + "installed_by": ["bam_sort_stats_samtools", "subworkflows"] + }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", @@ -201,7 +206,7 @@ }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "ff506dcada6fc826ed0c641dc2ed1e98f7345fbe", + "git_sha": "fdc08b8b1ae74f56686ce21f7ea11ad11990ce57", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/bcftools/filter/main.nf b/modules/nf-core/bcftools/filter/main.nf index 920eed3..4b55881 100644 --- a/modules/nf-core/bcftools/filter/main.nf +++ b/modules/nf-core/bcftools/filter/main.nf @@ -1,20 +1,20 @@ process BCFTOOLS_FILTER { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf), path(tbi) output: tuple val(meta), path("*.${extension}"), emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi, optional: true - tuple val(meta), path("*.csi") , emit: csi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -23,51 +23,56 @@ process BCFTOOLS_FILTER { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" + extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" - if ("$vcf" == "${prefix}.${extension}") error "Input and output names are the same, set prefix in module configuration to disambiguate!" + if ("${vcf}" == "${prefix}.${extension}") { + error("Input and output names are the same, set prefix in module configuration to disambiguate!") + } """ bcftools filter \\ --output ${prefix}.${extension} \\ --threads ${task.cpus} \\ - $args \\ - $vcf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${args} \\ + ${vcf} """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : - args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : - args.contains("--write-index") || args.contains("-W") ? "csi" : - "" + extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") + ? "tbi" + : args.contains("--write-index=csi") || args.contains("-W=csi") + ? "csi" + : args.contains("--write-index") || args.contains("-W") + ? "csi" + : "" def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" def create_index = extension.endsWith(".gz") && index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index}" : "" - if ("$vcf" == "${prefix}.${extension}") error "Input and output names are the same, set prefix in module configuration to disambiguate!" + if ("${vcf}" == "${prefix}.${extension}") { + error("Input and output names are the same, set prefix in module configuration to disambiguate!") + } """ ${create_cmd} ${prefix}.${extension} ${create_index} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/filter/meta.yml b/modules/nf-core/bcftools/filter/meta.yml index 8ebad81..4ab447f 100644 --- a/modules/nf-core/bcftools/filter/meta.yml +++ b/modules/nf-core/bcftools/filter/meta.yml @@ -63,13 +63,27 @@ output: description: Default VCF file index pattern: "*.csi" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/bcftools/filter/tests/main.nf.test b/modules/nf-core/bcftools/filter/tests/main.nf.test index 9933835..42cb8ab 100644 --- a/modules/nf-core/bcftools/filter/tests/main.nf.test +++ b/modules/nf-core/bcftools/filter/tests/main.nf.test @@ -31,7 +31,6 @@ nextflow_process { { assert snapshot(process.out).match("vcf") } ) } - } test("sarscov2 - vcf_gz_index") { @@ -57,12 +56,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_csi") { @@ -88,12 +86,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_tbi") { @@ -119,12 +116,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } test("sarscov2 - vcf - bcf output") { @@ -149,7 +145,6 @@ nextflow_process { { assert snapshot(process.out).match("bcf output") } ) } - } test("sarscov2 - vcf.gz, tbi - region filter") { @@ -174,7 +169,6 @@ nextflow_process { { assert snapshot(process.out).match("region filter") } ) } - } test("sarscov2 - vcf - stub") { @@ -200,7 +194,6 @@ nextflow_process { { assert snapshot(process.out).match("vcf - stub") } ) } - } test("sarscov2 - vcf_gz_index - stub") { @@ -227,7 +220,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_csi - stub") { @@ -254,7 +246,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_tbi - stub") { @@ -281,7 +272,5 @@ nextflow_process { { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } - } diff --git a/modules/nf-core/bcftools/filter/tests/main.nf.test.snap b/modules/nf-core/bcftools/filter/tests/main.nf.test.snap index 7f4d423..798dade 100644 --- a/modules/nf-core/bcftools/filter/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/filter/tests/main.nf.test.snap @@ -17,7 +17,11 @@ ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ @@ -33,16 +37,20 @@ "bcf_test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:35.716305" + "timestamp": "2026-01-20T12:02:38.075538496" }, "sarscov2 - vcf_gz_index_tbi - stub": { "content": [ @@ -67,7 +75,11 @@ ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ @@ -88,16 +100,20 @@ "vcf_test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:54.386135" + "timestamp": "2026-01-20T12:03:09.787136694" }, "vcf": { "content": [ @@ -117,7 +133,11 @@ ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ @@ -133,16 +153,20 @@ "vcf_test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:13.726932" + "timestamp": "2026-01-20T12:02:00.400038419" }, "bcf output": { "content": [ @@ -162,7 +186,11 @@ ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ @@ -178,16 +206,20 @@ "bcf_test.bcf.gz:md5,c8a304c8d2892039201154153c8cd536" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:31.219355" + "timestamp": "2026-01-20T12:02:30.237925195" }, "sarscov2 - vcf_gz_index": { "content": [ @@ -210,15 +242,21 @@ [ ], - [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:18.126698" + "timestamp": "2026-01-20T12:02:07.949745874" }, "sarscov2 - vcf_gz_index_csi": { "content": [ @@ -241,15 +279,21 @@ [ ], - [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:22.522678" + "timestamp": "2026-01-20T12:02:15.417109301" }, "vcf - stub": { "content": [ @@ -269,7 +313,11 @@ ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ @@ -285,16 +333,20 @@ "vcf_test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:40.997176" + "timestamp": "2026-01-20T12:02:46.265722559" }, "sarscov2 - vcf_gz_index - stub": { "content": [ @@ -319,7 +371,11 @@ ] ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -340,16 +396,20 @@ "vcf_test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:45.224157" + "timestamp": "2026-01-20T12:02:54.301083152" }, "sarscov2 - vcf_gz_index_csi - stub": { "content": [ @@ -374,7 +434,11 @@ ] ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -395,16 +459,20 @@ "vcf_test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:49.650863" + "timestamp": "2026-01-20T12:03:02.260111336" }, "sarscov2 - vcf_gz_index_tbi": { "content": [ @@ -427,14 +495,20 @@ "vcf_test_vcf.vcf.gz.tbi" ] ], - [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:26.846112" + "timestamp": "2026-01-20T12:02:23.055607519" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/index/main.nf b/modules/nf-core/bcftools/index/main.nf index ad1feb1..8635a1a 100644 --- a/modules/nf-core/bcftools/index/main.nf +++ b/modules/nf-core/bcftools/index/main.nf @@ -1,19 +1,19 @@ process BCFTOOLS_INDEX { - tag "$meta.id" + tag "${meta.id}" label 'process_low' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf) output: - tuple val(meta), path("*.csi"), optional:true, emit: csi - tuple val(meta), path("*.tbi"), optional:true, emit: tbi - path "versions.yml" , emit: versions + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -24,26 +24,17 @@ process BCFTOOLS_INDEX { """ bcftools \\ index \\ - $args \\ - --threads $task.cpus \\ - $vcf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${args} \\ + --threads ${task.cpus} \\ + ${vcf} """ stub: def args = task.ext.args ?: '' - def extension = args.contains("--tbi") || args.contains("-t") ? "tbi" : - "csi" + def extension = args.contains("--tbi") || args.contains("-t") + ? "tbi" + : "csi" """ touch ${vcf}.${extension} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/index/meta.yml b/modules/nf-core/bcftools/index/meta.yml index 74707ac..4e4bdc8 100644 --- a/modules/nf-core/bcftools/index/meta.yml +++ b/modules/nf-core/bcftools/index/meta.yml @@ -55,13 +55,27 @@ output: -t parameter) pattern: "*.tbi" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software version - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@jfy133" maintainers: diff --git a/modules/nf-core/bcftools/index/tests/main.nf.test b/modules/nf-core/bcftools/index/tests/main.nf.test index 24bbf94..b38c6ad 100644 --- a/modules/nf-core/bcftools/index/tests/main.nf.test +++ b/modules/nf-core/bcftools/index/tests/main.nf.test @@ -27,11 +27,10 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions).match() + process.out.findAll { key, val -> key.startsWith("versions") }).match() } ) } - } test("sarscov2 - vcf - tbi") { @@ -54,11 +53,10 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions).match() + process.out.findAll { key, val -> key.startsWith("versions") }).match() } ) } - } test("sarscov2 - vcf - csi - stub") { @@ -82,7 +80,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - vcf - tbi - stub") { @@ -107,7 +104,5 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } - } diff --git a/modules/nf-core/bcftools/index/tests/main.nf.test.snap b/modules/nf-core/bcftools/index/tests/main.nf.test.snap index 30f6f7c..2074e97 100644 --- a/modules/nf-core/bcftools/index/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/index/tests/main.nf.test.snap @@ -14,7 +14,11 @@ ], "2": [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -27,16 +31,20 @@ "tbi": [ ], - "versions": [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" + "versions_bcftools": [ + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:12:33.825153" + "timestamp": "2026-01-20T12:03:32.869223843" }, "sarscov2 - vcf - tbi": { "content": [ @@ -48,15 +56,21 @@ "test.vcf.gz.tbi" ] ], - [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:12:28.804939" + "timestamp": "2026-01-20T12:03:24.708477718" }, "sarscov2 - vcf - tbi - stub": { "content": [ @@ -73,7 +87,11 @@ ] ], "2": [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] ], "csi": [ @@ -86,16 +104,20 @@ "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" + "versions_bcftools": [ + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:12:38.852782" + "timestamp": "2026-01-20T12:03:40.444304193" }, "sarscov2 - vcf - csi": { "content": [ @@ -107,14 +129,20 @@ "test.vcf.gz.csi" ] ], - [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:12:24.498904" + "timestamp": "2026-01-20T12:03:17.363152216" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/norm/main.nf b/modules/nf-core/bcftools/norm/main.nf index f245771..443c8bb 100644 --- a/modules/nf-core/bcftools/norm/main.nf +++ b/modules/nf-core/bcftools/norm/main.nf @@ -1,11 +1,11 @@ process BCFTOOLS_NORM { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf), path(tbi) @@ -13,9 +13,9 @@ process BCFTOOLS_NORM { output: tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi, optional: true - tuple val(meta), path("*.csi") , emit: csi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -23,52 +23,49 @@ process BCFTOOLS_NORM { script: def args = task.ext.args ?: '--output-type z' def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf.gz" - + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf.gz" """ bcftools norm \\ --fasta-ref ${fasta} \\ --output ${prefix}.${extension} \\ - $args \\ - --threads $task.cpus \\ + ${args} \\ + --threads ${task.cpus} \\ ${vcf} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ stub: def args = task.ext.args ?: '--output-type z' def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf.gz" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf.gz" def index = '' if (extension in ['vcf.gz', 'bcf', 'bcf.gz']) { - if (['--write-index=tbi', '-W=tbi'].any { args.contains(it) } && extension == 'vcf.gz') { + if (['--write-index=tbi', '-W=tbi'].any { arg -> args.contains(arg) } && extension == 'vcf.gz') { index = 'tbi' - } else if (['--write-index=tbi', '-W=tbi', '--write-index=csi', '-W=csi', '--write-index', '-W'].any { args.contains(it) }) { + } + else if (['--write-index=tbi', '-W=tbi', '--write-index=csi', '-W=csi', '--write-index', '-W'].any { arg -> args.contains(arg) }) { index = 'csi' } } def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" def create_index = index ? "touch ${prefix}.${extension}.${index}" : "" - """ ${create_cmd} ${prefix}.${extension} ${create_index} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/norm/meta.yml b/modules/nf-core/bcftools/norm/meta.yml index bda9125..9feecac 100644 --- a/modules/nf-core/bcftools/norm/meta.yml +++ b/modules/nf-core/bcftools/norm/meta.yml @@ -78,13 +78,27 @@ output: description: Default VCF file index pattern: "*.csi" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@abhi18av" - "@ramprasadn" diff --git a/modules/nf-core/bcftools/norm/tests/main.nf.test b/modules/nf-core/bcftools/norm/tests/main.nf.test index 9cd5c11..0585175 100644 --- a/modules/nf-core/bcftools/norm/tests/main.nf.test +++ b/modules/nf-core/bcftools/norm/tests/main.nf.test @@ -35,7 +35,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index") { @@ -68,7 +67,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi") { @@ -101,7 +99,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi") { @@ -134,7 +131,6 @@ nextflow_process { { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } test("sarscov2 - [ vcf, tbi ], fasta") { @@ -163,7 +159,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, tbi ], fasta - vcf output") { @@ -192,7 +187,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, tbi ], fasta - vcf_gz output") { @@ -222,11 +216,10 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } - } test("sarscov2 - [ vcf, tbi ], fasta - bcf output") { @@ -255,7 +248,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, tbi ], fasta - bcf_gz output") { @@ -284,7 +276,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, [] ], fasta - stub") { @@ -314,7 +305,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, tbi ], fasta -stub") { @@ -344,7 +334,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, tbi ], fasta - vcf output -stub") { @@ -374,7 +363,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, tbi ], fasta - vcf_gz output - stub") { @@ -403,7 +391,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, tbi ], fasta - bcf output - stub") { @@ -433,7 +420,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, tbi ], fasta - bcf_gz output - stub") { @@ -463,7 +449,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index - stub") { @@ -494,7 +479,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi - stub") { @@ -525,7 +509,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi - stub") { @@ -556,7 +539,6 @@ nextflow_process { { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } diff --git a/modules/nf-core/bcftools/norm/tests/main.nf.test.snap b/modules/nf-core/bcftools/norm/tests/main.nf.test.snap index aca1b5f..ee2dadf 100644 --- a/modules/nf-core/bcftools/norm/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/norm/tests/main.nf.test.snap @@ -17,7 +17,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -33,16 +37,20 @@ "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:46.221551" + "timestamp": "2026-01-20T12:09:29.987030961" }, "sarscov2 - [ vcf, [] ], fasta - stub": { "content": [ @@ -62,7 +70,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -78,16 +90,20 @@ "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:30.84993" + "timestamp": "2026-01-20T12:09:06.488086505" }, "sarscov2 - [ vcf, tbi ], fasta - vcf output": { "content": [ @@ -107,7 +123,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -123,16 +143,20 @@ "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:11.25102" + "timestamp": "2026-01-20T12:08:34.863776359" }, "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index - stub": { "content": [ @@ -157,7 +181,11 @@ ] ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -178,16 +206,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:28:00.817863" + "timestamp": "2026-01-20T12:09:54.718705045" }, "sarscov2 - [ vcf, tbi ], fasta - vcf_gz output": { "content": [ @@ -205,15 +237,21 @@ [ ], - [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:15.720417" + "timestamp": "2026-01-20T12:08:43.007377633" }, "sarscov2 - [ vcf, [] ], fasta": { "content": [ @@ -233,7 +271,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -249,16 +291,20 @@ "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:26:45.743173" + "timestamp": "2026-01-20T12:07:54.877084219" }, "sarscov2 - [ vcf, tbi ], fasta - vcf output -stub": { "content": [ @@ -278,7 +324,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -294,16 +344,20 @@ "test_norm.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:41.556719" + "timestamp": "2026-01-20T12:09:22.220435939" }, "sarscov2 - [ vcf, tbi ], fasta - bcf_gz output": { "content": [ @@ -323,7 +377,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -339,16 +397,20 @@ "test_norm.bcf:md5,bf88706ef69c44ca9e287bc953ba3593" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:25.351662" + "timestamp": "2026-01-20T12:08:58.483532889" }, "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi - stub": { "content": [ @@ -373,7 +435,11 @@ ] ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -394,16 +460,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:28:05.288206" + "timestamp": "2026-01-20T12:10:03.22576704" }, "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi": { "content": [ @@ -443,7 +513,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -459,16 +533,20 @@ "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:06.16527" + "timestamp": "2026-01-20T12:08:27.281315407" }, "sarscov2 - [ vcf, tbi ], fasta -stub": { "content": [ @@ -488,7 +566,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -504,16 +586,20 @@ "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:36.335307" + "timestamp": "2026-01-20T12:09:14.249715835" }, "sarscov2 - [ vcf, tbi ], fasta - bcf_gz output - stub": { "content": [ @@ -533,7 +619,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -549,16 +639,20 @@ "test_norm.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:56.393941" + "timestamp": "2026-01-20T12:09:46.665932019" }, "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index": { "content": [ @@ -603,7 +697,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -619,16 +717,20 @@ "test_norm.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:51.326069" + "timestamp": "2026-01-20T12:09:38.144449162" }, "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi - stub": { "content": [ @@ -653,7 +755,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -674,16 +780,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:28:09.716294" + "timestamp": "2026-01-20T12:10:10.602984345" }, "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi": { "content": [ @@ -728,7 +838,11 @@ ], "3": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ], "csi": [ @@ -744,15 +858,19 @@ "test_norm.bcf.gz:md5,638c3c25bdd495c90ecbccb69ee77f07" ] ], - "versions": [ - "versions.yml:md5,09ff9f1797a7ffccc1ddc986b650daf0" + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:27:20.370229" + "timestamp": "2026-01-20T12:08:51.053195842" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/query/main.nf b/modules/nf-core/bcftools/query/main.nf index 91e0880..726360f 100644 --- a/modules/nf-core/bcftools/query/main.nf +++ b/modules/nf-core/bcftools/query/main.nf @@ -1,11 +1,11 @@ process BCFTOOLS_QUERY { - tag "$meta.id" + tag "${meta.id}" label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf), path(tbi) @@ -15,7 +15,7 @@ process BCFTOOLS_QUERY { output: tuple val(meta), path("*.${suffix}"), emit: output - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -26,20 +26,15 @@ process BCFTOOLS_QUERY { suffix = task.ext.suffix ?: "txt" def regions_file = regions ? "--regions-file ${regions}" : "" def targets_file = targets ? "--targets-file ${targets}" : "" - def samples_file = samples ? "--samples-file ${samples}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" """ bcftools query \\ - $regions_file \\ - $targets_file \\ - $samples_file \\ - $args \\ - $vcf \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + ${args} \\ + ${vcf} \\ > ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ stub: @@ -47,10 +42,5 @@ process BCFTOOLS_QUERY { suffix = task.ext.suffix ?: "txt" """ touch ${prefix}.${suffix} \\ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/query/meta.yml b/modules/nf-core/bcftools/query/meta.yml index a66692d..6bcb5e5 100644 --- a/modules/nf-core/bcftools/query/meta.yml +++ b/modules/nf-core/bcftools/query/meta.yml @@ -60,13 +60,27 @@ output: type: file description: BCFTools query output file ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@abhi18av" - "@drpatelh" diff --git a/modules/nf-core/bcftools/query/tests/main.nf.test b/modules/nf-core/bcftools/query/tests/main.nf.test index 45759b2..63ac5af 100644 --- a/modules/nf-core/bcftools/query/tests/main.nf.test +++ b/modules/nf-core/bcftools/query/tests/main.nf.test @@ -33,11 +33,10 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.output, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } - } test("sarscov2 - [vcf, tbi], vcf, tsv, []") { @@ -62,11 +61,10 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.output, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - stub") { @@ -91,11 +89,9 @@ nextflow_process { { assert process.success }, { assert snapshot( file(process.out.output[0][1]).name, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } - } - } diff --git a/modules/nf-core/bcftools/query/tests/main.nf.test.snap b/modules/nf-core/bcftools/query/tests/main.nf.test.snap index 0e63815..5168ef3 100644 --- a/modules/nf-core/bcftools/query/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/query/tests/main.nf.test.snap @@ -9,28 +9,40 @@ "out.txt:md5,75a6bd0084e2e1838cf7baba11b99d19" ] ], - [ - "versions.yml:md5,0a0bd969f3e1b1dfc5617547cf2d9b6e" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_QUERY", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:40:03.990658" + "timestamp": "2026-01-20T12:16:54.523612853" }, "sarscov2 - [vcf, tbi], [], [], [] - stub": { "content": [ "out.txt", - [ - "versions.yml:md5,0a0bd969f3e1b1dfc5617547cf2d9b6e" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_QUERY", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:40:08.930802" + "timestamp": "2026-01-20T12:17:00.64798632" }, "sarscov2 - [vcf, tbi], [], [], []": { "content": [ @@ -42,14 +54,20 @@ "out.txt:md5,87a2ab194e1ee3219b44e58429ec3307" ] ], - [ - "versions.yml:md5,0a0bd969f3e1b1dfc5617547cf2d9b6e" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_QUERY", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:39:59.366475" + "timestamp": "2026-01-20T12:16:47.953130141" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/sort/main.nf b/modules/nf-core/bcftools/sort/main.nf index 2c939b8..e0dfad2 100644 --- a/modules/nf-core/bcftools/sort/main.nf +++ b/modules/nf-core/bcftools/sort/main.nf @@ -1,20 +1,20 @@ process BCFTOOLS_SORT { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf) output: tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi, optional: true - tuple val(meta), path("*.csi") , emit: csi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -22,50 +22,51 @@ process BCFTOOLS_SORT { script: def args = task.ext.args ?: '--output-type z' def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" def max_memory = task.memory ? "--max-mem ${task.memory.toUnit('MB') * 0.9}M" : "" """ bcftools \\ sort \\ --output ${prefix}.${extension} \\ --temp-dir . \\ - $max_memory \\ - $args \\ - $vcf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${max_memory} \\ + ${args} \\ + ${vcf} """ stub: def args = task.ext.args ?: '--output-type z' def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : - args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : - args.contains("--write-index") || args.contains("-W") ? "csi" : - "" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") + ? "tbi" + : args.contains("--write-index=csi") || args.contains("-W=csi") + ? "csi" + : args.contains("--write-index") || args.contains("-W") + ? "csi" + : "" def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" def create_index = extension.endsWith(".gz") && index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index}" : "" """ ${create_cmd} ${prefix}.${extension} ${create_index} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/sort/meta.yml b/modules/nf-core/bcftools/sort/meta.yml index c15487c..1c3f2a5 100644 --- a/modules/nf-core/bcftools/sort/meta.yml +++ b/modules/nf-core/bcftools/sort/meta.yml @@ -58,13 +58,27 @@ output: description: Default VCF file index pattern: "*.csi" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@Gwennid" maintainers: diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test b/modules/nf-core/bcftools/sort/tests/main.nf.test index 7d580e4..bda7bac 100644 --- a/modules/nf-core/bcftools/sort/tests/main.nf.test +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test @@ -27,7 +27,6 @@ nextflow_process { { assert snapshot(process.out).match("vcf") } ) } - } test("sarscov2 - vcf_gz_index") { @@ -52,12 +51,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_csi") { @@ -82,12 +80,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_tbi") { @@ -112,12 +109,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } test("sarscov2 - vcf - stub") { @@ -139,7 +135,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - vcf_gz_index - stub") { @@ -165,7 +160,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_csi - stub") { @@ -191,7 +185,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_tbi - stub") { @@ -217,6 +210,5 @@ nextflow_process { { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } } diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap index 3cbca56..9b9e4dc 100644 --- a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap @@ -22,7 +22,11 @@ ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -43,16 +47,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:49:07.959267" + "timestamp": "2026-01-20T12:19:24.286732272" }, "vcf": { "content": [ @@ -72,7 +80,11 @@ ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -88,16 +100,20 @@ "test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:35.236174" + "timestamp": "2026-01-20T12:18:38.783455397" }, "sarscov2 - vcf_gz_index": { "content": [ @@ -120,15 +136,21 @@ [ ], - [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:39.95133" + "timestamp": "2026-01-20T12:18:45.081447395" }, "sarscov2 - vcf_gz_index_csi": { "content": [ @@ -151,15 +173,21 @@ [ ], - [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:44.50977" + "timestamp": "2026-01-20T12:18:51.194304667" }, "sarscov2 - vcf_gz_index - stub": { "content": [ @@ -184,7 +212,11 @@ ] ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -205,16 +237,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:58.749279" + "timestamp": "2026-01-20T12:19:11.413154111" }, "sarscov2 - vcf_gz_index_csi - stub": { "content": [ @@ -239,7 +275,11 @@ ] ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -260,16 +300,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:49:03.283017" + "timestamp": "2026-01-20T12:19:17.770087535" }, "sarscov2 - vcf - stub": { "content": [ @@ -289,7 +333,11 @@ ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -305,16 +353,20 @@ "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:54.113947" + "timestamp": "2026-01-20T12:19:04.409593559" }, "sarscov2 - vcf_gz_index_tbi": { "content": [ @@ -337,14 +389,20 @@ "test_vcf.vcf.gz.tbi" ] ], - [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:48.979311" + "timestamp": "2026-01-20T12:18:57.536633502" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/stats/main.nf b/modules/nf-core/bcftools/stats/main.nf index 8eba6cd..ac77dd5 100644 --- a/modules/nf-core/bcftools/stats/main.nf +++ b/modules/nf-core/bcftools/stats/main.nf @@ -1,14 +1,14 @@ process BCFTOOLS_STATS { - tag "$meta.id" + tag "${meta.id}" label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: - tuple val(meta), path(vcf), path(tbi) + tuple val(meta), path(vcf), path(tbi) tuple val(meta2), path(regions) tuple val(meta3), path(targets) tuple val(meta4), path(samples) @@ -17,7 +17,7 @@ process BCFTOOLS_STATS { output: tuple val(meta), path("*stats.txt"), emit: stats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -27,23 +27,18 @@ process BCFTOOLS_STATS { def prefix = task.ext.prefix ?: "${meta.id}" def regions_file = regions ? "--regions-file ${regions}" : "" def targets_file = targets ? "--targets-file ${targets}" : "" - def samples_file = samples ? "--samples-file ${samples}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" def reference_fasta = fasta ? "--fasta-ref ${fasta}" : "" - def exons_file = exons ? "--exons ${exons}" : "" + def exons_file = exons ? "--exons ${exons}" : "" """ bcftools stats \\ - $args \\ - $regions_file \\ - $targets_file \\ - $samples_file \\ - $reference_fasta \\ - $exons_file \\ - $vcf > ${prefix}.bcftools_stats.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${args} \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + ${reference_fasta} \\ + ${exons_file} \\ + ${vcf} > ${prefix}.bcftools_stats.txt """ stub: @@ -51,10 +46,5 @@ process BCFTOOLS_STATS { """ touch ${prefix}.bcftools_stats.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/stats/meta.yml b/modules/nf-core/bcftools/stats/meta.yml index 2cd634f..6416fb7 100644 --- a/modules/nf-core/bcftools/stats/meta.yml +++ b/modules/nf-core/bcftools/stats/meta.yml @@ -96,13 +96,27 @@ output: description: Text output file containing stats pattern: "*_{stats.txt}" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/bcftools/stats/tests/main.nf.test b/modules/nf-core/bcftools/stats/tests/main.nf.test index 0ced6fc..e8a5598 100644 --- a/modules/nf-core/bcftools/stats/tests/main.nf.test +++ b/modules/nf-core/bcftools/stats/tests/main.nf.test @@ -29,11 +29,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match("versions") }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match("versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } - } test("sarscov2 - vcf_gz - regions") { @@ -57,11 +56,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match("regions_versions") }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match("regions_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } - } test("sarscov2 - vcf_gz - targets") { @@ -86,11 +84,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match("targets_versions") }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match("targets_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } - } test("sarscov2 - vcf_gz - exons") { @@ -114,11 +111,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match("exon_versions") }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match("exon_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } - } test("sarscov2 - vcf_gz - reference") { @@ -143,11 +139,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match("ref_versions") }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match("ref_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } - } @@ -176,7 +171,5 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } - } diff --git a/modules/nf-core/bcftools/stats/tests/main.nf.test.snap b/modules/nf-core/bcftools/stats/tests/main.nf.test.snap index cc33ddc..870d364 100644 --- a/modules/nf-core/bcftools/stats/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/stats/tests/main.nf.test.snap @@ -35,15 +35,21 @@ }, "versions": { "content": [ - [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:57:51.913799" + "timestamp": "2026-01-20T12:19:36.943096649" }, "sarscov2 - vcf_gz - targets": { "content": [ @@ -64,27 +70,39 @@ }, "regions_versions": { "content": [ - [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:57:56.503606" + "timestamp": "2026-01-20T12:19:43.504543106" }, "targets_versions": { "content": [ - [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:01.116272" + "timestamp": "2026-01-20T12:19:49.943149098" }, "sarscov2 - vcf_gz - stub": { "content": [ @@ -98,7 +116,11 @@ ] ], "1": [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] ], "stats": [ [ @@ -108,40 +130,56 @@ "test.bcftools_stats.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:15.742817" + "timestamp": "2026-01-20T12:20:09.654761076" }, "exon_versions": { "content": [ - [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:05.795248" + "timestamp": "2026-01-20T12:19:56.837252836" }, "ref_versions": { "content": [ - [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:10.679821" + "timestamp": "2026-01-20T12:20:03.323950267" }, "sarscov2 - vcf_gz": { "content": [ diff --git a/modules/nf-core/bcftools/view/main.nf b/modules/nf-core/bcftools/view/main.nf index 72b3120..b3fd7b7 100644 --- a/modules/nf-core/bcftools/view/main.nf +++ b/modules/nf-core/bcftools/view/main.nf @@ -1,23 +1,23 @@ process BCFTOOLS_VIEW { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf), path(index) - path(regions) - path(targets) - path(samples) + path regions + path targets + path samples output: tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi, optional: true - tuple val(meta), path("*.csi") , emit: csi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -25,51 +25,52 @@ process BCFTOOLS_VIEW { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def regions_file = regions ? "--regions-file ${regions}" : "" + def regions_file = regions ? "--regions-file ${regions}" : "" def targets_file = targets ? "--targets-file ${targets}" : "" - def samples_file = samples ? "--samples-file ${samples}" : "" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" + def samples_file = samples ? "--samples-file ${samples}" : "" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" """ bcftools view \\ --output ${prefix}.${extension} \\ ${regions_file} \\ ${targets_file} \\ ${samples_file} \\ - $args \\ - --threads $task.cpus \\ + ${args} \\ + --threads ${task.cpus} \\ ${vcf} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - def stub_index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : - args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : - args.contains("--write-index") || args.contains("-W") ? "csi" : - "" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + def stub_index = args.contains("--write-index=tbi") || args.contains("-W=tbi") + ? "tbi" + : args.contains("--write-index=csi") || args.contains("-W=csi") + ? "csi" + : args.contains("--write-index") || args.contains("-W") + ? "csi" + : "" def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" def create_index = extension.endsWith(".gz") && stub_index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${stub_index}" : "" """ ${create_cmd} ${prefix}.${extension} ${create_index} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/view/meta.yml b/modules/nf-core/bcftools/view/meta.yml index e9df974..4676189 100644 --- a/modules/nf-core/bcftools/view/meta.yml +++ b/modules/nf-core/bcftools/view/meta.yml @@ -85,13 +85,27 @@ output: description: Default VCF file index pattern: "*.csi" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@abhi18av" maintainers: diff --git a/modules/nf-core/bcftools/view/tests/main.nf.test b/modules/nf-core/bcftools/view/tests/main.nf.test index 8281c17..3ed2b90 100644 --- a/modules/nf-core/bcftools/view/tests/main.nf.test +++ b/modules/nf-core/bcftools/view/tests/main.nf.test @@ -33,11 +33,10 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.vcf, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index") { @@ -66,12 +65,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi") { @@ -100,12 +98,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi") { @@ -134,12 +131,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } test("sarscov2 - [vcf, tbi], vcf, tsv, []") { @@ -166,11 +162,10 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.vcf, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - stub") { @@ -198,11 +193,10 @@ nextflow_process { { assert process.success }, { assert snapshot( file(process.out.vcf[0][1]).name, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index - stub") { @@ -232,7 +226,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi - stub") { @@ -262,7 +255,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi - stub") { @@ -292,7 +284,5 @@ nextflow_process { { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } - } diff --git a/modules/nf-core/bcftools/view/tests/main.nf.test.snap b/modules/nf-core/bcftools/view/tests/main.nf.test.snap index 38b61e4..92972d1 100644 --- a/modules/nf-core/bcftools/view/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/view/tests/main.nf.test.snap @@ -24,7 +24,11 @@ ] ], "3": [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -47,16 +51,20 @@ "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:59:19.949819" + "timestamp": "2026-01-20T12:21:02.710815567" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi": { "content": [ @@ -81,15 +89,21 @@ "out_vcf.vcf.gz.tbi" ] ], - [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:59:00.329884" + "timestamp": "2026-01-20T12:20:36.071823323" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index - stub": { "content": [ @@ -116,7 +130,11 @@ ] ], "3": [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -139,16 +157,20 @@ "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:59:15.546282" + "timestamp": "2026-01-20T12:20:56.054811979" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi - stub": { "content": [ @@ -175,7 +197,11 @@ ], "3": [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] ], "csi": [ @@ -198,16 +224,20 @@ "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:59:24.406961" + "timestamp": "2026-01-20T12:21:09.229049434" }, "sarscov2 - [vcf, tbi], vcf, tsv, []": { "content": [ @@ -220,28 +250,40 @@ "out.vcf:md5,1bcbd0eff25d316ba915d06463aab17b" ] ], - [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:59:05.680096" + "timestamp": "2026-01-20T12:20:42.68820706" }, "sarscov2 - [vcf, tbi], [], [], [] - stub": { "content": [ "out.vcf", - [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:59:10.959586" + "timestamp": "2026-01-20T12:20:49.538986405" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index": { "content": [ @@ -266,15 +308,21 @@ [ ], - [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:50.932203" + "timestamp": "2026-01-20T12:20:22.451426124" }, "sarscov2 - [vcf, tbi], [], [], []": { "content": [ @@ -287,15 +335,21 @@ "out.vcf:md5,8e722884ffb75155212a3fc053918766" ] ], - [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:45.877214" + "timestamp": "2026-01-20T12:20:16.040611233" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi": { "content": [ @@ -320,14 +374,20 @@ [ ], - [ - "versions.yml:md5,ad4e3c17561ccfd75a5438895b687d60" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:55.616644" + "timestamp": "2026-01-20T12:20:29.512063514" } } \ No newline at end of file diff --git a/modules/nf-core/bedtools/subtract/main.nf b/modules/nf-core/bedtools/subtract/main.nf index c080844..1afc336 100644 --- a/modules/nf-core/bedtools/subtract/main.nf +++ b/modules/nf-core/bedtools/subtract/main.nf @@ -1,18 +1,18 @@ process BEDTOOLS_SUBTRACT { - tag "$meta.id" + tag "${meta.id}" label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bedtools:2.31.1--hf5e1c6e_0' : - 'biocontainers/bedtools:2.31.1--hf5e1c6e_0' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/bedtools:2.31.1--hf5e1c6e_0' + : 'biocontainers/bedtools:2.31.1--hf5e1c6e_0'}" input: tuple val(meta), path(intervals1), path(intervals2) output: tuple val(meta), path("*.bed"), emit: bed - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('bedtools'), eval("bedtools --version | sed -e 's/bedtools v//g'"), topic: versions, emit: versions_bedtools when: task.ext.when == null || task.ext.when @@ -20,31 +20,21 @@ process BEDTOOLS_SUBTRACT { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - if ("$intervals1" == "${prefix}.bed" || - "$intervals2" == "${prefix}.bed") - error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + if ("${intervals1}" == "${prefix}.bed" || "${intervals2}" == "${prefix}.bed") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } """ bedtools \\ subtract \\ - -a $intervals1 \\ - -b $intervals2 \\ - $args \\ + -a ${intervals1} \\ + -b ${intervals2} \\ + ${args} \\ > ${prefix}.bed - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.bed - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS """ } diff --git a/modules/nf-core/bedtools/subtract/meta.yml b/modules/nf-core/bedtools/subtract/meta.yml index 9519875..4efd8df 100644 --- a/modules/nf-core/bedtools/subtract/meta.yml +++ b/modules/nf-core/bedtools/subtract/meta.yml @@ -41,13 +41,27 @@ output: description: File containing the difference between the two sets of features patters: "*.bed" ontologies: [] + versions_bedtools: + - - ${task.process}: + type: string + description: The name of the process + - bedtools: + type: string + description: The name of the tool + - "bedtools --version | sed -e 's/bedtools v//g'": + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - bedtools: + type: string + description: The name of the tool + - "bedtools --version | sed -e 's/bedtools v//g'": + type: eval + description: The expression to obtain the version of the tool authors: - "@sidorov-si" maintainers: diff --git a/modules/nf-core/bedtools/subtract/tests/main.nf.test.snap b/modules/nf-core/bedtools/subtract/tests/main.nf.test.snap index 1dc0e6e..4a8df74 100644 --- a/modules/nf-core/bedtools/subtract/tests/main.nf.test.snap +++ b/modules/nf-core/bedtools/subtract/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,1424765d0d00cc3f44f5e7745607effe" + [ + "BEDTOOLS_SUBTRACT", + "bedtools", + "2.31.1" + ] ], "bed": [ [ @@ -21,15 +25,19 @@ "test_subtract.bed:md5,63513c4dc69e8b481ce3b4b2a9f24259" ] ], - "versions": [ - "versions.yml:md5,1424765d0d00cc3f44f5e7745607effe" + "versions_bedtools": [ + [ + "BEDTOOLS_SUBTRACT", + "bedtools", + "2.31.1" + ] ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-08-26T13:47:34.662548" + "timestamp": "2026-01-21T11:35:32.771087338" } } \ No newline at end of file diff --git a/modules/nf-core/cat/fastq/main.nf b/modules/nf-core/cat/fastq/main.nf index 8480e38..0a195a3 100644 --- a/modules/nf-core/cat/fastq/main.nf +++ b/modules/nf-core/cat/fastq/main.nf @@ -19,7 +19,7 @@ process CAT_FASTQ { script: def prefix = task.ext.prefix ?: "${meta.id}" - def readList = reads instanceof List ? reads.collect { it.toString() } : [reads.toString()] + def readList = reads instanceof List ? reads.collect { item -> item.toString() } : [reads.toString()] if (meta.single_end) { if (readList.size >= 1) { """ @@ -45,7 +45,7 @@ process CAT_FASTQ { stub: def prefix = task.ext.prefix ?: "${meta.id}" - def readList = reads instanceof List ? reads.collect { it.toString() } : [reads.toString()] + def readList = reads instanceof List ? reads.collect { item -> item.toString() } : [reads.toString()] if (meta.single_end) { if (readList.size >= 1) { """ diff --git a/modules/nf-core/gunzip/main.nf b/modules/nf-core/gunzip/main.nf index 3ffc8e9..a8533e7 100644 --- a/modules/nf-core/gunzip/main.nf +++ b/modules/nf-core/gunzip/main.nf @@ -12,7 +12,7 @@ process GUNZIP { output: tuple val(meta), path("${gunzip}"), emit: gunzip - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gunzip'), eval('gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//"'), topic: versions, emit: versions_gunzip when: task.ext.when == null || task.ext.when @@ -32,24 +32,14 @@ process GUNZIP { ${args} \\ ${archive} \\ > ${gunzip} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') - END_VERSIONS """ stub: - def args = task.ext.args ?: '' def extension = (archive.toString() - '.gz').tokenize('.')[-1] def name = archive.toString() - '.gz' - ".${extension}" def prefix = task.ext.prefix ?: name gunzip = prefix + ".${extension}" """ touch ${gunzip} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gunzip/meta.yml b/modules/nf-core/gunzip/meta.yml index 926bb22..bba6b3b 100644 --- a/modules/nf-core/gunzip/meta.yml +++ b/modules/nf-core/gunzip/meta.yml @@ -34,13 +34,29 @@ output: description: Compressed/uncompressed file pattern: "*.*" ontologies: [] + versions_gunzip: + - - ${task.process}: + type: string + description: The process the versions were collected from + - gunzip: + type: string + description: The tool name + - gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - gunzip: + type: string + description: The tool name + - gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/gunzip/tests/main.nf.test.snap b/modules/nf-core/gunzip/tests/main.nf.test.snap index a0f0e67..111ba1b 100644 --- a/modules/nf-core/gunzip/tests/main.nf.test.snap +++ b/modules/nf-core/gunzip/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -21,16 +25,20 @@ "test.xyz.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:22.080222697" + "timestamp": "2026-01-19T17:21:56.633550769" }, "Should run without failures - stub": { "content": [ @@ -44,7 +52,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -54,16 +66,20 @@ "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:14.593020264" + "timestamp": "2026-01-19T17:21:51.435621199" }, "Should run without failures": { "content": [ @@ -77,7 +93,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -87,16 +107,20 @@ "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:01.295397925" + "timestamp": "2026-01-19T17:21:40.613975821" }, "Should run without failures - prefix": { "content": [ @@ -110,7 +134,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -120,15 +148,19 @@ "test.xyz.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:07.414271387" + "timestamp": "2026-01-19T17:21:46.086880414" } } \ No newline at end of file diff --git a/modules/nf-core/gunzip/tests/tags.yml b/modules/nf-core/gunzip/tests/tags.yml deleted file mode 100644 index fd3f691..0000000 --- a/modules/nf-core/gunzip/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -gunzip: - - modules/nf-core/gunzip/** diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index cc8ee59..57d2468 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -19,11 +19,13 @@ process SAMTOOLS_STATS { task.ext.when == null || task.ext.when script: - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--reference ${fasta}" : "" """ samtools \\ stats \\ + ${args} \\ --threads ${task.cpus} \\ ${reference} \\ ${input} \\ diff --git a/nextflow_schema.json b/nextflow_schema.json index ba53cd4..2dbc68c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -226,16 +226,16 @@ "hidden": true }, "help": { - "type": "string", - "hidden": true + "type": ["boolean", "string"], + "description": "Display the help message." }, "help_full": { - "type": "string", - "hidden": true + "type": "boolean", + "description": "Display the full detailed help message." }, "show_hidden": { - "type": "string", - "hidden": true + "type": "boolean", + "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } } }, diff --git a/subworkflows/local/bam_variant_calling_sort_freebayes_bcftools/main.nf b/subworkflows/local/bam_variant_calling_sort_freebayes_bcftools/main.nf index f12a140..e192cc6 100644 --- a/subworkflows/local/bam_variant_calling_sort_freebayes_bcftools/main.nf +++ b/subworkflows/local/bam_variant_calling_sort_freebayes_bcftools/main.nf @@ -13,7 +13,7 @@ workflow BAM_VARIANT_CALLING_SORT_FREEBAYES_BCFTOOLS { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // Variant calling FREEBAYES ( ch_input, ch_fasta_fai.map{ meta, fasta, fai -> [ meta, fasta ] }, ch_fasta_fai.map{ meta, fasta, fai -> [ meta, fai ] }, ch_samples, ch_populations, ch_cnv ) @@ -21,11 +21,9 @@ workflow BAM_VARIANT_CALLING_SORT_FREEBAYES_BCFTOOLS { // Sort VCF files BCFTOOLS_SORT ( FREEBAYES.out.vcf ) - ch_versions = ch_versions.mix(BCFTOOLS_SORT.out.versions.first()) // Index VCF files BCFTOOLS_INDEX ( BCFTOOLS_SORT.out.vcf ) - ch_versions = ch_versions.mix(BCFTOOLS_INDEX.out.versions.first()) emit: vcf = BCFTOOLS_SORT.out.vcf // channel: [ val(meta), path(vcf) ] diff --git a/subworkflows/local/consensus_bcftools/main.nf b/subworkflows/local/consensus_bcftools/main.nf index dcac510..e89e7e7 100644 --- a/subworkflows/local/consensus_bcftools/main.nf +++ b/subworkflows/local/consensus_bcftools/main.nf @@ -18,7 +18,7 @@ workflow CONSENSUS_BCFTOOLS { ch_fasta // channel: /path/to/genome.fasta main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Filter variants by allele frequency, zip and index @@ -34,7 +34,6 @@ workflow CONSENSUS_BCFTOOLS { [], [] ) - // ch_versions = ch_versions.mix(BCFTOOLS_QUERY.out.versions.first()) ch_genomecov = ch_bam .multiMap { @@ -55,7 +54,6 @@ workflow CONSENSUS_BCFTOOLS { BEDTOOLS_SUBTRACT ( ch_bedtools_subtract ) - ch_versions = ch_versions.mix(BEDTOOLS_SUBTRACT.out.versions.first()) ch_consensus = ch_vcf .join( ch_tbi) diff --git a/subworkflows/local/fastq_align_bwamem2/main.nf b/subworkflows/local/fastq_align_bwamem2/main.nf index e581143..70c4576 100644 --- a/subworkflows/local/fastq_align_bwamem2/main.nf +++ b/subworkflows/local/fastq_align_bwamem2/main.nf @@ -11,7 +11,7 @@ workflow FASTQ_ALIGN_BWAMEM2 { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Map reads with BWA 2 mem diff --git a/subworkflows/local/longread_adapterremoval/main.nf b/subworkflows/local/longread_adapterremoval/main.nf index 66e532b..b9b0dea 100644 --- a/subworkflows/local/longread_adapterremoval/main.nf +++ b/subworkflows/local/longread_adapterremoval/main.nf @@ -2,35 +2,35 @@ // Process long raw reads with porechop or porechop_abi // -include { PORECHOP_PORECHOP } from '../../../modules/nf-core/porechop/porechop/main' -include { PORECHOP_ABI } from '../../../modules/nf-core/porechop/abi/main' +include { PORECHOP_PORECHOP } from '../../../modules/nf-core/porechop/porechop/main' +include { PORECHOP_ABI } from '../../../modules/nf-core/porechop/abi/main' workflow LONGREAD_ADAPTERREMOVAL { take: reads main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() - if ( params.longread_adapterremoval_tool == 'porechop_abi' ) { - PORECHOP_ABI ( reads ) - ch_processed_reads = PORECHOP_ABI.out.reads - .map { meta, reads -> [meta + [ single_end: true ], reads ] } - ch_versions = ch_versions.mix( PORECHOP_ABI.out.versions.first() ) - ch_multiqc_files = ch_multiqc_files.mix( PORECHOP_ABI.out.log ) - } else if ( params.longread_adapterremoval_tool == 'porechop' ) { - PORECHOP_PORECHOP ( reads ) - ch_processed_reads = PORECHOP_PORECHOP.out.reads - .map { meta, reads -> [ meta + [ single_end: true ], reads ] } - ch_versions = ch_versions.mix( PORECHOP_PORECHOP.out.versions.first() ) - ch_multiqc_files = ch_multiqc_files.mix( PORECHOP_PORECHOP.out.log ) - } else { + if (params.longread_adapterremoval_tool == 'porechop_abi') { + PORECHOP_ABI(reads) + ch_processed_reads = PORECHOP_ABI.out.reads.map { meta, chopped_reads -> [meta + [single_end: true], chopped_reads] } + ch_versions = ch_versions.mix(PORECHOP_ABI.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(PORECHOP_ABI.out.log) + } + else if (params.longread_adapterremoval_tool == 'porechop') { + PORECHOP_PORECHOP(reads) + ch_processed_reads = PORECHOP_PORECHOP.out.reads.map { meta, chopped_reads -> [meta + [single_end: true], chopped_reads] } + ch_versions = ch_versions.mix(PORECHOP_PORECHOP.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(PORECHOP_PORECHOP.out.log) + } + else { ch_processed_reads = reads } emit: - reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/longread_filtering/main.nf b/subworkflows/local/longread_filtering/main.nf index e48ca0b..510bf82 100644 --- a/subworkflows/local/longread_filtering/main.nf +++ b/subworkflows/local/longread_filtering/main.nf @@ -2,32 +2,34 @@ // Perform filtering // -include { FILTLONG } from '../../../modules/nf-core/filtlong/main' -include { NANOQ } from '../../../modules/nf-core/nanoq/main' +include { FILTLONG } from '../../../modules/nf-core/filtlong/main' +include { NANOQ } from '../../../modules/nf-core/nanoq/main' workflow LONGREAD_FILTERING { take: reads // [ [ meta ], [ reads ] ] main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // fastp complexity filtering is activated via modules.conf in shortread_preprocessing - if ( params.longread_filter_tool == 'filtlong' ) { - ch_filtered_reads = FILTLONG ( reads.map { meta, reads -> [ meta, [], reads ] } ).reads - ch_versions = ch_versions.mix( FILTLONG.out.versions.first() ) - ch_multiqc_files = ch_multiqc_files.mix( FILTLONG.out.log ) - } else if ( params.longread_filter_tool == 'nanoq' ) { - ch_filtered_reads = NANOQ ( reads , 'fastq.gz' ).reads - ch_versions = ch_versions.mix( NANOQ.out.versions.first() ) - ch_multiqc_files = ch_multiqc_files.mix( NANOQ.out.stats ) - } else { + if (params.longread_filter_tool == 'filtlong') { + ch_filtered_reads = FILTLONG(reads.map { meta, long_reads -> [meta, [], long_reads] }).reads + ch_versions = ch_versions.mix(FILTLONG.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(FILTLONG.out.log) + } + else if (params.longread_filter_tool == 'nanoq') { + ch_filtered_reads = NANOQ(reads, 'fastq.gz').reads + ch_versions = ch_versions.mix(NANOQ.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(NANOQ.out.stats) + } + else { ch_filtered_reads = reads } emit: - reads = ch_filtered_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_filtered_reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/longread_mapping/main.nf b/subworkflows/local/longread_mapping/main.nf index 6db6fb4..dddc7c8 100644 --- a/subworkflows/local/longread_mapping/main.nf +++ b/subworkflows/local/longread_mapping/main.nf @@ -42,24 +42,19 @@ workflow LONGREAD_MAPPING { ch_versions = ch_versions.mix(CLAIR3.out.versions.first()) BCFTOOLS_SORT ( CLAIR3.out.vcf ) - ch_versions = ch_versions.mix(BCFTOOLS_SORT.out.versions.first()) BCFTOOLS_INDEX ( BCFTOOLS_SORT.out.vcf ) - ch_versions = ch_versions.mix(BCFTOOLS_INDEX.out.versions.first()) ch_bcftool_view_input = BCFTOOLS_SORT.out.vcf.join(BCFTOOLS_INDEX.out.tbi) BCFTOOLS_VIEW ( ch_bcftool_view_input, '', '', '' ) - ch_versions = ch_versions.mix(BCFTOOLS_VIEW.out.versions.first()) ch_bcftool_norm_input = BCFTOOLS_VIEW.out.vcf.join(BCFTOOLS_VIEW.out.tbi) BCFTOOLS_NORM ( ch_bcftool_norm_input, ch_fasta ) - ch_versions = ch_versions.mix(BCFTOOLS_NORM.out.versions.first()) ch_bcftool_stats_input = BCFTOOLS_NORM.out.vcf.join(BCFTOOLS_NORM.out.tbi) BCFTOOLS_STATS ( ch_bcftool_stats_input, [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ] ) ch_multiqc_files = ch_multiqc_files.mix( BCFTOOLS_STATS.out.stats ) - ch_versions = ch_versions.mix(BCFTOOLS_STATS.out.versions.first()) CONSENSUS_BCFTOOLS ( BAM_SORT_STATS_SAMTOOLS.out.bam, BCFTOOLS_NORM.out.vcf, BCFTOOLS_NORM.out.tbi, ch_fasta ) ch_versions = ch_versions.mix( CONSENSUS_BCFTOOLS.out.versions ) diff --git a/subworkflows/local/longread_mapping/meta.yml b/subworkflows/local/longread_mapping/meta.yml index 707e25b..9f72ee3 100644 --- a/subworkflows/local/longread_mapping/meta.yml +++ b/subworkflows/local/longread_mapping/meta.yml @@ -13,7 +13,8 @@ components: - clair3 - bcftools/sort - bcftools/index - - bcftools/filter + - bcftools/view + - bcftools/norm - bcftools/stats - consensus_bcftools - seqtk/comp diff --git a/subworkflows/local/longread_preprocessing/main.nf b/subworkflows/local/longread_preprocessing/main.nf index d6f5a3f..a6e6b44 100644 --- a/subworkflows/local/longread_preprocessing/main.nf +++ b/subworkflows/local/longread_preprocessing/main.nf @@ -2,44 +2,55 @@ // Perform read trimming and filtering // -include { FASTQC as FASTQC_PROCESSED } from '../../../modules/nf-core/fastqc/main' +include { FASTQC as FASTQC_PROCESSED } from '../../../modules/nf-core/fastqc/main' +include { FALCO as FALCO_PROCESSED } from '../../../modules/nf-core/falco/main' -include { LONGREAD_ADAPTERREMOVAL } from '../longread_adapterremoval/main' -include { LONGREAD_FILTERING } from '../longread_filtering/main' +include { LONGREAD_ADAPTERREMOVAL } from '../longread_adapterremoval/main' +include { LONGREAD_FILTERING } from '../longread_filtering/main' workflow LONGREAD_PREPROCESSING { take: reads main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() - if ( !params.longread_qc_skipadaptertrim && params.longread_qc_skipqualityfilter) { - ch_processed_reads = LONGREAD_ADAPTERREMOVAL ( reads ).reads - ch_versions = ch_versions.mix(LONGREAD_ADAPTERREMOVAL.out.versions.first()) - ch_multiqc_files = ch_multiqc_files.mix( LONGREAD_ADAPTERREMOVAL.out.mqc ) - } else if ( params.longread_qc_skipadaptertrim && !params.longread_qc_skipqualityfilter) { - ch_processed_reads = LONGREAD_FILTERING ( reads ).reads - ch_versions = ch_versions.mix(LONGREAD_FILTERING.out.versions.first()) - ch_multiqc_files = ch_multiqc_files.mix( LONGREAD_FILTERING.out.mqc ) - } else { - LONGREAD_ADAPTERREMOVAL ( reads ) - ch_clipped_reads = LONGREAD_ADAPTERREMOVAL.out.reads - .map { meta, reads -> [ meta + [single_end: true], reads ] } - ch_processed_reads = LONGREAD_FILTERING ( ch_clipped_reads ).reads - ch_versions = ch_versions.mix(LONGREAD_ADAPTERREMOVAL.out.versions.first()) - ch_versions = ch_versions.mix(LONGREAD_FILTERING.out.versions.first()) - ch_multiqc_files = ch_multiqc_files.mix( LONGREAD_ADAPTERREMOVAL.out.mqc ) - ch_multiqc_files = ch_multiqc_files.mix( LONGREAD_FILTERING.out.mqc ) + if (!params.longread_qc_skipadaptertrim && params.longread_qc_skipqualityfilter) { + LONGREAD_ADAPTERREMOVAL(reads) + ch_processed_reads = LONGREAD_ADAPTERREMOVAL.out.reads + ch_versions = ch_versions.mix(LONGREAD_ADAPTERREMOVAL.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(LONGREAD_ADAPTERREMOVAL.out.mqc) + } + else if (params.longread_qc_skipadaptertrim && !params.longread_qc_skipqualityfilter) { + LONGREAD_FILTERING(reads) + ch_processed_reads = LONGREAD_FILTERING.out.reads + ch_versions = ch_versions.mix(LONGREAD_FILTERING.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(LONGREAD_FILTERING.out.mqc) + } + else { + LONGREAD_ADAPTERREMOVAL(reads) + ch_clipped_reads = LONGREAD_ADAPTERREMOVAL.out.reads.map { meta, clipped_long_reads -> [meta + [single_end: true], clipped_long_reads] } + LONGREAD_FILTERING(ch_clipped_reads) + ch_processed_reads = LONGREAD_FILTERING.out.reads + ch_versions = ch_versions.mix(LONGREAD_ADAPTERREMOVAL.out.versions.first()) + ch_versions = ch_versions.mix(LONGREAD_FILTERING.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(LONGREAD_ADAPTERREMOVAL.out.mqc) + ch_multiqc_files = ch_multiqc_files.mix(LONGREAD_FILTERING.out.mqc) } - FASTQC_PROCESSED ( ch_processed_reads ) - ch_versions = ch_versions.mix( FASTQC_PROCESSED.out.versions_fastqc ) - ch_multiqc_files = ch_multiqc_files.mix( FASTQC_PROCESSED.out.zip ) + if (params.preprocessing_qc_tool == 'fastqc') { + FASTQC_PROCESSED(ch_processed_reads) + ch_multiqc_files = ch_multiqc_files.mix(FASTQC_PROCESSED.out.zip) + } + else if (params.preprocessing_qc_tool == 'falco') { + FALCO_PROCESSED(ch_processed_reads) + ch_versions = ch_versions.mix(FALCO_PROCESSED.out.versions) + ch_multiqc_files = ch_multiqc_files.mix(FALCO_PROCESSED.out.txt) + } emit: - reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/longread_preprocessing/meta.yml b/subworkflows/local/longread_preprocessing/meta.yml index 337fee9..613cb1c 100644 --- a/subworkflows/local/longread_preprocessing/meta.yml +++ b/subworkflows/local/longread_preprocessing/meta.yml @@ -7,6 +7,7 @@ keywords: - fastq components: - fastqc + - falco - longread_adapterremoval - longread_filtering input: diff --git a/subworkflows/local/minimap2_alignment/main.nf b/subworkflows/local/minimap2_alignment/main.nf index cfb0782..7b91616 100644 --- a/subworkflows/local/minimap2_alignment/main.nf +++ b/subworkflows/local/minimap2_alignment/main.nf @@ -10,7 +10,7 @@ workflow MINIMAP2_ALIGNMENT { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() MINIMAP2_INDEX ( ch_ref ) ch_versions = ch_versions.mix(MINIMAP2_INDEX.out.versions) diff --git a/subworkflows/local/shortread_adapterremoval/main.nf b/subworkflows/local/shortread_adapterremoval/main.nf index f42bd45..cf19970 100644 --- a/subworkflows/local/shortread_adapterremoval/main.nf +++ b/subworkflows/local/shortread_adapterremoval/main.nf @@ -12,8 +12,8 @@ workflow SHORTREAD_ADAPTERREMOVAL { adapterlist // file main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() ch_input_for_adapterremoval = reads.branch { single: it[0].single_end @@ -30,7 +30,7 @@ workflow SHORTREAD_ADAPTERREMOVAL { if (params.shortread_qc_mergepairs && params.shortread_qc_includeunmerged) { - ch_concat_fastq = Channel.empty() + ch_concat_fastq = channel.empty() .mix( ADAPTERREMOVAL_PAIRED.out.collapsed, ADAPTERREMOVAL_PAIRED.out.collapsed_truncated, @@ -51,7 +51,7 @@ workflow SHORTREAD_ADAPTERREMOVAL { } else if (params.shortread_qc_mergepairs && !params.shortread_qc_includeunmerged) { - ch_concat_fastq = Channel.empty() + ch_concat_fastq = channel.empty() .mix( ADAPTERREMOVAL_PAIRED.out.collapsed, ADAPTERREMOVAL_PAIRED.out.collapsed_truncated, diff --git a/subworkflows/local/shortread_fastp/main.nf b/subworkflows/local/shortread_fastp/main.nf index 6559b34..108b9a7 100644 --- a/subworkflows/local/shortread_fastp/main.nf +++ b/subworkflows/local/shortread_fastp/main.nf @@ -11,8 +11,8 @@ workflow SHORTREAD_FASTP { adapterlist main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() ch_input_for_fastp = reads.branch { single: it[0]['single_end'] == true @@ -20,9 +20,9 @@ workflow SHORTREAD_FASTP { } ch_fastp_input_single = ch_input_for_fastp.single - .join( channel.value(adapterlist) ) + .map { meta, reads -> [meta, reads, [] ] } ch_fastp_input_paired = ch_input_for_fastp.paired - .join( channel.value(adapterlist)) + .map { meta, reads -> [meta, reads, [] ] } FASTP_SINGLE(ch_fastp_input_single, false, false, false) // Last parameter here turns on merging of PE data @@ -49,6 +49,6 @@ workflow SHORTREAD_FASTP { emit: reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/shortread_mapping/main.nf b/subworkflows/local/shortread_mapping/main.nf index 9f2efd9..b80569f 100644 --- a/subworkflows/local/shortread_mapping/main.nf +++ b/subworkflows/local/shortread_mapping/main.nf @@ -19,8 +19,8 @@ workflow SHORTREAD_MAPPING { ch_faidx // channel: [meta, ref fai] main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() if (params.shortread_mapping_tool == 'bowtie2') { FASTQ_ALIGN_BOWTIE2 ( @@ -69,19 +69,16 @@ workflow SHORTREAD_MAPPING { .join(BAM_VARIANT_CALLING_SORT_FREEBAYES_BCFTOOLS.out.tbi) BCFTOOLS_FILTER ( ch_bcftool_filter_input ) - ch_versions = ch_versions.mix(BCFTOOLS_FILTER.out.versions.first()) ch_bcftool_stats_input = BCFTOOLS_FILTER.out.vcf.join(BCFTOOLS_FILTER.out.tbi) BCFTOOLS_STATS ( ch_bcftool_stats_input, [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ] ) ch_multiqc_files = ch_multiqc_files.mix( BCFTOOLS_STATS.out.stats ) - ch_versions = ch_versions.mix(BCFTOOLS_STATS.out.versions.first()) CONSENSUS_BCFTOOLS ( ch_bam, BCFTOOLS_FILTER.out.vcf, BCFTOOLS_FILTER.out.tbi, ch_fasta ) ch_versions = ch_versions.mix( CONSENSUS_BCFTOOLS.out.versions ) SEQTK_COMP( CONSENSUS_BCFTOOLS.out.consensus ) - ch_versions = ch_versions.mix( SEQTK_COMP.out.versions_seqtk ) emit: bam = ch_bam // channel: [ val(meta), [ bam ] ] diff --git a/subworkflows/local/shortread_preprocessing/main.nf b/subworkflows/local/shortread_preprocessing/main.nf index 54dd81e..919bf28 100644 --- a/subworkflows/local/shortread_preprocessing/main.nf +++ b/subworkflows/local/shortread_preprocessing/main.nf @@ -14,7 +14,7 @@ workflow SHORTREAD_PREPROCESSING { adapterlist // file main: - ch_versions = channel.empty() + ch_versions = channel.empty() ch_multiqc_files = channel.empty() if (params.shortread_qc_tool == "fastp") { @@ -35,7 +35,6 @@ workflow SHORTREAD_PREPROCESSING { if (params.preprocessing_qc_tool == 'fastqc') { FASTQC_PROCESSED(ch_processed_reads) - ch_versions = ch_versions.mix(FASTQC_PROCESSED.out.versions_fastqc) ch_multiqc_files = ch_multiqc_files.mix(FASTQC_PROCESSED.out.zip) } else if (params.preprocessing_qc_tool == 'falco') { @@ -46,6 +45,6 @@ workflow SHORTREAD_PREPROCESSING { emit: reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/shortread_preprocessing/meta.yml b/subworkflows/local/shortread_preprocessing/meta.yml index ff55e7d..5f1d352 100644 --- a/subworkflows/local/shortread_preprocessing/meta.yml +++ b/subworkflows/local/shortread_preprocessing/meta.yml @@ -9,6 +9,7 @@ components: - shortread_fastp - shortread_adapterremoval - fastqc + - falco input: - meta: type: map diff --git a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf index 2fc384b..160295f 100644 --- a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf @@ -39,7 +39,7 @@ workflow PIPELINE_INITIALISATION { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -101,7 +101,7 @@ workflow PIPELINE_INITIALISATION { // Create channel from input file provided through params.input // - Channel + channel .fromList(samplesheetToList(params.input, "assets/schema_input.json")) .set { ch_samplesheet } diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf index 9f6d755..e457949 100644 --- a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf @@ -13,10 +13,9 @@ workflow BAM_SORT_STATS_SAMTOOLS { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() SAMTOOLS_SORT ( ch_bam, ch_fasta, '' ) - ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions_samtools.first()) SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions.first()) diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap index c3c9a04..239f163 100644 --- a/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap @@ -25,22 +25,20 @@ "id": "test", "single_end": false }, - "test.stats:md5,2fe0f3a7a1f07906061c1dadb62e0d05" + "test.stats:md5,1101fe711c4a389fdb5c4a1532107d1f" ] ], [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:26:24.36986488" + "timestamp": "2025-11-01T03:04:39.140333" }, "test_bam_sort_stats_samtools_paired_end": { "content": [ @@ -68,22 +66,20 @@ "id": "test", "single_end": false }, - "test.stats:md5,ba007b13981dad548358c7c957d41e12" + "test.stats:md5,f26c554c244ee86c89d62ebed509fd95" ] ], [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:26:38.683996037" + "timestamp": "2025-11-01T03:04:48.787289" }, "test_bam_sort_stats_samtools_single_end - stub": { "content": [ @@ -124,7 +120,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "5": [ @@ -137,11 +133,9 @@ ] ], "6": [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ], "bai": [ [ @@ -170,7 +164,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -192,19 +186,17 @@ ] ], "versions": [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:07:18.896460047" + "timestamp": "2025-11-01T03:05:00.693649" }, "test_bam_sort_stats_samtools_paired_end - stub": { "content": [ @@ -245,7 +237,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "5": [ @@ -258,11 +250,9 @@ ] ], "6": [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ], "bai": [ [ @@ -291,7 +281,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -313,18 +303,16 @@ ] ], "versions": [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:07:39.028688324" + "timestamp": "2025-11-01T03:05:10.863912" } } \ No newline at end of file diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/tests/tags.yml b/subworkflows/nf-core/bam_sort_stats_samtools/tests/tags.yml deleted file mode 100644 index 30b69d6..0000000 --- a/subworkflows/nf-core/bam_sort_stats_samtools/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/bam_sort_stats_samtools: - - subworkflows/nf-core/bam_sort_stats_samtools/** diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf index 90fcbf8..a79d957 100644 --- a/subworkflows/nf-core/bam_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -12,7 +12,7 @@ workflow BAM_STATS_SAMTOOLS { ch_fasta // channel: [ val(meta), path(fasta) ] main: - ch_versions = Channel.empty() + ch_versions = channel.empty() SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index acb3972..1df8b76 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -38,7 +38,7 @@ workflow UTILS_NFSCHEMA_PLUGIN { } log.info paramsHelp( help_options, - params.help instanceof String ? params.help : "", + (params.help instanceof String && params.help != "true") ? params.help : "", ) exit 0 } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 7068ffe..f74ac99 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,17 +1,143 @@ { "-profile test": { "content": [ - 3, + 61, { + "ALIGNPSEUDOGENOMES": { + "multi2single_sequence.py": 1.0 + }, + "BCFTOOLS_CONSENSUS": { + "bcftools": 1.2 + }, + "BCFTOOLS_FILTER": { + "bcftools": 1.22 + }, + "BCFTOOLS_INDEX": { + "bcftools": 1.22 + }, + "BCFTOOLS_QUERY": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, + "BCFTOOLS_STATS": { + "bcftools": 1.22 + }, + "BEDTOOLS_GENOMECOV": { + "bedtools": "2.31.1" + }, + "BEDTOOLS_SUBTRACT": { + "bedtools": "2.31.1" + }, + "BOWTIE2_ALIGN": { + "bowtie2": "2.5.4", + "samtools": 1.21, + "pigz": 2.8 + }, + "BOWTIE2_BUILD": { + "bowtie2": "2.5.4" + }, + "FASTP_PAIRED": { + "fastp": "1.0.1" + }, + "FASTQC": { + "fastqc": "0.12.1" + }, + "FASTQC_PROCESSED": { + "fastqc": "0.12.1" + }, + "FASTQSCANPARSE_PROCESSED": { + "fastqscan_parser.py": 1.0 + }, + "FASTQSCANPARSE_RAW": { + "fastqscan_parser.py": 1.0 + }, + "FASTQSCAN_PROCESSED": { + "fastqscan": "0.4.4" + }, + "FASTQSCAN_RAW": { + "fastqscan": "0.4.4" + }, + "FREEBAYES": { + "freebayes": "1.3.10" + }, + "GET_GENOME_SIZE": { + "gawk": "5.3.0" + }, "GUNZIP": { "gunzip": 1.13 }, + "MINIMAP2_INDEX": { + "minimap2": "2.29-r1283" + }, + "RASUSA": { + "rasusa": "0.3.0" + }, + "READSTATS_PARSE": { + "read_stats_parser.py": 1.0 + }, + "READ_STATS": { + "read_stats.py": 1.0 + }, + "RENAME_FASTA_HEADER": { + "sed": 4.9 + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": "1.22.1" + }, + "SAMTOOLS_IDXSTATS": { + "samtools": "1.22.1" + }, + "SAMTOOLS_INDEX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_SORT": { + "samtools": "1.22.1" + }, + "SAMTOOLS_STATS": { + "samtools": "1.22.1" + }, + "SEQTK_COMP": { + "seqtk": "1.4-r122" + }, + "SEQTK_PARSE": { + "seqtk_parser.py": 1.0 + }, "Workflow": { "nf-core/bactmap": "v2.0.0" } }, [ + "bcftools", + "bcftools/consensus", + "bcftools/consensus/01.fa", + "bcftools/consensus/02.fa", + "bcftools/query", + "bcftools/query/01.txt", + "bcftools/query/02.txt", + "bcftools/sort", + "bcftools/sort/01.sorted.vcf.gz", + "bcftools/sort/01.sorted.vcf.gz.tbi", + "bcftools/sort/02.sorted.vcf.gz", + "bcftools/sort/02.sorted.vcf.gz.tbi", + "bcftools/stats", + "bcftools/stats/01.bcftools_stats.txt", + "bcftools/stats/02.bcftools_stats.txt", + "bedtools", + "bedtools/genomecov", + "bedtools/genomecov/01.bed", + "bedtools/genomecov/02.bed", + "bedtools/subtract", + "bedtools/subtract/01.subtracted.bed", + "bedtools/subtract/02.subtracted.bed", "bowtie2", + "bowtie2/align", + "bowtie2/align/01.bowtie2.log", + "bowtie2/align/02.bowtie2.log", "bowtie2/build", "bowtie2/build/bowtie2", "bowtie2/build/bowtie2/genome.fna.1.bt2", @@ -21,15 +147,272 @@ "bowtie2/build/bowtie2/genome.fna.rev.1.bt2", "bowtie2/build/bowtie2/genome.fna.rev.2.bt2", "bowtie2/build/versions.yml", + "fastp", + "fastp/01_test_1.fastp.html", + "fastp/01_test_1.fastp.json", + "fastp/01_test_1.fastp.log", + "fastp/02_test_2.fastp.html", + "fastp/02_test_2.fastp.json", + "fastp/02_test_2.fastp.log", + "fastqc", + "fastqc/processed", + "fastqc/processed/01_test_1_processed_1_fastqc.html", + "fastqc/processed/01_test_1_processed_1_fastqc.zip", + "fastqc/processed/01_test_1_processed_2_fastqc.html", + "fastqc/processed/01_test_1_processed_2_fastqc.zip", + "fastqc/processed/02_test_2_processed_1_fastqc.html", + "fastqc/processed/02_test_2_processed_1_fastqc.zip", + "fastqc/processed/02_test_2_processed_2_fastqc.html", + "fastqc/processed/02_test_2_processed_2_fastqc.zip", + "fastqc/raw", + "fastqc/raw/01_test_1_raw_1_fastqc.html", + "fastqc/raw/01_test_1_raw_1_fastqc.zip", + "fastqc/raw/01_test_1_raw_2_fastqc.html", + "fastqc/raw/01_test_1_raw_2_fastqc.zip", + "fastqc/raw/02_test_2_raw_1_fastqc.html", + "fastqc/raw/02_test_2_raw_1_fastqc.zip", + "fastqc/raw/02_test_2_raw_2_fastqc.html", + "fastqc/raw/02_test_2_raw_2_fastqc.zip", "fastqscan", + "fastqscan/processed", + "fastqscan/processed/01_test_1.processed.json", + "fastqscan/processed/02_test_2.processed.json", "fastqscan/raw", + "fastqscan/raw/01_test_1.raw.json", "fastqscan/raw/02_test_2.raw.json", + "filtered_variants", + "filtered_variants/01.filtered.vcf.gz", + "filtered_variants/01.filtered.vcf.gz.tbi", + "filtered_variants/02.filtered.vcf.gz", + "filtered_variants/02.filtered.vcf.gz.tbi", + "freebayes", + "freebayes/01.vcf.gz", + "freebayes/02.vcf.gz", + "get", "gunzip", "gunzip/genome.fna", + "minimap2", + "minimap2/index", + "minimap2/index/genome.mmi", + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/fastp-insert-size-plot.txt", + "multiqc/multiqc_data/fastp-seq-content-gc-plot_Read_1_After_filtering.txt", + "multiqc/multiqc_data/fastp-seq-content-gc-plot_Read_1_Before_filtering.txt", + "multiqc/multiqc_data/fastp-seq-content-gc-plot_Read_2_After_filtering.txt", + "multiqc/multiqc_data/fastp-seq-content-gc-plot_Read_2_Before_filtering.txt", + "multiqc/multiqc_data/fastp-seq-content-n-plot_Read_1_After_filtering.txt", + "multiqc/multiqc_data/fastp-seq-content-n-plot_Read_1_Before_filtering.txt", + "multiqc/multiqc_data/fastp-seq-content-n-plot_Read_2_After_filtering.txt", + "multiqc/multiqc_data/fastp-seq-content-n-plot_Read_2_Before_filtering.txt", + "multiqc/multiqc_data/fastp-seq-quality-plot_Read_1_After_filtering.txt", + "multiqc/multiqc_data/fastp-seq-quality-plot_Read_1_Before_filtering.txt", + "multiqc/multiqc_data/fastp-seq-quality-plot_Read_2_After_filtering.txt", + "multiqc/multiqc_data/fastp-seq-quality-plot_Read_2_Before_filtering.txt", + "multiqc/multiqc_data/fastp_filtered_reads_plot.txt", + "multiqc/multiqc_data/fastqc-1-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc-1_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc-1_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc-1_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc-1_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc-1_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc-1_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc-1_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc-status-check-heatmap.txt", + "multiqc/multiqc_data/fastqc_per_base_n_content_plot.txt", + "multiqc/multiqc_data/fastqc_per_base_sequence_quality_plot.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Counts.txt", + "multiqc/multiqc_data/fastqc_per_sequence_gc_content_plot_Percentages.txt", + "multiqc/multiqc_data/fastqc_per_sequence_quality_scores_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_counts_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_duplication_levels_plot.txt", + "multiqc/multiqc_data/fastqc_sequence_length_distribution_plot.txt", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", + "multiqc/multiqc_data/multiqc_bcftools_stats_bcftools.txt", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_fastp.txt", + "multiqc/multiqc_data/multiqc_fastqc.txt", + "multiqc/multiqc_data/multiqc_fastqc_fastqc-1.txt", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_samtools_stats_samtools.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/samtools-stats-dp.txt", + "multiqc/multiqc_data/samtools_alignment_plot.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/fastp-insert-size-plot.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-content-gc-plot_Read_1_After_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-content-gc-plot_Read_1_Before_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-content-gc-plot_Read_2_After_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-content-gc-plot_Read_2_Before_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-content-n-plot_Read_1_After_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-content-n-plot_Read_1_Before_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-content-n-plot_Read_2_After_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-content-n-plot_Read_2_Before_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-quality-plot_Read_1_After_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-quality-plot_Read_1_Before_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-quality-plot_Read_2_After_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp-seq-quality-plot_Read_2_Before_filtering.pdf", + "multiqc/multiqc_plots/pdf/fastp_filtered_reads_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastp_filtered_reads_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc-1-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc-1_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc-1_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc-1_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc-1_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc-1_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc-1_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc-1_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc-1_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc-status-check-heatmap.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_n_content_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_base_sequence_quality_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Counts.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_gc_content_plot_Percentages.pdf", + "multiqc/multiqc_plots/pdf/fastqc_per_sequence_quality_scores_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_counts_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_duplication_levels_plot.pdf", + "multiqc/multiqc_plots/pdf/fastqc_sequence_length_distribution_plot.pdf", + "multiqc/multiqc_plots/pdf/samtools-stats-dp.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-pct.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/fastp-insert-size-plot.png", + "multiqc/multiqc_plots/png/fastp-seq-content-gc-plot_Read_1_After_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-content-gc-plot_Read_1_Before_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-content-gc-plot_Read_2_After_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-content-gc-plot_Read_2_Before_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-content-n-plot_Read_1_After_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-content-n-plot_Read_1_Before_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-content-n-plot_Read_2_After_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-content-n-plot_Read_2_Before_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-quality-plot_Read_1_After_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-quality-plot_Read_1_Before_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-quality-plot_Read_2_After_filtering.png", + "multiqc/multiqc_plots/png/fastp-seq-quality-plot_Read_2_Before_filtering.png", + "multiqc/multiqc_plots/png/fastp_filtered_reads_plot-cnt.png", + "multiqc/multiqc_plots/png/fastp_filtered_reads_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc-1-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc-1_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc-1_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc-1_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc-1_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc-1_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc-1_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc-1_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc-1_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc-status-check-heatmap.png", + "multiqc/multiqc_plots/png/fastqc_per_base_n_content_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_base_sequence_quality_plot.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Counts.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_gc_content_plot_Percentages.png", + "multiqc/multiqc_plots/png/fastqc_per_sequence_quality_scores_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-cnt.png", + "multiqc/multiqc_plots/png/fastqc_sequence_counts_plot-pct.png", + "multiqc/multiqc_plots/png/fastqc_sequence_duplication_levels_plot.png", + "multiqc/multiqc_plots/png/fastqc_sequence_length_distribution_plot.png", + "multiqc/multiqc_plots/png/samtools-stats-dp.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/fastp-insert-size-plot.svg", + "multiqc/multiqc_plots/svg/fastp-seq-content-gc-plot_Read_1_After_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-content-gc-plot_Read_1_Before_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-content-gc-plot_Read_2_After_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-content-gc-plot_Read_2_Before_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-content-n-plot_Read_1_After_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-content-n-plot_Read_1_Before_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-content-n-plot_Read_2_After_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-content-n-plot_Read_2_Before_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-quality-plot_Read_1_After_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-quality-plot_Read_1_Before_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-quality-plot_Read_2_After_filtering.svg", + "multiqc/multiqc_plots/svg/fastp-seq-quality-plot_Read_2_Before_filtering.svg", + "multiqc/multiqc_plots/svg/fastp_filtered_reads_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastp_filtered_reads_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc-1-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc-1_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc-1_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc-1_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc-1_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc-1_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc-1_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc-1_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc-1_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc-status-check-heatmap.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_n_content_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_base_sequence_quality_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Counts.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_gc_content_plot_Percentages.svg", + "multiqc/multiqc_plots/svg/fastqc_per_sequence_quality_scores_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-cnt.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_counts_plot-pct.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_duplication_levels_plot.svg", + "multiqc/multiqc_plots/svg/fastqc_sequence_length_distribution_plot.svg", + "multiqc/multiqc_plots/svg/samtools-stats-dp.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-cnt.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-pct.svg", + "multiqc/multiqc_report.html", "pipeline_info", - "pipeline_info/nf_core_bactmap_software_mqc_versions.yml" + "pipeline_info/nf_core_bactmap_software_mqc_versions.yml", + "pseudogenomes", + "pseudogenomes/01.fa", + "pseudogenomes/02.fa", + "pseudogenomes/aligned_pseudogenomes.fas", + "rasusa", + "rasusa/01.subsampled_1.fastq.gz", + "rasusa/01.subsampled_2.fastq.gz", + "rasusa/02.subsampled_1.fastq.gz", + "rasusa/02.subsampled_2.fastq.gz", + "read_stats", + "read_stats/01_test_1.read_stats.csv", + "read_stats/02_test_2.read_stats.csv", + "samtools", + "samtools/faidx", + "samtools/faidx/genome.fna.fai", + "samtools/sort", + "samtools/sort/01.sorted.bam", + "samtools/sort/01.sorted.bam.bai", + "samtools/sort/02.sorted.bam", + "samtools/sort/02.sorted.bam.bai", + "samtools/stats", + "samtools/stats/01.sorted.flagstat", + "samtools/stats/01.sorted.idxstats", + "samtools/stats/01.sorted.stats", + "samtools/stats/02.sorted.flagstat", + "samtools/stats/02.sorted.idxstats", + "samtools/stats/02.sorted.stats", + "seqtk", + "seqtk/01.seqtk_stats.tsv", + "seqtk/02.seqtk_stats.tsv", + "summaries", + "summaries/mapping_summary.tsv", + "summaries/processed_fastq-scan_summary.tsv", + "summaries/raw_fastq-scan_summary.tsv", + "summaries/read_stats_summary.tsv" ], [ + "01.fa:md5,17e6433115d1ad1b4ffdf384d783dc29", + "02.fa:md5,9048642262df13a6fc427b2d971b7546", + "01.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "02.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "01.sorted.vcf.gz:md5,2b90337d28b1d76675489f3e6e3e3d0d", + "01.sorted.vcf.gz.tbi:md5,b454a70a02862b26ccf49ebe2928c3ff", + "02.sorted.vcf.gz:md5,25d9d8aa14ab8ee5e1377fc5ec57d611", + "02.sorted.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "01.bcftools_stats.txt:md5,defae651d5565681d95172331c428d9d", + "02.bcftools_stats.txt:md5,64ce5bc394014836c039d2f98503ee8e", + "01.bed:md5,3610ca49fad02e567afc984e5ae0cce8", + "02.bed:md5,37284f438898485550db0a584251e69f", + "01.subtracted.bed:md5,3610ca49fad02e567afc984e5ae0cce8", + "02.subtracted.bed:md5,37284f438898485550db0a584251e69f", + "01.bowtie2.log:md5,81a5da4710835dc42e60430a92ad36e5", + "02.bowtie2.log:md5,c352791c3bf8ae5ecc37ee8618716f68", "genome.fna.1.bt2:md5,829b755b64d0ca0edfeacffdebef1c0b", "genome.fna.2.bt2:md5,4845f032a953c5a4da5cdf49723eebd2", "genome.fna.3.bt2:md5,6d1095f738d00d1bde2dc4f954b33179", @@ -37,14 +420,114 @@ "genome.fna.rev.1.bt2:md5,a1cc6383eb8d90710502a540f87bfa13", "genome.fna.rev.2.bt2:md5,871b69582268b9404cb1884a401cdc39", "versions.yml:md5,f986bc29ed66b12ac01d6a64a13c3227", + "01_test_1.fastp.html:md5,3de80e79d3b631a569d27017cf186472", + "01_test_1.fastp.json:md5,200f46137ea23811d26f756e9cbc633c", + "01_test_1.fastp.log:md5,621f78fc049cfadc55aca67b5dba6661", + "02_test_2.fastp.html:md5,5adaa4d3a491640804267c77fe6f9ca8", + "02_test_2.fastp.json:md5,d79d41c98f5835ead398e63a9185facc", + "02_test_2.fastp.log:md5,5fbbb767c45c35133888febdd030275c", + "01_test_1_processed_1_fastqc.html:md5,9b1f875c1ae3482af4719b27dff0444c", + "01_test_1_processed_1_fastqc.zip:md5,b4140f1cbc5d93cb1df2feb29ab6c327", + "01_test_1_processed_2_fastqc.html:md5,3636a3c22acd0315e9da9305c61b364a", + "01_test_1_processed_2_fastqc.zip:md5,df08241f32e49eca77d7d2d3de8bd674", + "02_test_2_processed_1_fastqc.html:md5,d85d08c7b76abc0d805feaa0f5a8f29a", + "02_test_2_processed_1_fastqc.zip:md5,611dea84f60907f1bdf0d56c56585819", + "02_test_2_processed_2_fastqc.html:md5,e216b4061413c515861b3e69e37f7b65", + "02_test_2_processed_2_fastqc.zip:md5,26c3becbf4fc3f1b2d4152886315f709", + "01_test_1_raw_1_fastqc.html:md5,137f33acec9d74980f00731b4af0b4e7", + "01_test_1_raw_1_fastqc.zip:md5,d297cc0e5557436331cc96df5a98b657", + "01_test_1_raw_2_fastqc.html:md5,172944e0a212f68024b1b28b13a59dbc", + "01_test_1_raw_2_fastqc.zip:md5,3fdb1d1369ef20adc7274738c4b5a178", + "02_test_2_raw_1_fastqc.html:md5,6e603a656a8d8fae7dc33fdc37465d6c", + "02_test_2_raw_1_fastqc.zip:md5,9699585661fd1fd9b15b8b0fff2e005e", + "02_test_2_raw_2_fastqc.html:md5,a43fc46afebfdb588d6cc6b5f86d151b", + "02_test_2_raw_2_fastqc.zip:md5,f843144c80423d38512e0f0b1b9fc399", + "01_test_1.processed.json:md5,125efed1942221fbf536885fbf475e66", + "02_test_2.processed.json:md5,78fbdb421671f255b1c0e12cfe0653a4", + "01_test_1.raw.json:md5,39066d3164d2dbdc7a198468cacaf838", "02_test_2.raw.json:md5,3cb79d84ea9de94940e4d1799c0e1c2b", - "genome.fna:md5,dafd38f5454b54fbea38245d773062a5" + "01.filtered.vcf.gz:md5,c209748816237888d09299240ffa75bb", + "01.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "02.filtered.vcf.gz:md5,037ddf75dcaa968c300b6ae8d38773e8", + "02.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "01.vcf.gz:md5,3b321dc56da962d86b8cf3de9872fda3", + "02.vcf.gz:md5,1b4392798f9cf39f14fabe7ebd3b7d42", + "genome.fna:md5,dafd38f5454b54fbea38245d773062a5", + "genome.mmi:md5,76c23f17ce1cade4a054bf2763b081db", + "fastp-insert-size-plot.txt:md5,162036bf69d2dc7386b43f2bdadac877", + "fastp-seq-content-gc-plot_Read_1_After_filtering.txt:md5,4edee862ece4eecb5045589a36786591", + "fastp-seq-content-gc-plot_Read_1_Before_filtering.txt:md5,e1ed0f20f9ee5f6e08a7e4deb49ceb35", + "fastp-seq-content-gc-plot_Read_2_After_filtering.txt:md5,e96f6d5adfea94d5a3c1c1f69b9447fc", + "fastp-seq-content-gc-plot_Read_2_Before_filtering.txt:md5,90b5d0855fa34315556fe0cbbb5b4ff3", + "fastp-seq-content-n-plot_Read_1_After_filtering.txt:md5,9b2e257b68d6fcc7db96f0d8630dd1b7", + "fastp-seq-content-n-plot_Read_1_Before_filtering.txt:md5,9b2e257b68d6fcc7db96f0d8630dd1b7", + "fastp-seq-content-n-plot_Read_2_After_filtering.txt:md5,9b2e257b68d6fcc7db96f0d8630dd1b7", + "fastp-seq-content-n-plot_Read_2_Before_filtering.txt:md5,353cfe0f9e9a15e5eb33e842755d9d4e", + "fastp-seq-quality-plot_Read_1_After_filtering.txt:md5,4634d3dc04a6c471c3431947d300fef4", + "fastp-seq-quality-plot_Read_1_Before_filtering.txt:md5,9dad9391b6b77bd6f4bf117e13370e8a", + "fastp-seq-quality-plot_Read_2_After_filtering.txt:md5,1716923bf26234eea1e5eff9be484423", + "fastp-seq-quality-plot_Read_2_Before_filtering.txt:md5,01f6e617cc8ed0d81678dff0fe09fe78", + "fastp_filtered_reads_plot.txt:md5,b0bb82fc4a23564c834ef8c4f4706faf", + "fastqc-1-status-check-heatmap.txt:md5,2958bbda783b97cef0b64530cbdbb01d", + "fastqc-1_per_base_n_content_plot.txt:md5,ab8e8d876edde1e457b3153888c88107", + "fastqc-1_per_base_sequence_quality_plot.txt:md5,9e8b520d210127656adab7a734f0191e", + "fastqc-1_per_sequence_gc_content_plot_Counts.txt:md5,f1542e9e7398dda884460eaf46795ff5", + "fastqc-1_per_sequence_gc_content_plot_Percentages.txt:md5,86db46ff07ff526eee61d9de82ed76c0", + "fastqc-1_per_sequence_quality_scores_plot.txt:md5,67c58bd6be8e3404ebc1b438d9fcbf2c", + "fastqc-1_sequence_counts_plot.txt:md5,93e8c72254cab3431a2230298d970619", + "fastqc-1_sequence_duplication_levels_plot.txt:md5,c11a44d8967bcc3fd978b70c497dbd9a", + "fastqc-status-check-heatmap.txt:md5,7d06360e828f3e153a0b21051d23911b", + "fastqc_per_base_n_content_plot.txt:md5,ea371a265a80840751645c2476c98754", + "fastqc_per_base_sequence_quality_plot.txt:md5,6362bc88473fc3c3e6d69a650fce6b3b", + "fastqc_per_sequence_gc_content_plot_Counts.txt:md5,c8285b24c862d046d1dd1e5f8c4f1419", + "fastqc_per_sequence_gc_content_plot_Percentages.txt:md5,d78f38d530511e784a915a1a1e587e72", + "fastqc_per_sequence_quality_scores_plot.txt:md5,3e61d4e1bc67d2cf85c00d020f6a32a8", + "fastqc_sequence_counts_plot.txt:md5,d1c81af14b6675c3f9f04125c1ecb484", + "fastqc_sequence_duplication_levels_plot.txt:md5,e32366bc23f5fb89aa60ef7b0f29de03", + "fastqc_sequence_length_distribution_plot.txt:md5,cb379474706e24255b725ac25b7d141e", + "llms-full.txt:md5,09bc2c5622592aeb5520da33c6615fb4", + "multiqc.parquet:md5,8712b951c96c7a4ec00d064a916222f8", + "multiqc_bcftools_stats_bcftools.txt:md5,c3ed02e08a492df1f0f889fcd03e331d", + "multiqc_citations.txt:md5,57db2426be011862828d18f767d25b57", + "multiqc_fastp.txt:md5,56d6d92282eff1929dc1d594df1cb9d8", + "multiqc_fastqc.txt:md5,1dbca9f02b1b75f5df2ac02c81d78411", + "multiqc_fastqc_fastqc-1.txt:md5,6fb9e3135beb3f43f193bdcb67d247b2", + "multiqc_general_stats.txt:md5,314ca8131542969bbf41ffe8be336796", + "multiqc_samtools_stats_samtools.txt:md5,bc33622a9e4c162e1cb0ff5cabede2a6", + "samtools-stats-dp.txt:md5,4b8fe2e0db527dc98fc21d27f2df0e11", + "samtools_alignment_plot.txt:md5,164ec8a3eceb8d56809f7970f1d0290b", + "01.fa:md5,ec73cef39989caf8e39d94271a64612c", + "02.fa:md5,5a1b47e59b09692f7ea9d35da64c0558", + "aligned_pseudogenomes.fas:md5,bf5d42e4d26f61cbf702d30f140f74a8", + "01.subsampled_1.fastq.gz:md5,67f961708debdc99dd25b6e45199bd5e", + "01.subsampled_2.fastq.gz:md5,7d173d53ad835ed689ab7a5c5ac3d89b", + "02.subsampled_1.fastq.gz:md5,c3a57b07c737ea41807a08e4d72d5100", + "02.subsampled_2.fastq.gz:md5,900f282a3822240130b80b0ffd915652", + "01_test_1.read_stats.csv:md5,ff40aaa6720a766448a3b8bde72f530f", + "02_test_2.read_stats.csv:md5,c0186b0b0464a58d780334ebb63cc70a", + "genome.fna.fai:md5,aa44b24652a42e538478dea3492480dd", + "01.sorted.bam:md5,edb8ce1778fd811f93cd4fbca0873ce4", + "01.sorted.bam.bai:md5,c40453c6aec8913ba9787b47c9b079da", + "02.sorted.bam:md5,781fbcc0cb2bede0cef0a02ca778b8a0", + "02.sorted.bam.bai:md5,40d3309085ab80106f2f0c67b5dab19d", + "01.sorted.flagstat:md5,4f152687b9140a16a48856b0bb216289", + "01.sorted.idxstats:md5,aa16d5da39ddbdc94dbeb52ed994c515", + "01.sorted.stats:md5,fcd22c10723786252888ec9c5f47a14a", + "02.sorted.flagstat:md5,23ce0492dce1ce77e1350aa1632b1da9", + "02.sorted.idxstats:md5,0670671323b7d1f14f15625c3c179b9f", + "02.sorted.stats:md5,76b87ccd13bd5d913deb3070063f92a7", + "01.seqtk_stats.tsv:md5,589ff7dc5f0eec7f60c5a940b2500298", + "02.seqtk_stats.tsv:md5,bd6fe576e5972d925ff4ec45fed17eee", + "mapping_summary.tsv:md5,6107518dec4d9802ba35775df42f1e46", + "processed_fastq-scan_summary.tsv:md5,2aa64d4dff6aa9f062872634a2d5c08b", + "raw_fastq-scan_summary.tsv:md5,d175a5a6fde88f7275b7833eff01e454", + "read_stats_summary.tsv:md5,e24c3bce8a36a7ca8924ed05e45b0ae8" ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-01-16T16:58:28.749323" + "timestamp": "2026-01-22T11:21:52.632027" } } \ No newline at end of file diff --git a/workflows/bactmap.nf b/workflows/bactmap.nf index 3d3f032..d375955 100644 --- a/workflows/bactmap.nf +++ b/workflows/bactmap.nf @@ -78,8 +78,8 @@ workflow BACTMAP { adapterlist = params.shortread_qc_adapterlist ? file(params.shortread_qc_adapterlist) : [] if ( params.shortread_qc_adapterlist ) { - if ( params.shortread_qc_tool == 'adapterremoval' && !(adapterlist.extension == 'txt') ) error "[nf-core/taxprofiler] ERROR: AdapterRemoval2 adapter list requires a `.txt` format and extension. Check input: --shortread_qc_adapterlist ${params.shortread_qc_adapterlist}" - if ( params.shortread_qc_tool == 'fastp' && !adapterlist.extension.matches(".*(fa|fasta|fna|fas)") ) error "[nf-core/taxprofiler] ERROR: fastp adapter list requires a `.fasta` format and extension (or fa, fas, fna). Check input: --shortread_qc_adapterlist ${params.shortread_qc_adapterlist}" + if ( params.shortread_qc_tool == 'adapterremoval' && !(adapterlist.extension == 'txt') ) error "[nf-core/bactmap] ERROR: AdapterRemoval2 adapter list requires a `.txt` format and extension. Check input: --shortread_qc_adapterlist ${params.shortread_qc_adapterlist}" + if ( params.shortread_qc_tool == 'fastp' && !adapterlist.extension.matches(".*(fa|fasta|fna|fas)") ) error "[nf-core/bactmap] ERROR: fastp adapter list requires a `.fasta` format and extension (or fa, fas, fna). Check input: --shortread_qc_adapterlist ${params.shortread_qc_adapterlist}" } take: @@ -131,14 +131,12 @@ workflow BACTMAP { */ ch_unzipped_fasta = GUNZIP ( ch_fasta ).gunzip - ch_versions = ch_versions.mix( GUNZIP.out.versions ) SAMTOOLS_FAIDX ( ch_unzipped_fasta, [ [ id:'no_fai' ],[] ], true ) - ch_versions = ch_versions.mix( SAMTOOLS_FAIDX.out.versions_samtools ) /* MODULE: Get genome size @@ -154,15 +152,19 @@ workflow BACTMAP { FASTQSCAN_RAW ( ch_input_for_fastqc ) + ch_versions = ch_versions.mix(FASTQSCAN_RAW.out.versions ) + ch_fastqscanraw_fastqscanparse = FASTQSCAN_RAW.out.json - ch_fastqscanraw_readstats = FASTQSCAN_RAW.out.json - ch_versions = ch_versions.mix(FASTQSCAN_RAW.out.versions ) + .map { it[1] } + .collect() + + ch_fastqscanraw_readstats = FASTQSCAN_RAW.out.json /* MODULE: Run fastqscanparse */ FASTQSCANPARSE_RAW ( - ch_fastqscanraw_fastqscanparse.collect{it[1]}.ifEmpty([]) + ch_fastqscanraw_fastqscanparse ) ch_versions = ch_versions.mix( FASTQSCANPARSE_RAW.out.versions ) @@ -176,7 +178,6 @@ workflow BACTMAP { ch_versions = ch_versions.mix( FALCO.out.versions ) } else { FASTQC ( ch_input_for_fastqc ) - ch_versions = ch_versions.mix( FASTQC.out.versions_fastqc ) } } @@ -210,15 +211,19 @@ workflow BACTMAP { FASTQSCAN_PROCESSED ( ch_reads_for_fastqscan ) + ch_versions = ch_versions.mix( FASTQSCAN_PROCESSED.out.versions ) + ch_fastqscanprocessed_fastqscanparse = FASTQSCAN_PROCESSED.out.json - ch_fastqscanprocessed_readstats = FASTQSCAN_PROCESSED.out.json - ch_versions = ch_versions.mix( FASTQSCAN_PROCESSED.out.versions ) + .map { it[1] } + .collect() + + ch_fastqscanprocessed_readstats = FASTQSCAN_PROCESSED.out.json /* MODULE: Run fastqscanparse */ FASTQSCANPARSE_PROCESSED ( - ch_fastqscanprocessed_fastqscanparse.collect{it[1]}.ifEmpty([]) + ch_fastqscanprocessed_fastqscanparse ) ch_versions = ch_versions.mix( FASTQSCANPARSE_PROCESSED.out.versions ) @@ -232,14 +237,17 @@ workflow BACTMAP { READ_STATS ( ch_readstats ) + ch_versions = ch_versions.mix(READ_STATS.out.versions) + ch_readstats_readstatsparse = READ_STATS.out.csv - ch_versions = ch_versions.mix(READ_STATS.out.versions) + .map { it[1] } + .collect() /* MODULE: Summarise read stats outputs */ READSTATS_PARSE ( - ch_readstats_readstatsparse.collect{it[1]}.ifEmpty([]) + ch_readstats_readstatsparse ) ch_versions = ch_versions.mix(READSTATS_PARSE.out.versions) /* @@ -274,7 +282,7 @@ workflow BACTMAP { [ meta, [ reads ].flatten() ] } - ch_versions = ch_versions.mix(MERGE_RUNS.out.versions_cat) + //ch_versions = ch_versions.mix(MERGE_RUNS.out.versions_cat) } else { ch_reads_runmerged = ch_shortreads_preprocessed @@ -395,45 +403,43 @@ workflow BACTMAP { /* MODULE: MultiQC */ - ch_multiqc_config = Channel.fromPath( + ch_multiqc_config = channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_config, checkIfExists: true) : + channel.empty() ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.fromPath("${workflow.projectDir}/docs/images/nf-core-bactmap_logo_light.png", checkIfExists: true) + channel.fromPath(params.multiqc_logo, checkIfExists: true) : + channel.empty() summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) - + ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) + ch_multiqc_files = ch_multiqc_files.mix( + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( + ch_methods_description = channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) - ch_multiqc_files = ch_multiqc_files.mix( - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) ch_multiqc_files = ch_multiqc_files.mix( ch_methods_description.collectFile( name: 'methods_description_mqc.yaml', - sort: true + sort: true, ) ) - if ( !params.skip_preprocessing_qc ) { - if ( params.preprocessing_qc_tool == 'falco' ) { + if (!params.skip_preprocessing_qc) { + if (params.preprocessing_qc_tool == 'falco') { // only mix in files actually used by MultiQC - ch_multiqc_files = ch_multiqc_files.mix(FALCO.out.txt - .map { meta, reports -> reports } - .flatten() - .filter { path -> path.name.endsWith('_data.txt')} - .ifEmpty([])) - } else { - ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix( + FALCO.out.txt.map { _meta, reports -> reports }.flatten().filter { path -> path.name.endsWith('_data.txt') }.ifEmpty([]) + ) + } + else { + ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect { it[1] }.ifEmpty([])) } } From 6c83931f2d56695f5055f0b0d2ff6c0b2b3868e8 Mon Sep 17 00:00:00 2001 From: Andries van Tonder Date: Thu, 22 Jan 2026 14:54:44 +0000 Subject: [PATCH 6/9] pipeline fixes --- subworkflows/local/longread_mapping/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/longread_mapping/main.nf b/subworkflows/local/longread_mapping/main.nf index dddc7c8..fd95bc3 100644 --- a/subworkflows/local/longread_mapping/main.nf +++ b/subworkflows/local/longread_mapping/main.nf @@ -46,7 +46,7 @@ workflow LONGREAD_MAPPING { BCFTOOLS_INDEX ( BCFTOOLS_SORT.out.vcf ) ch_bcftool_view_input = BCFTOOLS_SORT.out.vcf.join(BCFTOOLS_INDEX.out.tbi) - BCFTOOLS_VIEW ( ch_bcftool_view_input, '', '', '' ) + BCFTOOLS_VIEW ( ch_bcftool_view_input, [], [], [] ) ch_bcftool_norm_input = BCFTOOLS_VIEW.out.vcf.join(BCFTOOLS_VIEW.out.tbi) BCFTOOLS_NORM ( ch_bcftool_norm_input, ch_fasta ) From 698930bcdf8e7ebc50ad8d05bf596416e899685f Mon Sep 17 00:00:00 2001 From: Andries van Tonder Date: Thu, 22 Jan 2026 16:32:55 +0000 Subject: [PATCH 7/9] pipeline fixes --- subworkflows/local/longread_mapping/main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/longread_mapping/main.nf b/subworkflows/local/longread_mapping/main.nf index fd95bc3..96f8ba2 100644 --- a/subworkflows/local/longread_mapping/main.nf +++ b/subworkflows/local/longread_mapping/main.nf @@ -60,7 +60,6 @@ workflow LONGREAD_MAPPING { ch_versions = ch_versions.mix( CONSENSUS_BCFTOOLS.out.versions ) SEQTK_COMP( CONSENSUS_BCFTOOLS.out.consensus ) - ch_versions = ch_versions.mix( SEQTK_COMP.out.versions_seqtk ) emit: bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] From 9e515b02a01df12eaa8d2015bfc681771af7ed37 Mon Sep 17 00:00:00 2001 From: Andries van Tonder Date: Tue, 3 Feb 2026 17:24:00 +0000 Subject: [PATCH 8/9] pipeline fixes --- .nf-core.yml | 2 +- conf/modules.config | 8 +- subworkflows/local/shortread_mapping/main.nf | 14 ++- tests/default.nf.test.snap | 100 +++++++++++-------- 4 files changed, 70 insertions(+), 54 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index dcb387f..9c7cdea 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,6 +1,6 @@ repository_type: pipeline -nf_core_version: 3.5.1 +nf_core_version: 3.5.2 lint: {} diff --git a/conf/modules.config b/conf/modules.config index 2bcf097..cc7186e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -529,7 +529,7 @@ process { ext.args = '--write-index=tbi --output-type z -i "QUAL > 20 && INFO/SAF > 0 && INFO/SAR > 0 && (INFO/SRF > 0 || INFO/SRR > 0) && (INFO/AO / INFO/DP) > 0.9"' ext.prefix = { "${meta.id}.filtered" } publishDir = [ - path: { "${params.outdir}/filtered_variants" }, + path: { "${params.outdir}/bcftools/filter" }, mode: params.publish_dir_mode, pattern: '*.{vcf.gz,tbi,csi}', ] @@ -547,12 +547,12 @@ process { //final ONT vcf file withName: BCFTOOLS_NORM { - ext.args = '--output-type z -m -any --write-index=tbi' - ext.prefix = { "${meta.id}.filtered" } + ext.args = '--output-type z -a -m -both --write-index=tbi' + ext.prefix = { "${meta.id}.filtered.norm" } publishDir = [ path: { "${params.outdir}/filtered_variants" }, mode: params.publish_dir_mode, - pattern: '*.vcf.gz', + pattern: '*.{vcf.gz,tbi,csi}', ] } diff --git a/subworkflows/local/shortread_mapping/main.nf b/subworkflows/local/shortread_mapping/main.nf index b80569f..7d8dc0c 100644 --- a/subworkflows/local/shortread_mapping/main.nf +++ b/subworkflows/local/shortread_mapping/main.nf @@ -6,6 +6,7 @@ include { FASTQ_ALIGN_BWAMEM2 } from '../fastq_align_bwa include { FASTQ_ALIGN_BOWTIE2 } from '../../nf-core/fastq_align_bowtie2/main' include { BAM_VARIANT_CALLING_SORT_FREEBAYES_BCFTOOLS } from '../../local/bam_variant_calling_sort_freebayes_bcftools/main' include { BCFTOOLS_FILTER } from '../../../modules/nf-core/bcftools/filter/main' +include { BCFTOOLS_NORM } from '../../../modules/nf-core/bcftools/norm/main' include { BCFTOOLS_STATS } from '../../../modules/nf-core/bcftools/stats/main' include { CONSENSUS_BCFTOOLS } from '../consensus_bcftools/main' include { SEQTK_COMP } from '../../../modules/nf-core/seqtk/comp/main.nf' @@ -70,12 +71,15 @@ workflow SHORTREAD_MAPPING { BCFTOOLS_FILTER ( ch_bcftool_filter_input ) - ch_bcftool_stats_input = BCFTOOLS_FILTER.out.vcf.join(BCFTOOLS_FILTER.out.tbi) + ch_bcftool_norm_input = BCFTOOLS_FILTER.out.vcf.join(BCFTOOLS_FILTER.out.tbi) + BCFTOOLS_NORM ( ch_bcftool_norm_input, ch_fasta ) + + ch_bcftool_stats_input = BCFTOOLS_NORM.out.vcf.join(BCFTOOLS_NORM.out.tbi) BCFTOOLS_STATS ( ch_bcftool_stats_input, [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ] ) ch_multiqc_files = ch_multiqc_files.mix( BCFTOOLS_STATS.out.stats ) - CONSENSUS_BCFTOOLS ( ch_bam, BCFTOOLS_FILTER.out.vcf, BCFTOOLS_FILTER.out.tbi, ch_fasta ) + CONSENSUS_BCFTOOLS ( ch_bam, BCFTOOLS_NORM.out.vcf, BCFTOOLS_NORM.out.tbi, ch_fasta ) ch_versions = ch_versions.mix( CONSENSUS_BCFTOOLS.out.versions ) SEQTK_COMP( CONSENSUS_BCFTOOLS.out.consensus ) @@ -83,9 +87,9 @@ workflow SHORTREAD_MAPPING { emit: bam = ch_bam // channel: [ val(meta), [ bam ] ] bai = ch_index // channel: [ val(meta), [ bai ] ] - vcf = BCFTOOLS_FILTER.out.vcf // channel: [ val(meta), path(vcf) ] - csi = BCFTOOLS_FILTER.out.csi // channel: [ val(meta), path(csi) ] - tbi = BCFTOOLS_FILTER.out.tbi // channel: [ val(meta), path(tbi) ] + vcf = BCFTOOLS_NORM.out.vcf // channel: [meta, vcf] + csi = BCFTOOLS_NORM.out.csi // channel: [ val(meta), path(csi) ] + tbi = BCFTOOLS_NORM.out.tbi // channel; [meta, tbi] stats = BCFTOOLS_STATS.out.stats // channel: [meta, stats] consensus = CONSENSUS_BCFTOOLS.out.consensus // channel: [ val(meta), path(consensus) ] seqtk_stats = SEQTK_COMP.out.seqtk_stats // channel: [meta, stats] diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index f74ac99..8cfb934 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test": { "content": [ - 61, + 63, { "ALIGNPSEUDOGENOMES": { "multi2single_sequence.py": 1.0 @@ -15,6 +15,9 @@ "BCFTOOLS_INDEX": { "bcftools": 1.22 }, + "BCFTOOLS_NORM": { + "bcftools": 1.22 + }, "BCFTOOLS_QUERY": { "bcftools": 1.22 }, @@ -116,6 +119,11 @@ "bcftools/consensus", "bcftools/consensus/01.fa", "bcftools/consensus/02.fa", + "bcftools/filter", + "bcftools/filter/01.filtered.vcf.gz", + "bcftools/filter/01.filtered.vcf.gz.tbi", + "bcftools/filter/02.filtered.vcf.gz", + "bcftools/filter/02.filtered.vcf.gz.tbi", "bcftools/query", "bcftools/query/01.txt", "bcftools/query/02.txt", @@ -181,10 +189,10 @@ "fastqscan/raw/01_test_1.raw.json", "fastqscan/raw/02_test_2.raw.json", "filtered_variants", - "filtered_variants/01.filtered.vcf.gz", - "filtered_variants/01.filtered.vcf.gz.tbi", - "filtered_variants/02.filtered.vcf.gz", - "filtered_variants/02.filtered.vcf.gz.tbi", + "filtered_variants/01.filtered.norm.vcf.gz", + "filtered_variants/01.filtered.norm.vcf.gz.tbi", + "filtered_variants/02.filtered.norm.vcf.gz", + "filtered_variants/02.filtered.norm.vcf.gz.tbi", "freebayes", "freebayes/01.vcf.gz", "freebayes/02.vcf.gz", @@ -399,14 +407,18 @@ [ "01.fa:md5,17e6433115d1ad1b4ffdf384d783dc29", "02.fa:md5,9048642262df13a6fc427b2d971b7546", + "01.filtered.vcf.gz:md5,ced07b77c22cba9a53f2815c0256aa29", + "01.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "02.filtered.vcf.gz:md5,7e7c04e92033cfb373c511691dae53c5", + "02.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "01.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "02.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "01.sorted.vcf.gz:md5,2b90337d28b1d76675489f3e6e3e3d0d", - "01.sorted.vcf.gz.tbi:md5,b454a70a02862b26ccf49ebe2928c3ff", - "02.sorted.vcf.gz:md5,25d9d8aa14ab8ee5e1377fc5ec57d611", + "01.sorted.vcf.gz:md5,5998257ae03a4beb8931f67d8eed764f", + "01.sorted.vcf.gz.tbi:md5,93413e333781d63d89023745e5ed4ed4", + "02.sorted.vcf.gz:md5,b6eafab8154ecb0a7a9ee893dffcc54f", "02.sorted.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "01.bcftools_stats.txt:md5,defae651d5565681d95172331c428d9d", - "02.bcftools_stats.txt:md5,64ce5bc394014836c039d2f98503ee8e", + "01.bcftools_stats.txt:md5,71a4d86f777c160fd969b6382c2f5655", + "02.bcftools_stats.txt:md5,e4d4ebc423228aa03e48babac21ccf44", "01.bed:md5,3610ca49fad02e567afc984e5ae0cce8", "02.bed:md5,37284f438898485550db0a584251e69f", "01.subtracted.bed:md5,3610ca49fad02e567afc984e5ae0cce8", @@ -420,38 +432,38 @@ "genome.fna.rev.1.bt2:md5,a1cc6383eb8d90710502a540f87bfa13", "genome.fna.rev.2.bt2:md5,871b69582268b9404cb1884a401cdc39", "versions.yml:md5,f986bc29ed66b12ac01d6a64a13c3227", - "01_test_1.fastp.html:md5,3de80e79d3b631a569d27017cf186472", + "01_test_1.fastp.html:md5,77e3843e6fa6a069f76576a5c8c99b91", "01_test_1.fastp.json:md5,200f46137ea23811d26f756e9cbc633c", - "01_test_1.fastp.log:md5,621f78fc049cfadc55aca67b5dba6661", - "02_test_2.fastp.html:md5,5adaa4d3a491640804267c77fe6f9ca8", + "01_test_1.fastp.log:md5,da47c5a68d591c795a302a930503db0c", + "02_test_2.fastp.html:md5,78636145d5ed1c0f68945fc69d4dc5bf", "02_test_2.fastp.json:md5,d79d41c98f5835ead398e63a9185facc", "02_test_2.fastp.log:md5,5fbbb767c45c35133888febdd030275c", - "01_test_1_processed_1_fastqc.html:md5,9b1f875c1ae3482af4719b27dff0444c", - "01_test_1_processed_1_fastqc.zip:md5,b4140f1cbc5d93cb1df2feb29ab6c327", - "01_test_1_processed_2_fastqc.html:md5,3636a3c22acd0315e9da9305c61b364a", - "01_test_1_processed_2_fastqc.zip:md5,df08241f32e49eca77d7d2d3de8bd674", - "02_test_2_processed_1_fastqc.html:md5,d85d08c7b76abc0d805feaa0f5a8f29a", - "02_test_2_processed_1_fastqc.zip:md5,611dea84f60907f1bdf0d56c56585819", - "02_test_2_processed_2_fastqc.html:md5,e216b4061413c515861b3e69e37f7b65", - "02_test_2_processed_2_fastqc.zip:md5,26c3becbf4fc3f1b2d4152886315f709", - "01_test_1_raw_1_fastqc.html:md5,137f33acec9d74980f00731b4af0b4e7", - "01_test_1_raw_1_fastqc.zip:md5,d297cc0e5557436331cc96df5a98b657", - "01_test_1_raw_2_fastqc.html:md5,172944e0a212f68024b1b28b13a59dbc", - "01_test_1_raw_2_fastqc.zip:md5,3fdb1d1369ef20adc7274738c4b5a178", - "02_test_2_raw_1_fastqc.html:md5,6e603a656a8d8fae7dc33fdc37465d6c", - "02_test_2_raw_1_fastqc.zip:md5,9699585661fd1fd9b15b8b0fff2e005e", - "02_test_2_raw_2_fastqc.html:md5,a43fc46afebfdb588d6cc6b5f86d151b", - "02_test_2_raw_2_fastqc.zip:md5,f843144c80423d38512e0f0b1b9fc399", + "01_test_1_processed_1_fastqc.html:md5,b2327ae1715a8169942c99126b2f8dbd", + "01_test_1_processed_1_fastqc.zip:md5,198e2c2a57347258ab6eddfc3e4e1e80", + "01_test_1_processed_2_fastqc.html:md5,a4be338edad02af650571fead2a225e1", + "01_test_1_processed_2_fastqc.zip:md5,9341885ca56f8c00e8e47920565e3f9f", + "02_test_2_processed_1_fastqc.html:md5,ebe6a21831477e4d244208cdf455f2e3", + "02_test_2_processed_1_fastqc.zip:md5,53c004c3f30c9b524ced1a432441e500", + "02_test_2_processed_2_fastqc.html:md5,397100c73a84a419fbd2631d781cb4d3", + "02_test_2_processed_2_fastqc.zip:md5,9505777b26366459e64cecb7faa336ef", + "01_test_1_raw_1_fastqc.html:md5,2c11d2e70ed3ca42106d1ffaa753812c", + "01_test_1_raw_1_fastqc.zip:md5,41bed910f3ce5e74b97f974ceed9b8f1", + "01_test_1_raw_2_fastqc.html:md5,bbed35e4e0267f7b0d889a47be342120", + "01_test_1_raw_2_fastqc.zip:md5,1ea438b21c3b284f199afe7d533630ca", + "02_test_2_raw_1_fastqc.html:md5,e2a92f934b54d68da36a9454b6d53318", + "02_test_2_raw_1_fastqc.zip:md5,504092823ad31ab4a129ce6df77beed1", + "02_test_2_raw_2_fastqc.html:md5,263f1bafbd45d321bb8c34caaebb4ab8", + "02_test_2_raw_2_fastqc.zip:md5,b2a4a24d0a171ff26dfc22964123ab06", "01_test_1.processed.json:md5,125efed1942221fbf536885fbf475e66", "02_test_2.processed.json:md5,78fbdb421671f255b1c0e12cfe0653a4", "01_test_1.raw.json:md5,39066d3164d2dbdc7a198468cacaf838", "02_test_2.raw.json:md5,3cb79d84ea9de94940e4d1799c0e1c2b", - "01.filtered.vcf.gz:md5,c209748816237888d09299240ffa75bb", - "01.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "02.filtered.vcf.gz:md5,037ddf75dcaa968c300b6ae8d38773e8", - "02.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "01.vcf.gz:md5,3b321dc56da962d86b8cf3de9872fda3", - "02.vcf.gz:md5,1b4392798f9cf39f14fabe7ebd3b7d42", + "01.filtered.norm.vcf.gz:md5,e905f8aace7118fd7c775e83d24b4cd9", + "01.filtered.norm.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "02.filtered.norm.vcf.gz:md5,d97deb363c2dcba13e8a181a1fd5136c", + "02.filtered.norm.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "01.vcf.gz:md5,5ea465b34918c42c67e4d8f7999614c7", + "02.vcf.gz:md5,1dc400334499b315df22498b8c588bda", "genome.fna:md5,dafd38f5454b54fbea38245d773062a5", "genome.mmi:md5,76c23f17ce1cade4a054bf2763b081db", "fastp-insert-size-plot.txt:md5,162036bf69d2dc7386b43f2bdadac877", @@ -485,14 +497,14 @@ "fastqc_sequence_counts_plot.txt:md5,d1c81af14b6675c3f9f04125c1ecb484", "fastqc_sequence_duplication_levels_plot.txt:md5,e32366bc23f5fb89aa60ef7b0f29de03", "fastqc_sequence_length_distribution_plot.txt:md5,cb379474706e24255b725ac25b7d141e", - "llms-full.txt:md5,09bc2c5622592aeb5520da33c6615fb4", - "multiqc.parquet:md5,8712b951c96c7a4ec00d064a916222f8", - "multiqc_bcftools_stats_bcftools.txt:md5,c3ed02e08a492df1f0f889fcd03e331d", + "llms-full.txt:md5,17bbaebc278b8479d023d7606e18bc06", + "multiqc.parquet:md5,e3c7ec53526a88f66c4aca145dcb6e3c", + "multiqc_bcftools_stats_bcftools.txt:md5,356ce8604c4042691dad523ef4768e39", "multiqc_citations.txt:md5,57db2426be011862828d18f767d25b57", "multiqc_fastp.txt:md5,56d6d92282eff1929dc1d594df1cb9d8", "multiqc_fastqc.txt:md5,1dbca9f02b1b75f5df2ac02c81d78411", "multiqc_fastqc_fastqc-1.txt:md5,6fb9e3135beb3f43f193bdcb67d247b2", - "multiqc_general_stats.txt:md5,314ca8131542969bbf41ffe8be336796", + "multiqc_general_stats.txt:md5,7e1ff0593f1debb00f03f556197541b1", "multiqc_samtools_stats_samtools.txt:md5,bc33622a9e4c162e1cb0ff5cabede2a6", "samtools-stats-dp.txt:md5,4b8fe2e0db527dc98fc21d27f2df0e11", "samtools_alignment_plot.txt:md5,164ec8a3eceb8d56809f7970f1d0290b", @@ -506,9 +518,9 @@ "01_test_1.read_stats.csv:md5,ff40aaa6720a766448a3b8bde72f530f", "02_test_2.read_stats.csv:md5,c0186b0b0464a58d780334ebb63cc70a", "genome.fna.fai:md5,aa44b24652a42e538478dea3492480dd", - "01.sorted.bam:md5,edb8ce1778fd811f93cd4fbca0873ce4", - "01.sorted.bam.bai:md5,c40453c6aec8913ba9787b47c9b079da", - "02.sorted.bam:md5,781fbcc0cb2bede0cef0a02ca778b8a0", + "01.sorted.bam:md5,2182496d237e58f5c9e54057ce6ac785", + "01.sorted.bam.bai:md5,194c81a937bc1defaffe2e0aa1ddd8e6", + "02.sorted.bam:md5,5a07f35cf8efedded9bec741eab2c84f", "02.sorted.bam.bai:md5,40d3309085ab80106f2f0c67b5dab19d", "01.sorted.flagstat:md5,4f152687b9140a16a48856b0bb216289", "01.sorted.idxstats:md5,aa16d5da39ddbdc94dbeb52ed994c515", @@ -526,8 +538,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2026-01-22T11:21:52.632027" + "timestamp": "2026-02-03T17:23:29.845485" } } \ No newline at end of file From 11c1e77865533cddf3cd00debc0623dbe2bd337b Mon Sep 17 00:00:00 2001 From: Andries van Tonder Date: Tue, 3 Mar 2026 15:26:51 +0000 Subject: [PATCH 9/9] update logos --- assets/nf-core-bactmap_logo_light.png | Bin 73513 -> 75733 bytes docs/images/nf-core-bactmap_logo_dark.png | Bin 28349 -> 28533 bytes docs/images/nf-core-bactmap_logo_light.png | Bin 24366 -> 24513 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/nf-core-bactmap_logo_light.png b/assets/nf-core-bactmap_logo_light.png index 4f70a0a475da539451818925dea6dead6343c905..9fd8de13841288f24191c6f76e72c4a60cba2f84 100644 GIT binary patch literal 75733 zcmeEui93|*|NktQ%2p{POG2_GTh>fbF$vKkWvL`7S+eglWvLVyq^!vx5wgoR)sd*| zWoJr4wy}@>_kPs*ocb4j*Y~ijuVhOY*KysvQ|q$y*J-S zk72oMpYe0q?VAbaq#*9EMu$IdcoXp^so>_-$xz2=@*S~&`he~jv*V1qmOg7gB~|ku z4iN>q9{kdyZ|YpwtFN7@xuSZ(Q#H%X?NoYKwa=aXj}v2~+N64J89ds7jyopzTE&lL zTX=gIP6(U()S#j$694J$cS-q-%;cBHV%V6wo@O1Lq5Km$NZ4lj<2c zwqe?icigw3j2(aYEkjNIUZPcw=4bC$%q+7b?p1P^!$01``3%CuY^87 z;+7(ucG8n%c1WY$)*4{X-}BJ>bo;<}^v>;*r&@E0IG1l!Tp!}0zq857k7xHop;0Kp zp@Szq;zqjNA6dD3R!l5jDHM2N_C;`RXROn?GDR!4N3Rr{H;HXrSGA?_^#Q)^>x3(} z=<43q$8GY`M>pzW^wyWZeG~I-r(IWRLDQGU@i1q_WC4ffOiFfW-Ev8m^QVz}l&O0c zE-N-A&)rvx=OBv`{`)UCX`>qP&krcRHeYrA`@JZkb|WkP&!3Hh&M?CNd_(@9H(`JN z94XB0_vgv}e;Qn^msPPxe=j4ZZ3tyk36Qt*{xj$1vfpf zfBH3w+1b*|GaJs!(AUwvQtw>gauUf&pe#+DqG^ev2_0MidbaBfJliPBoT!80#N55W zHQE^UG1`B{W;y77G;^JZ?XkZ+q<%geg@+i7lHDn>$mVspb@xY%5NgE@d77ner^MdB z*1nVP_UY#-Y6+E<6!9i?+oS8$-pt;d3D=}sx*MwhbhNflGtKiBcGI#+HhX)dN@uIz zwmP&i0vm)y17C`|p#E^MEEm>zX-KMMI?WQQU^kBA;1tj@<~8`!k6U+iC}prxPmuhX zLf7-#M5camXj9p)7C>oq{&QD}yf0a%zRENK>b9gjroGHS>5cb)J>cAwuIbORgq`;p zTlA*RBIgOO7V`Q-GHmC7ec{waQgA@s=7!!EAVMzKXzyQ9fV>qPdH^Ma;^2%Idm@BQ zM2@WTS7c%30FP{ds&OGjve=0;e@c)!{5Qs~o)&OAOBL&2h3C z+(CYm`)5ePckWtirUj;j=#14_e|4Rpj0@3N8b)$~sm-A@5Q%3?LyG%gU8O9hH~ z8A^^977D%Xm^qkJdCK;0QQ7W6MLAC=Yv;Zj_Q%9qHa)tdCeXU@hbZ2C04`h6DoMfY zv>$5J0irT?7{pe5eUoP@Q5MB1cp$;gj9tSTbi-0$!c*+N++WJ^G8dF%Gu@Qtx9EAI z2(`*l<_b^pu(Eh_HU}9)^Sqh{~|U>-3rmZFc!^%_ZbeD=flc&OM@tp z?svck6BIj*j_#cr!gBffi`+ED
7@O#-v_4>H7vHWV z3c>16#ozJ|(2YlFyr|FcUGLF?NR3^%$qz9+`SUEr7eQ9a!GKiqe+#+`-V#Fjq||3D zuPa`Kw_>$#ixM7R_;YDRW5ifEmiSdt!ZNxsaTTCTAA%!}l5>;)N+l%RS8lG9h?`u}UeiCe>ZJV(mp_czII|xVk zvx(}wP}Y$Fk9aihozyix{WmSOp47XVdsg*mH-)XkDIf2u38W?bXA$Ryrt>*3-i2J>&i0gGs^9OpXxyy zb;$Dde`29+TOBjUaNlGlPE#>%H#ySxFD|^Doz|3Htw#j7FH)4Oi2jQQL6_lt3e@h! z;-jn#>Vt2(O^0&+I$A1zY-%#m4D8{BHen}$>&;&~?*{!7K>Ifhe2yCvA$b2SL1}lU z({oPqQlxA)AWNU^FWz48ypb5aN(bS)vx(gi)&DE~qmV#_TuCdecp<(c+=Lj#zbSIu z=jbC8UCGCoe~=3Y{wwd}3-U`_^sxd?#V3h|Q`Y~buZqWq)UxqEr>^$$Bg-E8YuQ_F zYK~_TTanck|ME4q4P(s%{SGXCa`$$S74Q7TKb9B0Z|aM{i4|MzCWzW%{!$M1kD%xx zvtrh&lQ9AzK{24tOKN zR6~TB^!H)X;V`T0Vu7OiIbuoJ|0TP&(?_d3*5_+__{X{WkEQb_qPxUhLN()s)QA+{rg1e{M9F;f{?oKbylL#% zlmcyglD2M#c-pMz{0~qK2Z5uT2{GsY;J^*a$$Md_6%}MLAVeK`JP!a*XBz*tdPtL; zzwVERC;R8AxedY#jxzL@5Fm_3h>)-gWuahRXPN$xg{qO{yALFufV##scg1s~pVp4B zY%qt0XYzOdxnAEL>ZT;^=?mNGNWd|gcY?=B0D0)oO>aCoc~68^)}XpDJ#jh1*LrXx zdA9xHt|c=$`WA8|_Rrb_M=hKw1^jm*3RO zU=4){s^|a1N!vG3cPA#OeOd#9&CDS24tGG!P~zmyEIxL%5Yc|pe^5fHncI0@5=3go z;v?^}j^L|`I#Y3bcs{N`ROTjL<9~j9*O_$QY^LW)&eKCOpH6#w!}%9(wC&6uaQ*^> zuFxa@6@HAJA@k`#j>cea`WSFy<`byT{f0Hq#;4QoRe<8(z|YRllsTySjd|6A!wwxo zO=Wg)*tHGsb0XPz_}*;BgSDlMd!p_-F_kHTNPVBQU+vw9Pz&}z*@Q$-wJA5sU$LpM z7h@gy2`|&U`LX=W(gHLI2Z`1UcAD{%#aUyT3Dtowsv{Jgp!X~M`{}jOaS`M`oeGSV zxeGkt69zF+?wrmt5g~7`7vSMflk4ccg(F9XjOB#X7krrcSx-t#tu`cDDoPf7dEfL4 z!EKG#)Vrd^u0T16L)g{`w7O{>VygOaH_E*fYowwD<0|&c+dVD6ODav%X|*e{SVq(P zrx_N>#+}?d<9@L!H~r*2Ll(hJYC4H~)(ISFdio!6Wv~p&(UN?#{#H%T?QiB1do3{w z*JxjWWhD*O_s=XT>z|oLqiM8AShW5u26nJ)v$8Nd{t&y6Wb0=sFMb4gz z5S6O@wK=6*a%HJx3bc?(RL7(Ovl%dvK};6ACw7!?8t5XUP_oTE#pbg4I%yo zzYBGWLkY~0TET;F^{F_m;0O7Z9OmC=LbqMnK&V}haPy@}mWkehsP6~wDv|nrV~y2| zllRiz_o!vNE1w&^jHtd|+52Gu^#)LVE=0GjGR(3C*~)l5R2_BO6n~Lsd|6|&irgC5 zI3OtEcdqdLFv6q52ukp&_j}FkrCEzwCt}~G{w@j150o{a7p7}2XLPSyd!ypdH@3qY z8)>JgQ>2SDmEU{(h`c)?Kq^4g`X*=vdjOZ8sBHiOQ#YkrGd9r`X_llRs?%?#NqgH4 zqI?(R=>7l(e7CE({Wwg)BRPRvc|l4Aw}OO!TTYf(n6sC$7yHw8|K24P%u$gpzP1aT z4WZ_Mv|9=fRgUT~r+i=m(-%b*9(wtFV7Vtu0JWvb>gwyxK%q{yuKbX`AIz&2n~GD7 z(&rWQn{<)zl-VfD#ELv)?vIvc=l@+TjbW;1J{$vER1BCntSY*=CRKy=ff23LK!3be5YuWtf>8^w6 zyt2#|TR=^Fdh7~(F=jC+1Wnpj-*6T!GD@V}r7gWMMKUukA^Rs*!~|YNQMU~>UMn=q zw)l8GC3x*AMa4x5hKjp;4ke5|P= zh9X2JQ{=#yL#UlZn}E8Vzsyzt$&?muuvsVe#q4K9Y>)aET}SovGS2^`8l=5#5wceq zc_d}OwETsOv+`TVWcVEK@d~GcEgt8+mZTh=z;rbT=)r6EkG>F)kE2X*yQ*08#U?r21@$V}!yT`uX=J6ZJ z>9s8PY)@(BZ)%r2w^L$X8uyUrvV`{I|mNyUav)P$WM4jW= z-!FdmY5Oep=%$UMlT#laE`9&eDO8zT@{@Ri+dFi9PWbn#&ki73lOPTe2@S;VlK^=+ z(VCxDLMKnk!Ut<66LUiHT{S8iqleKMs_p{`hyycnDQ4O4sH3EaN3x^*Rdr$sZ;5Yo zZ@H?ebCfK+OUy1_dUY-&v0}ERy}fQzNXg?jxo`AeEM{tWWb;VBV0?+PiSs#P^L(T1 z4-Kx1+v#$&r6Vb`eGL~x1Cf|caSQ17L8^`Jk(*Z?5$+(zur)~MUENQA4$jw6!qGVI zbI&HV+lryJGe0-eE}hr+>Js+#-dy_FPhp>$fI+E8bD&=3a&Sf`Pp@OkNTI-@#(kTb z3m^PC%K9eN$3IvnYkmE;eaz=#n(uMj%Z;Yu)yhPFtY-7GmZcKO{(HdxCTi61XB;X~ ztbIJ=_5V_R)X^#x7C+8o!F5f+_-ln7t9)t!ihJM;U#Y&NMf4oT0QZoYU1>-EwIVZ5 zdQtX*`Jzc{W>nC_hz+wl*To9d=A|R{BNsS z#hvL7{eE<_Eh*7wkE9gtci|C7O6+|MznJ?YD)NOdWtf2jB zr3$EHBoM!)hA9z`5j>U~Bh~t}Zsg0*hpgqArVrV&Io6%#ZJ)j;`nnyT*lrT%H0g_r zu)nyp#p43FKLaSD1R?b(+a0h5iE2pf46Kv?`men27|U6(`Y0j6;1`IK1c1?YwlxDi zR4!6ARwqDTu_Cq5uJpn}Q^r2&l7&9jRwh``Wl?I(ucO_h*LmiC z{1CQ6@NlEjvYCI4b!)tDgRAoLjWhG|BO7V)RCnN(xmIwv;#w(dF~ux9fu&5$h2s}c zO6XXy9YUa3gpLP7Zk^0BNrMo`64F$2sx3)G|DJ%87D%`Hv7NQ3e#<;jU-3gQt^1$at-TmG_0LZoM`h;Bob-m98dE+{Oi+n3 ztr@srj-9p>h;nfQ#{~5zC0Tw^KoB`D`Hq>Eg7|gwPp3<_ss-eq>GyK=ga80%woc=Y z-HYZ}mCnBYU`wYj>2t68>xvfj^Id-0l$NyRYWw@u=qG=SG8#bjf@Y-!!6r^?n+z9F z?}95_+k?XI$?JGyaHDSS$XWsKT3o9I-M&Q4X)d2XoyDjOOq5!l(H9?-PehZ0+mBa&p8c8}fiY&m@~=9|56iK*SQp8n3f>*{!CfR;o^Ire`QW zar+O=#vZRPx%#o$>v(1KHc(@Mz!E4ocerbsN)dkQl~|PX&>uCZ{$4!Jb1ecx)8iY2 zDZb!@O)x^tb+~Uiw)woR0^V(=Cf$AcrVnM7FDxXznReK-Xx?zVeQFFsg=fIh(d~$* z@eiP%Meq+sv+URJ(>t=uW#v;-I>^~N||;g z4*r-mPZr3F)gGvQAVI^!f!mP-t0QasbxH02byU&&b^zQJ+2y!}y?qT=GR7RAHpg-g z@X|hjUaLV-x)ee5{Op8dh3{B?=T#9j>m=;-&|3h&4vr#U_LNzOQz;plku7t{yX<^*lZ(Z5-6a z<#7tq1^W*O)@K7P=A_bqI^o}Me)L54y$1UZ0A7`nANp$Ew-&OMvoOyxsYmjmIz;DZ ztDLoPe~3Da=~tZqiVpcw2D9O_om=RyUBnV7a!AsX4>_tUGd=PTjnm9gMDk;d&pt4~ zq#NaY=y7I2ezlNDr!>?ml7xFADU7$X5RLjjvn|`bwXdJbiX`B%5CcMJOEG8Y(Fkx( zu5VTSUY{r96nCwi?nm6eMPEvs=VnI_u=OkCW5>ha9WAl&Wuk{AIqP!$D2GEKj97c4 z4w$jV0mYpu7x~e$tYB&5w&2bo@Sg#kOG68xpEj6M);qJ&IblO21nIbiWTrX0{%80) zW9(gGK$Z*f-`8+xR~nUSL?N64%o7jf5bp0@%i66*g_E$Cjnr7f>bN7#4 zpBmd^2Hpj*DHy9jwIXhCr03i^y0)b466F2cJnTRp)bK8-bOe%c9;XNSjX5;Z&9WP!6sRcX&n?J*n6(TuBu8;wm~)ed(9msKa#y10dz*YHf;1{EB{A$P=&qYTaPfUJGr zv+dVUUOh*W#aK$WX83Pd!qT;N@U{GgCB+q}q=_A8M<5SMMFy~Hm@=vwiUa-cZ-L@t zA;&V&!i7)n){}7}G+pUdcOl9(?%KBMH2}eD(!qzm+*eOtRfe#h2RkP!!TU?UCGZJH z3Qt#Ba{55DlnxoP=IxQF9~1(8;YRt-kVh$~H4Y4fCSmW9?o+#=*5M8NythbidDc>a zi(9|Myf^>m?=0?}b~>*PRZkoAQ9bsBo4U)o^-s*Q_b~Txs|81%u)%ObgR52q!HDjX z6N4y{?<2~{)Q64Y5aM^j!rO_?#8~Z1zpSX~y$0_Y0kuOyg;ph6ef{m!8c;ITStwUg zG!R{TbsuUEOe*_bLWvbj8p%fK*Ea}IjM87=#+a8hUATV{$NuR9l9l;G?ExRaA&ds- z*-Y97dW`VCRDnQX14?1d?vKq?`yELobQ`Z=usrN8F$x zjYNB3(k)OgSBBJWJEGKsI5z6Cde|i!mkPT)2n33vAnFzh`kfJj8=fZI#P6i*#1C7 zTw0#7W7si)U!~xtbx`++CoTp*L>~-nIUh)2#Zm@`Oc+V55Smrl0CSjTA%m0F4 zq?D^tOJo*y z8T#yQ2dVN39<|@KugRp7_oC6VY+&aO_JtjJzjz>}4P`JBDaV-vMHj>qu=ZbnQ_l$} zSmT+oy#`tZDX?~7%9O#5tGR#^`SnouBPtFd0^+Xi3`msv@9{XKcHYx$SAaPAn0&JApT!FRLqGilW52->f|m0cK>ptlo}JscXOz^4e`mG0yLyny;#lrf;QIfsTCxD{V@b@1L~qzpPE8N{*oViDLYQda!s zswOPf9YdpAjNvw3{Zw$pMN>uswfLs(drp=56)NJ6zQp|Ry(l0tt_~x6JXrt zAIqDfw#R@D(sy^=W0P+Z1FManFx&m~?A+f0Rr-Ag>?AUNC3RmrAxy#nBg!F)3a6$c zx-KgYc3*6iUZ9N&-vwxE%LerK;HJ`uFR0w-&m|jA9o)(u0Toe#m4xrbtIRdy&tDv9 z7LSdzPPtgdq{6Slr?Shpl)n7-k?f4L5N*gtud4VQ>MGgQ3@hXT1_g zlcb2rMB5)BTUkGNbr(5y-Z(stR5&l&8nUKTnuMZjsq0yL1X(jLRW#&Xj8@JaAGoSu zi7bWT!Sc+Ml|O@}^6>-Vxmkd)ObG%Yw79Wkr|)XA5{o-&qBI_eaULnT~4DUljXs_o@Olo~VvZ zi_jSIVyo$8OZsBR^T@wx?l?>i*_W0&rt>O4mc=L$6VZ5PzaJ4LwaEZe#P6qmh(|sO0Yhtkwv&?YdM{U?rk5{gl&hXpu{|JYFuC(~<`rxKgf)SXBr$c#0qkPKQ+h*;FP~u; z*@N+Fx0QTs-fwVGUg%gm&k0e>RRUGyl@LU%Jeb~5RX>OxdoUMJeP`-lqTUAuurqDZr&03Wzd=(+Fa0XX|AYIxi=F~3C0@fc+LH_m#+#jbdt z0Oe+>$w1?wGMlw->oKw@yCK-sA!9oawi>CEoEu`V*twXL^n|$_^M~^AO&GURl1AwV zxWw0AC6AMwiHjJin?bc%QPan6Kr&|;@z9@`tzLET?L$9&FWQ5*W^Q^vssEt%{V*{q zwyAGvdagaKxi1(&-Al!UQd|2l@J3NT0&;SgETU4fQe6t8rI@jit#l^H_p^! zjvq-ee51+gA?fHtQ}JwIsn}2^#5f7jCZ9^!u0v>A?4|o0$awJ61J=92vv016+n4It0M|(Gs@I!+5_)% zOJ&Y^^+%*}u8ek@L~&Re-R4$G-*@-vcG+v!=ReO!TRKlKd^%^y?{cL79n!UuK-@ZD zzWfWb?5v#gby=BRg2#}L|JcH|Myq|6r)Ab0=*DmN$?`rZ8Qpfqzq z^5%em3zakB#=^q;Ciax_d34P!S)pquufAxwkP9~-W+A+#kU+0C)5WPFx(PczUs=9+ z>3NL~QK&d!=RGJMi_q<8w$$fTr~JHZv=WUgYpH2WrOM{JJ@X2;3OMNTbpn^;Ame7! zzL9>(R8#razlm5jmV76Um1Rm;kJPd@SMGd#butMVl%Pp-WuLrff-w|+{KNS) zO{JrByY82w7GQ9;R>bZ)U~wK|8qs)s--Rqu!S!axq;INpGukPJ`;pVWf*z+J z`?MY0!55$Z-Pwd}D-l-3gSj8_i8=+e;}yFdGS3;p(VG2}#eE#sB>mxgC#EFgkHCu}I=-W{x;ygcnl`A_qBnbyEWh>A8dY{=bw`X^&KKUZMK zk--DMbIwwk#Va4@=Q=G;LM8gMWxU69ZTju=)!q?e zjR_2m97UKAQZxom9H0q{8eY`k7k~7nd-BU2~74k2KbdtBo?GR+ozWi@#rsEsEn+t5;Fa+<3iY zYSKD7vGC&jj6&7cSWe5rfRw;zIZrnp)=R!pL)KC(5S5f}-=|*c+8o;cqR77YWnb#3 zdhvzf**B-o6}?~(u1y*B_7;w|wcAxFLXmlmM=ro4QCj$rljV8awnKahVa$S%V)o*e z^r2p&;V4KT%S)Me&nVKyo%(A;OR)58Djr^x*lAZ#DX4aD z*V!+ri!Fe?DFE%>Ujq`&Rh-+&QnD)Z#j&TiJY5W|%RP<`_3D$T?qSUFm`{8#w7aUF z!gXfT;XF>6J(cu>860J^)7Wp=qk5^Kl2jw=F|Uz>ByG2;$Gh+DD<~Q-{(e`c(|*a- zS;6wv(3if-66jnrgwZ2Y zG@-MvDk>%BGiiH61}zvb7)UjJXAJdg4iDv=eJY~t9~1pJzfES9>H0F(XJ9h}kk3Pz0@~?aApCg3T}@67{=*w~#cwob z?$N!GXgu${w}xxN9|BiH=x_6|)Fqqinz-!`qU?3zc*qll9$Ls6h&Xm!W49x}j0Mw@ z1U+YZ?w>GiT+<;>&Gwk9t6a2L5c}c|*5;!}ew+$^vGAoY)XY_RP+AY4k1giijn>&~ zG54YmzklLA*Phi+*3o{5*VGE$7Fa5KZXtMp-*a$$%;)&TcP-=7>gXrU+subA6SjPc zb2{$ytPi_w z;(q=%sKZ${JZo7Ifz~$posrtMudbp}WlyP2l=DsFf$kAY*LTLRUxMz@D#qhl-sc2% z0bOvJ)ntuEzdZz1z1jc(woMF`nhsU{piXQr;B+Ok1vEN~f;lL5dLJ_D0kaKxiUrSX zbJ7|_^_@Sw@!Qq8I^2tU1dF}P&C`tj>5s2Ip<2zSUrEp$$)}8TB9@B0F&phh zP12fG2Q3XWXMc!0*mX^pj;eETL|HxJkUrFz;7cdry{0$eWYryOTDDQ;k`!FG(%PCi zZ-?z)CO&dK)M}P*I~AB%K9-8b`wXY5_fv%K0yJevD6< zS@vln57ef&!^nxKtsU3^7s(x!0TV)6FhnMfcBmd_9<^hp@1iw==4XP{n+_iEgiuc$ z?N5+z6xWO36a^!=Kn@;Y8@- zyojt_r2XU3V;`NH=1eOxC%Te3%BN>>TgFlG-T`%a+pp8)X_L3>`o&+E`OSYgE$B2~ z`ys3Rr+{+zf-Y?$;IYNfRBaRSa5BGG>IfLVH7#BAaN-F}wb9BFw@R8(y7^|c_lPBA z)O@+c%olI7PqJVR3TqMocbdE&taNcw^6oON1k0#%lJA014q~1+4|hbwl6cTUHB)mR zpMli~5M8MeyxE^Ie3_gOsiXyS$X!XfsKH#u!nhXq^bxKSE!bgK;5_vxf<@e1YSD^T zM@pXVa{xrV2GQhfDm3gdOKL8m)GVAJBy$y|mCBI@C@&QK7%hx<;=t|Rq9VWH^*rW& z*#g^ELq1;44&G+~O z(E;*AZJ@0l0=XYu!FEx;h2h8UM&;51pz>V0#p6n{@pj!IiFnjBp1Nx0-Z;F%%s@FV z?6CK?YZELmkt15WxlQr?tS})7Yy=xOs{Bbis!*|0@C3?hqR3dYQ-2OcK z4;28Ch9jWZdxI7?0JYkg1i-)@2 zDi34NL*Gav#O2dPq!+(8hEtWBZkD%%{cjxY6ash8_|*;^z@x`hpXJtTfv)?pb#3+7 zpVO&y;g(ykHfQm8h=~AW*(ly&<5<2+jgnAhcVn;5Kzg-dBGBmoqr0gstwbDF0bZ?( zO)#CqFGu=%DM=Q{Kr2k2%0^c^KSjIP^X2u46Iosl5flFb8q5W>#*$cS+Ag|BUhCpV z`6NMRs0!^}@(~E<#@G1>F;19CB=PI9GW)amFwtKN%becEKsqe~YVSpLD`kb4ePSt* zKSLBE2}7&ViL5>$KKPPH?l@?V0VD)*Jhg+Qgo}8T#=DGkb<;VkgE=<7k0vd`$&wyU zrP_SC{y4$3h@)7U-gzM*LudMAgYn#HV$+JBq31^2Xiw|-V<8C zw1uJQ7?xv8sRH0$=OIEjIB!Z*+2F8^{t{Mz*@xNyp70j~CKc^4W5f>y>R@dx+&bDV zYBIE!UL>o11>_!okh#le^|pcOQtaboRvh=!Q4uxE-h?xf_Kd{N#0C}bQ$v0*?BQv= z%HHJ)7Wo!P^S$;+9J+zgfVehjcMODS&IG=D(%r(JiC~i6ppo?`JT9S@aqnrwY}Gjk z&_w_nL~R=&op^roo-C^8o}q@s0Q|&EcY@)Ryem&LQ7fe<@A+;zmeH+AI zQ@V>HGK*!~JWOf3`D8cIfio+M4F?q~;9W6#91I_pom2;1Uo00&PFF zlVlifSGlg=m8t-Qelbe)@Vacy>anlJKO*TI-(m6P=Eh+5g8W=wg%g3XtKL5ztuB7x z3NyXH@L4PmQ=(1HSLAzRKuo{ecCEi#2ZtvQM6ISn2clMUUNP^sQq`95<4R7*L{ z>>E+sFmucbx10uo>z=-xc@8j?3i+Od%f|aDX$ocXZ}u)FP(JRku6d1p6@N{)_Gj){G3@yQ9}gl8)2F8zTld58Gs8?+*{^^K=kjgaA>(2L7Xy1)QHvGmhHe z>91n-WM6&*$9%1lpVG$Goq2a%fubBGX{R={#Z2!a7>3NG9d`G6~Y49oMbgVHe`{>=Q~ zS?Zz8(g{%y6sCQ+YcdiIH^d+23&Err zR(-fzA8om8#gK4X+dmTkvAtCa401au8*2$vuc9Ggb{c5b1lNIi9V^nSEUhrmBpzz8#zbNl29{|^PV?HA1sC>%+?^T020RsErFzQYD;HGF&z^!2nLCXNp( z;AchgbCgU~k4>#Z502%%!aE)Tx%uO*6Oo2*A$T`S(5DsAuvWGk%~XBrt?HDKW~Kdk zW87pV10K#rvx$=~3%!DJ0(M+Ax4!jPE`I;Xm8I&_-sBxro5Q-w)MXu4t62_9tzz7F zJl2H93j|Gy>!BI#U1Guhg$V}TUV`Pw(62v%=@3LuWzm`}FlE8rZxDEie9QktPV>=n z%m^lyW>EX)o+S=mCWe|UGoDe2Y~yGzh8S_H3oAG|_{qoYuCH&fYql@g=$Q?O<0 zTz=s-Irv8yu@t?E`ZzZ5$(*GN@Q+!lbfg9hDg$OILiXs5X5a+fXpiU46i!cGNVG{Z zG00w+#mBpRlsmCWJanO}^yM~>H}JTLL49T?zuLzH5b|ko>L+MM#7aww9MmkDC?4|k zYB&VB1z7LLM;Bu$inXZC%)c_Ri?%5#Z+8(4B1ya4mYdi~gUM~(TV(E|aM@4Bh1rNZDgc z)EqR`EBVZFUn6d8JFWMK|OKJ6I#K?Q@df%VG|p*TjnHfK~QjZDRr+YR+6p7VVp zCcY)Q*QRaY=i5N){&%i{tvzsNJ(4%pftCMotRoDePThanP0UiiHoIsH`Aiq~%X%O8#EHeIeoT_hv=awRd+eVx5!YOaxe_I?o}TEGmfj2N-LkLmn=i`#m1W13GA6{ z(1z#1SaJwxou%AzpLl6X8>LEsp~l0UQ1um&(X(L0vUJh&oq~I29jGUe?Heh4&*o5g zp;-c?w+9`{y5+F46`A**3J9rueU^KV~X}stP({&n9r`IJ~GsDn)yn znYg#lj-Jzr(5>Z6y!1fv4iXebLsbvv3IIA;=(g0}6PuAlF5Jg3b6x!5v*-C3TEJpH zm}jkmST~tui29&q)A*049()Qzt4Dz3G$PO1m_y79H*u&bhI3fZ$AumooA!ixbtENEGVVEk4mN;N#18$##)-R&knk(j>EqHRF@rnI7hhDVVRMlt5 z{QVC2R37a9K{R92aDpfQ*=h-N9HB{*d0a=EWDBqNYQ8#Ttcd{89Rp?yIE*Nv98B;M zErg1O0H<$+IHKia@6hG0}o~!hxMvFc7e_>jxba6w1bcDf#czT`E^uZ7+iSEL2gQp zv=#!+4M1RVO$#>!u5i%_b~%%5d`?L11MxFyyN=V-H2(d*jJvzfwrt2Z5h(n5u3qKx zf<3hfUCkFz3A~%DX%IdFxVg-$f@Sy&N;iqZWQr}hJQKPe0A=JzOQfjHK!*FcZOteV zJUviCR}0AxyG!*p8x^}>384?C!gN-FmQ6z)5|FcK zD&BS0KioC8wHfE1);nDO_1W8siDD6x?vM%iI)xBwZ!pIuEl}q>my~`~GKKEc&vaT! z5+~fc!9>qTptfZ8EUgDtwfbR5)PbR{nV||QGFFoBopRBPsRt*$p8xQ?@$1hPTp5rE z;u1DP7rzdf(fDU!&M1EHrB0Tl(3#tXqaUo(c6tmr>G&+8n{oGs6$?#i^>9F$t5+LE zft%_e3+UGh(bBqTrLDER-cA7sU?41jjqVtJ!b*0HPt&3lK!9f}Bcc z&eGhHw0B3FjVhJE01zu64<1tiBUh9fMTi4zMDaF3S*YrjstdtB?%B~HG;OGy-&f$Y z@T@fYewH!^%CZPIH~XF#rI!m8`w#LrQD6$iwke)X1JMKH3P^l~sW^1?qF%a7cU33x z6qsPhmcFa9w$h+C=0uZ#x}+{OCJ(E@jeMEV>1HY0i=g)JE2}YAL}DkW8s2hh&fM0@ z_jFIRgu>=bMCkGtiIlB3zliXmu(pPQBs23G1Z8J zdt99w9BDnrVgc7nD4w7hOdiTK7t6ru@1O?Aw$JdGT*ZBC{$#jvBUn)eqt#ybM!*=#APwtEk_E! zWHb+DdVOwe#{XRLzWm&A%0J<3#do4uVCg-{w|TAl>y{u9%6hhwFTdhoqYC$$=iuXe@HKaSgyDdFEj77O@*b%$02BI+z;g(+Au$*pkfG;*G))FKo-G5aLr2OT>B#NH{%VNqIOvT=@!8Eokv%tR zos_>A$jDkkQWo~JY;i~l0J{TNRf}9XpWKO&gnyHFLG+M_S@HyBE_QkqwyR6w7ph5w zt!07PNzTU}2vC)%u2egkbOcob-#)9gc4643y#4B`B0}a=pizR|Vd1mv@u!kC2K*Re zbP~Wpe>F0}WE+q`T+DhtA(kGjymUM9KYS3viZ~jAt_7?tXv)3@e}&_Jfs2S zp4}8oOhxMT;_R7njo)lbX@$6^6NX_ZOLW3|f@dyVMigv%)?&X7k_|=GrtoFBh@j1< zJj4~`&!tw)R7(0z=ot3uu`rx;U%61Ka`(bTgR(RTxA0J-0~Oxce|RCFEMn{2SQ<6D zsShTpygyW!Nyw~pJrd*@{V5OV#xj;Dc#Smamlm(#4@LdCtH?cqgDuf`VToevDlw`J z7+WMB_+My=)Uj|L7YC)SQqew=z`uF;!a3uFV`v*}B0F-xZ7_9#>4BkA#Z*bEfL8GP zoMDm!wioU9wyr;6J0x#sZ)Ugr-dP*tfs+PKCF!fK(qEE1=~(53oeE#uvm z)Hn574$iN_C`RCEBpm9HFL$tY6f~SXUqR_S3*(9J>{v8)ZdlHoqmHwvZiU;~4m(YU zng-|Tl~_Q)*P{3jg1VE$QKwsK4h9-2Pzy_fN7w`o#kj!0I@W)aS~c&h0E!PIe52tC zGI~g=gq&9yC5yAbL>`H^Vk<|n;!P(}IbbMtELObr=bU3m9Ll>>!;>Q_ux9dUhD^D z&qmj=#fxAIv5B|@7JiugOKgCg4LG$&pPEM7j)a?65(;x}XB8 z;m&}Slh+`4J0%)cxqBiUPzJ#@34i#u51Bd+n!D)X1k04_6zV5Y&dXhFb`U9gOHV_U z?)LYshPWC2V6;2S*h9h4bivF#nEQe0?yjUggbvGkxTPEXo)khFCvWkz$Jmc}b}p_U zm-CC}%A4+>g2(z*$P~(r_j@ZI#CgJyqLsY@eGe@WPAjApJQU?8v@AsThg@Od2W-EHKjgy<;C<@~fa!9EHMC zv>D@ap#5bS#)k&gcmKH2l&HwG=2o?jTEHGJni8zOi-so_kVFFInd4ZOtZ4ilAplwH zJuV>*0Vd7KhX4rnBx&EfQv~zX5{b}+@}BdiEsmIt&BIOi&fH4nxQ7Pz`e7fuHD@Fq zNihlNP5#sT_+vDYqo>z-pzSrahU$PBXp0?3XJF#y>?W0#M=z3bLwVn00DWM}M(9xP zzJs?u?=0z^F{i0h-GTfAeq%6pzOQEa#fLeU5-2YaPw0Nx-py5v%L(#X_Un>GO7a?T ze^Bl-riWz-T00ezE|1Eg?sAUgFT1sG4r_?9V9w--y=wP@DFIa`>&P*hI4bHdWcF@p z{9a)7DUgA8PQaqD%tw9>{=C?}w&~Hk$G6RWYbQ1vlXIt#i?Alzxb|334se)>+VVi2BzYaLI2l=YInnS96BbfN^buoIwkJp+?9#lrY9{ZTDVfUp7V(dAqb%943S ze7_&hRlZ|hJs+C-B2X~;xQ)(BPRDSvglCnK;GolA^ z!NdTsvwO+Ih_2Pz(h#B!*bU5S98rGp6-Ib#)MIw(Kr=bR$ z4_UC!j+$}0v?|;JAsqD$zSMU(A>l+@lrqdbOH_iM)JQQZ-uk>A2!<5J&hiD66$&w{ z>z8a``hA#3;j zXv)3o=qo+V+BjZ?B2+f2CxW|HUP@-A44H0VF56ygNYm~6Q2~kp!yB?21P=LjLZc>| zP2eIw1)pZG8X)obvjlUK(-!p#+z&SlcAY=O&2c;J1wxg~>EI?&GCEX>bh`lQWIH6GoL zJLw}8$O*W@neX!S2992?Fu8eXSPat--%O842$KH3PlrlT$?nPi6y7dS`L(#Z#0}OX z3TdlH>br_%;^-76UyC=#bnT1ZN|1Vt%R~<%P*nY^f3mRjQ z={)8Gg&JGeBgH`){>PhT+H3#pb94FDssMePTQme~q?o={-AX+5_p;kfUZh$dW7v8& z3eN@C7G09#mI!N-;(Bb5vVGL;9z<|(HMOM$@Wdq3l?tKbJOrSN>YN8^&ZAQvhD=%}Z&wMU?_ z3>Uh$2tKj%#oM(%%0LpndyiAXw=++&L!ZQo`S=ay>+uR)8y3@t&zNXi%ccH)fK*WW znu3c55o^$GQ^nImzl13TBgkvC1U_^}>ef}OU8Wq;-1qhD=foEnB=I{0lM)CqX{ArQ=9||ubBlpEJ7Q>n zw1sjI%z@KphCpanu5OYt)y;>jhfcBQF?hg#`Kl`f;k4zaf2Xt{vDE~DE2QJXX9dO) zP>4Nuqz+N0?H%AU(qs1pB>Y32cTbLPBXIosqc!Mc`AmolKB_y;^P~>=SRCcli?@kQ zHD7?(T|p%JJs57rmG>=;z(GWIaX$h6V@e5-ybXxYSP#$(C~#S1 z7-7w!j6R>ZcLh#zO=vvaCvmP+4>oZ??&0>^qG22>;UmyQ-cMEV^QC97sx(*?bbA)k z?7|!eCSUJq3QdrL_+S#JCv<~j%V-qoVM(sYQ7Zt*K@Y;O%VvLkJi)%Rpdy+_Ko-i+ zI_ZE>1u(z62CTVIPDh;mF+BMPd@RQAj-Tau{jv>W=GREd;=nW;wrBWLz9k8?X;-BA zPj#)I8#H-*dmUZE2}PR}ijh)Y>?BYLL&xg>c*1gPT`;R6%q{WIpAJ%uX9y?ld%rr#u?Mz|?i0fK;Bcd$~+g zQ2N6#gCJpa7{zXs6Dw{#Gz3rPq&dk9mk|XNyFzd#L(vG`ql|+VMJ2@)$mYNVBA$cb zy{aG}ks;7&q`YdXvH5F=(4tpJ)o~DKqvb@!34;q1*<{o?5q=4xm<^7`sKIUa=hc`x z#skoSmQQd8xj9Xr`T^Hku2d=ee{MEJIo4&WYW8#Dpgn@3D!C0x*hFa*PRe`k0Da(N zxmwud8T5-N1ga~ML&bx8eaT9IF5xA(sa(8Tu~6y4Yb~_MV>he|KSJ#M^JgS#jDkr?TQ11# zl}*kwC&A(Wy0QtK`ZR8PUD9kex%WR#Bo)^E%Gs&IDY2YgRAIs$$O=34P-p3h&Yw*s zmi9f_hYU=H-P=>)@mt>OlCq@iFzj=W)BG#`Z=>tAN87Bkqpc((QkhwMp7U|dqD6<@ z7j#(kDP%%;)YnT4-KQ{vIYl-a4y4i(&o|eFx3>1k!@8RmIN#e{nk_J;p5M?uUPf_^udWj9RIWiz|jMOhJ)Ua9-%yWAes87 z&+X8!l}NL?9Hh3Gwrl}OAdPD?Zr!9Y0eSL_J9+X2d1ic2HOECScLA|fWN_o^L{Asx z)t}M86t+1;9Gu?uTx)?u*V>s>Xv@ERt#vi`wVFod1;6(Ekw4{Qb3ucAW_oMfiAg2V zR#eb^M1iIa8GaQYqwiIsBU5J|c=PZJtwVyD{j;$Fv_veF4!8Bzxh)l=FY0`z7@kC{G@dQMp;@R54@?M`I)Gs@p>4go1!v z>%j=}?%2GQ3n4rHDnkISY|mWF(yv z@a{Ak!?cM9#eNe9s5rLEi^dR=m(DowmG+Nly6+T{oQ50PPv~Sv;YV3-5occ%%+0Vp z?I9^NYpclqO7GP$31+2jV>^APx1{r#(xOOlc=Wo5mB+ZXa%k5E+_xGNECKPyk*@uv zF7A?aa8wlA=F=yG;V$7%T;*aC9-s#g1xgHX*5}BZ&_T-6X;`TS1&pQ?;8QYmb=F_L zlIVY-6`q1t1b_Lruk8WcD(@uw>uw@>(GEh30v+G47X`J6=6NwX--0venA>%CNnN-y zR4FMUf7IBT!}nX@OO`NCkQp}7a-I%3r(_ZARYtpexRH|NbbfG%zUis2L z^~KvI&3=ETcHN}}b1t@df4-vVSno-`Ei|3xvbCXWvAtvzF&s+~a!_~+9Qi>)VwW@( zi6RJq+7)678`0-uXDX?z={Qa!n9qd~1!N_#xP5^{<6Fp(pn?HvFWlZ^M|Q-8?MsMW zXfwEw(x#aCS?kZ(=HKChlR(Ns1=z8?om@&Z$4V9fJ2mJafx6NMHC51;c}k#m&=FMP z+m6r{Mf20hs*8-xpOQap59KfHmqBZq5VHC0A?pIR5)=a_aYoH_8w57o+`57=GhMiv_~i9Lnt1#(=I;FNHtktbY=H0Q)y!z0>b+#^ zUlP~&1iH|Zrh%+I61O-e`KabaK8^?$rZ^}W%5w?5&|2dT7#3i`%08m|=B-L<$Uq;_ zqw$SUBx)!(Yh;~{7iQsS;aza~g~R*;dQNs6&xbo3v1c^UB7fob7`R`l#|$s;;}JG4 z3sz(+Y5STIHuy2vPn?5nl%ylk7A_1|g)2H_+;y=t?VKs3!mTWmINpofuiJ27 zHI!s&<=Jbjt)*H=(D<@#u@`$-o2jQ@0zLu2!k}sY;+f~OwF(?Egnb)qMKD{HN%jB? zWIZ5&TB_LXASw98h91qvCFp2#l2=OGMf z(1D#%|Jt!`iOjR01ikia3py~0B3`t9s1)4Zc`6!YI)GM@{flj>jtJ{<5dYv`@gD}Fv@&|4>v7lO+`f;Vte*z^H8Bur54KJH?L(gYkT2l zBJs^T=5|)6NzKb4xc*11@uH(z9+C3$(lvHmJ?Z*4HZLDbrC4ty1Tn{4@s$1-bXg%Zoyo%mPn%LW}8Tx{FMM`ma)>=<&B%8807@z z;d341!_#uyeE74N`~z+U7nh7SHvbEZ;#;pxOtp1U@_v;@B9@g2-|;gLxb#qzfoDj+ z1~EsbCAjG~v(?Bxj#V(en?udX4Q5wvlo*n-&2z#hd3U;mhhN0HrHARH`NiB_aL$g_ znodX*>TQej^IfcErInTNbTK@XSYzf@qUS}WFEwf5kaL+ubuPYje`&}8+K^2x{ZDfv zDrvX|Hq4u5v)S_f*CApH3n+n58Fgj*K3FeE`Duy9d54)XS`3I_T3k$H)lI(hiBPO3K>Art+ z_-rLHL5NrTE3u^pw21IUiAHa-jiMD|p$lKU7{3*Qu#0=)E)8OZo@27qO}*=3A^3pk zPyt1I*dg3nM?(jJ?wJH~H0yA1B?7gN&O^mrZ1cGt@t#6$?B@;@d9gDN4M>fLzNbZl zfWVg1pk&eTobc9)&O(B9qeR0}M44P~okit7anpE>bq7}3kvq5bD&tYaRm%`u7Iiyo zP!Fpm(GMM>bgN+Q%X#{DL5%aVaO~& zq!|aCy6PlEhKtTu(on#A{hguO)Qr^2{Sw^_DOo1Lnx}yQXjU(b1T%g?n1%_gN12k%VV6 z7gxSnr=#h=8GXeaQ0Y`j#VJY-8@7>Hd`<3n$jTEXZq?0}_6S@t)bA|AyCh_1H}wi1 zQk9>YpH$b>48eU1@Hibmf8$plZnD=B^({O-bIy>zi#xF_#>z)%8<{9F1~Ko&sV3Od zTxGk-u<0`Wx6c5?mt>&-_9^iKQ1l_H?TbKBnv^GKpils%1qI($)PD=B{st-Z13U%% zPRJOTno{H?7dAisTF&7orfZ~nMvlondDCr5{!GWR>a!_IOTQV2x9R1hJ>!Ks(b-cx z{qxfIt9kRfgiolFK5nkj2E^Ws{RADjrO`mT4&MW%E6Rmx^b=g9Fw{-M4i`~sVZj05-G z3EMQ6L3_1Zftvb!mRG(7SAiSUu__S8XNYgM1F^S?%s0h$%F`t-{ z0{J2@LGk_dhP?c!i}IrFnPx}EEa-EDIVC74zqRHu61q~njKtUZdh8Z@O(_zzk z{5(RXw4|RWPNQKy1`{d(W6#;xPej|7ozD>xQ?$M?tpr~w?}n! zB-<QJxqO6naf-9W?^E{ z)j72^6o2Wt?YoC1ktsCL7;owRCuV8E6Y?^VHwuPK;R4|3xB`rhNTdG>>BLO#1Zbo_ zagiq~zu7P1DwgNh=b{z`chAxm#|4{^(TjQ|e{y99?Ond>+^R2TW}P&B;L&fd{c>b- zgax1CprA5W+miRf-!0dE$J9&vdK#Y^x4aF@m0NYaAGPEaw&$>hnZ(g5f%jr=6<;OSv0{Gvc`RU zQBG3ef`kNeZ>*twF+2pHkC4^{t;t@PmhJG}x#7NdbU^yu`nF!2Td(j|W}GJPZ06Z` zbWTUIj#+HDZ=|%t?<{2%@feF+5qDkcO#4T0rRWE`5R-5VGpw??O=eNNj!Uv;k9|5$ zN(pl5(et{e%Y9q2UD2GstvpbM6j8!(SetdS<+5Q2I;P)<8#iY-?Le!YEXNvnCm52f zX>$;C{35`J-K*36VA(|@+8g&DJ}SEg3JpWNF>isOpTY1UC6Z9KcS=K9JUoQU^t|T( zH2zTD9I7q9E28?$19iUjw$*#-Rl%~jg9GbHY`B#$9>@fBidM0)? zD_HsnZd*X|85WVI)zXXRDk6(%0fv?yxpWH3HV;9NgCM`{z;e^K=+-?*+Xo>vmGt_t zfxL@CNPhC0t)eBoP>{F7VlZ2NqoK4qub`S5$I$J6!ye>n_DrKyTAy2!_M(2tLawZQ zb`4ctO?O_e7!E9QVume%HY5eB%c37Y^X$-!q_1y;0;z$H_(1P#lBl#7Rsgrbe0H{~ zI*wZt9CA9mB}uSNm-1oeTyNdH4$Fl;VUG4X#i~aKk&+}gmFbgb(6_)9yaiVf$P58Q z&5?HiD@^YBacBfc=oBNdyY%Z1k>Rm{a9tp7+X~QC#87kw$x9<|DBuwgtDvueAfWni zcQ~y(F?N9mr_(7|SQRcq`kGud+lw3Rb(h9cN|zGfC=hRVS~%DT_UNW{83H%tqty1e zCQaAD#hSiJb!1sSEvGjjX_^^q@ijXwX{Mk`@(3};s;&{wZ#l-=o=M4^aojWj=wu*=g5p4E|G#yws+4$)tyB_@{x#5~vV)4la7*NY{EhhUU0pr( z1D-aKYX@2sh#$1F?dwbyTkr_+b^}6FWlOotg7W`3u1wkLT zjX2W7!tO3q_- zjM2I|!3TU{h#8T&!<=)?8`Z76qYSU-#IkEjgoNLt{UmT79zN7rFCm6YWkv_7w@QY% z=!b6JxImg`>uE)~_kw30p0|wYGh9nhJnG)-A2yl2t>SPkCtBy=OeS+gy0~AqUVQ6_ z@D|!PLKVj^u!T#A z#b_4C>*s&-B_u{4YS4(h)a_r)J0pN<_jHZh43~8`d=zgz*2jFhS&u)HIcSoPp*??W zCPk=DGrN-KtL4FO8k$!^Rvr+W6`Gy-8dF@d1{eCVlfs#f4cKK~YWy31VYy#wki-L@ zbXyp4LrW&=?B%uE8#j>gX?Ga-MEf2%bTU9p`siO!0J)?}7-gcN9Q#@#a;pVGfzOFS zdeFLET)vtmnSTrN!SZ>vw9AdjKckmnK_<4VI&&Ih^KCJYCR;D)|EY*x7>|g@4;Vti zh}DBO!|5vX*gGVh-vXJ@7#V$)wDXFVIm3+!vSTAYQ>H#lXY*=h^mPaMc1E23 zl&`YA$fDKA&*{Pms=Nv{wz3572^pfun92_iL+}$oeE3{Lq#ax>rp}(#glYl@A-yMA z&=QW~M8<5~35FsVZjCd@V7#m66m`ecv6)(fzJ^I_rjj3CfLE$+eh!yR^j2BPOw1uNK0rq+H#c(H;2bH$k4c8RW+rq0F2 z?8}uSC}N71L9K?uE3H0KpntAxcPNaQ7%?j-TQQ8+Y!%Op_Nr#~@#S6CQ*XVD(=k{J z_buqfQHfVFy!E2h7niz~BkPl+tou9ryrSyeg;A?C`_p<}EqY$njELU!CnlE?{JTZ~ zzcEZR6iHBredkwx(Thr@mK+$wr#o67lvyXuk8u3!8-p-I!{YA%n!km|*sGtA*Q?yV z_IE(+O!>~FWYVsexE=l{mu%sL=I9!dy#0-il*FYx(7Q;4)H9wpkH>43Wpr5{G*Rz={<^ZE z*F)xV@CR&4p<>W?peuLb7JFfC=XQ?>EcQ952y%&Qp0W@G17+2xDcFA-l^8$!!%mJu zLR}SLzdaCc!T2~Eo2_1@jVRNG|*WT6rC0rK_^`#<=|b|`Kr#z z8~VP}cE~ZGBk3$~*R?PF%C4>)6C-7JxhD}%2xju(v|BHu`#n~*cxTxBC;PoFSf3PB zLH8KnHVpa6jJxZiqCX0*=ojf=wkLpgSuHEux$Q%yqq|#^^IK{|CmQ&W>9=dpr*h`s z9BhAUCvE{X2(|R*oOOF6DMM|(q6E5rQdZi{$}x;&+=EF z06J2Pi6cGbqW0n|TuQh+vHXT?fRjkOj!;e3q>KGjv%-0N21>=SjynA(k%QFk87c3c ztsW^?m-oS!@1!;>=FLyX1i=?mC5#XwuNkNCZacvMg8D?)cTi#XD`||m2i{QNw|;qi z1!-{j_tqbW$H=?3{;iR^a(+^Bo;xleeKcLWGdDk{as@@o6`nM)T4lq?$UBx}XWO_! z_^UpQO!c;+r5>~P3A!TxxvzPW=Zv2uc`64Z!W8EYiDA;s$FZCgR6Vp zCp9lQMDlA!%7iR5fixA}k4^^$E?6`Vhi#tLU0lJrXg~)asY|SiCSF@K?o~h!BU^QL zlBh(x-JQVGdfA5o&!z>=&$C>L18v*l)z$5&P@-uHu8qlETG=@>Plp`2&c@&)DC1-I z1`-l5u)kIwS#1myFIj%FEm)C3iqeOo{TrT`V^{VDYnIPfwaB>s@Zy^Y7K~8!WV*}7 zr1zeBgq77u&*J;Vg_??Y8P9%9=ZIy9*(95Cytn)ju{FBzy*@qtKnt%r=8oD2E29v; zYYjok_l_u4XnOT6Cd;f(Rd*P3^H`2$_FAqcFUvQm(UyPzY*$wTFGC7QNzk}tA5ONjgio$kOea?QMxMv` zycJn$t0{Lat#&KDGiZNDrn|O0YfEcAi}p(4wisj9mx!g#mE-17QSJCIxe57=)6QIy zuB*#qX5I!kkxMtW`<=czC}|K|_?c!TC$e=4C3>>Rj!I_jA3C4Z2}0jW{m25k@G0V; z%7imEM_s>C~6+pu6#SHkG%Jm}#_X+LVl{OH@c-)%MRk~g15UAVfq+0VZ(U;6A_-rgZ|pZpo^ zV`eqtW!3x2OcL%+F5Voi9ks<b7C7Mooy;9 z-@lBQeMm@n=I(gZKFd~2tkK@-&Q@NZ9bO_*v5_Tp^l_?>jq1y6d(PgxYnLl`e-7j; zru6$2kbG3x?X#N13QZ?(SdQGVoW2!>KXD={p~vu**PRM>)O88h(fr;gS*`&oK9y{V zS@yJQbyIl7{k_WpvIn~ENq)}hr{<$mOr+=AzAFN9oM|sS=uj@JLc?Etlp-JIfo?e0 z^vX*hG=7lZWlG|sa~)4i?3pGWjh<5hoEtksiqd-z^VabVz29nzdcUFkzWdY}bcm}K z+hvI>7bd&U{=}JQPZs@|`rSe3#JLTajNZo#pqOIECOvjCsDD)=sO&Kg}d0pBvk-n1@HP4*LopdsJNPQ>SS9 z+mG$-1^K(xaXx{IKc4EpN}43lj%QVE>T%B)-J}?(?sGbK*Q;76{ZS5frtH~@qb+%6 z&C4RYkjudk;LgPTL#IqxV$`OQt8C$q43xS7MjuB;Wmw+98r@I13$sH}VylmJEe=`u z*X;e?7pSl;-m|~Yp}O;_bFgEEat=0D6_UYs(3s;nJ;XomX(u=?3$lZozsDB%ZT{HJ zF=U+Tv3NvdDX&%`DQ1n=zc`V%xEsJk`C&C0J-fa)WW&mfnvb2+QHO5e>H{;ip_;@j z-^EZ(s_%X`z}XePH=4NuKz&(|VZ0hxqs~ZeMCaf)i*8QXlV?me?jzLS!=I5i|9S65 zf6qNhhW*dNphS#;{2SN>%TJMR%Kc5k$gx2V5zBKhR*mKWkffwM9f*W8P+u<-HH|&~ z{CO!EVt78YZ&HnhKP^{#UAmY^s&+2Ptgd!MV<_RCFtZ1_j>Gc2kLsqRasrKx@wkS@ zaOaw{pH(9AZi6^oX0zaCG90qZ^!aye_{MK^!wcK$A$VfBMZ&5c98i?`LIEmfWQHVa zusnBR9pjI=oC{=F*$naq)w{W`S`cX!T}Wq*lFB)5EiOk-YWJsH`GZP3*% zkGB7}l|HMQUQ3M~O+|<+s%DHfC@WWwmsPU{&aADTan|C|TW};Wp|5Oc+oV)~ zi$s}!=SMwZCj(xW;yeBc5r@-PI>qq{E376mo)=Uj$9%#*bebaftvP5@0_2-=hsO%d zeKjhLE7z@iKDRw*(4#Vjy87Rq*~8C3DfMGTZj@2GT}D6S9*}?}bAIGs1$m=aNvGo# z&XC%YJNy_68uIiK(u_I02ru;83#_wd^(IsRNy~} zmJ4lzUCAWB=pLz&mLa_8bEax9>dOaZ?>~-!qk5(B><32j#oSdda=T}?EGtO%Vc#uT zQ4BF1ax>NclS<8j8fv$x>BG61LK$EoL|TE56^5X7HF7c-ql*By!@2XZR-kP{;{&iF z8E)7{4B>q@aGd0jl!;0-ct93SZ zsBX9Lz; zZIs}6D|nGN`_|ITdI#^=EP_5tcn&RU6XE?AWxSOu$RK4}cx~iK*j!)l0@{>fFRbH& zikE}LiP3Xn$Go01oVRtEI!m;YmAQ<`58hGn=-THuEdEg3S9($ z4*B!Ij$>4CwEwge8C8vFY40bjggl&|;2WI~E;sW+>3+lwjm28QaeBy#%3Ov9mY#cs znP%pVfdE2Qh;C?p4}>#C>KA(cv$&4^SsBXvipUx5fS9G_vPA*tuzzY{U=P4TCYY3V zhcR%gI!c@vrVxDwxie;oY$#DZOhB3VM5n=oz-`8%}drEXqDO|8t|Nz7+7@`zG!3@9+ipXDAJ zufIzn?{{-3Z@5ZxU@0C9IvFsH0e$3Ka^8=}_-gIXSV?1!$`z_hr)4lKb9ZmML{3hfgKrx%?5lzJG*E$_dmh5uBMp5{b4Ouc4_wd~3YS?4 zHM91sR13#(HccXqUe*1eNG&-;QUO&*cn8x>PB(9OtWw_Kr32nZK!ipP`JYCf+}LwA z(lb5Kv6>xBAqKh5M)n(t@kEE6>U_$OIs;C-9~GxEb*#h>Tr9U5Rn+uhWlvuihVv6S zi=QE|`cs9^7`n1`*GKm>v9yd}ZpihF!9Vp_U0FD` zEz^~AE`oES^u7&y2h^sZblD$^So^~1)Ds-1)luFKkh)c8qw>27sViy1bFg`XX1Q}R zmk*vi46GG~BP0IFWws4oZ1EW*bv0DaE}8Ca7~I9E0m93wgy!Ue#C?nW8T^Zhq0g%sx*ml_oavR(SpMs~H^0uN-U*E>EXL1`7w9nd=+U zKrh8Jl#R3(7w3L=OFvBJ2>oKi1jdNMggH0T=uQAxk%Jngc#z z69?O;sAU1l^oP9anQcDhoO0G7V5B3@Z3;BOnF$c{A6+aH$)@NB6ZhmNw@e=vtgF`f z_`tkym*WJ-siwsd29=p>#O&=kD*vARI&savdfb{0bHN{j?=+IU7I*IW$AgMuY!q7{ zT^{7c7FZsl4sfn;!$6pd1eOEX{HqV5vh)Y-nQsxrxc$uoHB0n zN=LmSTres;$?e?KixI4I{d0y~^H&sGD6a?x{nIY9XWy{=Q`_0KooR}*MH1u$lhTR! z+s;k8U@mtl3ZoeGxm^(hU&{H4A437i@CUDh_B~2hhIZj36Auf(795Bu8`0i_(!{9> zc%UGVIRv((3w zI8pnjRkC7@>=>yQIG~2kl)^d+l;W(13L1k2eEGlS!Z#LX9h(yIwgWg1V@T`s^|}_< zScv)6%}rH?F;xrYFCA^@tyG&ju#)kgZCr7gHGaoOw(jQ6ypaoUk6;Anc@mDRSINLpkFbuLr*##FC|bPX33z1JSYU;H~JlMF8D?z>z^XsX2Fp#qh(- zOemmY#2==j(=sX=weXr_IRM)-Y4|r*1ZIRcvW;gTtRZuOdhR4gx-El6wXJ@F%V(^S z;Xj(Rx}}8192unAxC4kSE~Cz|8lk{N)j?y$@X9&zd9}-IxjcDc`mo(spicXrJqKk} zgKreP=T$95(eSiG|A-Bt6248p`$}dznf7KNf_?Q;zl^bHKQ$z*m=6X#Li#@tvzH&j zEl?8*Gu&S_JtK4iR!wwYnMnto0%E3c=p3ch{>*XpSwjRMm*JsIu+8ax5sT~|t5crY zen6w&e5gOck*bnN@PZ%rrazjlfd3W%OSXoGX>{Lc$?9`*qBnBBHvZT11KGb(31sbm z-~Um8nIqMP(6#ECB|H0*X@SG6GG$G6ivuL3ipMo zGpvKDZ61o$@0<4x4^eI0&KvZ;fqqd9Gy_?sK773+;Wa@vc;}H#Om}H8sM+*KQP?Vg z5U>wnU>|H5Z8!T&P`!lh-yQ z6(|5cSqYsP?)!$gHVWYg!1t_uOy>b~zVn($5}^cltAEjk5DIHBhwWcS$5#Ve^Mbv( zQj4T+aPHaOyyBGmU}k4a4ipFf3>=`wSx=t6q4fLlpmDUw%XeWV7!WP$Jb0MLY!rBS z03H@Gd^Pk*WNVS5I%D_1jC4^JE?^r$%|jrK-b~Os_KO@5>gh z%AN=AUUeRM7q;ZWC%}O2DgN!*1f8Bu<20 z4Gn{bPonTBU?H#f={R{+w}PzCjN5EfmneMEXDK|Zm?TCuitX_m)1~ z2`>U)5&FMVIpmE-KReD4`I98ss8NN^nC3a^@^>XmprDwJH8$dz3xMitk-x{~UNN zVc*5hK=lj1f8`T!4{eNfAflop#{>1ai^4}BNaHExFF*34E)L=|J79IIf3v|FLty|S zRNk)WXV@f~TJ{Y;KpjA`7}27(*CwSGz5yKpy-_$|!Qda2e)58%-{7S{E%~RyWaelk|4Ufa^oG{+)teSAAHyU5zXwUHub{jpObJ-)TQcI z4b8#G>N~x^ZvskvuketbImk{2KGwmd7(+}PO7>IM@f?lu&(nv`x|xnk!IzIspL+CF zXf5El_YJpK7dO2@h_671h8SzrsT__avF~ipAV;=N-5U;Fp=xmzm%<9>Tu{EZR8G=$WgS z5wAYQgQtYATYfX@Y4rukp{GQ{-6b~c-;i%)5hcbB`)HuR=bBP30@__sGjJ;R@qtBN2K!m$k1go` zDzqtA0>Ahw{pT_>bfLu!*p`#8N06Qv-{)05sD&*HbeSr5xLQpXQ;@!Yo~$prNH&VFiRnXNV z?~Y$Ov2l!SaZ~Q1bpq&xL-JCoNawy?$To3WHqs%UXn~+X@cS*&>9Hw9&IZnQVC$qC z09VA&%iCMIiWEV!F$HSh1FjW@`Njbi>46Vxgg~Ssl@-<8$)o~LEAUXdd@G}+n%Hlh zA3C$7-GC&-nE!B%0GWTG;6k+ho+GI)3!8+pf7ZQP;m z5u7Cx`DjGsl-L)TFjn&*J`GNyf`H;*%L_W+nDagVNkZCp1-e>!8I^-ks4<#A@W7*A z7tp%T7|JfxogN(yo|@2BKCyIP^rYq^NG8OAqOBXUJSpE?Q2On)F$NnoWhv}$pb(kX zHV~|{xqt;mz*}VVsboR2=ekUEYIqqB7c^L69~__lzqL9F*@3JXW-ZHAjFw2H7B;qhKVwA4i0m}`*(k2CFG z5^8`4OJ@Z^SrUS-+P?|k?{;@_AQjN+>e>UpB?TeeRm+;*I^a0|*z~ZRs&e{9qmQ9)f4f)p zIVHcJq3Wt4&=aB@w0n#=qnz`W=F6jo?i5W+Ab z*-Tn*Gc+bbnqmWVbnrMn`JEV9dwd~j!+b$XLHdGZx!e6WE;q3=kdy>XEAttpKS?)o zK_<+_CUUe`8-4gU^SBp_d4|JBhD?6-x{N-j?N{Fy7mgC}!?=ZrD+<4ln`fM)lzWnX zEL+=)mAnftdW@<)>MgA^apK9R&vgB*aJ)ljQxm>8MD%z*x-DpE6J>KEqU1UL%Z%T_ zB0Gdk=EJETN7(Y)N?d0M{q!QVP@M}z;*=@Q-^tT#THxU@GqoDN`pMw z2uc2H)!%Y={vG4$@=My2I%@@U@vX|IQi8 zEsCx6XEl_JG;6q4#mn?{8Sp6J>ba3XlCA*mu#nTI&rwBSS9R)?C3=TF=YK)M8|@F- zgItR2t(8S!cuBCf+lMwxBj!I#*$b|{2fn8CFGVUjmK|(LxqhI7JEreBMsd7;At{gg zWS{J}v*3BluU+mXe5)IiU4Dl;|16qia_B5U4P1-F%KnJ?!;qUj-8W*0AtHGwMu?sn z5hbKLx4lw`{R_uzWQ}qBo!_?@_SMTuh4VNw{0oHc08tl$&AJCG8aVl#a-gphP=uKe zr({~gGzpw_${*L)U}x8WS-XI?mV>rliV&vZX_Q8k9bt?PWbmLV3>M<$Zod~ZN{zZ9 zjl+-@KajpVR|x?#hZkfZ`&DQLjlc@FD93Eq@QW?3_PoY8uXQkJjZ(nwJ=$6UnNXwK zeELorXQQyo!JVMV_vTs&>##i!0G~A zFT1%V`!;@l(r1wp?NF_Pm)o*HS`hS6-0urY5#qEM{hD6f{!uoZa-z*%H=q?T(wW@# zp`{1olki$xZDSY}8tPAsy=NnuN~s0lU+V&AbWTRk7)cGD^uCIIM(byU#ze8>laHOi zCwrq*@9#1|2rpEHOAy!mr&gr^kEWEJGzE0ePRH~yViduACYurnaS-2l^g|$usZ^PI zF$2~)a?o27qSJFI1vU<)p02q*Kj5%58$V$SvB5sMKk>mp00ie=La;69{N4$cA{!x) zu-7`WhVldx9B^PzOvzOEr!$k6!QxpiNrC{c)@dBtVefzUGW$5&~-0^a3%XLT>=@25pY(}gI5Q)8Qg+-u(8z}a~Q?uP# zp0oVR(2A?U>6->a#Helu+YF+BRClQOH7+35ijfT5Zx9bm#Y|`cVR8U6?eD8;o2*(*j6G;D*k^F|?jRt2o;=HQ%lT|e10R_8*};}n(?<&pBk6$=0*%gvpA&x zQRvDmxY?rqmy&IVMAMezIIded6Z_{7`3LM9uQMIs8fT=0WTI=uLEzsx_n(9)opA~^ z_MCy+AxF|=BLOBUJ_P}WGG5eDJ-3fjY<#LIPSiYbY0t{Lk$qip`Jt@*ch{p_YmZAs zw1ON(w^$paSTiP_LAQo3eh>cwYX*hh;33=Htl?HDhfA*iB=X+-gxfu^dnY(~aqV z9Vj{KHdlm4g9358Ns=GlQj{uM-1w=Y-mLLow%`<`1ox*zz1~mqgf*&OPt}unn?BHz z$IPM9!|TIJUIuoR^VhLIe+~)36T!M*k>Y5tfv0232IFlYG_`h*cv^4SotR9?#)v%E z8@pRSvI}J91MRKO?{>yn2W)H#nG~!qFNGw@gr1YzO6L%n8Cgn_?qHf1u2bqGfGW)? zC`iLpx+KEFNAC`gc*Z%7l@Wvaf2O$~;aySRKWzwi-^e`jhl0EX3%Xic1OHb9^jN!B z$U>3*l9WuO_-!ldr>c+?-~+Fy4ZuxLoYa{aq`Tw*UhD?|r);}jY6+stO5^43tG_|1 z_^kVPf4T2TdhB#hSw7h79Q9tVGjaZY$1*P8qR)Q`+se7!9a*@`{B*~r;3D-fyZ0F2 z^8U3UX>i)E@YJ&`h5;$!Ia4HM;d;-^i~m%RUazKihn=kZ*NzeT8bgRII-I>EL%s1F z(sO@+=M|zjQRkvyE+Rw&#q?yzaQ_!p8H738Z*E!dvk+I1F1`zg_ND58(N)m0YB6$x z^oCw*>?CW@2Dx$X(kfX@bYRCgZudu;y|8uF;OpnliEh2ObY-W~(S5?LYQLUD9;GNe z@ri~LpL_{(JNK7b@cjPYCzEc$J*I)>f1-U$Bn8rVGc-2aYsiDQa~f|1yYYyp;skSz zQ>A(NwE>KnlDzL+jHdg^Lnv#!EQU*S<{OSVpMX8ROdkg8IxG zGD&*@b$+YDtwDQLtp%GqHl6i%`}C)*{2QK+bt#m|%1arJcUTuc*!q&})r?XI8kA@_ zapFXci-^LVA}>hdOc%Saz6aYjgNM4JcBxJ(m~weNd-}CM!szTjkl}_a4C~B+6IMOP zL1CvbURS4Hd~-vQ<6*7F@UnoULLw>Uken!BIg)weZ1l7;exL;0;nrkH@&MIt6fAiS z)K<1_;tNCfu+_{*0(Zdfw+`dVb9+1CahA)lG!JeyyjSzinBP48dc*Bsxsw#PsmMY7 zqh!ofvU_*LY;561Z)%E-`e%$N0OIsQ>E9&1iq+;Rzlp28sHz%jJ?!Q33>j|x~yAv1eEiWxzK(v>+pl)KaqVwZ3EAM0Ss_7;`I{gnUcHf9 zST)e&7*K)QMZJ3fPlwNU2M~)nBYAW3D_9N;CG%2lxRY3%Ct@9|yZiO^HC^eMHo8eJ z_tCSA-ecubql>x5z2@`+lk;zrpDrPo zrr{Pm|NQtAp)&Z<{#TAjjm^VzVUT^p^7M6?3oOXx4SD-J+yr=oe7YRxCF+5*GSBak zIA9CW$QJV9cAN+~3C;Uyzb4+_&uoEU#EY5}Qgn>hf<=KmvD`b%9QZ93!?*G*32?Zc z-v8hwhkFy>&7Y9B0}%Igi)D=K3zTyiyKSssrBx<{xw8A^VQ! z+*HYoH>BzD)oB6K;ZhYolal86HLSd6%2=}E z;)`jE0Cj>rWYo}7siJW$e~l{zUKckA|^8W_Fdi!7HDPxCdrZt7nl&~i)I~@ z-pQPnGq?fp7!AaEA30(ATyB&#rRcP?FrR}8Xx}WvX&J#>lv`?3FI(P1nvz0J3W||q zA)^E{yGFJNQ=^>Tw-&EULdHRm94hfFGMi0=vnBQseEGq5LT;V?^F>4((+l#etw}OA z*}~Svd__~|FCH3daoCuPk{X*WwI6E}t90019gz3B(U+*Wn9^PKhkSLszwcbpds_qv^gUnR3uS;`_7n8bBN6i@nlFb=^0_m+EQc`obv; zEzHx$Iq#9>MLNNqR zUw7^Ie9BPFSwp3kKed;C5}$lsM?e00fAQ@oE?4?FmBOx!zWSbpksYC+#iHffV)K*= zqGYz5@6^1>Ld7q(_0)YKi9qO*L}n+&bj*A|J}ew{>*WRjs}DkFQ9`j8h{7DgBnRuS$|?qOoUEYt3^pG19{k-UEPP(5JJ-b$KIQ`L%D_z zz%vF@VN^(2D~gd;>x`|%k`XeNlr=3Yp{OV-IY zq?od2`|elg{LcAZ-(T>3*YCPc*L7;%_kHf?-ky7V?mKPr=#EMK?B_Xe>S2E|Anpk- z8k^DTAA&39FR|<^F9yC7w)YYG zJgVsBUG&Ox$7ekZyjFb`QW@eX*%|?lmRm^GQvIlI?D@iU%p?2UQ)-p1-`jfwst58a zH_*!WBwlTNS?so_w5iB$Z~0`Kokw4y-URA=sZe)Ehb;t}S`AFRPKNgICEMAgP$!=a zJC(h=yfE-%DCo(9+}2Ic{?!{B;o!LkvE2xC9cFKosa(Pl;MlCK{qZ;X5~t=@bk<7j1)u#6~Z!+WScD0;|Jh1+Z4EXSulbp?6lZbrG~ zYiT*JU)xCMJ1<)YW%9L;-)}K3_qy--$>Sa0?1gv{@LN8k*Pw`Ka@>-paF?!?!six0~ASDN2KcJ*&%VRZli+Qf!4d_a`_ zvf+oP+-lsvZ{{sUkLNNjI{iy2Uw|RlTIb==ANsKCu5MzQZJCj;4E}iQ!-e2{P&KPy zXO}VV{id9hk}`X5XxHVXcR$3+eI}ocXj=O_K(0D>*kCohSLg|=S&I61I7%fOD20Qp z61nTy6>P=qyAT~xUO3u$8xHCdk-M$Ug`>A$gR`O>ZH^ekd-65G3?)OYpeX0XzqS<# zY^#)YQtK8~AvnSh-?op;yJ2qNYOy1jufzz5K!CpeKY+FGp(8MTU<>jE;PVY26hrR- z`w+bC)k+5MJ(2&Td$I<>+#y4EG(D87;NuzOTh-D|ZOA z@)powdwFJg&DKVz`OJ$@@?htqa9T=B8|z*!gIQ66>;Qw#l0`sY<P{)CN$77FY+SF%6J0K!b9zsGn3L^9+lV)i!U&H6pPkBv(L7ebY?q( za;C^|Um~#ABP*l<{K>y8WTkB2qAwmA-r~+1C?@XPg*wb>>0w6zVA=GS@emJLT1(l- zMLQc%q=f1Yu&>fEfvH!GB_N#?WC=9J1)wN~zA|n&Bs8)BZ)GEkjJ}2iOdUi4K`Orx zR6D)r;F2U|J$HIU`+?;yS`&H}-18WS3n)C-a!?R(hjYfEbKKX759W~C_{s=1s8Y7) zUj>qxK->aPyqysUD)A}`$Jcx7+$Axk@@ocjiw+NX!pdv31&a?#s_9{Iz^_dR z&l*PDvC^x|k?%uG@hooFjCMK8mSkEgu5-4YUYG3`#U21xc6X3`PE#qY_uwZL1dWwF zb>0z4U+e@>tN$$Fay8itqH+7IgzlkNc)osu-GSG!_Xf_&4=8kx84~7-Sq`!3DrF9Y z$#o^?Dv0j521|3$Mko-NwbAJ{b_P#tzX*gu1>bla{Aq_uJ`K(G^GFs8BLb&Xexys6 zjq#~WV3>P6?cgO`JTJ!m01<(|iE9YF;{fYcca8hTpl2}4;WWy$XM1g}cS(cx$J`qoOTo z?WmxsBHJY^Ads$l3q4>DQb(tI47BY{Fr1ZiG8d1&oL&If@*wondjD7I{?&BR&p^3+ zY;Am8AHPw{MLixFzU~6>(u#UU1H&jZ5c*;e`ndi}pKT-465fu9i`p^1!qR#WdAWz> z+{q9E#^HdxiDQB=H)&%>FmCEBzGX}YR7&+CjuBE>aUG|20?u-6cI!W9c>B9$kGf~yc^>ORu9xS6 z`5t6^L82$yf7?Vc(+iBqOZYu+t3*3gRBd&V1%lUWHt+r>9~B9YiBN(esJs%)J3@3v>I5A4m(C1aI0IZ_&D4U8u3)17>i99XL37&mb|+Jq7K7HC zKAe(a(b^Tu6@atsCi9M{-4hwiS5b*4DGzCV$B*5dSK}4~C`#%r6tL7H*Uto{ zp7CtN;lhgLL;xhQOE9&3S?PfhBIfGj66`L3R~Gc5r@NF#G_1!nw~3pB1R!efipMZY z_LZBQE!yC{wzj?ApXM}GBw;nbhzmFY#h=gOv;G>X?EATv8wc6&)HLU%0O;}SAXgBT zUtsGnKL0#!6FR^e8Bo+QD-ipWqMN_Y%Q^Os8mQ*jxH&0hhM$N8smG9NR2l{!sb_={ zW;pUS3zc3^V^5m02OUr9%R$bv0fS3dT+!ZCa>6~0G%xblME9z9Y>a%5Bc#}4z-bR) zQ=CKLr&EW%KTxsc5=y~76_L!c2c*wHs=BSlLcP_;84jy4)1X*&Bz%_YUAa@}r3{$W zP7ou`MrJSpYySjVN-&Qot~(f$Q6g7~6K8m4lw9{EP0Yzr?hjoH1j{n$_^~Ad%$v`r zx~Gv#f9t7s#AC@5o7N#!5Dy)slPhIAN_ ztpkEZaRJ@x2nK)a0f=t(F_R$dD>uFXz{o=R>aXaVaRH>#Hs;Gx*4N5Ieg+d}<6PLN zX8QEo`+4Rk(b^PC+9aZW-Z(2|_KH5~2|E%Nl=r`DBeBXhE1m zfL$XhvT34CYy7az+cwm$Fue0xN{vJe2jfa`@cuAebVp0JLrasShXVzF6OGm`oDV3*%|2o)x<{oX_%z~LBzS)D? zqi->Ivf!i2aW3Qo~oVebO#WZR}MA?nuIl^uQXjC7sN*!(Rv{bU+V)rzYVfH*W zYoMx^f3NMSlf2j8Yc*Sr6)nD_19`&31tMId1&?t*-cL z94V`%DhBR!tk31sm4q}1T#x|{mxpp?*yg&DY=4+is1RuBd!9r%!C%)*sU$+isdvK0 zGxq$be5A*Xy0q}4a>Lc&I*&udqwtj2tnb~`55PAhVI@doA^{O;wg~Le8llDsOeQ2? z3>*5wgdth5dNm$d5dM=et>dvnid{27QvBfgsNW}`qQS61&wRH%9kM26yMGBF@^n<9 zO~D=7J3Xa*pioD@p@zGMF^j~qj`a4q4Z@Pd%n`` z{?>|xFofbpRJ2NeOnf_ zvIY3z;V&N=*=x&%fKB;l;Is_}gTfKgtu1eoc%f2vn>DkErT_p{YzLRb6uKDxjhKu` zkhU{SZ^TGIa|NDNrwP@nL(dZzXBgP{0{Wkk$+Y?ijf zSTuoftiZ=hFxneR)FJi3TZf53cqAL38E)&Cn)3DK|A)UnW`dqQ!`^`C*;in!0$aqM zzh!Qw&7-+CLjHnkGFnOtNjrlkkPvjL_`wSDl^w*~1v;im5jd=d zYO?nq*pwg<_;ro_I_Oe;PULwQQn@Mw)NpfvvuPNe%AX=4WzcDV50l4Vwf{NgDIY3p zCvrjh*Mj8d$BrjI6J}=aUO1{$0KA3-(<;_?Yz(;Qn-XcqzqrYk2kK*aaQx%wuN%cZ zruTeE8<%RBx{8E+hvFz($2JunQ`9{8Xb-SVLa~b$U-lG9bh)v8BVG8=L zS&3rIOz_LDB3QmVz4QVS2o7M%%%&$kDqK0fF*@aDm_Is|4m1&wHY5xFtLUuZm<&(? zzgj9}4sO+jxC1Ubkv#s|xqXoNQ5O4-XIDQ2+~oK5X+mC!ABw!uTvg{W0!uxT#lI{* z*AIw)2d--*jD`Oj)ftg+cvbVsAP!y(7|D8|E{vB(#4LJI6)HrN8$BrPAdsI4RxK9t zk{8fTe7%BSb;V_=uNKj^yuq&Un|1SP`GoL))rk_+mrL<4?g!ao@sIb8`&O>smK6(h zNYQ_4YAr`Jsi*TP!~W(LOP84dz7SiCnM9Kw{yA{seT-tHZZ-VY(Qav6{HvrN0W@PB zK$*&yA`MWkhM7RUW_;QV2`RxjrF?%%{4-6lfI&oLg?<>rN=1CjTLPrtOAJyI-tS=E zqcxd=fVIP5@3&Bl@DE?^05fuY%`vo{zUwFbb{<4D%|KKh5t-Z09e}kE*UM`Ezp|}_+&U1W z?9ZqA-Zd@U*a49mD6i3v9qt5{%4OEk>Wo~sr0E@x5AnQ?1M~2y2A7|0a4^!e;N)FQ zU#8+bLLwK1&&HkZ|NEn0epw=dJOl>Q6v&wBQ2;ZBzZWAVntYBKij~qq*t_{q8u+{84Y6{EHI z>$dzJ7iM&?^iKpv749i^0#m)l`@H>Oi}CrjTtwzVOygD8{|h6OpR0frcB2DC4CY zQ&p4Y9xM>h2G402VMp5`ca7297@*D7bS@@@M!uuz<@wp4uQ4L?{<|wES&4uzj32RB zyuzPvO`(S_%5wie6oeu6ehx_P73OKtq0~AaERWsH_icMza(tTL`zIQ`kNq!%!)8!{ zcBVSQ0eH$m3SFq4c?kq{nc{o<(5M*gGWvD9<_y0L&pq<7iThV7+(D>3kCBZ#RsYvs zXaLD;T7>1XrITxv*9iIARihmb0Felw=Zuq}&Fw#o9V;(X52!CvQG>?| zwFxxNrox|MX*|ozsz4pIg!x6h}5-I=xcPGaGH4A>Jf`1SF)#t3Q|EqeC_p%QE zdt$GCM-1kV{r8L6|7%l7R1xCv|5-6s=~s^FfBwm8+kfeRXruoF;s3Dki#`6o!3*G0 z9xr9Y&+uHn!P?KO!J#)HSLpr~ib6PX3iq$@OG!$*tTE%mK_Kye{R(AK|M|Q8|A`zz z{Qox={`TB68t;$;@!ZcNQX70&XPUSCqe#5}wK)GzbNvrL{lC%pfBO6Xx2KrEe@^!- zJv@Wg{gYPFsew8>o)65(-lxG)b-4E|Lf-W^%5cDxA`t|uAUtDt*f-kFe7_0r;S0wr z99a|6mzD$g@&!xI>BK-laft4KRdrwQRRO&pw zsk3%-QZ3a#EU8U1mwy>;-x{=trSMTU>`S1IdyZ3q9o_Z;X?~Nw4>OWkoqWvG1Xg>XRD#i|N zHxP)DtZ|IdfJKQoD@xvAsvz=Qy7_*wxuPFB; z-*rNgo=5L4U7DTY6YYx6vmdj?`L+`~MKAq%|M~lAQSrj_d(J!X*?*p$uNkW>njn3j zcUtfsuIoBp@vzCh!G59ccyR8C{GXF4_=jRou5_=lFK+WztG)Ja7habGUR2XAp|~;U zEIOG~j`8Q8$xxhb&}J_q#{+WD$#9E}> z!UX>f)s4|yqe+RX(@~#1!lDa0d`L-3WC$%LyVP8EoS551xy-sUbbk2GuszA`R)60# zTC}#LGN>+K!aL5)O0apRa)36y^joiS95tw}FEHjRi{M1~J(!#r-@+4_7Zt8(_S<;7 z*7&jSr!>VCbj7Elb6h76kxA{x>D~72-iKJFDoHVWjjivIJNY^y`a?P!o(^Bj(IR(e z?7Mfqs;=o2Y4jAkzt?-i<92-xTAV}Ap zYU*5gXp9`}v|=)$8P%WWn^RnL6#wne_p(qgo9e12>nw#+4;6!w`4+d#iPUlyf4(^` z5t18@Zm&^#+FMu_M5eb_?xiRito3R$__(2f-f!3v7nX{traVi5@L+cVH(lr%S49iY z$O(HHX2fHJ@^>AdxDe&Dg?qF2`v>~uwZGh~uHYH-qT%E$zu$96g{DWg&)3||snAw!y$+lvWJVf|W;z7b z^|S?aZ#!_JUO7{7Wih(H@>7%Hm88M=7G2TWp8Gycm5N2%vf|v>!I4d~c{HaX`n^|% zHq zh#(liYf#TYe{@B|aPZyiE~c!se_oU^{+qr9s^sc~rl9#n&*&stDyk1#l}fGB){MER z%qZmJ9%PU7dJ7MqH_5dqxaH!~J8?dmJ}LI}PBs(@s0LN4HH3+ZKbRbd@zb>TEu)QbMnIK}?nF4|s< z!Z6+ZCNAA)#AAh`$=w$z!0%tXow=2c3l^Tc$eQ0u-S?O?0ZeN>X zQt9n!Q+D~e-er&+oy7i-pU3L!1n5h4=tcfH3GQ?Hq;<^|(FQ;6dwTSkv&X}Da$Nt| zq=o3E&hpxw*^D94OP`x~`dEa$0xSsIA=yl1OKp1@zFv{BO&@4F*w~Az^tJS(7R%qy zx<+NhONc6{$9$3Yk219~aXn5~oSpDLK@H51Qi2WqH)1Rk*2CX5Aj9Hnpysf zx$8u>lSzA&3%BikN4N@i9D6e2LGR5rxF7M}{9aJV+DU__52b7Lbo#{HY(wwZyd3RJ zV4d_Cktn*g=(*k|j1!B{CrURu!X}o8+G8)JlSy3|0X%C==1|Da!V@(@qP3qysI2Np z90EU-^CIwjKGvvZ&og(?F#OUNU!9H2(o-0un@8c&Yd{<^+F@xZ?r~*we63Ps&JJCH zU^z}Ol_FzpMH)TCyorz0b=)VD0?cM{i@0*0HUG0ia}2H_OP>Dh$|RH4mT1&YHDfK@ z_g2_lP|RuC$d+Sf`movsCvRAi7Rbkjwf^W|`g!+d@UleteHWbyP0r%N$i4@5x#1@7 z{PI21{T*k&L!LK1f6$W86(gIWxKaqA!&v!*JJ)1AZeL4<&Y+EtY2xTE-0s$qpS!s- z&d&t>i!NR!lV;OOc3s>?IeKBUN96sRLUrJ7T*syVfKy?Oc1+p`^*BXJjIT3}win>u z+h}YK;WOu1nf%e@)%ZhE^W|t{dBdz}XQV7#rVGBibdqhZiUHaq>c3 z^5Lg4%Ym#b=X^JN$h6la3=m5ml1X;QgOhco0|cv1WM@l;HK8Wn5mIHPq2qbhF{I$^ zi{qRzUK&?%w|_k5$`Nz5pUXUp3f$c{^;%=eL|T7ZjY^mnwyt@2VJ+8@4cA{Tdf*va zmKFTEvYGSo*5Y$AwY4`VhUn#YPQ%yalouPwd2A^9In8_t$<+Bf_f=hOc%0D7DxBb6 z`(S3Td}^j;g;RBxeekiy(wnpuK3xkqfrf|yzn9>0!{S?HL^*{DG>7nk3*%2RY*&`e z5xLn1C&oFbppdj`e_>7jQLZi+JxkJO=wjOGb}Q)z#Pzol!h~zm}>C{U6KpC}$^1Wb?PG#`Amd zao4gv2%KF%mm2X5s9@>|-dS5MZvE1L*@f@Dsr5bctUWeHwY^48k>M-P^@*H*QajSD zCKQaB%cD;^r6Fu!@C=lEHuU>t6v}d)MEws(^SNfH%ktzk5>|E-uiF4biTw*qOUl&u zN9BLGcuma?(!Fls(m#{%Ju&@i+&fU{y6XcZjD#)R=byXSn!EqvToI5uY;;=5clPIl zyVURe)-4Ej+Kbm!F`4n3P%-HN)yr!tN=}}0<;i2a}Z`-c}FP5F2QgET~RDrqGb16CI zBfrm?C!Ph9Cp4vQN_^>aW6m&jYY3|LeHh0?>ar1hYLI9v`I%VqJDIe?TOrZ`_iaeu zj6}y`1R%Wwk;~2sNCOpaXu_~acxXZP=FyjA<#|bNsCIppUspt0@N8XtOGw(w3zLla zXf%tbH|(6OvBabJmOXgJiH!Krwf2XAtvbF% z7;knr;QPU({$A#UB}tZq_W-q$w1-i6gfv>f^bcEtBH@-tB)pm>sfmPNqPg7c6h3}z z>buU93~0Q@Er@S{_EB5-a>Ji*vBzRb_}xeGm3&|VpY@foCSm5B*c?2ga#g5=A{C@} zSl0%#t7#LN@t31lc-TF7ModOLeWSV-EJ}by;WWW6{?Q-IwyE*9a)`iOHO1@55wF9R zw?gpKO3ldPmSvTl@9hoj`i+gR8wPV$O!3g8$gmhJ=sk=n1NNm7(=hqQ(%#umCo|p-!osF@GJKDdMvsWvT~0>X>fcj6 zR)^{{#;XB?sDT2dkx7%5q=~;06FVYV>31fBBlCK6Aio?LT=&S^bVY8g5}E#K&@GGBk6;IY&uu3T#)VTzbKyO_%vYW66Q1A?FmE z@##kfEyE&Tkug;S$(Rm_xj@or7IfPIRJgKdnP<`qfW?mDdx}p?&7--0j%Y(tG=>ju z{BCQdkFigZ@Zb0sBVB$(swxZ6%roMlFQGnQTpc`G39*$F^3SV~6n~1EJ4_nA4`1Dm zsC6v+&k<$l4(@o}K-PF@Haos$7v%ocIK%)IMtl)A^!KrowexxLEfL9y3edISt;YUX z!}@CYHYArf!mZ$k@ymFSPZPYfz~cIjZN!_PZC_MqFnm*?GP1E0H*QJFLI(?LY7%c= zoM14;ElHEBRGNkyT!zJDTYSr7$nCqxP+Um$^=mMIie20dk>$n^YP52)LpcFj#ijML z3GFpY^O{^He6-0DPYSvV$yPE0SV=W9+8htHfxpWa@l+*~%S=GI#F8aU@RhQZG$_l7 zJ^xi8cpv=SUX!$)F-2tVes87Tgwh?Ff$GsLQt-fbH_<3`su^B-gS7ret>g5s?$95G z55f(!y{Nofz=*LKEmv$vqx%7O;49pYZ>bDhiDGTbsiV?jkak;;eud0HR5l;;1evq| zY5iAdQ9Eq_qy$aQW^Hh>2hMdI8ESRb7m-agbvD~GZJ^_rE8cx^0Lk)$T% zZGZpOUZW^YIF#S`aY5Uo)K!vW7 z!UM^j_;KOy-mpe9uP)qX{Y@7ISKfYyx0TMAu%-WAdrI%19P#&$5&Yc7_!btDaf)q& znu3h7xxV-o9pIb(k@%JZXjNiB8WmzfhcXbyET5DVG7;%8$@JTYXM}{ET9JPA>@rq2 zjts3g0llleKU-_>GVhT|jZknfR~=8@Mb!T^JrjA=6=wZGjJ0Jm7n;w+dRou=amQ$I z4?ClA>H<3z7zg@%BF#|!e715^5Ru_Ck9P;HvCO<7Dt-~b%V_-mF}@`ffnUuLn;Bok z=Lomv9x(jDSAqg3kPZ(ZUTfo1JmV#Nu74UFWa#i@L2~nVj&;ckKq5la#>~X*ZCO%Z z%5b6U*snaSdp0p|0E4U|F9%$=jIu45P4MkVxbAN+Fjow1pW?`;P{C`VTPq?DhA#>% zNze-CHt$D&>BT27kwS`q3V{3j0G}G<;jE1O(W@l_j&yS8Hllw0qA(XJUxVtSEnU#b z3b$?4=J_drejKHZ+&GR{R%7_iu0EgwvYq|-D%iBp^ESIQC+tl6k$AwqH?vxw1H9St z=DSX@m5iSqR`$@-%0E?=icq>Kdp|TK2^M|SXzLF+ z6Y8;qo7iR6$!#^WQMj!_Z@Mgjw#beUZ1(^kMsK?7q60ldGvZq&Y0!EVf%Pa@VfC9W-s8rwHpeV1?@r z>DN=`fRQ@{jx6{i^auQ&C{Lcdmcbr-CZyMP_~g`ie4pO`_9e6euD7Eh{Z0Yo7EBuE zf}%b4M4e(@c=0XVzO;vUPnmBh4NURzZu_#dSxr-mqKmoSs@(4He^wq~OjQ#&Lx_$c zSC-t48-5K*eabp+X7BfVbZW{wh0&0T`~B~80vAGLaoVB*qLlX1;NAxWTt3%QTEjB_ z3k$QyVW8x9m&i6h=Jb;2S2F1gQ<|1cOAe}YWG-Kl8W2q{Rx7>?{%8`lYAf;0pBeG5 z!^Dj^k8a=~B79|{gr`KXB&Ex&HHmPb*7*H>k@QQt*j>VX)@r1=y4WjN4AzlC5S3$FALJwK~2YQPVlI`o(1d5 zgH{DH%dS0d)U>Ni97KM(vMz)}G%*Edj<@|$;I3NeC!zI@My09Hs##JH0Oz02Ks=AC z@rkwF>9YZAY8AbVv*W1v-qc1ZR}MWdWlRA~x3KWQx+Pi!+W+Ov8x{v@ISU%1T}P79 z_JxEvca4l%I(IV)gIM!FMz(e;w%1JW|1##>)9Vu{X|!_i z`}C44dyzgFc}V9ptJKu{<(HF}R;qh{&V*GCpetWe#g~GRjT0r|Yv&Rs6wfoM1EG#Hi8aTUV61{E;I2J5?v@3Dvs9SAR0%-!Ae{bZW1KJ6YQ6 zLzuC9t!d!~u+78jW}{!?$8Aom=-#Eu)VC+cw^z1lw!egq+^t2xMG-K?4`e^AEeDK zONI^{ndtv`1YaetjV^AGDtsK~h3VrBeL!_o|B9+??=0tuL8X{k5Rb1!vk0l8(%XL< zW0!&@%(^v5?3g7NQ`NW-3~q6nUZ=^3CzoNkXCsr0W%(NfgsgUBhv`i{b9>_;jwy+_ zb$c3UF7iL>!uAf)+ppZS6w8QDK`n|?D9~%CWL-zPviNN*%gbxq{Yz%#*zXst^58+Pl1jg(wAy1I? zp}6MihW5BOD;{nWcp{9Y__`>-=ZCjtUJ zuQI9BWi#LFhm>k=u<(%{BcZ6p1O2$qr$;=V&ib$k0mTE*Fu%)cUVpZ1%Ivo3=c8Xk zpZux0KX5xY$6{XQ4w-n}Wn*m|El7COZTI3Wh!TgN7ylL^hI)ps%qX>bvNzoPz}Ww1JDv3q3w2JoFC#@JO+Ux+2+6O2&a zMHAM1Uh|>h!z4Eoxbq?zrV~C8|4EP5V>A@_8=P%=M*B&{&)3aqQ;xIdAJHcV6)Oo% z1PF^;#8GwQT{hNS!WVgL&Wc-zRr)3c z_jAs$<~yZ>Cku>1QhVr=eguvys_Av@r=QyDj6$eI-r$Yr?qT1iPaYz0puPb@sA}#I zI)ul_$EM~S02$>$zO>ShT`q%+W`Yu1iR~2joj!SWh`zEx`oeo379@dUnh3JE?hTr_ zxib`H<7vMGTwb;(ffK`_LlL#A9f31RWyL(~a2b9!qP;^yC|II|%9_`svJxC1ie9}& z>gdyu$ZMT`1-APFa>Ko)yEE^c!nSu@V*=)#Zr~0mmU6d6-U!r-W?7QKvV-;lUtYe5 zu>w7_*kG~u=M#@8H$7KGaM{0U7+SKwC z))1R`rU|3GKDTdL)Y5aNp0H9)r)p`MU#Cy%`LH1J*(VPDDla=5!$#C%siD9jT?EdZ zq!+iT%Mujf$Q(7_AaNeyMnW|ZNR`-N|Ax?)NY%w@N^HKN_d%))&nPqnqz)1TbnLNS zu@-jN_GU5Byi9TE!ukh<)|eKeA3~L!L{rb0AHx%dPJ-Qc?V4=XFyIjrfvJvSkq?_k zRa8>}EEdeO*A$A$tHrC3Gz_|piC0C;C-aYv?OW-(xVe>nEG6n*#Z#_&kc+KYT zYh{9FNC#LyKFSFn8~IeZ@tDUTJu~P-s0^=_i{$%lpHlimGT~TYf<39vnh#{(Vfu%s z$2Z==GrmECXt)C)z+CcS&4T#AFff#$<%DMwmZv&~MLq!i%@cP)e1d&p#_uGLR01{B zkTst@vhUno>T(EcK7l#Tq|%)DjAAq1f--tbs1^%2=X*Ey6Q0Q2I_>FmWpmXZxgKYG zsaS96iu?B1yn9Y@tux8=$tJM6fpUBS`;OlnHB1^YhK}1XcLZEp-h*DxUWkO<={Xaq z;*QqVg@%g`0u^yCk}0l3baS}bXi(`P5{;^oPG;yEj}XIpZBel!k`f{`o!jsmjeW7<{p3~U(B2|nrj zXZD!b`10CE-+G)ceNrJZ?T_L;_`nM`y3x%el|&5%>*Azuq7p>q?@>cBa5Zr@I+Yhe z8VLP*=x8IgV}FZC==niy zly~F{)Nc9%6a)s!nOlI`Ug%9c;`~PVn{wcDLGS1r@50)Tch}F2_c}a#AV=UF+dn?r zfV}5H!W%>+V$9PziXA9xDFLkcGtht5n04g}YyJ{}W5nanr^{Oye#V%buqe(AhvujI zegI@sBt7%j?Iy_l3#;G9*k~W=V9E4nxZL!2fqd#{Fu9I*9~|vltGyGs_b3qpR!EN- zYyKkpDQ%(Yr8*M>or=ph1PD+#^vSg;uQt=^lR}~jm|Va!k3V!2#il@)S9umMj#?gG z^OlerM-AnpD6lo*?)cGIt3U$BEwX*AtnXTtU$Upq8^VfEfH$%nr|*j`h- zf87|HSO%@&K0!EIutJe&v{p()`XJnq(FH%K4XC8PZ$omryo?z17GDRIo}nOW-+4Kd zLHb^_BXk+$y$oG$u5%=o1qDK z$vMHAf6Q!$H4Z|v?`rgTGBwnXb;S)@A_Fs^=b*uxvvqaBckhEebx%_bEM`iH(CT`K zo=IgX4AEtisJgp}G4cr~L8~!^q2qFwE(~XA=PA~YSX1Z$?R0&lrQZ1MJHF(XUs$Ap zflJ0~RQa{xc0G^UQd2B zK|BAT<1h%QY(u~y*8JMaxJybg{%E+UvW7hLEkBwEdWZ0s0%O1hMhK2@dtq9@MVRVo zDz_L6t>B+8((`KkC|62xcMY4onUN#w4~-{~FG8Wcym2}bu``{%JA$e)e9oN|XTPUU zW~PUa%mj*W-2|=EpBeblPD0CG+CkX{!c{zi=Oj7KVh~#xTJC==UG#>j4qL55t96j% zVuN44Y9O2wD5qPj4QF+^G{jPK^98kBXzatP#)PgA-x20p#AclQ3C+;A+8JQ4$5M4gH05A82p{AUZHi(msB6oSzr+lI-k`D+A@r!UUKmNl=+{tB}pluqV@PblzJGFgtP%8jH` zVVsL`i*kqx@!;*UyL#t8exG!#pY19bB9=(lV@=W(IKen>6tt!vhX4Wy8Bz|f4m@ej zECyN-Rf)8VV^kP3Vl|zcS7tUlZ|@~33Q;xiwbnu_w`kO+&@Y+esnmqjF=w|aWf(GW zHp6p!g1qq%6fBdgd&Q-L<;xo^Z|gthG+_ zJR1g1^xlC|1%zzWk(g$*=!>Rut37a_+DaI}mH+jx@Ng-~Z7aB!Urbn6B<7IG0T6V# z7{Yn%GDttcQ+<=Q|7?O*^L=tB7UEuYw;ixjNUS1*aGB(by2hQ{lW-ljcs4}Fc8fHU zlZ3zsQt9szZEn$Y?UM~Nta+Q2UCM}ZHQ0u0xHsrjg;iKUU-3~+`r?F=p$*;-Z;-S^ zke!dzcU9pKVuCXXnf=ihsKBfiPnLVrgP@9qOwDONkOOBBKk@7=O|yTbXX~hJa==veZ$TXI2M~Rp;Tl%S?3KF(R8kK z%N)!(F^=Vb;wk>86?Zb1>?3V2X>Er!NkR&K7`{Zv0Vp3SbcG9qv8sW{PIL5Nj1jPL z5HcEKvl^a}92SCK4xQzlL0!gP=DGY;XZ)adEY)2_cUdV?WDeqGQ_*TyfvI#UV2rdX zuV{voGX>ULYc-$DT&t%C#U)5=u7ySzWdL?BJpywQj@6ctpU_DFqIu`xvO>lu; zC^%#PI-o$bBndg^jYu7t8bGeQ2_2eR(5;2dhEb%ocOjf*T`Z{tJ-R`75R1!wX+I2G z5_e5fWT?uPV7bohL!$oQ;w$$(7c&?RdNMuvj!e3m)^TRhpIHwEh@h5zl+~y{N7wyz zPm$P6=IV_)^2t(Mo3fRgv~uG$NJMUa)&rRsDr*-K#Lj32=L%N2)Bn4E@}A50mh>GU zmzo0iMg}$rE=Sj%{uJ5&`?qk{(Cv)E-}_&2>Y2s_jzIXcs5GVIk!}rOksQ=A((V`h zQIYnV2XfY@uqM>c?#^3kXCDv~g}XPDtY*(vuPZi^phhLWr4Mgt(SGe(>T}5S^QE+C zjf+URCeDmWH=#$O4z3)Um^;Uszsq#DKEZhU4U#IG(^RM|n7shuSL0@TY&lMbrj!%T zIQfo{cNCwD>E1_D3t%>6QOFI?g!)%gKG7 z06}mEl-?neuo>~Xg7#~JrObVD%|$f%=TH)^aXX6!gflh26bFZ~dD z^+`hg&Wx|ms-~a#S8}dMO?>yD2FRay;n-I^!KqB)oPOOR5_Nk@U<#U;0T8i~oO@E}x*IBnZ z*|dJcx_0VYo*JpB89`l|g2pZ=lym0&@DnVlilEhRYktO}oMjakQIGc(i-g8*5p=co zyO|w$F1A>K5bT?>+b>E!#{5TfcA%y8lC!n+KH|qe5?>wW{3y&Di(x%AgsLAD3UxV> z5U{(U=APF^>b@r(-7wPir`kD`bERk~Eu^hSVF%%iZ?sxh=K|;Pmu&0la%0^GgEi@s z4R4lWE0pT@TTj1>CZskT=J>@)X%b&Opm+9gZs7pZ$LDb}uca1SA0EKIR0_EaNU)qk zqijf@v9<}N4r6{WdhzmM>z-Zp3vr8vv5%uoRqQlOe@w}zW@TquwQftt2pvec#(HUp zwUx_UK%w&e8fqkKq$>6$5H{O9EU%6|YnF5~SBnV0H~^&9^WA`>BI}#x)_%vWm%L-; zV!JQ<%ET&fLMuFmxso^4+iVMQ%{RH=+&#lO2rLs3NLu_!D^ zP)~j%1Pt5{KkaA+eL|v&E{fn$`+CFDF(|u%K_IsKu626W(+jYn9H5GM&HjP zsB$+mqy4)UQK)@x!_Mm6R>RJ=&tXeDs~-xY+&5j5b+#T>P23?O%gX-ZAFHiVe<;0x zIh6R8_4-mYF5hsS9tw5rE+KJk;#(=f$Lg7WL*b9#1`$xs=j=!MU_rCFtY-9#jkS(S z{mSNKOztb#D$Ef@p(I&S4f@B<;r_7Jas^^)Y1W@iKY~Ja9g5ow1cjk)Fqy*3s?0`6%?+#9g)h%K7986%5%W- zn^Z|ODp8QSPec`A5f2z=Xq>YPgGy?=Dd}v@0?IV*R7tdM4Ug3h@x^r`5m-NbHIlGJ+E575Cm+z)uZ@z*zOINo?IR|fc zAaAOTy+xsdj8_?4=)7e08cXZ;qd(rtN8DoZ1f3qxJ7YpUmErwD7;xDr)$qy`!DUic z*$;YKEQ%)m5MjJ-7@F+mOY7lQ$8|#!;|>#mQu_j++Xs0q2}lqRukp`B!C&(a{DM#6 zwV`-u_Ln=xGU|Z9a6ll-?T#VfkQQ|gcV6HZ$(-RENnO=@QTgGBv{=l2T5s)V8@ob) zSJHpI@;bp0g>sjt?z3}I0!`3KZ?oB$>W6Z^hP(hw(dK?eK+kyjK)s(~1TEwjC&pEa zKj~~W0(#NjoyMJ)TwN^5?lWf*lojpUU%&Pg`035PMQgumc|BDk_6gJKvR1Md2#>Tn zB0TmF2#LE7{34mcI0kVP8);QB z#CBL)OUDmt7;Ae?`B1kq{xfvuQRcu?{OiY;Z;M@e}TCO(g0!CGX& z;ulR2KLGqEhJP}%1SQmpLzEEf+xVnW1PWCY@j^IXiMngiy~XTSs-!gPG7|*a9NhNC zs?)xJ{_BLqZ>s|HjR<&Y-kF03wRLcnhs8q8V78iZ_LuX@H z&fomS#2?CjoCI};>M}rHBnX`s-$}UQd!1pl6C`F$2O8mGH{d`j!o}(L!#~*|keyG!CUT_yW#}51^Jx9gqVI=urUc+O4izhMbG) z#ZhNaOq>?Q7v+4Z8*By|b@IhqlFz&_Gx>2tKGpn3=}`MXY%solv^-cxqy9>{ zHplh*~c}klH?Q}rzXf3H}n_4<}RJX z^|}tT8`TkB9o-4o`egV76in9?7ZUPe>Io_cMAMdQwDY3aaOXj?RLz! z$AA^HpPej4-%v8P~zBiQ+@N@NeZp`5p;1M>vdmOP)W{|yo zPsdobK9B7V@r@Rm`Xt{(`tf31_q1i@vMH!DL zpIw1j2ycvHwbknN{AT&mUw(Z&uB%%w5Lc0(jce$?Iw5=P$AEFJ?!HclxQQ=er(-I$sNxMng@PD+x5$+wQi6YJ^4e9R%x{N}$2Jet*&A4{L8TGyCzu zc)X=2uk#NBmdV)oWckAGo+YZWdjHWGwfilHIS{S2Em(S{=>xQA8`UzxcB~&}e^X-s z$%l#%wCqGkZue@f9#bh8Jd;Z^_nXnrN;sk8%WCy6@0FuI>4L$wI5>jBbZgW26&Z$<`JLc~;6WYG2$gO;~_B%Ly;#pattNgs@ zO}d>2Ng$c3yx8r9Nb2xQDf%lZZLH;k@Y7=BL^wHkm=N;Q{QSBVVkZ} zwoq8J#q-`EyJm~w&u`<)L*rEx-}RS2#&05WZ0AZttb4qD*8t95O1a}w!tsqY`Rn?S zgSeC>fU+g5ehR`rYFaQ1T;3mC;y?Aq#xtXEHK&fb{Y8bDj`COLR!RE@A(4>S0(y$u zh+rlYQA0&Bpl|ZVA*%ggi361Ng#X*Ra(57)ek5N#?o(-JkAlLMkRR=9^lYpbelcQV z`2FyDP?OvH)Zs1Y)&VG60Gl=_CmTod$wN>hmyVGy{RTLtClB7~30WT5`lRvWWp&TP zTPQuA4+f!51>V`zP}5NJaoD-zlC|HMypsm8?m?sXw>7Aa({P$pX=>N20d@*vqH(te zZJ_Fci|tv0GAY}~S-X9!V84g#$M{f8A_7eopk(jx<%_{UAe1u}U|Hz@3tq`zdo5Km z23S~O$2@3!+j8Vp7%6^82BbO~k*YQotP0jLDg3lka1($FZ=!Z(axq^Mvdc*SPkUef z)HKHtr(f4p@b+hC_+2nK!6w-m3C?bw4w|$E z3S{hNNRWVtSb{{f5fB2RVGuA#6ha8YUFA97{S)pF_c?j^fd`UGt-aTN*Sp@eYHy4h z-&7QkAsx7(h7SV&k8d=s2LFSdj|#)w4h%%VaK(C=6N|t4On7Q+>J9QfJd(OwM@U;D z?+C@qA+EGBz?`nhE~Is(&Y|ZFpxc^Fr#&(Cxq+T#v$j^09gfHDln4`@gCVfQPHjhZ zHj$utph3IQ%kh}TrN~b@%zRrQ>JLe$^0kJz5&ZgRxx!vm8 zYDKAaJadPg-+E4;FhS9;bG>g9)qI&-daPffdkdh34IH9AvI26DHfPeNvxhKsC|Lc} z6F5C{ID~R36~5mZ4y_(|!i)mN1HK>o-|rv%gjj<46f*c*Z||YDtwTe9#bz0BK_8~P zr+E$L6-ipsHb7ZuUU#u+UGapsnTN{*91w_{CbR$Chl?#Zxmv=A?ETkZ$ph!jjSHNtBczTkxtbf>v08GcSW z01$R!Dch87)SU=-qu4L2lVTf)Feeh|gCzHzMA*6YpR5ZF$;IKt9jGxyES zp-PNv9O6wn#BKSZr^n%+-zENuS8N;zx`t1_#?LhlXb)cjDoBah@^xC_%D>wflPq<) zH2y0qaq6LJY2@O$i5f*$@xcx<0Z6FnGPSDS*!R~9F6>gh{MfSv8K?FHza02()w@J| zuqJCqqbn-O!DrSJ9lVH!0h{3~1wfuCuOE}kh^uj_!5!u7kx#(P7O#g%a-DBiSm=XU z$7>WF#Rn&u-bvExX4YIQeWGL6<+i%}UdE*wtvMTntNM=@FUXKYdSl56O+{=a2Kzt!o5?Z)6A;q)7oLL7w!6Adw3bKJ;m-V=b1AGpAR0G@#I8!+&q zN$_zh)_&@ZNuOkuEF8c6l{g)YAi0+664(_mxF91MCVejbN1`Ej@cXRT6D7F751mG_ zM1AhhQ}k$!lUu-B^RALBYcgRw@`5ZSL9&lgAG*AagB6-e`Bzn~Bk9{<`< zEbg{f+rYFUhU_nw-+Tq6zNFTk>YEbeIS>IE@u~q1J_sH=FtFOq1MPN4O`PPTh+T#h zk6jmEyr|o7{I%`Z@uZWWU``dcrq7;e(8|HB5w2_B^vs8Q2tdcTU}E1Cbz`}a%PJk; zd-xkWqT4{(+|06gyh^BQY+kdmm(1peXBvK3`MG2f3@jhW=^Bd{nh1Rl5jNu95}7*~ z%1qcJe}S-Pb-6PT03;9ad<(d8-gy|`HVBxhxp;>GmyPY9+OPO{OA-kuDO0M)-6qZ# zgo(Za!8-SrP+p}4QEMOAzS?A^&fAv)RVR{t4dj~321+Q%EI%X%51LjY1*}iKIE5G zav~-<9x{@~*hiWX4@7x*2kb2GjE1%%Bh27gF#0KrIde4RO2epzcO-u{N1(gE;HpSZ{g?8qB=LEwXDkFiq~&F(}oQp zJdMA_1w8}b3A6D0O;+j@9;6K#rH3>EAXirLDy<2l*RMFW4Z;KGH7TA8F6xz^uyhLk z8I^EDu4fe6Y$yW{@FCOb&t*2->6^>~#9 zxUMU@Wvlp&d&@R-tQwz8Lwp+F1->XtblS24QbbcvGR^zW;~t*BAC1nGHfNQ56>s`{ z)B4`hA<;Yt?dad*$7b=#45I+$agBr$W~LpiIa9s)cBhpmlcYiD->3-<9~?x-t|22X z!Tg#t7A^h7TQ7vU0bzEFE;PCl*6%N=k1Em)_y$zLwh5S#( zUX<$I(u0mw8tq{e5O=@p+03_P!^YUF-p)fqRp8zZC{W1olJY9?@Vx3OQ>r+bp5nxb zL-;sO6Mt}Tz$Yh>0ta~->*f;HSq>-qG>JnDBf+Dk)(Fw<-jZf9w)2?`$A{3CQwDS^ zf`@5u-TKlX+?nHJYV~+&%KPns*i^ z%KA(xTncCcFhDu}*B17tg*vyTi6tpMdamdJp=>|uk&9>RD|chH_WkWYiAgw50pi?d zt8kF_;OEYev^d4q6)nrb18H;%V#I&+n_CU7?Nc?wWHmrqh?wNy>Ts^&9Xvm&E;_cN zt@L73zX2UiHlL^JL&Uq~SMf;|n^cxxYrhg_D_ejT}dG`WH0l`4*3c zA)ziN&0=QW=4Mp=Eo^d@V`Tj0x=!>w^V$jk-)=|LViAAhU9PAd3tgow&L=Tfpxqi9?#XX5~}hL5wOjq z@*r&X2KaWm7pjNj%iLSu=MH89!d}_i08feIgYz0}^cvp@a$wf#5YEaQ$LBgTgS*J^ zS;L$;^Yi!c?FUiuvv-q^x_1YUg$6>vN{xM9V_t-^KQ&4ag71F@9rH0N5MgWlEcMKcsDUs*Wgagm_n~)CZfg*W!H1d?+)8Tdb;2p5tKDYZ_)x4;QzYeP(CH=Cx}AI|=A0f1%6+Ej+lPd0Xkz z8K$f}B5LZL$P=ac7cEz&8abC+TM)~z^uHpUWis}-RPQevY}$%>@^;-f{m;X=CvWZi z{%DeQf&HK?4j+tT&NKjuy*tlj>_tT{Bn4eW^owH8FYB1Px1`?IO7S-_`s_mb*^Z$1 z+BTfl#&>KL8yzDM6KDBLS=Yqz`N`Rxc54ZjCtLmzzJG*>wMi({yQr6c?U8tChg}@@ z+%|buF$W#%LG+s5?R;NP%Fg8oElk14NO4D7#qhW1Sm)X}Luc9dCW#)sL6Yh5<~3oj zgqylAHX+EwCf5&p$E$eso1bSF9<@k~H(+~&l2t}2@i$;T+XVn_|J9rBpZeJMF zZbnUuEt9-{UK4Ta08RM-5us?k0rxOwsn2C|_?tJgu-^5Dx^GLV$>Il33~r~-c1ZaD z*VIPck5M$L{~1Bkk&Ht2OfYrwD6{Hj-4?yTfHRBglnn*T0?y2i*08*4LPuMV2ad}7 z-s&{jaohwa`=MfWBF0|7Vkc@_E-ah=Rgo>-^K8L^Uk#Um`z}St#=U-7awJ_H^E$3H z4XXEdjp@rh7_qjOjSqHXQ^zp{4Ise8+x7cM?m4k>lGxIqLM5+gN-&rkV;G=eK|LjW zkRDs%2(^gvUN)@I4C%v$ep@D^O_DwAAJcnvblEI@R+rVN(b`Q!_a&)H$RvpS3#`N8 z0bet7szJr5-0!n?i=+SuyC%5n&Z3HFz1ajrFAuK|Qw;68+zxmII<+3zHDW zdg2D?m0FNw#4O^R*7At7J)JBHi$XI}>gIX)5O+hOMvv}m-2?0B^0zS(Ukz_l>Zu%K zer!dA>d2YfO%E`eFQhL6xJl)JyYrY;DbmNi>`{KN_+XU8BrZNn$e;$gzN^>WpRivwu(&k!XIf*p`;*_ z+wVL6?C+AT-1?*U(?-fjjiB%NY_nS1SsDnU$3NXM(&F9kbAma&K8;PCz+CpVz|Xzt zDzrrn9sA7k5^bs63t*?L01_08KOj|O&?X0MdfNne~ zWM7~s`e{@}^u0ZrR;Ru2K%bpJwTP^zd=7&?6URsOya+f3uuy%Yqg>j&W_%yV#~m$j zmj4FCtSug!+K>4_q(qd-WI)ab)}OI0sXn*cl=z5sG6)@Bgac-+PxsAW8N6kKHq-19 zaK;Ms59;}=)*FZ*a?-<+pl3TJHv6bESQ#6KO+oHMq0F}%PEhRXx%}}U76y)p);Vr#_^`zI{dYmkn_6+hX6fr@d5 zrJWNs-OH{;07ZN-?Y}NXi=mQ2>Vu_tls-|iD-iBw6H!a59j{>`RgE>T%+lz~OCQGx zR0qkC_;ISxy6Z;Wyl)GgoSo!1o7e1ndj+XSl#|Wd4EnAk3NJ=-4*oj%l7k8y@A&vI zVs~BosfOx=2g&qB@;X0U)C=3e zi8dmN;Dht0k8?yoYL=echJolFvvd-saH!O1^~|pkNqz+(ii^xHD11-~EufO{d>G1n zf4U&tNpifGxlQ49(Yx`rFflJ&0r6u`R=C#XgA6)~i_~Y}#CgvfSldNeLPS!U{5 z@cfXP7O-x%X~!WM+tjg+EmS=qhkAHV&t(bJp=q#mRRdcj)624U4F4u$Y{=i_XI;q+ ziMb(A-9-}j$Uii*e2)oK3z%JIq(Qo1(9^tr-;^sr{f_`0jBx;i%0d)ernePYj9QG@ z1cY4C85e>Wz?cm7B6u>!7DAnuZe_K=@kIk9Wt7*?v>X3{YQX1%H>LGL)tBaN6v{@Y zp3AnQod8HC@YiO^!MHvao7BR4 z+K^crtH<|0$dc=IM&VuONM$V&%7Q8MlUqqY8?%Mi=$QcXLDxfO|Gjm1s;) zFWv9AY=jQC+O|VHc(V1A*CkohuCHY|$EPCyQTeyf3B)#a^Vhiae7syX15dwEC>}re zTz=SdPwhVBQJRA?_AV-`OvW%K7Tfp7*q+{l^+P5{2vk>HC(lcYBaX@&o9UF8G0;Y~ zfjD|1`i;bdOupVe1B>bfs;9`TsTI}h{3~9kNEj#-iiAGe_1n#LqT5Jux#&aEAACEV z40VHd6-+2^e?#%qgA(guxSz3tq7N%5DgOeaUW;i;z>m`_01+Z3(|4M;SyUh9XvdI(aN&7Dw`PgU9{CrTzgMA(_A?u_D2+E@h$kFD_{~Xhmaoh2P^aAA4u%0YrIAIk z)9d^7xiDHmA=jN=fNIQj$Kn7q3_q1freQ7LzbA~=C-km0sV)B0h|ow`FE0^F#xVN< zR&+wKF**qf-4`BdhCdMU)1)mh;x8+hQGW_S7=CK-L1sx)K5wSK4X(T=^s%;jyd+dn zKm#hfETQR}G+Zd&BNvhwJp>ihT5wMDNIDTcB!j0VzM&M-mPECABs$64o7bc~WEU@g zIwKxfo%W|N+Ky=0)gR-a1epV3|1*Iql^JD9v;&sR4R^*8NvS>$a;imRsVTA0P;g!9 zCz(zl{eArABTdykp-W|q$m zR*8?Zyc&VJ?*hOZSyb!5cO8e6>_=vW|=`~#Ciw~1SK&+le-r~=kun}sCO3k#=ldj^aO z??jnJ&8Srm18RK-?q{=1pX>VXEHUGwGJ+RpGQtg z_g1TaQOH_%;W~k;g(*vxLWpmhU*IB-mrN%?vH}%7Oe(~tJ`Nb2cu;_FJvp;o1FPBp zEO2p@OPCBZE6o!ZjvSr1Q6$u(1Q6PdE5WtQBYz|Sgke7iHHxP`gepgl$T-e$XTtJ~ zi-eUmF}qtH1Bu}2qzB+eVTwc=HyB$mx86?}v4JQHRRAof3XiblP0T17Q!_!mHdK*} zMV!LKiA~>7^7!-=9TJYdXfkE(627j^w-nzNSP`xb?=g`fq4#9%{P4c#OxZt@XxaRN zj8;iBR@dBDpV0JZAGB=?!xXMrv4w>ZIim+yOQL6jPHQjE7uxZqYE0)98FMJh0l|MK zqk&h7)KZ|jEL06Q`#}hXg>0QK6pzS!9D+xT!UWYz>9&MRh=S7*TI4N>^v6y)%JCZ4 zlzfOdfDCy;$f_3UIL&|gwYugowC}R;zxZg12zTP33BG7em)LfGi0MX7HI->f{ zaWQL-;($H5T93}R%R@Q*R}v9ccWdpbl^K`gM=v3q4>JBo8PERm8d!b?6_J=|RmR15 zMW0cE@obKa5gD>P%!d>Ghj4Z?(MnTh7&*uKy#ZbRFT`?4<}-5gNWP@dXu8wT`R=zd zEOTlJl{C|tDIbtU{V6t}m@b=dx3F2FHzcd&*{mj1)Ox>kjsf>4PP7Xr+COA@)qW2D zr6kcgSZp*?cH!VdV}R6xZdLVw>F`4tBTE=<823)h-#Hrid)0MmYsuE;{xahevI^OZ zyVf84vUu>6Ylk)Z_JB9Crz5p!C)WpkLn(n^yjL3%IK(9^lp@<9eNJwyDbiQ=82!$O zejy25*kpcG68Q@T8c<%1D#@`=lf*0>>ILsSKm#TQ$ z^sPTw_d7AGvV|jm444}?h(E;fIxPr@S+-k$7#izE#16sPz0SKlHk~YzF&+wMx5h1w z*1aM9v*yOcu|NZ5F2Wg*slpU?A!Ly#C=ROLLjLu-hKDBcP3olOnYL_G;m~5{4C35y zu#Cr>+OAbnB&JbJ56rhaajkdzGdqr=j8<^~Tjp=(WgZkr<2qxf24uA)Ls2hM2vk$D zsBKt>KG%PVTB*d9nR#8hOESG!@)0Rr!P3(6{zuZCE@iN^6C<16da}o>j2MZQGFd%G zVQ)`;6VQ+x&T*C}HM1x&MU6EjP@;0lXqUJ+2bUnCH0hV3Go@Y0yeU8IK$yY@$Xb@V z8s*x(Pqn)SWr{GxVO}Q`j%Zx*+ug$zng-lMS|$e3_l2|Ukk$JFE8Z#<4Qs0(@+vo7 zU2ITVo6UnYa!{a36RKEbg6O#LwdB-CnY}^9HjIDe)x_)G#mvkkX_zFkwYPt?vH4El zT_J={2{UQ~krVr#LVvaF@oMg ziq{R2<;?Dpi}1m5mY1=72b7mLFHi3Ojg(d(VX0~M^GuX6))L>7y-oJ|Tt}=U(Wy>% z5*nR&Qayo6l2uz+k#vLy%)%R$SP@w~o6W?7OLIFmLWf8(V)8+zfUSf$l1Nufl#hEH zDJq|8Yul_wDGAi*n&0Oe_PF?p+@6$RyOZngr&1BR@2`a)tQdq3qBPXkqr?>a-Mw?! z!Od1*3!*zPDvi4r6G9KniMuRoM%*0CgT{3OF?6fus{g@dH+If@yM{G<;!sICPkMz+ z<=IjOh*RLp%Ml?Ozdh6o!EQ=@V>aReIgp=~vSXs;~3c22Y!mN8(l-pT;_k z3C)fCj*tF@^Cm;IXk84E&~A&>LQ3@#2$rEq9@ir3<;qf|OgHUU!w8GGgG)~_<$W?n z)M;G<96xz;Cw&BDKAv>$;l)9J#9rY%Ai#V*sSE&3)OO$Wc znJ08r}=o zpXUBDQ4x%Wb{PF`*UhgxT0za<)b?`(gD}J@^Mu`W@@D^mn;pXk->`<$%T@BB3|>T} zmt`=w>G`{3H#h;K!SWzUWMkXz6S-tvh86?uIj4w2fjr(1Vcn^$^zyNu-p^HteW)UJ zhg(grr!1h7jh%7|PBwb>6X#jjQhmVtOrx;H5O;-3j+FVJ2W<(c>jC*%m|*@=h1pmW zkWHsU1od5<8mma9pIy5oYP>P{ez}KMU3GY%na4j>Gm(~iY4lBTLu20E620Z=&{6zy zNmR-oWcgU9_$+Z&W#p_T2*nN1JXBvM*Lw9SH<>AO!&Zlhl_6fyXS5Akn-gyBv5xp?>F=ZFi&FAOH2)i;Aw<< z?OFNdjk|-rFtOL5(jQ9_2v>E7BkKnySw{I@ zmPBY6H$Ovqn^oCZF}YD(!%ElwYsih&*-$yVQLM(Q45?gAD52ran9nZWDwt?Q0zb-! z;(YdIp3Uk1R&lH3BR*Jd^z1COz@2$t=q2Y?PS7_eM`#t4HnisYk5+VywcEvsdv>yn zc6m>EO|ga#X0nsT?W_ofm^Cw*hXB)g`9~%|_oDQ4DYWjLrq1xHhm8v63-@c;9Wa?$ zAsi}DH0blY*(PIuXPl_Fa&J*%R;^F=>N!(pw5QkY(?tXtgp8S8of5vzDk`N9nqy&& z=Xs#0R+`7DOb3ewugZXjLj?ty1(|7v#I_3m2a^}Pf}rdaIe@NY@88bI%W zSJjglvM=F3FQE(B@BHtV!O#Ewog9h(j>G?l{s1j8YG2KYc>s^NjOghcTI5VhwK2*! zBX{FAuFUxNf8i}{PWfM;gZkfZo(FCJ|NWg3^WSm!uRr`h^#SFq+Jd-pmFd1DBXZ=K NJDq>d-|l*~6q`@Ub#_3>Qqf-Y&Pvi`yO2ZA81Xti@!5QKRH zK^VrFx5IB#>TgRR2%V?(*|V3>XU`tIblbtg+SVLF+!CE5288@C@2^*uKHPKI@Qq`> zRE~7hr!N=cq;8=l&EItOQ?K-tmCp#2T(j4SdNVh1uhP$8MF031DKx!Ijf_pqK|hK$Fd7%{6MlPWnrjH7g=N&P)mCZ3b$b?PlF&U`8)dU7_p zO`Np(th}7twFiy48?bNa^7+qyyp4SOwD8`o`B29gT#(>>;{CpO!%Hj8pN7qSPRU_L z9U=?W+_;6O-Zo=d>uq#DSjm~X%jFolTzlDD?-hiKOG$XrDb(+;6?>2_QS)TAtk3oX z5nW+SdLX%w*2_Cz(AA zEfm}RGu|y_tjgzWR^%lfr;d{oB89#w^OAl@Q^Upiip&Kj&zR$7y zgwWTWG)`=D$QXQhW{mZmjb>tPZQ*T$;kvV4TEc0F`vHBo%2!cL$ z`l?&vWFM0kw`J1ST&_Uzfv_am%N|_<>UVC?-~UtXnA7+v4LNyL%&mh}PE1O&p_xOQ zu8uo)b>DWR+>T0j)jTt^Yo``HTNmXEW$tk%#TQjdRI_<^9_P9oXPH7w5XR{k_;_3w znrikMTjq+7jok%C@V`rWXQ}A_euBSMHSS&ky8d@5o*88N-%kiK%Y2vb*PpBS8GU~J z84262jCU|X9xc$0~$E~pB?=F$UuVV{A;9%`uy>)1~YUZTK*F0^wOs_ zuc5aO0;j(b42oiA9VhF166$=)%opPe_fpqIk)82RgLe1?{t|rhZoiwqj9yN1 zk#CRfdci(X z>q6G8*fw)4J$>Hqk*!*{RInsi4)>6MMPq6J99*cHQw$c)MnjQ@Khf)H+vJQ_LD zyC8!z60@H36PpPXoSGppBlayrzr^#w!Y4w}>>3_Lc;6W8!?!120f9~(=aF&c-v}%# z1b+S&EY~4@_=EURfL>X}kCs#ZcX>^HTaZU@?HjL{NkMmiqaAa9MT7mne@6!M;T*nW zh;*+0Ri;~NAq7RviFns7@`q~xd4 zZG6e)C{9?gHdHINrVo36ctRl_$taxa(jwE)Cq@ z4n$C#(d;_DeFEgT%#JLoQOXR5O3-f^Sky;gc`w>Hf)b7@ds!+#4Z{at&($lu{df#NPQPNQ(sE|~3a`h5i^2=s42vsK>Vi7UHI+PgfsHWN+hrrmNSCL0L80ixX!A)o!0WUMal3WldV zG31TRa`Tt}?_4CE=7dMp*1mA(R-C?K2Y01hW&iGG_~&?PsaIREnukAr3sY{9O$J#j z{HB+|UYa9lNMP)u8;8F6Mp2^R^qgyaU>LpFgKJ(f_V$^0SM{|q_;r74dJm)c;BVSb z)Cc$I$N7koW91B~X*i=Ik0$-Lp$v!XIl7xi&|9wpWfq*#xdw3f4q>{g$4v>V=YLVw zc+PikSX<$)QObRSt)`hNx1#9Q5$gx|jHY=HE;}{yTR3|2scIqJen;%DiLPt`@Xev& zF~FU(<^Z}pg>gxwIqO4wJib`H+eU_?@-*o@uD=pI%wX;6VL!UxIj;rImt(Lc0+J*f zX(eIuYN-5rZw>sCJ&F>BYmRzdX4c)DB1lyy=?HpzfLIfFV*W5u`OQ6K^MQsiHIHWD z+@*`?Fk`@weNS589UN+$kyt9QGlRvj`&FO&)fZY^!55SbNUoOdr`kluvVgzms1qzm znaXc>>A+pa$H-UE_03;yxuWHrfP{{vJSk-MZQjH$hKE$Img)s~Kduy+*|z$bRPEUXG$k=@6P2Kk|8engJ<2{hKC*j-vIIf*S@7l1ml2 zk-YzhuKCA$Mw`Q6zyvwDW$XEF1a zkgDn5V2twCwshT)7G8Gn{(*F&eg%F%qsI$tnR-T3Oo}@Zamn9U>2rC8r&_qv!nXL? z-~VMP6)4q0SB{w?esPC>#cfBPmDN_7TIR%|p#7bLCK?9Cxtu4|7iacu?YO1x>aJEBe1VG zPKuJfbApjP1IuR9kQ_4%or%kS^0t59y6gGE*BG&My-f~?-ksTh-O=TziA>`ckiGFo>A3EhWhSBeU+$9oD zFXu1XxeULYdspp?)l+=T2eFxp1zu?&kjD35FZ+Rd6SiLv{{HYw00=Q-+XxCT@EMyw zJeqg?|GkOvU{Km2^w}d?X+aZIxuBI&lrjQ)#^-T&yuKLV^|D15R>cUU_IWy zG&&CMtZ-gly&OMMNh3Phb)_Wu)ONqFUwl-25GN~dNQ#6vVBig-fCu(<+pmx2S&Vuh zetL)hXO7}4Mu)7=ZN9lc;((OLaI9z1nXs*l?D$vD;+@GN)^QsV=ruo@lxUDMp5{(1lSB}&%hsPXkGUA5 znKZgJNY6t5mYN!Pex7^;{SwdGrqplU!#>cO)qd2__h*{Otg%P+EY3)<(o3LezK2Fz zJBV6^kLI_GFG(*%!m(v|PqcjFcF#v`hj45-smfqicb)XhHtGcRD|4-ho5#qHED9^K zgO`7r;h(%m$c)73VV)coMEoe|B{htuyzTnwm$_aYN{)P<6gsmoP@OJqcvGuwZ~HUb?zJSL#+}I7P&BO|L+I;7i_xAA)i_5|m~pfV%Ee(gH=s=wt9E%5IRA-|~r& z?mcMsBD$17&(3FVssRdTRJIP1r`6Mn^hpNsp9y4y@y9DBn}tvY&l)ZU^3g0!5{$J) z6<9)y{*k)1Ac#^Y8Ebgl!*AoX)tFpf-KH?l^5e12mja^=M{!<;9@HM#g4DGwE*xh_jB3&Bly zR+F2pw<<8Crlwm-1J=meJur%@Aoa9;U2_=Uqt;67KLwjtZzOCTp*rCfiPr}8`7N+1 z*F7y|+2|A}-o=H+yU1T5`S1+!#;kKoU*#->g5ZdCHq}bY_ty1^1n%~2CJ4=eD46ui z3g<}~0wMW73#F=LjW6#f2Ynt`+N>r^HFVLj?ewFio6d)3)6$fvW$$|SH7nm>dYXK= z(~RwisAL;v{HEtODI@DoIlZTMjgu@2ljZ;U%WsV4QEPS2XKZl&C4piaKNV{`a~#LE zWOZ3u!y^}rAl>d zM8K=|pp7Fb*U&oRdv;c7vXaEmh)NL1U6)iUi0W__`62fzL|)rx^=ABt1)jsNI?pjI zr`*&lPU;o*#*H)l9eqUuhdKs)7DxG)D>tJ*-d*l6k?iZ@y`}9Ci8Tj18REOM=2M_g z#BeaDmIXA5T|^KM0GYVjHA}(1geU!GM2G7WTMhC*Qpwct+Ey~o=UdmK#6*i#2e4Jf z{s`X)ycGa9@Ig2z+07HQ5@TaK z4M@+=50ra0V|)Sv0_qkD_U=8y**(<3(YW4}bddhLe=@xZ+$2-I^ z49qaq5@3m6z}q^^!2Q|Yf1{_S`j_!tXdQI?SnDfAxu$s{SmP`jWZCDU6^_NKT8*Vz zAL8A+bYR-Xbno7tr4sUz1_!2eb9zOim|I3k$*IcF-omYVmZ!^qU&3HZj$p74w&p{9 zqT)#j+jjn|1_Ivdq-{V(M^5mMK7)!j@EC|*du6xd(e%F=l^+_-P0hs1c)S)kl8D8| zk3guPkGf1#X}Os|c3y^OSD5Nd*7`+jP0jHYAsIvIt@@6>C}a1Y)58WuO>ek}Wz>Be z(kSbp$8|2OtnBa)-l2)_m(}Z*Ui4Qx2I04)*UjQT%U9~$t)ih2mgYGIB%MhwV=TwN zqIfOfbhD@uBVzq2P0$?^KjLr)!+2@mlM8mfX!huvb-hW)$>-24Qpky7TY~8f-@wY) zMwpCPKf$yOtuS#;y3BE*RQXJ+|kd{1EjZnkm?TDICX%M*mrmg*y9h;(lb(?85p+bLjfqyYtr3DH8^*=*XP*Qc`xfKGQLgyP#=4$E^0vC!@WR% zYez8sPEoLPznm9Rw=@K)7f6?dt+oG6*8O&DWJOU>#ON<8QVn9zSZc`#4`q4us=tI5}=rLXA6kAykHK|-KTUD5$u@)0s%+08;rOLDgB z=E>CsR@Y-a*lt6@rY*{r5-7vx%{*K_O_oMyHZs4rC{$`D3X01%@upBA z?fFEJSiAaK(Zpdtd&m*ez=Ze&P6?I|JkBzEP-@omY}EZr1T5&r2Bx%hl6d9^*SYo0lUdJkI2QEh-f?m>=V^Zwm;?P}9%L zYzUnxrhMVj;a&~jyf&6ztl#5ET^Fn4a?MwW(rhE> zolbf&HAUEk+@WPK;zvOmmpuRc8DjmE)F2jixIeKBrfy0#NJ0p|a}5-9owM*7PBfAt zMXV#UCT6$3rRFM6y^)+D5HIWOY~ow((-JK*8PM3et(u~-(8@1J%_6|&IL^JhruxJ}HJM)hb_g6#*V4wU1&av8omv&6uF zfSiQQ#UK%bnF30CX*=O%vrv6^OW5iCA8+(iLVtPBeSg`JxNn1Iu?3LM2Y}?=UA#IXby3QXiClVKAa_)Y%X*33 zJj?26+dkV)xAL|x8>UOEWof`35jvO_p-F{MfPl4Hs>=tO{}lMzw`&XfMwC7l5-FG0_!M;yPNC6ayWo9~jeJLUWN1!C8rp86 zu$DfRPwj@eFdZWiyU{5$;@*fd{%8?2*2OLTOu18ijlSyDM{o&HQ$VP3fKOqOH|5`E znY`Ox&$`U(`M#ZhdFw-MZEacWg#BvLgok2*8c7Fa6a<~}AB~KHzPukKBB|Oq+4!Sm zLl9@5b+m&EhB1$ZFmFgNpnV)8IQ8xpYjQ%E>^L16t(ukK+mN)O6kl$RtI)Il#5PlX zmLXMx23{6;Fk=z&OW_}$hqUNiLkGIQ9!(G^CxR$*AYkfVIZIN0b;W-w$9q|RsLqoI zz5KjH?i{HY2(yae+lOFim8JOK#Mvx6@gKyAGaHFidMP%|8$f0=d1P|oJUYzs$y@OX zlM3>6{}MSZQVcxowQtukJ{nTT{gZ$7$AcZOWzD7FO^pE$)?fYmoN>}vmxr%%)4T@c@so!q7X;rbRV9`|29{LUO*itL z!o6ZQ;(i?Cw+TtS3R-*Fwn@wpgXHmJm*|!{AL7HhBis;mTHL{OC`6(3Mxf`gp@njZ;+jsImx_Hx?}V zsD95Z=q9Ts1W_SR=m=kW)zdDxu^rn%lR%%lfX2U%JlSz{a;7ytqsae{OD6zU;N^YJ zJXLQ&g zY}?kGRs+Okz`s=EuIHWmDeeKqOC)cU{>%ZZ4E zy5qHl_}%urKS8e;g(h4h*)2)g_lWTww2sRAnL4`+D-y4dXIe*Zb%AW89AdECne-GX z%h_C9ax*8x_aVpRAH!uXc1d`?&Ng;IOkY;J%=F}2kYa6sk0xTJNs`0;gIgM{|GB?` z=DsF?YAty3rplR4B||;UqR6Jw?;4%Qv^7XXIpOnKuCC4Z@roZ0V3Wn?RY7Ky$ZX)LN);Puvdw+d4M>++@RjN=J3;0%<`T%36|s+dLXQGGJ;v?BW$Epv6>AJ4G8+CV6T zlj$S_8!effY(xu(w5!V(>Sg;vhPOPWmTpnFDT&TdTT?)zSoZ&j6{*}%Q7Wh#3s#ni zHQm0G$2|zOYJwQKFJ}UwH(#<;tOI%<(%`^lwEwPHQ@vg17`y0nFLn>qe9x(q{DOVt zXSD4qxF}6Ef+EXS<;8n)R6dklBAtZTL%(zd0R0fHiSZ^7%71NA5S>_)j3BC5FWbQp zqgJ4AEJD^q>y+mFY^0zTZV}s;3aq1z#|X?-fP+E!;yg~jzr(VnZvDl}kXrejman>K z76webkRYl6-t#xQQ}pa|427$s@CPNSrO=|%BBh}WI%r)ktXl}4L3el6amn~sb!G^K zmRnbaCjL48>LxC^GppUvGCWrn{Tv8V*ru+!4JgR zF5mx*sE?RKbLk8Xuk!d0xvaPwL+j|@0hAw<*jBYQPDV3Y1zy2W1~*{qpOvy-5)~2( z>CUH7`#pI}OFPWA!&a{-KIAX>-Si6 z=^%M1Yx^brvp8O`iGz$Zkb4S^$;+fu|1q&2C)=$}l7!X^P2aLHKu=h{kqRHp6Yle_ ztU~&q;`kr+b9>M%BVo!KYwFU-)D(;#=3M_`IEM5Z5Cwc8`S|JSfm0q^&Kd#}fKAh&M+XE5%x@_5nBYb?&I-&q$fm^9g#t)8F$)K;EWEtci)n z?TmjVB)$S7t;Dx|4cj5v+yG(>RE^EpBSh~ud>>k0jd0*W+A-s=js1MNrXh^|xb6)a zxTZj-+$SA!3^w0)w~&6hKA`C!i(Q5&V$u=KSfny~Ed3LtKHsnXwrFmiZ>G9K^dN=@ z@a9XTz2HU)kij7PZ_?C|^rb3#I0q_`X|U|?*UqvS4bBK<(I?n^IK+Cm?2LlRU;9C4 ze!Mgg82@uy5%=STA3mm{EeN%3NqJ|1d4+h>?KU2+W5M+$qDWO@BJ_T|{wSk2qUDOr zB{l5BWj|iuVnf8e&Q)zFGa}K(=$d!-0oTVPUIVOFrP2;ymYc1S75i~BMU&R%ZC)cNI288p_}Ifb-7<-_NX;XRMmz7@M~IO^KTT=h z-wb5@BtnDMBiD={p_zXyB#DDEuov)s(*;Yr^ZSK8y+_py$2-$?!)Tm;8NnJkl8eN&ox%A7y(9rD? zrArM4Qx=4vBrh`>rq(TN9T}I>o7LX+;-1knU?;Uv;rYI<%4?&Amp?WiSrHE6U-0qr zg*Li;txw|Sst?c8Agl8Il;(1bzn38tEMviE|%&z;8U@R;hM5pmo zKO&o!e@S!Ml{3BpT}P4oOL>u%LZc39?erxwcOtL!@! zT6~1HJY8+aCwi-7sIS{t#Q-5SR1vGS`W}J4SCMUNUluG1?d=&lcheR*JfI!E>Z1B- zs7-6VJ4w4$RH=V>@$w#3i=%CQ3UcYCEAes|p_g$MtJisNQ)FLQ)XDZ5kh}$wtXv7a zHwGl%a2B9?^V>QUx7Z@F-{E0@Lk zx0XLjugi!R__l2xCjWu<{kHOc;0@iA+K5&6(n@OS?Q^Ox#>72abd~??$<<8F-rwrD z#CEIP+k;sRN9KMNFeptwr-&YP2oTGOptys@D$J@}-?pE*e(wq$0s3X)EWqu{z89`5 zY|^8DWl%kOpF3Be;`j?jZXv*J{mlfLlQB1C@ z&ZHZj5(*WgH(&tbTcn_xkz)VMliq?qDD51nT>dR;xo9hSVq!@GJ-MFh`MOp6%lHYd z&D9X-@pjB^RQo+{?HSm9Aheh-IC95y$;~r78dGEyE=7-8w#_6{-uj$sC&pz@G6gjLq@4kP#Vv+yE$qFz1Y81U~VO$V90lz z{1m5El;q`cU_&hPOZj={?$F+W?&UuRa1?*3hKs6KQeV@$>@$h>41ZG$BB)+HaOr`w?NN&ZrFblVRRCs0->$u{KTqf~EM`YsLlbUZ*Cs znFUKi)HcWYbUUq`Ezq~zfFLv!GW>1la^fvx1=d?trev*9H5nTxf7UI-6XbP^`m4~I z_Bufuq*-7;oV9&Fc9}b_sE4OSXo~DG71|4HU;(TgvHm*|OE6cHQpdmOQr3G~jE=#$ zM#{50zBXcquGfb|Hy?SHaHV(2jl>%d_x1Rb9x=2@3p&A`4qpW2)S0x|Pww*#swCmc zCIDMDZqtF3G^Psy_~EgTEM<%8jf91{plveteMOXSc0EfK-d=}4dEXotk-WmK60>{d z^e)IOHeHym<+s&&*@wozZRB>)wwQjM{}jyjM%ea^+mM_mKVU>mW(AyH$FNE#nuT3D zwN>}&SV!QWc59KcYvrt4yAaMSC#8m|J5~3+cwtg8K~U_EQ0V$_C@8HVcox=!$Y1=F zP$^9h%T;^EC=3E|m(f-ZT#7x(qIteV{UN@#bfKnsr+qJvDn}kMS-QzJfAY{RTZgAp z+?HC!!02%_-xG>tU28QHnmg$j*>t`^0kVn7`#Y@DG@5nAx4JW?iYGsge0X+VV=PSA zKwQ!5eQoXi15Nf?Nv|#r@9o%_o1U!89dPNWFzyLYiPhdYNoPC`WvmMO&WoCwlrJuH zv}Sij+gsEqc0W5>oBGVme{d!N8o;_sP{Dat2;BM8z4Dr?_&2-oI5yU;6O~@MVBa|g zNXuS`#P+Tq6T*plE&|LJVMzFZf~oOAau=>~fv%j7&y=v`)yaJ+++x*YA2()awo(@V z*P7GHcRVYx5qOxZ`W#h`^W2bhw^cpLC;1Oc!Sd0b#W6F;vft4^%fiWeq~JLk_y*Jq zdKr7~lAuYkb&M>MGcnusl4W#Y_Hk?Z7Iy8`&8_n_XGg21^|&}W3DkJoHa@X8OQZfe z4!vGCmov{D-29Z)-ehwF!NAPR2;8*6_DzQ5pqakn+oVj}*)e|Tx9ceGx&zK_kGm=V zH(eX5QZIW;tbsli`e)PpvqYuH}&A4IO+Ky$}6qqL(ahkHio?RyV@C~IDYS)YY1 zuXu;3(kS*wQg-PmThHpynY!{um{;&it5N0GC4;6*bV;6q-T_)ykI_os>K7fd^5G6S zyb%36Xzd2I^vmmI-njvKq2D|{7-{&-HTtU#Titw*<(Y^M;*z#oCHoqAx1Hv2=xwZ! zZEUxLahWK@p4}^VWln^|ce%Mn*`+(w9aX%9lUv(2GQD9YUE%eQUbbaU@Z65Oe3P_| z3QR=p<-=q>oRO((__Hm#gKeL`?j1d~clda(8f`cz76oI#Q4{*8zyo1AF%tc+fbLHl|)d0DOWDV1PoklsILXWlU3fRv$=A5@T}B_>m;EfD8))Nv-P zC^P7QwrO2PY9K&}FgdO$foLu4LhiGuFa88*NBoPi(Pd8VWm+)t0Cvvl%h6HibMYfF zr6ue0>R+ssxt>dBT<%z89F@WK3zIV$eFxP6tGMT%;Mf+&FU!g_-IlD_eJqKFkfrHh zc<JAsctVaNMg1^qRITO^by|rC&%bD-M4%8 zq}YYnKG~J#R~f+&61ZSqqK)BTM57Y$Kl|v5UH%1d*UL?aon2#m9_@aN(-_>k?n|z&*UHLcke<>_pgBTR6`K;cDh!a%Vv4( z5OeencPexky{oy?8(u)dPBuF7cL|lttjPJP zS7RtK7(z%YxgyG96_dmA)&5ilCUncJhBsM8tv6>| zW}gi`eY$$~?7}E3dq^V}XL7N*m)Amo-EhK8Kf$ht$Do*8)MOCo&|7BS>hLOriR#r5 zeYT#O_!R2qaS3|m@sjV&ol5TGXz3KrFf(vawjoW z^^8rvbh#O`Pa5W&^zu#x_Y4O$sVPb1`l~oQSf6<`v>C-vYcPwI_ zov+f16W<8v;~Kf--e*PPPkMHbJc>`NcDZR~Wp%c~xyLwX;PuE-LtDt&D32@OrvJqR zZ?|S}R08a*5OQEZu0mu`IHP0{Dwiiz-pdvnhfTufhpF>iRXM**7@0$RN{|K zO^gKv1(`c2eoH;ydQFBpJ?!f6rkGw*LLe#Mr21Nz5u`tVFFoQ26-})4x^d&neft3- zwC%r~=dTe8eZ=uGk+*!ys9XMI{xqp{-bUHCVT#GuX85^T(UUu3TzC0W8<;mzg#a`p zdR%%QfAjcr>hVcfj)F;AGBm)%py?))heMD_{XMG7`KMC?3$8PlomIO?>Y1`pzi;VK z%HRKZ%|i=-w?vd#fv3wklvOh}^~BKm6^V+8^dkQ+MmZDJiE$l&`0|rmmu6~n^)#@p z8mNg|TU=;m=#PjqC}D-j2{O~gld9VCj$JQFwe+6t(rBId7$F?nu`Zj5afeXF*@rf{ zZ$|$Kma%6${Kk3h-fBnrc$N2-S4#O8vw$Ac!uDm<$=1qGO=VA?=0`3+YC>-bV@j8% zH$IBxRGJNl*}m5nZe0&WbIB+CKzo!X4M|BU;f_9B?AXG>wZ%f{&@d+cU5 zifW3ry_RXyx8^*SuzO}b6LsR7NvVr=#8=zN4p5}gmUH7%S0yvMg-~UOKI!lox@b0b zJNKb}4d2E43`<6N*#3tHj{7`Rzo9EnsTGWnvwjj_Z&YkLY;LUQTTcobC?8S^tx<-4 z2n`i!!>Y3`{DC`G6_bn`#}7%yQ`(+f$UZ^twJ7xA%49`U4ECsMKcN_*pEn%dl?8r2 zet&t^uu96JzDJ>PrBoo)2vWXNS>aqD01@(HQCgUG5<9Z6U~>=8H|Ee-Wxsceqi1R? z@q4R|*~pX7_hC9XLD2gnr0~-qzS!88%$2+L+QrK%c3oapr>UQHvEa%64M<`% zCu%KwQi=IF6Q>b&m&l?fV;v3pEuMxsTnss!-)Hw#hApSe| zHxdM?446Ot9UtIT)Ae{8rH^90v$DGK?dycszofuUDl||1`amrf%AZE==6=eyAY6b> zJUO{PdR!u)))HfMwKpA>bpO4&N)QY6kTcB};$2 z1A6Tryn`CShbB`UsLn-RpU#t6l-pTEfTTX>nf|YlMc3r=6hz*OdHPqC~tO z?xA(ip>ysl{nP->cW}}lCwqzX4mA7}2AD`{3NQ-F?b^T4hqJqitceDtS$2j*-S-wZ z7(Lc*3~7m?M#tjV$fZ51mPef^Jm}GJv$smKSN5o8#18De?|rXt6dT0a$xuMspj`YQ z)!+a_EAg`y-_E^gJWXUDzusv{XwAR&T(XNQP=1Z1Re#^P$A1|!KX@lbgj%9_duDaP zev@*UX=~8Co=3^!T-oehoMr}IVxS1~jccq6uQbIo zp0QxqmMdu%Cy?*N?D?u~5VV$5y~kzBebue)Kuy3EIavm!EeOOLKFnTYH^!sm=Qz;Z zsL!x6cXp5J^L4dr-}gJKgt>XgZ^cDuvRhxDK(UU+Ildq7JRy0nDG zULFytVJQte@@z}HD=%T|9iQUnY&tk5C3TNo;0nRL@k0IeY;GQd#UxC~WPCOtk0n^V zr-IY)S)3wY)%N=^yoAKs2$YqE+Y}}nqIWmk+aoEKr37<&qfyvFKs=6vaS|puaMSP9 z`EP>3@sGoINGUls)heC!_y5Mp&f76zUP5z37G3#-B8Xmg#jxicHRVG)#K3|Hi|&WP zxRkrl4W@h?)S;K0`-8ZYyKxXY!k-yt$mucD!8Hgxsk}FT1izN)|_H zGV15>o1P_aJ5GQl3RE6s8eO3=>K-mZ`mJ=5PPF|lt~fem{~JdT_2_$zHune~?MvhQ zQv%-lq)fw(dv|a6 z);GegC>`2@bGe!itcZIRxQ5xgmQOuf&_naZP)?&~A}Hq-sBiz0R411--SWOuIpYQa z=m`0N%S8|S&6bwdEvH!@6l-?lyUzEsNhw?kUjuWM=d1o&2nc9&%ajlg;pA16FZy=e zOq5{2-)wt*;>hdmuns&KU?%x$ zd`FHAogu7ea<_Jc-|V(zD3?XP^+7N>LB41m-In9kK~&v~TQflW8b3=jyekKHZm_*k zBWdVen5^ZBlqJA&o@?Hj&byV4^G*3xhBCzPq>3fjRBo`% z^G=5kg8V-lJdf6aU%P&I3J%%Ro~tk*wY{^$X9nfm{p#!Ez?{nAk2ChYUQyg!2XIEE z#C~O;wd!@=qZea$TbhfTmR_pp+WsmrkN8&sU-SL1n;N7A!_V|4wB68Iy&FbZFi~xT zD(NCD_8}(PkP4*sF+2Yu6x0Hv2I+r%R7tlx3QY#%kcOvd?($~ z`9N){!KNw8?wv^t)a3zK{u6Avy}-#czQJ=FU}dgZszF0RiD~@u;8?MX6eR=Bc^+r< z5-L$q@{K!C;A|ZsbE7T35)RCKvU{Fm36ou7CL@@koqpx?#y`}}rr2Dg_$_T!9^97O zl<|@Ip!VuMEp7>kvLOalzT0G|AyQhKJEPv3w<6Sq_Y=MN zg9szU%k_=id@1S0c^Y(@Gp*S$$9MeVxW`f?E4^(ea$Os)3Q`YqGW_m22aBe=& zYAB^LZ{uOYva$FU-HEWRaO{A@18@0Lna+1i+RJU14r@?lQ|UgeZ~ZAzu$m5u z&4kJ=^DAFMb8FV&Gr$D-%=+$NzS zHQxkbALGOm9Du?@oZAEZQCJxoznx0q$2HoBnG~_%D4zvFqhDc7p(1rdhvAGHCv2)z zCHu7IP1{0V>1C&Y3OW{FrNZY1C4gXPSQ8XY8E)DzA~Asd@m;$CWaWr6oudrpd?^m) zx!s_a!d9v)t@wKNj#=QwU@n`!1#itO&5$?eNgsjXlt@+Ds(+&`;ov4@2r9Hu=Y9c> ztDL9q2%JEWbcj*Glc5=_01N703UL7M%#1U35PFWUTtl`Kx8ah>1ZKCU$GI!7S;G!Z zI_7CtL|CjEp55Um39amksk|bgO6lqZkWd*+VdP1aix5lVrqpeWj2r8g1yQhyV0=_L zQH(rlH1GlEUbBojMQD7yd-|p1zQ)R>%!aU)hTU^-nO-W2O70c@DF4>R6}Y^H<2?o| z2{v?RF3?P;YoJ+n8`kT$00ZELb2kS(vPh>7Y}SsE_th4C0rR-d}}4%k4pt z&0l#LnwBxH5}PMAAu`$X6Q3Aca9uz?-pIvxO-ZB0o?!KX#vpD8p)e-)4Z(9XI@We% zGz~<6_hl%a1l^0GpQl|WqR6S<*Ar!ZYq11!kdCmy{DLcw?+WQb&Dr{wikiseW00@T zM>9b2zu`R(SUVEtJdic0X8letJX23wGNFz5^CZFV1j&(Q`^-78carNh^3fy$ zFLu;PiWW>Ut6Vj^>&K52M8-wTn@S8-znc#vbIyst!x-){^E0PrBCxjbei;7`To3pR zDI6bk@zDk@PA4TfC*qFmKeXj_iIiSm5ebEAdB4x6Lm2i7VP4Mer3ijD!pgS5Y1i)B z+H-Li?)Yev_*Lt#_vO&R*D*~+&3_9{-8SqyWl(HCZG25-Kg}}E%>Z`8*q#ol!h-O+ z+Kq9w1IJUTiL#AKM>VVHk40Wa8*4)^s^b9?n*a_OO>u{KeiqwBTfqpw#tI>jAJ_ck zzulJ@dgaPI9&e+5Si2DE`G*FP>hh|jIv%f8XYklU5Z)1tpSmS2ZeK5dF1B1~(oZfd z#~C|MEKQ&C?Qa^;HCi1G(s&m5!ca4h{1U8xyXXoDd?bGCAJhw*K%YwUiT2Iw+jc6! z?!xv6>xLEDhfqk%aoT4w-ZhVpTAKT{-+7Crtoq@py6jO=tL0Q*GxhLX;b;|xnf zG6Tc#HBAuyF3Tx8^V$nSi2pYSDE~wCed&?GZ_Ibvw3191#79@Rc>mTzK^>v^v45*28AT`mup6=`oRJFUp=1bP68Va!WT?d8-=~* z58ZygoX_=@iQD)a9T9`IHdIN7&Qt-#()Uj7-G=lXZH0xl$&&I#w?eiX!oCFXI3r_< zLi;*l*uSqt?7ylpY3Pg~iRzFq#4TMUhB9ySI1!X~R-in|Jm6?Q%#pgtNEQ3@y;Wc` zcMpnp3n6IkK2?(cNSK{8g?VL?HUn^nKNjxKq4f`SkTU$qZ8x!2BLHC(XvZ%bOG!y( z?6z{~b?6F9_IyA75;vOZwdn*!6vv;t7QDi-ukg8`pYQtzJ74KQyr=EBBKL*h)55z$ z8o29ka<(1Q8+)*f?uPhLwG-Ao-&={LZU9(><5@5rcTIq-o$!sEv0A~#EietwXVAgV zGAV(8)_sg@MtzeTafoNJyS3a`qGy6Sc6uE%k7tNU(j$2fJfCQ*JfQ;gvng;cR2p{B z@BBw%lf>X>FIV+i?WP6ikqzhBEm*{GX5fb+_aq)h7SJI4p22dgoBVFSfy>WGaezZrD}o)ULq+NcF;{$ zTjiSRqEbJdo=7tU#hmQ6aV$Sa`#4bt=Q9bb8~(Jye`azfE}1Kujao`wS|!_y$q0B) zKJ*upGoN|Ke%YNm0|k)s8_{Pw;rKwoxT$o6@Q?;=meTK2hT$D5x{!!WQI$`8cno_) zr#?>f;iB^o&R(qr=_kUzN-n;Gki$?dkxLzbX($$Q;v?e=w~6hG_oNzVyBsE|i`fmt zw55UdHw*!RjmPqN^uZMRW!GBxcoKw9*jVzJrLm^hKno1MKBx5v{dSer!6$BhgJ)Q0 zBC#(f^!;$|&rozql4hL1KQjVlhXj9_lF1SIJW|cH z+xw5&Jxm`9kjmehVCSZGg;o^Vx>+s6grX*60)_P*pMRXVeHP&P9Od&fhjb(G@1HCyK6)uigw13M6yB1#o6lQ)G z33EtfzZW3zWgL8c!F1`&5k}X0(5VpB6Cls%U92h>2n~&*5P^iOThJObJGK2SRWRv< zuWb>=0wi1K0Ru>3&*AE{$`hL?X$h~fEgqfK28h2Fi8fu-bx>^&?JKug_!wf>qobv; zpCaA~CHX<}Ufe#|%{yl5nj%x0!!Z7eL(u7}={34B9@&1OLpRrMi9OnV~%OkGYc-IoRj}~5--}!^x($V~P z=j&oMd03xSLHlRkqO^bBI2>& z7}rSyV2#JP2w2N3M)Tu*~w$a_AH z482VQxRJTJW8K{{I3O@uV{gOPK=`hL=6m^@2N!h3eaE%FzWVzw=~BgL zGX3xoHnm`T6vp(25Wi|ugC*q;&O9nzojd_sLL=Rn1zzg&sfjg{vps%+EzMM*tlu8oquD%5 z)^!$?4#C`RiP0zI4=Fks;|*9Y2O~PD2udje6WA;kgocHPU|SUBJWXgUfK*R;?s^8` zb72J@5#LYqPyVeoAPybp^w08b%>8;zx3PMh&tdW->!IYHHsJyJz&V*T9=cS2!6XY~ zz7#9f!5d4DOnM6R6jL3H&bX!|t)+R}tt~>o=i6t7aEp?zxJ6S>3172N9OVi+_n?V9 znGVN$oXl13!QB$M>@wzFlry7VkSMwbF$`TiJX=ui+SbRUQb{v=&Vs*bTiU4x$+j}1 z3~w^734hG8jiOvz*I!h{ZT2?hAkap15*@wiLfW@kzhS&b)w5^7oV}3CmVG!s;fduD zCyIl0bgp@yU%&d7V>pUy)&g6pSM2Q2QNzg%SeQ~@cmo5hw-<6FDC!H2bFzgOh`U$j z>bs;Fr-EO*i7+9dvoh1kGvw9somC$qtPqbH+r&x@(ka}gNmw)WE`9(__}Hi#^C>sO`;Z(3lWd4_Zx2C05z(!wb;F#-$o zb8U3NhHsPG3!hK~{uT<$E;0{0(DG+U{sNerr8`WQHC2&17CP$XNbJF26nQ&ZEC%Zp zKf>qSN9KoxeUk8&=X&v1<4KqNaFlcqf7@ktpV{ovF!v_644V1dKnw|SS!d~1f|U6q z_S-hU3fM6dm$6{@m|_<`7PfTrjG}9I$br$}04Qb}RJ3W|Myo1LeRh(VTAbl0U-j%x zVS1UVB{>1fVcb(TWV}u`=wx*MSmW+t<-*gvd&f)4ht0;uV4Xp!A|Vu6pB}}gvc89!BT7VpN0Z(;T9) zrtu?j>PMPx7Zgl1K}mgg*RYe!-VZ8z^&v8wI(S9?zhE*2K!NoGcvUnnM#cGF9UET5FIm2Q zxyACvclv03tHq9dm$C@CK4a3Os!gTo2!M{}Y|GM|v|8n1_|I*Mq#Bx9!_%W-VWbVG z7?cM86H+{0MqPiJkb{Hq{_#;O&yEKsVQ2sB=+P?gnEr}2iys-iU9sJw@$~t?$*-YH#Z7A-@-W?_>d<#hoG0C+t|e}nu43gM zGBXs9NI1p0&b@fU3TyjUUnuhbQT68WP`2+I@SrGbo=EnJNXlN8u|*|WON(R;A#0Yg zjwPW8HF`o>BkGZL?0Xc6>@jxPH8b|cGM4we>-+n>@B1I0;hyWhuJb(3{kRk$8&EFl z;h8dEzvAq_h0k%3q6Fp_W=kflLcNb$&^?BHddZN>izT?{o4^LdXa;T%>yV*v1vzw~ z<}wAM%=5~$^-eXPFpoc_Y#M2mHz)O#k3N0Se9FwlAeVm~8g~ox1(h__J!u9NS9$*B zFIrzai^t1CySsYGZPMz>B-D^ix*dggJf70gNT{UN$Cl-l)XlnLRQ~x84+6s<*0z|I z<9#^b978JKeY(K)qU^Y~yG^^ds?E%p$i)24Tv_Y4@OSw})liIi1vQy_Y?=Q4!N-4P zI7MVER!Zzczxv#Dohm;pioiDNV=Cb(*Kx8D;e|J}3#*p{Xp@CD0=wClHf`}HlH@MG z?+-@!Y^g!WFoACNYpx;rcO=iGik_3$j}dH#QI^32OU)Ia+XP#j>b(ZK+I@mhvK?B; z++1L-M5z$M3lF07HXXfVZ#l4?lFBGlwWqTkE&7zYrwisycqcd$;+qdP0!g2{jFFf@ zdAmpvU_49QhqB)5Oj$!~r@rp{>2^u$!28so=2UC+p)e8yF2$yD=4(f44pW?h%!QMO z1#Qr;PMgkPKhGi-!E|5Xp`xtJ z^@Jn8;nk|5PeMsWUhB)AGc-NL4a^D6d*SpkX7LPdFW#U~ZU1uLd|42Hcdt6QK}hS6 zWH`1~V8)du95bWim%#6PgJtvUdEO_o`8r(`@hXqLD7PV9XivBVg@FMVwY~X)1JBI; z^D+@%WG)O5@*%Y%Q7-61zHhEs1LjOcKyvZ=>*+Db4Omg^zE%e^eu={=@cfqk$och@ z3A9s-E-vlta0G{}j?~ksE%L()fm?!V;51>nS-+7bEGyyg5n`8!e5+Lbzmfi4CfU^b zyhMDd<~1n20KrIbs*_!Od_`WPko?h=V7L!%_lMM1XiAopeTML z3%|-lFC~Qy$;>}}=A8c$>f1C>DeO4Bf=($^utT7vgL3E1%`Nacc@gn&0`b5}LYh&W zBN!GYjvj1vQvcL0|CtUYb=Px!pk!E}5DVkiTu`vP`qeg~Z9Vn=<}A`;Sxbpq^IUy> zqg$OXT@C8_oZ8}M{nuz`=4!cKw;M2mPg?h44aG|dwW-9?%#D^O&+e;CnDOe3BcCb> zxksnl5$_q=@K9qs`M;}BOyk4}oDNC|y)6kX4=7!ErP9-Qp$<)((q&Yz5fp4`AoT~W z#k)M(_s?&cBhwLgAmH+J+!TN1oLze#W0QGjcdz@*Seufw(_le&)8$$X;$fi9OFOjl_1M1eniMT< z1C|f?4o`4m{#_#kUnY>-PH4v>^AN{0$O*qk z;RzE4qy|?y(_|e8Q%4XMykkprj}LE2qs64ZJcAm(<@rfr^9J{kMmFIQX!i0bcDSNt z=dB0l157nvaF8~-%FDA1t$ZTP>y}|e30^)1($FqZa!ZaiyrwzkPfw;dR?hqTAV zJ8+yQdy+M*{C!}Q0EAb0{YD4ot9Pp-_@06^W7ko?<<1hrh5ifQr5q2RZ5(=0dfAX0b*Zt zNOU#bc-iwNKXC31c~&8UPTPajg#kpI{j{z^d@zJ@;KFp2WOZF8ek%RNj5F1>dO9zZ zvW5wd2p>#kW^uUpHS=<~&8}?fn|xhD{+m|4-Jt+8O&$lcyz*L+4oR1u;mZ$)W|UVK zf5xnuIIELvBb4&2UGQFexgA5BixbsPCyMyjomF4!=oL#mkg%(ZZ=pVKiU=?Jt}|0t z;M>0E)IIK-M5Mhc(-c);a4_@E=*u;ce_QEJo;CDw*LL+bd(5zF)*U4rM)+Ru`7i-a z{uX3e1sDr8Z#^HuGJ=}wP0Z=wQqn%zl{RC6I4NWWD6E=$&eS0WOG-0+Um#R#V-d)O z&eUV3t|CixX>7L!A^VzGJ})t{+vD|`P~;rzV)r%ERrh%|XP*Out!~2od*#@agNq4! z;Soa?vRtkVfrA%bPi#*p8I?I`D(2>wE#`32@(8#v1Ugw}V^dfTaLy*yw?8>}n8l&` z0Plcbq@QRT+4FI5Tfg)B?BAQE6T9D?b$1|7fuw%yag&$c|0$7oYhE2UH#S@#olHS~qKdK%(wKkqdxpMgTW zMl5QcCWk@{_e^Pu)WevJEn~T|h9pK?K*>f3l5_h`s7~7Oxdx7`z1Mh>cNf+gO zbmRZSa+JygdZ_eYO6%1a5_3$DuGjNuN+Rw`~h-tgX&ONfD%(8<*759+`vdPeMn@Cdg;b3 zUy(MW>Z@liN0u~sM>Cf-M{$ld7R-}my((xp-N$FIYIoT6qV9KwSy=|rkQ%a0xyI8g zH$8Heh9L)Z5&`(bCWZ^Lc}%Ag^G`FU$6WN9=EhOt)cW?XnWChQfptq<_m{UXFjIx9 z5G(jQ>Z0HT)bcI;gVX^zDVu@u4XQ?a35>gh7}dDQ1-0CEHS&_4on_YCXix1zv6Nm; zD~M0_*JV#nf^=?hcy?1jNhOuT%rBCf_-$2p)Pks5CSHTBXpy?ERglejxrjf?Wc^&4 z70?do=In4X#%)Ub`@Noa`dq*8c!RIvZuhzw*UvX{t@&|lEMayRyS3pR0)PO7d-^vj zY%dkP3`@ZK)8v5kZj86eVH)Sx%9dQ<;iT8aEn8~1+1y*ZapYMQqMM?2PerAlx z=it5m{U|rr?IXODfoeOe)FZsXiEVX+7si*2v*yyQIX=Ca7!#3`<^I~WwxC4TzaSL% zln>40B-7i&O60JvQle96EV4?8slPVslmFqG<)x!@DHk&OPDxXL_nneKe{*za`M$24 zAXFoe|HIZN+e>AO|lJjPv7tYj*mEok3c$u^VCK$ z-K+f0w@~>+UD>$1X8LydHe!>56)OYlZv+2ea5sz#?gJ;t!d46O_zA0;`grNcy=EV; z<0M(^%lNG5kq0~Y)z!W$A1Pjg88uF#$5tPHe)jD(&ktLdAshcDa{pr2NOt+q+oATU zezejaM{+3XRQ}VSKgo2L`Ok4?d=}C2)gxZF0ogMN$)HSMjzo2jAM{Gf6H3w?{3gqK|w#l>rXip#x);)PPRR23oYRS!A=wAz0WUov$ir11skBHdU%4~eJIeQRy)w7Q&_w_=M#Y>Bp`Q0{VQgw z&?>zpMpcB}M$%4~-rvOH0mBm$c@s~HL-R8cqO8^1^cNrU-)uz&cRjBOB=Y2TcpHud zgQxmf7oQm`rVQzIgw0WdaXaZ(CFJ*; z))!EdA=KIaAc1fCN0**`=A`m!Lx(5j#SY=uiV=s4 zr0l>z_C{dav{Uw5%u@E8TyO2+ICdUaFD9Py_)H0_{-1SF0zp_Jvn z@&^W@!B8xZqOLY)b5)`I?9N3o9m^~*DBUW`3&Te0tHga0SoIaJx31bD^y<&{e{cQ} zqi8gV*GWRdy!4};ma$2FYKcH{}?+q7WatMR3uxEc`VO?g83U) z+?v)a+WIu2HX%F1BlciB$H>FTJjJ1NQ(`=893i~CuM!z4x=!*UIY*h!4^+$w$Sa&X z|527?^!Q;U)hXdKS86&&}khC^@dMiqf5rJD&EF+#Jfnm3k%jnt86JfmZS*LiUL5*O3ox;xP-vhMP@g@@2K175tN17m^CVIacff$en$f-oPEzlW z2H8sXFt!&r$b7jOSE#D99(nO|3%blrJBr+(w5 zA~z3@%gADB%V6g6EhT%ODj1Z?$Hor@Nj818jQ%ZiJlvPDl?(P8!j&cH446?YGPT;Q zCDPJgf_UqNXL189i4caQdX$c*UAiay*#)%Q|5y-kDfaL}%@#OPl@XuF^HUloW>ju` zBnst&R03&%znIyEVAuGowTg!#_6U91|JhCU;ly7XJqy2j9wz&Ht~x|K7_>_LP-rqk zBrjVS@nfEyu<5Dwk^bg*nuH(mk@8pZNKv$F2*-#t`zJa^7t^VRb5GkkIYtXOMg$DT zmz3S?eZWhv7qj-@$5^csIzi4*QhYIcDd3wI%~E@Ua1V>PaPi_op4#a%&7u#B>!FhM zG*O@LxQf<+?Ka&5W`X+pK+xdD9xD7aW70W7&?155$RfnnD9=U+)s|^kcI3$G^r&~T zhW__aBzABr=)aZTl`n2oeN(z7OzIh^uzSGK-}^NOBW35a;(qCXy^NIgtV4;rOpg*h z=O?}lmD<)}eJ#7>7OHCmHuAP-qe!sP;}8*7$6x2~@;?zFE^chu+&)IFDSo633h^bO zpk=YeG~1g0avL_5`G&XPq)nJDKGPKeRz=gFB`4X^Th-OVj%-Mq6~@3i4ezbrGXC=_ zA*sd)wZ~B@;ICATyTADxF~Jf%p9_J@nAXq)>>3A{wWIF~3?4N3c*&Bi8zs)hjRa&h z`RI9pDEB2+r|^f`%1D!A)XyKasoL^PksoDmb71g}s zUbN~#lsZSK4OMU4Ap;S74HK0k^^IX$Z=GnU+Kh+n5l8pl+h~$?yL`MWgJTx0V(yz$ zN_3oX(NS@tO|wl2ngWhr>7+i@gX+aQn8-})^*An4LRF-?r%S>9LFR3C^}&TAOm#wy z+2LD*w>*IyHm#)~cE^v}6jlDb4tSdc39O=%I(baN@fu9qQtdfZ4dRkD-&7?k?X!m8 z&hILy+C*GJ_@~?Yn4J5CEw+Ke7EAywsuH0y`$N>q0Z35qKjb27UG2v~5u=r*j9v0h zZE05(A@zLg)Q#?XUHO6%K{=Y={`@)ln{|dvu9PA1+0T{*Wg|1ctOnIM>uM);I}?2B zJ;vKP;<3^-ctdu|z?ot0gJIG!hxCRO z&i?)NI_diZ^W4npQNV_9thc@c_zA}E$SZh|K0Tr5b~qMlF`B9y-5?X$sgEWadDc4wsTP{u=Hq2OO)HV%?TPOFjIvSN{7d*sr}+jX*4euCaHgR5z2l!yj(J z(ILOPSsxj!QtwT@5^0ne%62w6o_KHjUzWCn1K&RzqOVw2P8R3cHOO9)%C>gupE^~* zn#_-lM2l%?=H?rOyM$*e9ULey5HC0Cb*$Vs;G$BxY$%@8%hPdAaUo|X>=sMb{Z&^q zgnqxXH$euXE(DjZqE9hGNJmAsB$sgF6E1|}A&|XZF=^Kr#mye~6*MBNB z`)SoipkZF^I@Cm~8MMyO1bZ;a`9QM+r1RP=$tl1Q6cUc@!>EyZ*gX@I+HXEv;Tf%+ zG^h%V-LbEl;o$c-G4lu?O2$SS#&j_*7dOai@)VZ!C^qGAk`nnu`)a8aU-Hm{Ff7Sg zH~eX&R7~!`W2}ko8wm}5n)F*&K5!07&z7l4KGF%V&=vpKs}%H$Dm$CV%Pn@gJTK-gpy+l1M7=VO-YT?;5$JFRj`N%b`hm8)cv+ zpGq zo;dwTE7wKc=+iqIX6oak8=LQlwBxzYY1JT=78pT1L0{fza0Sp14Xq>TcliiUTFs$i z+M)H`#|ViXW6vDzWY0huUJb2y10+h!)wyNsd3XcyLq_}j!%Nwy1f3Ezk#Ojl^MA4* z_>&6z#U3f1_pzpx)yz_fnNP5$mD5D~KD>`!=P(N#90@9A8`s6q6ve;c;qG(!WHh{I zlb!z7G4|jZVXIkhnL>Sl9f?_yId^0%Pps_RH%A)+>_%lficxGyR${&ke7PX#_&DW| z*zgdjc<7DY_ygz0Q6#t?LtP1X=}&VX(86}~Eg~G(!2&#=>)C{k(!4wZApmMT8Ftzv zGF<6W6yM=ahcG8nyfdL`yJw$uWQ@vX|At##zIOl7=~uNH+!dFSRa|MM_bufevu*a% z!%(Fq30ar1dQMzRg=OcsXZp)E$qb8 zLdc}U_r_;IJLSQ1HfQ`$6?g%YV?UdFT^Fj%;>a7;?ZonD z6)g{WDGvL?MI4L9Rtv}^>ke5^5*H0}M+E)mS3~@T20nhC$X4*eT*1UvGgB2BVEY4kws~5E`LW?pM;X{exHZfk+2sX$KO8Lb*E4dl9k^R2E-$ zPJCfZ&gV?_Y}>pQw;iz(4q5q~hb(n39i*ri48x=A61_2V*9QkSY?f zvH2zF5*A^S@vV(}hOyMB^Ger%eLEUcc*%>cX=S~dJD zXyBr5J?IGZ8HHAyas(N}0)!fa8>W2^|LP?ghxtgkgsjl|4}o*HJmI}B zkzZJ!w~^ys07n%woKO>cg4Dw*TeA2b5d6oE-D&Xl2C~gQZf0>j>ZDcchnn$dBK&R)_>i82?RU6k!|LIm8Fi>cy<}MG5D{**w;cD3w+18&vk74wj~9)nZBz+ z#S@{v3Km#(Xq(XO`pKaFVL2S&`(@t@+TFH>nM!C^yu_7!A_3OjG44-MxH*T@>q@LZY-Wv_vtBgt4@LiV|XIpw6{LbF`;=$fdO zf{rO;i5@dMKhy{7OyjN>*%{&O5}HGhP$)qkDQWhJ9x5=H{T&ux%R96rR|xfXEhCc`4e4!Sh4Rbb%2|wtzZ}> z>9n&VH-MQpC-~VdHmY8VPr`5suHx)ZKksR8DGrq<;|I;WB3JKLB%BcLmHw8)|IHy) zUin_5+@;y%w?YP5b^@!~;>>bZ_aAb8N=I^4C%z~Yv`bvX+_>F*rRbJ?`iYI6UpzM+ zdn+xrnrF|+-0)magfMg0d}w{(s<@bx4hQS1P;nQ8gSYHM!a8Zic8-`tq;{sL)i02~ z{6iB5h@$?FR$(TWKgGi%1W6eiAay+K`TQ|&U>qx`D(DDbToZ*SHdCz22L;iZ%0|gP zk!gD3rn1~K4nYs?Wsb@HkbXb%E*ty%1W9(_L-qkGVO2y;GViu0&4Xx0UKj7F`8ko^ zUotl66^_Ze$PSjCmh4j_p4$$w`y9Qu#A;*7`8`TnjjKwvdrKD?o15fXqlS-4-A(t} zIKI?#7b)?Dt!*(8lCj2bxqVCRe!hoBEeP~bouYr_0m16v>tWa;)#&BZs-;S^1pM8Q z5|ixz>}O1C8D!ByGEcM_4c~vL znJd-#_#maYQT=q2mzSr=XiMBm7rgx4ef}bg4fMWBT47!og$HLNxYe@KDYHMrvCJTtZI63@ z+UdNW1~ORbaX8q=(Liwpi(F8-(fw3lr*rrOl4L>!t0H7&YutZajp0{lk7*TFsxH0H z;9de>3DD;#bObm>51y{vw68)LI=;N6rIms?_Fl-xy5ZcHezI-kK`U~L1*LkzgIdxq z6|=eSa}7qhZMfe4BsVBgJp9#$A`7lx>t8BpBKs7+bu`GyFzD)fkKc`vP|H1cP@ZHB zx&8YhnaOz1_4yirg5v-Mi3jFg84J*=(I4EWf2_3nL(P8w(3J}*F3#{oRZNcc)J^tLG1VjdA(0D;amV@IoZu;*XS*N4z5e)3zLbbUlolq_~p{VpV$RF_FPI={p|m>N2TpZ(>w0opNw5O`rw7 zz=Xu-nD+a5Ob68M)Bk%8dZfFQgv#ptX~zXkua~>6RklK;%}$IV4cl|^F!C$N)A_=j z`X_~Wl4M;D?bJqh7YFSj?cnF9c1biT-67<4`)ZWBp?G}{wqr3YZfF?7cPFWFZe)BVw^8-P|M0n z$82O{i+)EZ#HeA46IjGc8dNVaq{YNs3}JGJIQ%Jy^z^yX%g0A9KRjN{s&;%Qm*)PX zzjB*b(~TE=WdMFPa!F2F>?_te$0}@pK01|bkGlHjjw-i?$Jp}$cFrA*s%I~CUOL}t zolu}-H}~%A1ji@Ao^#oAFY(x%6bwPD=Q2i*-Yq=ai}@GxazegW46WmDio;lt*0J|^ z9m8uqYmibz87yNxABSgYsP{Bn{KCV`Hq@?qKGUW)o_$q?vUOoe;|hNuv}~ZN&p+W^ z!i3iwEP?~naHN|kY3Y4nn{*MfTRW|*DpdAL;Hd?i4OM7wmEygwg%st{jd}dwG{46i zAegI_LYe(Cm-pe}?YKKhCv1#7mkX_HOpd3t5Dl=S3$!-qeTl59B44c&6FO}U*stjF zwilKS{2J}~wJpmzsso72s z^S#ibbi{X1aA>xq*}Oz@n6U-$%tWX@QUZM*oCf=@#AeS4hduv$Rr=~i>B*E0DX+)w zgX`y1C| z<2_wlBhQgk5;q_h2dx^KVyvy@yB2z{G(-;BE>>puaVYwLFmkhko2#A>l3D{*Th}m- zje}>OO*H%yb~1C8P3kb147aM7c7#pslIQjPhfYDVZybeS8|qkFvYtN@@iK}PsE=o_ zLkb8ktt6N~$^R6boX)!^2jet4-2(zUUu|%zNKoT8MW8YF1?KltXW=PeX^KzQUplrF zS^-fVp5R48bKvX^&hAx)gr~V@4of*aE?KID@U#1jos&$kVRG81FIOZ{@BUuL_k4lT zjs56+Sj8YmXLs2DG!WKG9{K(V6$c4eU|GAS-LXQN{d3C^iVN|OLo%)DeSRO@M*ZLS zzoaie0BtpxSl9vAPEU|rorR(=Pns%|W-&aZi*-=_C+)H)V zkX`wcIfR(K8VVx&k8U0R`wrGpeK}>Y3y%>CCi+<-s=l3hC8isiuIy_wbq)a~^BM-FVSfnx!#9BK$yt`XDnQWVH7GX!H=Pht_TZM-v$ zA&}J==5vpO_go(XP!HSKz`RX@PCg&;;(CLL%3vBUlX21FS+)YWv=4cQtfbiiwkCA< z89^i&tsplSk{U)+>%D&*VeI~M^8Y{Q@%-!XKL!}Y&=%6a<5dhWm;5@D>c1BHFd{P+ zamM&~*Xm9ZCh|}z3dV`7Re>(F+$sXU)dY5(vNo#H-r7v*Qy0o!7F%WgpIen zC~#zR^&~%6y^vclxJQ-H7DL_5bN=&*c)9AmS_(OFwQAUZ`6klZ!02WTrj!mK?MS#;!2pGn_;earcVRRyrA zs<*%%mvWJ=Krg`&ZNI1g%f9Ygcqhd-`Tu#qP%@3gXP~zaj(0IMX7x7v!+Dj8ip5p8 z|KCGqjlAEu_-EN&7`M>bN=MAXK7FI3G2r{4NLRkP9)ooRKSytKgrs&r0~I2OcqrP? zo%!5(9NCJnjV;HhOlXq|>E^i}41FnM>!6eWqxDCb!q9fWD)kM_1StIPP`o3Io}h;c zXI*e|?47J)v}!enuM*cAa{rXB_ZiAS=h?uS`Nt3zYoVOkUU=f{@*~v9u*0W9gj9&_ zrJ^y2ph4sF%>@|rocj#Q2Rc7o-ysIC83ZoG>G}I%lLX-y1>-FFTc^%ILVZDu#qHV= z9VKY*QE%CRQD>FMJ~U}3UoNN?F{l7L+yPX=-<$Uixs1<#h1nR8$ZC#m0A*q2|0cf{(y7(1YyQFwL}w-8pf5w1Z6N#M?|kJ&k1A9lx5Lk%SG>Uah2)i*(? z2JiABVX$^WOl}kh1kI?ce=ii2nqH@oX!?nZfhu;jW`rQ=LuZpOH|R4zlk}3ca<3On zFf_3yVh`u9kglb{U4FWXXY0QxxIi=WKpAV=jg5Ev;IMQnqa}^C9Fu?^zfYxmesPp&CK)8U09`*7H)Ge8z^X?Sq9|fy_ zX-KEG4x_hFWL^3;&Di1ox1e$4iqZwE3JI9kfG>Xu7x_)%`cAizi`bwpGOht$iPsMy zWs@Bi+-@_h$nXfUKUs}u+`kebFMRhW&w(QB9$1y@-0uq<)Z?*GQF-ne-QaEkkAEI< zHIn1i7>LHH3bj+Z$OQ@GUvrf2Ztj)j2hpIM?eD40LB&+EmgtC4>WwV>uXotgoZ3ycBsc%cCD zOtezM5~Y0e=fE+CWEj=MRb9QFCv^#D4(+jN2Dkxd(kN=rY71Db7);43^TeS0wGluEQ9Z0$6Kr1m>ql( zQJ;o32(0+u)o|)9kCoeV3Xn3jA+%q@Q$1ni6{Fq1uliJn_QZR*+Uq4u%e!;~wssFQ!y zv^@KHvtOcmBN0T-^|3-9Q9F-m$rzl+XJg>ZEPd|aEbRxDl*+TTq2J0DR2L2K%6~+< z1xU68j{~Ki*Gt6zc?Y8)u*&jm3;Nnql7(91v{gu=7rN@dK-DhV3@>_07imtJ5f72< zWz@b2M_mIx9StsJq3f4RoaYO~0z3xfN<+GBPyM}OyIut=yL3r<@$hIW@JdkVNLQbP zq+aP3g0`u2Egh4OOV4yn07mN>pu6x=w;)I9y2!)gI@nhMpAVV)1#(HV-DlW*+hkEB z=E>^87;^yd&Fuu#slRu4*2idF9X_(rFl^9W0gcG>VS_ADh35G6f5PTPpV86WKe;BM z2A7;%xa@EBmt?Z_|KJV}aCd+06o24g8;!e`V&D~28e}99bbzkttT6vMv%qITAWm-3 zKv)eWbFoedHG|R&F)2D|a21>X86wdq4-n!r(+bUMA$u$>5vTB0PZ~3g4vG2g2R!@AD+Y{QKd)J00#DE1 zI-=(aw+Sc`QDXxxH=*jzmG$?k(^JPQsZKyb{in4WR!RyGJFI`8lqscJS1mCGX@X^A%b|6(ZB9#oG+5ah4vUNny%P6O8Rs}#D zD{VeA;dx(M-(%fp3{LJ`v{I4;C%6C7O9GUj3k~Nh$pU2cmWFr!mV!# z-dlO5s9&+)->Yy?hS%5sErxr0uFh;gL@n9#$rwfZ*QX{_7!)YP&FE|a@UC0yCGE$; zb&ef4bBPa5LaG}4#FDbiJ$JK<+z2@hy+v9-JOxB&4bI4=* zL;;0|VrM@vZRz#R2sq-6uYYgsmw?MEgqHBut(ze<<9}~_w(M7Jqjk1>n&}GDkH&rP zym1Qu0n3y5P}l6c(#GqFI~v_1jQ##`3MNw^6fko05SNl(Al=SHkbQP@B*mA1sRjBP zH@H}Lf+!1g!$tq8@@}AMnHHw+eR_l?oum*PBMX~kn&cesai9B=aP*wCnNg>t^ecN^ zzQfTq7n45|bV&RC^G{{myTq=LM8}k{nextm0wvq{(tlBvN*Y`ArFhVDETnoZh&htI zcly7rbcdNVzx#Lk-Jb4Bw6MWdcQ1o)o5N}?U+Co|787*sQb|<@f_*)^mzzuV&zF&^ zVidi;*D|3H-3hL7jM}t2n(5*2DLhxaRfkPZBFE9zcm68;+@ZblPMA$ly>nJe1akMe zRHLSxkvS@{HY$MuKEBQQavQE-RX7kg|Iw?Insh;VY}tITx~O_>7Ct3+e9V9qwU!hb zto*y6vOB8H`dgTU`8c>Zn?Zm6ytP_5ho!5FT7eKxe_TCVCmOM>gs2uz%vGkcqnWD? z@(R1wu#Qc56xVrG20Qrq8~l8?GOc4KeIK@c@+@~*^T#ui(Um!R>*h;i+A;0r$uFnq zuv|1uX*H>Cfd;xOy?qW%;~#Tj8Jf3W#V^zrRrdn-TVM3f<;lR11*rld{n}qgF9g@P zC-tY8wJx%D${*GQpth8hy5hgatF2mCRPE_#UA%YeReW9%yw|X>h3-mc$RbCO7mmzb z7G!b9yz=2?dt2WRd8C5^15YYrVCzlB#Silbqb+&5l}~%bbjLHXB;#_U8A{jSx)pMx3Dn*JPc+M`~5x z?}Qgk?wD`!%BM&W;IMzfKCCZbqRP@bH0cG_Hea-OQuNFMcNfd6bnF7Oytg&IHD6AR zG1Kx@w|Mr&K#N!5a0XR$lLY^(!oTdb1nk# z(!~>&A;nV1{n^aQGVCnMV9&kiO7=$PVU;fM+uAc>i^ba15ixD1B6mvx#exv(`oaM_ z6sF^$xqtsm<89s{$&RMnH;d&Di8B-xj=$GX7r5@Kw6xF@Y0dJ`k0xbd$La>dXf7k7 z?GC>L^)?B$Jk$My6bkHib4e|O^J1e@GTkDu8M1G=b`LAvk zo-(j0LFX4Tc#SvJ9FAfLWJ)Nye}8yD;C*;xqIT_zsbsS&(?=&UZm@0%+>|_nTnrkw zZ8UZX)utGd%7n>%_8C?w?=)PwDXndy^%+euV_UM$Fb@C@J?y!}c9W`gJKjQU-{5AQ za*Gx`L;zH&SmsrsWAp3WGm<0O=zk_0wNqYB4RVLHc%Ii;iL50i9KOAvp_aRUt6|>d zRN3qn4YprKOJ8T@TWwVE{>;{nS~2b2O!Q0+zur5Y?-iP=YRGF``PYR?E)uJv3LSC^FzB?aA>s0b;z5a&h7iNdRQ~tVod%nHIH}VJ2mg%hV&mz z^>!9@J7-Cq4j*|`Uj~aU1yvlm$L^}`rG**s1C8*K-@@SHJ+(BRJ#3#g&QC4Z#jWSV z->5O!z=mDcR((BX4y&~@9}LqB`SH6_I92{Vl@vMBb;I=zh|%n~mFrBj(fULUL?EcJ z-9hs)Mp*y;7y6>9CESae^gc=bJzH?UOZ$!!*QxtcA*s=K~VDrcRfV>*mX)u=`_M6rYR#pfP zBuzDNm#vE^)-Ily`Ff3vMUd#r$ThCeA3LLafjBl#vuXwTX5UXdpbkTE%3sD8%7(nP zoCERv7N8KG_)E-Yiy~7V5y-O18mi=`-o`l7{}u-?kGq(8H>PiRa?#RRcJR%XxE@hj z!h_rrPi`9GhLUE3wm!gX#A0`tW*Uxh^#g_Eto6ykXi-*E^u(NN<^IscyfczDAJG)z z%Bs?PXYYXiJHvE{F?(h9A-6&{?V+dbTMi-P$9?_QlR1M`4sQ&|_bbhBSTo2sk8$yqxzzgO*2z}ib9Us% zG9!wDR~6Q(gTO^6-~otSUT)v*ZwdQRaqzd}$Pbs{q)rX?k?*U?{mXIlq@>?`B-pJ| zo%vTIzQ4=nO*jP$Q_eA)5+DEm4E9FT`332>_9$%b+6Fx8Nc)Tl*JsC$X;*?=@$C+; z$wPhZHcDvZm{Ke2r5F}?Mvm@&2fV4O>>zpzZ(i-!c3AMTdY5Xj;xRHgy_M%cf>+BM z_qv4NI!6Ze_g`MHz-?>erfZq*q;`-*8V6%Gh2`h+ zh~BZyYc~)3ue}e6{_X+a_7PF-VaeanycYZ02hFKA}~LbTfO_IF`KIfUbmTcq?%y?CdRvg+%fpLZ4Urc z=K9!5DZE8UYM;u(&hsuK!%FBH5p8t0zr}F17u{f~L#wH?<)cDyk5R#Nt8Cf=DN{1^ zZh3rtX5=Q$9Y06hy0=zFp?Ci;+Ur3GB9^+42HC|0lXdMtQ~mg&yYs3rpA;x&Lth4B zxM};EjpDXTB?5?VNt)wZAK^7t!-FxZ3v(JnI%c=C-kHG*6~wwkHm(;4N7yOsdH|GW zz<$%aCG{Jun>C|m*FsA{$I+s`4!Ed=X0<*g8w=@{(sO56%ArjIAPNO1G!JhclrmL8 ze+Wb689_3A*-^{q^Zz$FEvYX?S)>m zs-Bp;imnIV?+=b4?G7Zz<~kY>r!wLier@^Tg3P9aMBP3K^z%pfh=uO2*_sxP=kN4b z`UGlQ8&6vRo{iAKZLoqBxm?9U9zoN`s(5!gPQThu5=9J)f;s{Qu*VD{n}*&b8n;~u zwV;2eSm^KT6|aL>a1j@u!e8jpu@N0*l6NdYVTB)VPkTn}L*PBYA50))CC^X1<2}hftm6NvCT0dwXvU+EWMM~ z3mx+#z*?x~F|}JbwZS`__#^S5a*2?W-TW>r%BxGr#bowJM6)nW^k|#+d9zDlz%1Ow zsS&GKkG_FjZauj<&D_kbodRBHeI%+v6%iTT^XCj>bgI=5T;VA%7<+>#GY&sTsPb2<^m!(Ir4(Pez3|F z7sY0uHg-O-eehaRy@Dx5a$Q9-b*cuQXr99=8tMfewE4*v>#aQN3(6B9fyq(UT?l5; zs_wm+I!JuZaA+e$07^}$`qQvC*&@D{|1{UsZ(0a~qTACoqDrji0|8R>wj}luaz#DU zl`W&e*K(dyQfF>K9H6=13i+!K_?^rP;l1n-_wuXPe-3%bmhx5#U5_=6O)XPVT%N+W z?=FS2@E-9J>MV&BZyziUN4{E}VgUSYAZ-S6Vw(GgG*5a`}iRT<40HFFR#x<9eo2^q+6h~bzgxu#GYZ=sn$uB-z5}Dww&{8rYW%84cu{t_~3jZtd-oTS~nH_KLlC24_o?1J@<7 zJGb%^+VZ^hxfVCK6o+D~$8Oj8R%ItGkqw-I2=oh6ib_CD&>TGMt`8BfEl@nFhHklu z9HP!wgeesjd`>#C{Q-{3bgtgTLQwR8q12(Fs*Gxr^+T4sCH&OAA#e5qd&J|wO$l(v zVA@tzwSZ~^&(7wifErg!BN)Qoe3#wb&t*OQffXX(`H$PwPV6aB8s4Mqla zT@$Z5_j~0wIJ+c}N=M2-1uT^b0Z1#e+o={;_bx9F zhWP$baYuVlag~;QVZ~%I(FO5r?+$36+Wcwe6kB7R|!^( zfKU!-1x{9}ttR5z6~{Z9J@ggHB6XCC!{5Byl^w60H!aR65vVz`H-Shep7>xhUt0pV z>E=1Mzux$d#`1uJldrcD?6SL9mcBcc&`hfo^^ykQSHYI?cH*w-EA`LF4yVLZU7Y$qP{;aROfdLzA%$iTBZt? z57`+I0<$Fp$TJ-(w(gSyF+b*M*QfCv6?0~F8^73u+8!Ir~|~Gbjk2FzQ^g zYm1=I0AT201VhO(7Ds-S&}zaY0t!X6gbgl6^9m@eJ5FBGPO&je5XvrII0lD~h6VGL z!-8vt>#Uf6)`KHx_8#5tcqL`jn?~LBmTXcvZpxr?yyGz3hZa!CZ0cRzi;pu6QrqjA zhYcgrNh%;KCfe1$#@O^51-X4YTkF+MIU-pHIPio4HDM+4@|BVW-!s|CbY5p9`dR!Hhd71@-WY~WKsx71WE z7}eJU+{b&TO4o-}=-_hL?3Yv%r}!atu{P7-*n4iSBQC%TWFY9=(s;+>N#F6>Z9#b_ zg47Nr(XM7sO<#FF)O)AxwxnmjWZ=#bgS}5;WgG1jew{m_sfxrTozZzFi>j8oph^Gc zEqvJ|TBwFHbwYbrrlkxv zwi;P>9pW%zw)>AE3PXP1lf6LR!wd1&u6~#OMNL_cj*F@40rCAR8MsU=3ut1~ui5l2 zT~s)sqG+eJ@-fb!YQR~I`onRD*k8N;Q?_*R=&z<{;wLvd!H)a4Vs{t-y8_~b_l9Er z({(4esf7s6wWMQrEP>pkP;C*D!jh|^`Y{o*3`i)Vg`32gelzR|tpjP_bD6R#EPk^G z-fHZeOYyep*zbBnutz&LaA=$VhrKrshkAei#|M?po2b({mTYy5U(R`det-S``~LI2 zuFvbb=DILmuh;W=KkxN%-}m#m-_B-=44OlMTE_|nuAiW`!GwC>D(N4edg^z-?7>}Q z1W@XG5*~fI;rLQEpJ`M}IBNdI%F-;dp~pVc<(t$@!OjOInhh7^XalTOaahyM_s5j5kdPUDPEoX~AxJ}(0veLV{Bx~(F67mIE zj!fdj1mctOaUVyD(Y4)cBmFZxf?jO=ho8bs-U7Zj_6YZ3%xwydOrj4WmQrv^l{T}P zbh6nqQ>>iRNswMHOoNUN4JPM{aPmzh@LSpOl~}Mgo=aVbSO{*aN6#KfGkZ;ML40Iu za>SK%9=>Ov-??;6X=IrWX%!yt*`N{m{fMB<+_bEEx^yf)HIp#=Gr1H$iJcsY%gc(& zQH+}X4s#i@w-Em)y}KspeO&xcl=;C~)oQU+>PmG(;zYXAxjAni2_H!su0e zAPi9rPtdWV4EFBri0XMY>KfGjeL;VI;)i)yZhOmtJ=WP_6}fdqwVn+rx0{N_M4-RY z0*uE#AFrOEv|032>R;TwUVH$lq(?op2J$umK^L`*^_Z65t28$Z*IzIR?*@#@IWvOF z{#bBJaeL_d3nupyiHi&*?&?RNVJpSg%Y;F>5pYI73zWqzjQXK5h`O3=2S&c$wQoRI zw5czb2P2|*RxzWKLzvZz_HVd>JMZ-{Av@&Vg)oj|gwMU>uHJQbYl*jVQs^JF^n+S* zcbGRqRpcqunx|*LU@kPD0HTrH#6h$v5@C^$w02MY_d z2O03Ed+zE$&JmD;%zNBih2PFyEDZnbsXDlJ@N;DtA(mIPJv0L3`9VboBjxANe$Zqm z5eM(fciGcDa~G#Oex2`|RZFm(=AI6iZA!Cm-mTbur9M(G?6Y)0^f#I8;4#g{pY=+q z*#Rnc%iR-Atg7X3OP8>DpFFpf&oH#x?_jHze}-lZ{!(8BKxKpIq7$!f&?DVzVX%&f ze3~=y>xiXmrt>+y(Lsu3YmUB<5ic=;H5|#}L>0fuX!X6tFF$gmJ85K z7GcWqsaMu?MH|a$`R|FO}y4bM_;{yZ0(wF-Bu-i4(E^lYJv{Y{&xxj>a3 zegg}Cnj~)IkzJk$!;}h$!7E?D302!HJ*mkz_W&;E;RY6V)V<9h+?V&y{Ni22afFb; zz-UcWXFe+{vgMs+_>_+#i0$bWk!z%Gbc!}GY(y*M7Zz3m+Dr?tg& z_c6ap_pzZ3@|ycf1r{ubMZ8wW9Ut~Y(cBo`Diis&pd{7D(ay4N`pOl%eK8+XWoEty z1Ea}+FA0)eymar)HI3@+7FpafOpUi$r##>M`$$}5jLcl$3{!BdefFGGP6;gf7`is= zONLh0CvZPqpoD8-`pk9trBz4T7y>B^@)H_6+PR;`Fhd}WQP<778>JPwKV$q6pVjMG zOypdW@opxcEKY4b|3`P=+k}hzUE!;!kI3`jSj*)H?vsz;gi^>lkANeF!3Z93^_?5O zfLf^mHUo7Oeucca-MCN~meE68miNv45B!__qTV{C6o@h`90je_3H$HGoPwqIwO+q+ zHhu`4IaCwu3o#0b;(s*rI&h>i&0*phTr9@5k7RBj4-Yw>)@#5FjO=*pGJl1v0xuh} ze_8@=iIl8;xX@d;jU%E06%wgxLxktD4fnO%x}fG&M$!mmU511^ z+<^N})I@7@fG9O&?mj^O55K;?lFns=LOLEV=@iGx5ZZx|+X@uZA~-i*-GCTlA3F5+ z_vPzp*R-I`$KT=vd~7nl>2kU{+VK`h3*6aiDnDn?{jF<_b{cx z0IiBT5d9qH)w4hmr(N*v42IgKwhisl_}J&on99ZdH5uGwuqjPiKoBTBeQ3Q(Yp_C> z!%4k=?g&)Zh-WoCkd2$;%yr);p-888s9($H1yGxoVgCg#?U{|%DQ_r@%wp*!rRUH}81p?z#j z?56U7R+Z^hK6^69b`=BgJ@Eu)^B&z{JLMLop?Ef2t!gW?9Y~!`6TPXCk*r5R9s_1_ zn)rF~-pn`Z9)Px$?q*i+QO!for-J`7eAZN;>=Z3&`B4)gn$t#jWIlY-)5I=h`|mh; z>D)NQEHd|3_?rZL2J3@YK(Xq>#}*UC-sCMa5}noyuImz*iN&M+?@&4BHd8`uM>SeF zN>>kSO-YR)klh55?p8CVQgrLdUgp)|_v-HUHSXRI6*cw>K4x!=ybEyDETV0!NrPVm z7}tKnTX!YM+;pNHK`K%~xZQ;GhmXJ~6P^evL5u9qn zX<$|?$Yuo?4u8~GrNJsL2V}K``6{Nl>}9509Hb9!RXV$oO4$0k4_;U3$&U&B)RzX#P1kNaCxc%8ogB@ptS#Q3a(rqLqt~zY zasd*Svvsm=i-OQr*#w>|NgrzuJGyI>SE<5y$r8(5Me_?6id%XRp*%gI%ESw&+ge|5~;YR*a&_OhR-8@ z2m<$ErVvz97vtYfNcDL` zt~1l9HZ^C;kj((bjC?9QkCHpAC_A49|D&)FdW>v&Ea*s%v8d)QHy7hd=6cHXof61l zsJFk&Igv?-US7|CZR@@SF3La1{U1QpJhFHe?4*WPg`47XMN~gQ_gQeIotAT&xC7WQ ztbgq{Pfl_b``dUmf;E5SP$CbLcPiz$62DsH$3?38NbmX!yf7>oNiEPsBv{jP(wz+4P6KW-!(X_MgvjFez(-wQFx7eRuft z8lE%CP3Wp!&yZ3fPJH}fGm`#yjogf>=*snl3il1XyP%Fr+yzRYr{(+yklOy)TUm{LU6lN(|es1)BC}T z{za?#~{$pfTO;*-=bPd`8B*ghGo*V3;)KtaIDNzlZc!z6tcA$S{{c6T6nZ&2pfxg2=56GKk(?NL#yIeb z$u6c}rCegi7!{v{zRY=$cEOoEm=0=AOr-bPr*TS#H8Hp+*+B2~9|Ez^znGf0M>N8+kHq76mq$wxYH$#|cPe z>8`&zU+tp1qr=3cAWulhES$Ycb7!67xok!)A`a~hJ(p_y`q5u8dc8R7LeH(EO@jA@ zxFVw2_z(0kc3aK;3Xjry7-?TC;jb-!xn%(+Hcnsfo`G-{87&$E$oOPxCooqn1agy} z3B*(&AMX;3AhVZ$?G%^{zBhR@op+tSxB@FpyZ*Th^E?3?GGZiGeq;_fFPGZFxrA{H-4lU8OPr zIZ8DXQz52K#WVzfxjzlh zn1Hn3>ce;4aYk48#1Bqm`g(zGZ+&93gJEv#CN^NQy5SF5tK1I*J-_N_rj0e7+QxW+ zBwhc+xOzH$iHX?B3?On|#Tc*Z5#;^nfr+LtQO0%O>d^X7i{|dJ6bu+DindX(RPNV3 z#i@~zn6>-w4FM@lGq;=kgS(71+x<73=p*d*Q$UW$Ee@= zvR|8N2#&Oq3&^NXrp@wWp^5u}zMI@47<#7>;-11)tRzV1epOEC0AVUZl2DUn+l{G^ zenVj$v%?WeOdunHZq3zym+b{>8jntG{D*F>SLf%`YIrfmqAausVdnzjp_s`361h$k zjG^BDGIxwDf+riuA-ckuOq3YuFmYe{3NmVEwBKOYzXLIdsLl2W?FNS!XM|#Z7$jdd z>b;@|c*Y2VlKHy0hag@KT<#2zE9yP2zj8`|cIXj^#s^=)>cMg+AS3x?!si46XKIUZ z>#w-~_nuDmyBDnD2fM%}1A#NJf&3}dpGgD{bn*9pgcn24silqt){*MPam7I##s2Hm2R=y z$LkTdjtb*x2iO7`3##sF2ioz&l`6=2RlJe=?hn&zLyK&tu0wK^FjC2d%}ixCBOG3+=!*63j@9o(HBU{#bUq!=oy6KXJNYZN}`kx{07Wk_w+>sSEF%UK8qSPqL{`1!k%6uNx5YG9 zcnC#A@GJiBlo9RFm`&#&f}1BISB1gwOcx;JLK?e}3yh*VLf)EUc>`9NU-zp>xC zyW}Mi4IQ1$?T4@S?2R$7`!6daE^^`Y-yaNBiy#&u@u1W+k_PBCJ9)SZgKf~zbCOvQ z&wv2bRMuWczSw~A&*UD&MCmebtrJT|?t@68>M9J^OIcsZ=wHEBx&g|Sc%rdzk17d@ zO9IB=sZ#47o9Qvrl6uuM$=qe&oB8Z^r5xbUB6O%b+0r)X++dW2#tDGfJIXXiljJ`l zCwSBt=tPi~=Del` zCMW@JdQf#|5Xs8QXwTQ7Q~fn!HB}aiv_sFy+($H78lVDA`u|QiBN%ZNFt2o(9?J0= z=!&-xo6X|ZGk%S;&$`Ebqp8u%z9>jRCjBLBiGk#!_AsGMFItZEbs3WB%xU2-K26SvvVas>uS1Z>W>% znp-&XM33y#3wlT0733lsM~iuy>=ORQdSMA8r~+v}ZD@@QvMSasrT1px#6%cgO74c@Z@`RZT6F; zQ1i$lf?!P2qA-n>4r1}jGZT+GdhB02h8oz4WH{fW`N!(|ZGr|RWd` z$_9&Jb*CnFJ<~&7eLmZOqwdu5`SLX2Dkq$1QARZ{sll)7RQVqg>_teh0TV^#EtKdm z9|iw5AjC`+BeDWY8`Zg5r@Z0e%f8{7}*eJ1@&BDlQc2V}e*b^|=OFKX zWMZl}92zyrX5mRWj(E<;e_guo)=2TnKbI2h*Y>|ZgTwv5bXaAB|6e-Xv|5C%6Ob!r z>9mawMovi8B+duZiD+Xwy`_67@ZJRnykGPN6a#TX48n3LW$S}(p+8_!Ce%r;$2lWI z+c-2{cF)`Q%9xhkx=R-r9bX|c;iAVJN>k0`o~N6+UN(x3Y{gwO=Vx=S zY_tr&!!5;8g%pausizv- zD|w8xORlH&JbyX;0ypa3!As!$&A*Sa>z#MP`=yyERXH>UiMlJk>vdeLY&ibFtCf46 z!}HSRbirr`Menqwey+xTpSsjxt9pAL*H~ZpP)13X4!P0GoDg-15)DUoso-JRxwwnOhsD!oax zFj1NJRL-P5nMF#~D5RCu%FE5RhT0ox4`uoOmvK*fo)q6B)--68IyB0YBMRwuofqvsQ;XWMJuj79 zCij=Qx16bDP332geESP`lIM`986ux$^$KX@9nDr^P3nkV=cH5I$CFetgN?Ui#9llWX=1 zv&8Taja@^OFbvA2cvcE8m|ER)>>2XSJg3lJ5bm~em=swc<)+1i~>{HfEllII8G-~6MTlg`jh zLH$ZIsp8y~CG^ht8JCs`|NT`)OcgpR3$<~&ckBxra6+P9(5WRKJb5P@Q#0G+qWk(Ijlvgy(MWT#sR&Z+sAAlnnsi6*Tfj zZ&E#3$(1TjrW$L*<#x$_lFSO=)!eTResA>3MyF$ZUvVkVOYUpu*pZHXbyYe{6>?Pt zJIuF#?e6TRSjS{z1N;k0P=!BEB*)nztWr~{-C;LYqfeXR8qJAeOBe%5%Zb|zmWA-U z_oKK)^!)8jf-Ak5#I~s+jO$6fpQ(}i$TxZZr8g|1k!-hK;K7)7(KmDv^rK<%J%MuY z>`y5H70!_PR5+|SzdxO3Q8|F)Y^XDme`$4CvF2PrxouE?Qd_`9C#+%;YZmu+C*eyL zk4XO4yY{5}Bo-AgWX{@w2og@yRDOTu0Mz;2$!QOW#+|L z^3J(4-T0Ag#j9U55;HX&Y|f4Q|J3`Oj%6gw%slsh$<=}zrak$7NG*6Ow9iCQe4a$}>~-Sg9LHve-uYRbD5MdzJYw%kvDOB=&ti0j9%J?qc$Jox zkLCDQKb%`izvE<446`5SJc`yt zwfuZOJ9$p^sl)tg^RM6GvN@{yY?mMBHp2hqI|GB0>GFN8WSWf$}v+V(76NU2&!L= z0=AWYY}nb|`;5Kt?#u*tn#U2%@Cxc{)6S3%k+rqw%eSd=jETbxnL5=FG^h(9yVOYA z_^B|=sa<%&Z+Wqt#%3=`qujqE)kZJZMcL>S{=EDWBj^k`m-FoRd?W-Z@)pw`VGERdG+4TPWr#OcvbDEHFU!LEhDI{Iyn^VjCa*CcLvWK`z= zBLql*Y+J(G*@`SCKVUWVtAr%49LrpGcej?|FS(Tar0iJIC|yA=?8`JCvs__1mCrGA z1r!Y0H?kwc)o|v_%*tfx!bE%Cc-{Wg?D-F9``U-1Zw@vxv7G9~nq?V(f4T0wo>O0G zY|?k!`_8*ksec(yO76(rgAm?=X*Ii)QLDh7JqJc^F~H0QDWpi|f1bQr&+cwGG! zSCm$Ie|?g(sm<2_@?~&m4AfdQ&6Oejp*#V4PvE_)45BsLXu0PI|x-qj!(ncr@U5*L3b18k;DUcIJXy(^>=R ztkby^Hy@k}*(Fzq&AS#xbqc`TlA*{{5b0& zPwkBpTKsNP@%+>ls)G%0-Q-<#wDyEl@vyKW{nuQvoz74urlv2l!?)i@e)p_ujLHv- zNe+vG*_RHDev5h+Ze>W7$T!7~oX{B>&!vo8+NKX?GVKsi5NEC$Nn zXCpi69sbCzo>|$_?5@jT@b$@S|Ta%lU-OhKcAM086?)(v0kVlY3wv)G{0@L-rGrh+m-XNC`L9i>lprhn!?iX#DmFT) zW8GP9UDFc9FN7~GPut9A6ALbqs)laWD~@7Jv5uqC3!ZXS>p=gW{;EPY3)5X*`dEP> zrrtny4mPN_mZ|9(Ca_6J(m)$lo$oh?#8LwG;!pQ4FwVfeT%%z z<2t&>=2NI8_3N(7G{yEn8c^q5xB7Rm06*V$(7VNjCWGR8E3Tc_k8cmf>kPd)x*nxu zk|@deWq%oE>JP|3M|~a}I0J&RR{?QHXlRXNK}MeP#lFHqBi=O&zr6XvC;U!9?+0E1~>l8Zpu=p4s@ z{DQ*`-DD`;7tOK_%HJEJH*i4gTOMjVDveTt4fNeNnHN%mYJp%uhsi5?xh{21 z1z8S_@eYlaTCJ_JsF+M>-#QmB6?RdsDis*O?(2>#!_ARoGuAg(6yqjjn-aaP$Rp_v zQ8kdy)KJ^oe#mlX{nvrp4&4HNI(i;A2xo(a_7+is9CIYA_ej^Eaw(9=;Le1axYwF* zW!7#nLb>liX49VX8Wwq|5i*I~dz{wOs((-mugXBk9lHkQE}x})Sst*6zUvM)m?@2v zrf8Fwnfg?Rx19G5N?X$SeSQrSKI+s}=URm4cOM!C6xa6b70H{XVv73}qLdy$v-R#1X02a5x2bo@kv0m}MN z2H94W?m!Lr{E#%vu*~Xl%~hM>h|(ma2VP;8bHI&VhU2xNHrM@xsjAyq8y|XpOw^L6 z&c%0W#U#$TZ}xla0AY+FdQPP#t2V6-9^kfOZ{R_4G(-dUZbimP^_W0&fKA=ORNE2J3 zk@V?(P-S_}52HQrORXG&a*r*qL&?(0=TPqIAS#~3bcaT;Mv_MbuP_2A&ow7MDfuqC!2HoDp3deK{Q^5+vps@dyIAjB+dV@Be!&AnfL%s zGAQ^tRwF|rCqpXT0ZZcZpt7aFBSa{l451HXl-(z~-_}{JzAFW=i#>;6m|CIOegdTP zC#jA$6-eeW=blt~&Kh|keZ7-astOY{3!Fq^iDG6aO^B~%82NSdM;h9#Jm5Y?V0p%l z{hziB*EtO{94F`~C(oUj<=!2ze>>#3j_unXdNVf0b?H-QeJv#@9W5HA%b`$5p%!Ae zL1~zg4jsu(((F2>n*E%gG*c5o55} zge!;1)+#=zhx#xg%dx5H1J@<0jnNohh@nFCP41S}Aw5&Q%SDuB(j~dxzF>FRsC>%T z*F@CA^66`_GbB558acw0DIzzKAH4iPIBcZTH{(l>qHcXwK5R6w;^!B=rdY8ygZnPg z0wE82zNCf+IWmg>ZEiL4(DQOtkS!~=OMzV}Fw6Bfq)`1VEjEiMI}r)8WU?w8e$ z0Bd*B4wbo>1Cc5#K~^fR=iWnEyH;tPC-5wW7CkI-sj%#;^tyF1$W$ZS?!XRX&$FXKO-?a@fqEqJs%`mUaS_-yD*%^>ARfvzHoV-|9bUS z^D{cIn~b1F`- z*ww--p|KSv&w&f0u%?noq6u9sdrYoY-tD~KZQd^&OG)s}uG3aMrri^{|35T8?+Sl% z4^ah&-I{$}M#-g&-7VSL1pe|j;2{G#>1=u6_v@SyA7|l0P$4ZYiha0{@X61~uR}0g zUOrBBCZ^L8mqbuGjADfK6nk3Ji+-Rx+RUe;<&7*>@^sHHdo6wic*RI@1gmKC+L_!y zNc=i+KkqYEqh$2@8JoK!@-Z4jBe^~f=kT0UA&tK-+ZlAD>9{(FK=&^oIf0CU1}w)?@^ZYHF_K!WmhTSl(M@k<*AT4uzj^0 zrNbOFv@>chzU-X1@jZ5rVt0-oXE8viqEUJOv}IehVsG26yLf7K{E8_P-#rb$$DchU=O6y42EXMdz8%YI&(uJ<>;51vcHDl+@>9yXFn@A-JC@YL_goKVT0&fu=29fY zu6sy`do8Z&J)q7!?}cAkp`ruE{naDGXe8;PJj8MWOP1sjde8SqK4EuTd%HK^cF5`= zxD7H6#S~2_9PQuDlF1o4V^eVz^7xUWPXDA`7Y6d=b1By7P~y>N?C~3a?7gISRnJfT z`-`&qN9=CmLsq7Pjj8W90Y?4vTiM8tk^|ijMr+C9EW#PwYPE9Z>db&IdY^HrN>DRR@r*N!I?aNcNB*cqxf; z0wX!menb0`X(cY7zwQ%0VZU-uCd{TXQ`z1(_D&7&Zm{SXt!AIhWjO`Yazew$>TOIo zEpuCydZp$p>@X&Eb*W3cFs<#>G||xKw!-^vVbz_^Mbh<`x=A$;Io>W55oAB1viT?e z!Wd!UrKF|IF#z9^L-b19d@!!}E`0cS=z1=NN5a`f+j>#zIs}nxb{b;>v2&cYFHDqNMSM~Kb+_?30R|6X|5^dKVZH&#BR%CG?dFOW= zOBK)2*Qf6gZAQh+=l!ht!1=yQ?S3W=Ur2gE^T$2WAMyM4klnq!*eyBtVS(z^Ld$$p zP{Y!mr=yLY(_Ejk7ZwX|iy!yC@6QBix3ELuFqOmkjc4k;S9pi6c}t;L_@Bjz5~#09 zEDJ7XFC@~~>H43-51am2%3c7BN`;iUe)*wk&6O_-bFpuH8|?kGpM4l*qi zY56pu-1689y;$Cu@@p(F9Y{Tvf;E2$k8_d9wXEg*oljdnQ%ESD{u{Jzk6XT}#gT_Z z(H}DGJI2Mvlg~yNnxghH!D)Qt5ryBEUPcQ{#%Xf%58Rwd(yKf=>8XJ?`l@I?8th8H zx;X!PKdtFe9k~~Fms!_GuH+cJjwDSl2hz^gdRazsVCN{mG_#tei~aVWANU%1D=-7l zo3{3rXb^G!kZf6T#Ajak1IvJQPQvn<$u5BLrK$GAZsj4Lu>m;zk`T*#OVBK!Eqjqw zu38^?wRk_x5=M5iaOTMorH5GFbI{mNs)NaKa{<_k={s^&!NZdQ-UQsl+E`jWKY);( z=f+$Q1~iLnhbzy1BmK^?tJ+2<<*GD_4I9QLx$yLEJ|QTC1R&E07s0+&kyZCc-OA`5 zle0(65|-U*IgfR0Basuy4!ov@&aRcc->0w6B zeW}#;CHlrD@6v}M9sChCW?i7{s7ZylsCqNXy%{1VzaVzy&faaz6{VEmib$PY+mD^} z5^@!q*^DnV^4+|&O+%tMtCDJ6?rQ|<^#3Z2cts~u>xdEg-W~J}YN!rsmmkEn$h-w+Wwp3mZt8 zQ5Ib!-Qce+xs(lvqq+;ydIKw;u`IhO23lyiYb7u4;r?=V^59E9X>8%lHyV5MhL11S z2%@x@-lXf94L`qv(BB&D7i@Q^>9svHq;O`NZq+B!ZmYBSrSpX|fzUZtO{$^^@1f$K z0-D$aOigI|GfpsBavDs#TG6*I*vN6Sq~&6ZYRGLsqK8#O{(hks#5wSJflp10;8Bf; z={7-Wh{vgr4X3B+0m5iSJWVdza&N_yoljWUHV<*E&}2buRet==83%kJj^1yt^4aAz z#X-ScwR?KZiJ`F=M(%0HX17fTzdGq#=+%y0DPeaj{2u))hUe7ke@PPdqcmZv$g;nZ z=8Ww}NBS)Eqq(0VEj6SdqKb9_iENAa{L?R(KbQtSYH2s779{9 zlm0RFp0E%&JuxZ^S=nC-t(;&jFr6bKbhW60>#KUf3te#*z{OA;Iat<$q26!g{IQ!< zbc>)>K&vrh;tl=zi@%OQ3?mgh@Ge6t)kS7wusWEJ?LNV6yXhF6i$7WCNurhj|C@y* zNh7*w&*2LlNTa3)A?E z6PrtBT|@JC)s&UYSJK!cw3dyLiiSk+lhL7P>v@y1zv~RWN0S;uXltv(jq7D%wn5@8 zkjt^{5vA`A^CcVZf%@b#pZ1Vg!5ypx9nGbzMr;b{umOJ2@@1|S?OANLeW~UL-$E7?+|Pzco&RvGVYpbf zL(R~Y^@3J|Y)Ck802u5h_qwK9_3i}AtUG~QrbK)Ie$5)1Vm)@ZV{6IWT;)6~axd)s zgNk_v?IaUvSl(h zD>t#Ew%sPbXr94Cg@paZ2)X9D3@Q2RK=-GfX%p}Fb6yA~|9x_5tb+`cRATaFq;+VqL%%fXaDo~5-cwP`Y>-KOw>mzGQ6vI3>tpMxq0#h(~kv8KcSRL zvAmA72=t)lq@jgpbj#g|p^3CEBsh&lb{@vv&gY4!{oZ*PaUL*^ZU% z#!*k|woh8Qb#J)Qc66WEYJ<3U``|PQN(rE01Xb`@Ub*?yR8^fAN>kp=XeevrqF{?F zK&mFvv3U9qD?&}RGTv>6qt(;5qd<{krj~CduM9|9g1fD4ynQeTJXEBvvEbEU(&&!R zJ`Xz(qeJ0=Q+vfK0*CJj;&tv}A)jV^DR6FV0Ykj9PTd!X`c zf*zkzQ-c=M8n|8Z1ue?!Ny99zXqBV@*r|?6&hd_#TPPOaa{hMErw6Koo>-BfdfmOWh8(Eed&^Z*RxBnJ&LCiU z%-*TJnx-cGN~5HcPQN3o(D&P0mJ5_0y4!+Pl^)+9#b*Q-uZbE>eAi-p7D~+gGXg`8 zLK!1t%R*(V8c@jgQ;M?0Fv4ZeusjhtV%K00i0htJ;|C{P55$1mlMQUI3YIYJ6n=>q zuGBgy@0Zs>Bdgx|=51|SgKQt^zF}JVcO7hQhkfNxPG(5gi-8M`oto~@z1u3i<@Mzg zK@R;#lFmSV6?q74P3-XCjGUv(VP2Utm7%1mbs4OAYP2YYJ}F?owj|RSK4OE|-$3UD19ce(FD~i-Qoy9Xj*Pt@kDQ1qb2hfN=XA2CK?cK~yi?;?$8!mM5%ekzK$2CN zsj76gq>h#0QWj|ka))F(-2;Is^Eb_P?S6HiGp+74c19<6?PDmxuZ82b!`X)Guih6d z+;V9AhC@BW1%MFI`hQexys2Q?bLy&RAdzg32t2AuCfNPxe(Cu3PnG!W*20S9gFQ;2 zchUW$|9yjWE_)3BG=14x{fQPFO(8>LSHT zl|{O%Mb&?81B^%sS{8FIA`#k@u|dIKSYB5yg{4)|dLzEnkMa}L+@A%gt{B@uPtutT zW`YAM4YmYbdx!gma|(ycg5kOkojqLXe>zs{4+Q%a@O0JslPq+QcuNc zn^0$+i@^ZB&P3F#yL>D$(^2^x16r_;LT)V^DgnIYWb?;%YO1uHD%vT9%C{eocG}>k z-esVUv+25dODDJYDP_tMgU#nyqm5q)@2#5+U7UukG_N`2QabK92zvM%FV4Y3n?jOw z2O#%z?5>o?PvF&LN!9t1=9JSCMbK1+v?Ro|UlG5L|8^6t*nEuQ;D5>{G?+{xso{?* z60sK(w4h>2QG5Q9&d^<`G7;fEt8V#pek9jW9TJ=<5YywsjC^oyzX4z0Lz=zzuLo4$ zSIIdc`&6kL$b1E5>IGV89|RqP=T2H{&1a&sb#tp|l%OK0f}rfa`L2c9)1hUk4y%nk zPG*?Fd#f5U5bW+Gd%(~;KD(QL$`k= zNh`E~6<2YUiH`11S+EHjN@_@vFt_wlL7MAZrc75LNfO;5>D9&O7 zyT;eM4iDr}peM%lE_bvB|3xzSd0Nv=NlV4%kS0WFpyc9>Cm(`^3Q6+O96MB?BZZoV zL!994x|4=;9Hm@J!uHUdV)7G5$2${Zl@My0h#$0q2MY!W^wiBqp#O9q?0w~-c6B5K<&N|==MPbCZ5SFbc><6h zg(D?iKnPNn+6_AsZu=Qn|Jx|7FJ2ZNxiBG}40Frt{ zy^CfMKy>$w@S2CKuR%!ljBpX&QV|IJ1g&C}>vuD5I|%M_naFf1JB>3$*UnryjC2|> z*6xmm`?IT8|8I%|q(xq!t!HsEyT0Nt{}HPJr}m*ToMB%7E>s!S>?sWm zwiYmh{EL^Z!!mEri;6H**pjz+ATcxHq8TE&?pb%G3@^Ytq@+RDpq%z1f~?$QmsBAq zrZ}kI<)WLuF zL!r!pe`%faHn;-FCJQMqWOQLjn$|;g=-uO0?vb=iN1lo5L?&doI-#Lk8}e7J=c-(H zN?N8hWlL*S_(PZbdj(VcKU^JpUasjE!u)1QpcaG^?czsnn~({SqLIZr63 zUKTZo&kkKFK(341Jba?V+n-1``f!uJHKMb*!SS2sp1&#wX4<~d)3ppW@ z&6`hH)qM}#jViZYa;QT;%hKQ_5Kj0TDbAJm?MxAWCUL$rVwqwK`0VX^UInc3Z)BBz z)cMz!&IU-dfV&;})nN(Ql?7hIFeg-maQslZO1k^}Yahuzv=74ZcCK(L9*K_Wbb?g77)N9|Z&4}gg=S2Bo(4|sp_BNw||DCvv>TVGV! zP|sL>jR_Ck|3QBbxIm(ssuHyi$3gt-vw5}vxAa;3J$T4nT4vh0bBK~w{t0F~_JlND z7xZ9_y{mSdccw`$Gcil7+D|3tE>-lcLIuIO34}tZ;2Dk<&G5+w6G8+6Y zv8J~{%vZjF%@g(~KS8|gZBH*Lq6=doC*FM0pRBm#)Kp1S_Nm(>F;<}>u-Jfhw-od( z4NpzX^9Q^OkVd0Wsppa8znFk89Q&7}auVh(QCz4(;L6aoua@}m6Cr<^o9JXRvXEZM zPz0KK*6Hty*}ud>^y$&(lGz$!$fmSj1-l5W0kB!KNEplVIjVgjk3~(u^uE@um!r!- zz|Qhkm&)}cE6RVP&e_SZ9nC)gp&n$548z@;-PFMmI8rVB;S8Xgkemt7HAt2Kun!xg zRVKTBoXLx!csGyFV}zep-W|frKFhg36_lH-{xO<*nm7O}L!r=}$YS~>#Q>K7Wdf@T z?t$b;KLq>DpxR($EXM3=zz!40gJFxZW>+Bfq63+M2(5}&9l~C@k}R-Z4xkzZE@|^$ zO46z-n!Wlz!Bund)sW>e*_m)kYU>hl-Gh0ggbe{;lvDFJW2oqChdAi=|9(5;4uoPz z8e%&zJErty2D2pjVWtPuvUKVIs47g0r_&~x5e)>e+mBg!p4tVaORzlP-eiN{as7UK z;wLxeK(I-ftYInAJ^?>T0df}I6L_nz>(>RD(1+x+C--LZV*Zk!qWW`}O zTm(W(!=;DiRzt2}gps%!B|_9w_t1C=@$}P}^pLN{-<3Fc>x+&`U;e?ewO-uMNzPgE zV3Fpt8qoK2Or0hrS*0%RGFdj}+aD+dK2VBmN1{6*1Nw~$T*W`VjjP!{VI;?L8F&Azu+!hJk1% zKsSn7a^CI|8rTEvMEG4;+kL8e5VS;VzI@ez$4~F}SP%sm#rM5GNOOm^Hu($$YwYH7Z=}yQFT+R%2C--^;Es+mcN+r88hx?FRVuH$8;c z_ix#oQv$ZP74c6~?!&g`W!hwAtTT=!`@3ipxlvHtSu48m8%JQcbxkU!W z96#}>8;{XaUtNP(%noh`CTj9n^0%Q%+u~rTX{9cV8RgpLoGtMIV3Dny^t~v(4*!6Z zJ7y42*Nbybzh*f2X6|F~)>8nO4>-kxalOxPpHZ3Ra(f5y> znj(&KIGE(Lb8ZcJqj9%n=E5raqIGLCAGCI!6O1f{vP_V99VB$Hodg_x{=vY)TiGS(enpX@7lx?X5CR>x)IlhtD zU&?MOPzGPOe2G9zp@|i}X8mut?>YC?A{*{abC11t$GX5a#WOD|m)X4WGFRFf6!~=^ z)URPY{l#{gjgg4FXCB_u;i|CmZI^I6Yuh5m!m0k!cv_tRGJA}86GN%jp!<&p2oSPE z-$nV?@zsO*-UuN=n^a5gMFN7KorBpxkS{CDvblR_bT5`rDB<7y$pHy*STy8v%}a`P zfW7a<#P8!=4+Y#@$rx;$Vi3S{7y9@gq1Wn;p(f1yh&o;ksez?)LUE!8f<@d*%cTlm zQjAJ7Ik#=z91(1L4tWnGihyXfXAM0YsS+izZ za5}b&Ys~D%kmqbe_qHZLZBOrn{+izHDRB9WXos;@?4Fwjk+S=neRhc$IGziOVIFC_ zZ;3Vj(=*1+T*(CB@E#IPkQeftoWAbkQx}AEXKg1I5n2AdE%AQ)sp4Csf!OATcjGuX zitU>Ldl(W_t(I@-mI`QD$~mGAhT@7;JF9;2DuN8!an44nnWJP43>A8t@>~s+N#pfL zyqda=FgpU&$G7}UIl;F82FX|l0 zjP_IM8sbqD4e&XEz$2HbX`$3B)E;zJgv!Is(_s zW+*xuz2;Ok?J!2G9#D9K>~J$on(df=G4%(4ZFV=S>q7bf6BSI{yWrfK3)!=X+bi=| zcS*B)IySwXL{1~BW@_l2#pH)CwIdi40P>FaC4qC(WTCXQHy@~+o>1S899b>$PrGwH zbS)o*ci%PURD(attpr&F)W$Te0JDzqmGU(!z1tw{@|XYa&pg}Z`^n+m8Fkdmunpd6 z@tHIXz^xA>HF{AmLY&sf`=HIOZ4)ixTRJBL>f|?vY6=-^YzwzUDPPKN|BtW+b0s{W z`Aq2e+Rl66KJ*^Q%?kA|&S>#YyJ3@dre#TfHJ5`ZP`R|p z;(Z5}q97lt#6`LG#jw<^(G}<=>0n*Wj05}=^blIo(yTez7|0}bNv_>=VCmg*^>CUD zxC*`_QabNR{FPonaYNamN{aqI^7zW?@>uUV8YOYxcythAq=%WDN#FOp}>Rr5=o`@kkj_DAj-@;zf2g?#j>oHUIAG8Kpdd_@8)Mx zgx-Luv{1ss0Ya~9&;jRyoVhq?xk=8?M6319IxkrPJT+dUOvq_%V!kT!15yL4*|8pSuu9@V zc)bfdV-y;Qgdw%Us2yt?S%z!uU>@aESU#|G=`uz|nZ_IAMP8uJ8J>X3SlTk*cxTne z!%AMMr|wUJa$N#GgG9v$V6PFEoI~)xaZF|`&kdte{*6r!2P$y$9~F_KXqza9L)L{ z4L(-siEy{DixS{eB^zF$Z6h6MwfsPs^o6-*^z5J;g1ss z$T|4la#+RF^Sz2u*7&2r7M$Wjn>VjA29+Ve9F(IAGN_k$-v`+WK2IhN%8$(73uF^=$nDhW=2VOn0TH zi9UTdmAB(6)ya-^{@BCG1B@pQtTdZ9c%oASD5jUr8L^NhhANmpgTo*3{DG?_U_PoH zTJv~O+aIpva=052jc3`VE9b`+NWB6U*GdM(gjB)`i{HWshYKti2j>zd983TdJuVN; zX}gvwA0@6o8G;BZ$w=Wo^<7_(std*7^CRB4K|>d* z>B7nelctct%RDBQtb6Z7EVTiqsuAFE#%nkYC7yB7aWbH>Fh8>eq1UTSrR7uop}Aum zbL*@fde_|{;}&WQ<4AxW{W{e!YhiERMt6hH&h^|Fo!LU_iDYtQN{I{Y3 z%(sOd8mObMZkqj(h(bv@V-FwvTe45`+&h&)$?Q2wG_f%N+>Ai;C<|h>LX;!9GVu5} zT(9Mt2ms)n13l1d?07%2N;fa6r054i&2MX!YjrdtmO&u`Nqbm(*$UKQ? zIgvYL6g1so5~L$~Gcu~q9zXYZL(AXiSj$vJ&N+`>{U4E>KR}<3n0%g0SN)@|Btaw$ z9G}%UHgDGOJO6nhcpP|OY1oi;mK7WGI{3G z`Gimik(H>YrJ{&jY`t?4HQNLz7aC-nX78&0p}n{?J5Y7xn$4Ree{yge_n-NLs#w;K znzbI$Wi`?n+n96oBbBsrpVpzjT&McAE^iJ2b-^CzudzNlg(Bx2HSVF>_CTl&kd+f? zV}9>x?XyE?`xpETw!C4B#W!s5m3r0&wY7l?fy@#7hHAX`QqBDV-C9;p!^rfcSo}pc zuric1O5xfkbc-0PR!KWi^X`*6|4`flIVg{r>OI#SSibq0jQ8ud0B+(}%@|$C&-77T z>2hERm;Yw2G_?}fz9ao-hp!&}e&lIzygll{Gjwn}7)zPv=F=ChL&5-B!#;jvQKzE`y!2DP_38XG4Nr??KGpK7bG3P*_yJ*hqM>TN}M!%AsY%D3u)BCy|J0h2ak zp(okKe5Ibfd_zMz?|o!}N-dBO8*=kcm-FpHqWfh{IDULlvfCgHPR6m|e;Dso0um&=*f)zoibg7BgRYiyMGb4ZfFumy9 zDoG6>n)rf`)`WG*d&FCpR#ODX<=4v z2EY(y)kDad{aQ#G*dA)pYtWvY-3+;?BkyWoZMh?{+m7`THDl<6J-?a`CVF2$@vqAt ze007QH69CtuBZ&Gan`8j(C2>WELFs^e${{%f4F!yvfe>`d}hwcEYkgIq_Zyl2(@Yg zItD~IltaW;MZEx(_&p-8&p_gu?7BA}Ft|Po&S-(bn2bS$MRI!^rlE`0V?ShBep4%| zlNM8>Mu&3&1zrSHsDC?riyM4&2kk)m8UaeqUHUCz= zwneTqR!e!fQJo6`e#sjhwpl*-+yWKtkYJuZJ}V`r*rJY}RQU{*)_|Yq z5WZl-;Y~vW(rHEwu}uA#?$ViOU8Zy;{FD1u-S2cgK0!b$!r{;)#V&mUxNS9({XnL4 zmvs7(^TIrT;#m-dJyaeN18GA@bNRo%I?7fAWyMZg^1FY;O$JaX$Y4!0Qtr-{1#+X6 zr7M_tn8|@c#en#4uJW5U)9T6?t2%q^)Tf!i0V_o7CDt)s-vQGVu{ZRn;bh*pm^za3 zbmMCSW*_E$dYnJGR*eT0Zt*dB!)7Z!2G31qX$^C&TaVx#?N`z2IbmwK_i2=Z)=`Hn zJ|z{UEU&*(j{4rXo${x7gsep+>Bt#Dt%}`0+)x;M`K!n2%L16|S1uUts`l?~V1#N8 zg|qd>Hx^e2jg^b59rdTMi~Y={;c4UPHD+g#zAoK8>*~SS$9IZzzjVFeQfxQcX`gRr zd&A?L>H%E6F1pNvCKxQ@=;!7LS% zpzK)icaJYtC_6^F-rG$L!SxjR-k0gyX=J#(FNGJ?dQh+}p_^8+?Bak6z8mv1 zv`CtLOvV+Gpj)1tmBt$xO^m_yyl1nENjiGcR}$+=NFBK`KPO!vxacn#y8X0uZM2)B z$b||J(o#?Qi>K-I+BM5gXe|4IU|*<+(QD$ACODYo#gQiF!mT~I4END@hFf#1HtRU< z4KJ(+Cr!|?E}r!tPZ!@PKl_S1A^#zt_YZz<_5m%Js1lEHu7tlp5EO6`r-@JOjYZlh z*hMm_Y5eZ%-=C6B5)BRMRg`gV(NCec1-ZQybEJs^tczRw$J3P_^;Tt8s1nI;n!q7J zft11_i+bxVV`!i~PZRdH#Z5iEfVV#+@=^~gZI7G26Z3n@Ba#r7lS&!q68(ISv>IGk z9*tX=$5@+leqr&8M&ALo1)~g6%EDUeXe)RiD;Z0uCZ*kt`5lIN%FZ-JS6FOjd3kcB z&HC|vppL=%NF<=dZ5^CTK%ep0)GaKF#P!tPH2e+b+U}@vuWkJ zIM+z4eS^Pnq3l%>Wg@Y-J8XA3O#@AOec{9g?Avpr-|33ucYk=MO9*b-#Cp<1 zJbCj79B!GWAX&E=T~S#yip{~8wHb-pAI3$TA;#a1kw($R;Gu5t(CmJV zZ|P4-Nn_hjg*&cFnlOsAE~ob=O%42ggMZMVfMkUY>l{8RKE}xWb^(zJ|wg ziWwrRZ!==IxM*SUu-}k}L0#u>93`C_C1Ck6IpQR)7|S_l@kZgCnZb+4BuV#j^SJg! z^RTw&I<1iFE`Q-VtBy)MBz2HT$%?)s{ER&W_Uak41a`5UJW5$qOI`CM+yUwGrMINj zaf%{0s-zHv&knah!lcisUla@|U(Lm=+4g*}jS3`@ppF+#eE3W@=c^ZP;qcyu*;RIh zqwZ&P2R<+sbLFipN_h`F5fNlRiAReCB%My9U8sZwpxCJ`B-tqfL$Ay!7sk6QQ@SLE z)FYBZD=zXNu5zKypV*{=k$C1@-1(FgnJbj@h}4h;bKG2pnLHn#Z2n27s_<P=MUx9W~uqxWe zaZcVse zHqH}DCP@>im?do3;2;b~(!MF4E%=BJaFh%NFNM^gvAy;jnsCm$eUylwqVB766`nmt zG%B2!mi$yXOPY}1xLoX^^C`ZCfj@zcwe8szZhavyreyY+^!iFkg!=~^4!t&c=TQWe z2bGm7o*nTRo;{y|i9dxCCXuR2fls9sNI;r!J?VuLzF78qJe77t&xro8a6&rLIiQH7 z|4iym*638udZRb%Op7kt5hqM0O?MjY=_n>O*x+L1Ke*yE@@JATYF3;!ielMi(gb?r zwZVNEl>H$;H%6kkm`HDR#v~5cnTK3s39#ht#-CZ$_9qTLCH>IMcLKNdezVS!|rA(S=#YJ>tVibLaPuW|^1m`7^ zYVkNJttHRpsHuaYxJr-sASQFKeL+MZ)!KwGU7qFbgp2UT85Q!!Z`#g4RHhgeJ^ghq zKu6oIn3Tr8pSS2EfhxJsO>+_exvSEd@95H2<3?E=`IvkP*AwIDbD0qPR1It_-d!^(j>YnLSIQ%nG()e8g))SId5edkzuVP?&xGsx2W1KsB z(CF*jd6D7UF^3+y@?hCnqc_4kc~RNv;@MJ90hky^WFH~X|C#B*f=`|NC+3L6j zo%)eZ83n!5Y`xiVNVns#K_Ef69>>Co7RH&lzk4XSg=Oh5qo!JJT9^%wni1^rY!625 zoeI7SNW8DqYe(imwBf*QqTJt}iMQ*yLmd2*&RR9~ZjQ7i@?;FwNR8OyrgLHrJ#&tE z>V%u>uX86R@8k}MQu+E$I@Xm;l6J=Fm#VnVe7cH@XvN^Crb;{S#<*Baz9tyC)RQ)A zNDaD67plsn!vfvsg*%KyQEtY59}#P*(%_1-#)gqGofcuWUV|s5qMoBOoT^DK@7T`v zPzkvOy80Svq6_TLWng&!g&6AxTi};x5q2P6eWj1IO4J$*(=lScO+taLuEOXa4-jM? z<2=CV_)iDp>dPWxZ^hWO6_SkK_j@4l1T$81b%DW=yskr8xQG;j5y0vL&Xe@D=|)6D z1$u#q6e{bc_&JM{Jmp{^x=GRA!kgjSR5%a>NSOjZm0mP9;`6 zOf=S8^0ap{3V5G}kD1zU*=t=EPuu`}1Dg^k3yj?s#3Tn)G@GtWWhCyS`#<)Lj%lO} za(~mdMA3de$rHTO&rSQd@PqY*{g!H0W!B97<#?iN$)tbSX`)@lL-NH~6slwT=Yguq zm_GF^SRoOp?FUWhD*ZlDY(15zcRlC1r;l+GN&3O;of?hs3tgtDwZ%J@%2|=hC((ZO zI#>hq*=&m9%dBOWhIpCk#rnEGr_@IBrg}%>tJqj0&ljHwj69|Z>lr)7he`6wn{z+j zb=GZqrs7wUxn<>x{gzYN-@JZ2R9*CJO0%)sX=(C>kC|XyUpGzD{(;F!$0w_cOPA1E zmR&t-V~N^D^-(7!7*&M2ur+}VGgg`Q(gi500v|o)?bFx+s25_GzLhkZkc5VbS*0 zA#ZtBYd#4Cw?B|6?bRRN^uS3OEqOvk9}H?%SGpJ_Tn2yqJ)ym5#g>VC*9;O-yGnB? z>MUFcaY26@(xT&(M=njCUv(I8XK+Vhg{;FK4V`Fnzx|j|wm!BI-RQp+H0-gHc@@Ur zJaEmBG3OMJR_TKor+Y2Cy3=kM-IFn(Qnfa2Y4%&LV$_OAk)wN2%JNz>k5BNZ{Q;BP z9Ue-|f3zOh-=*C)mG#AtvC4FO`-J4s4$N+Ug6s6fva7<3sTa!HjPAnph7P{IsQ*Mp zg)_Su!kHnhu6j54D5v}0F6uQ%7*wJMu5~Ef`8jfUDW-+2HXrIqlp~QgjFod6a!TWb znX2^mXt6V$Dk7P>WZvj#JMyB@>du27$icTCFYY0nA)3ki4#j8T)}*5&h&r~ofm6b$ zXZQGqz5G5V?pS|T@VLg5sT_XO#qRirXor?>O{=90emfjhSP%d@aKkg<90Q0s^U0|? z6V3_!H9ShOfc8Ji+>WxKnRi-I5zH6eyD9=QEcu`_Dt=?Z5_3WYQ%>fY0>5Mh`sF1DW zYNq^!)$)2zNygf6q;43$kLX8y!@vJPh>Y4$?b2x(Dhtk~oN6@F7OYWv9C&Hvj12gt zr^2m&M7b5hu=qKXv+E0+_hxU$Iqjuu5n&YDjSMFxtic1%AI9bNWa&D1v8lw-zi<%~ zgTGwBRU8b~(JC4!?woq)oY$y*rllxvK1W({fi?fqxWALhmdz89JhLU4^?tvlo&By& zN~8(jj9rFPXmYPnTKq@T#O*cas(2(g0I_30sCIQsr0j zRm#Gq^v_ub*E56qs{H}&ujuDi#hsWZc&f`{f!(Jwl`~pYf7;1wtmwn|;#GCCg`n=K zh48qh+b|@7@gOj3C0-zOj>03(mCV5!&OfZswdF6ndp~>G z*16QW;`g@5uSL|5lf$agr+QD5#m47DZ5xd{*(TMjxi*Z?q`KAA{X}gmGHH>?8@bV$ zXff{}?Jz4v<&0ZAt08oL_*AJ?gs zqP*|%dH>37lG89uUaTJz%JHgVmbh`w6?>sf_PCV zgYBV0+AbCW&>K)f2lqVIpe8-<)??qL-7T#y9?TKk+zTaGRl3@uY6O-1bhc`` zd1&|s+YDjLrJGUIS z{|bN59{dlBKMWKB9MQkNXb1j{SN}J_*8J;B{om=TfdToyzb~*oEBpJu`2L;G9MFgV z`kntg9@&WhYz}OK*#DvAcveI0cKa(pDfl?&RzMtNl0YW2dgZGE2eg;AZwm7Bggc|h zpeptK>;H0v|G7GVBK?nE0cHIER_X3b+u|9Ws99^c;t!Bp6bgI9>TuB^xAXr6Tzjb4 diff --git a/docs/images/nf-core-bactmap_logo_dark.png b/docs/images/nf-core-bactmap_logo_dark.png index d14fae3616f95b5007e6170879cd9bbfed2aa9b8..4d3f130c9ccadc3378a784b66cff223f9be4253a 100644 GIT binary patch literal 28533 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 YK>AxyXXY31b9#{BMN?F%p7VqM1O4tE4gdfE literal 28349 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 bDACjkf-Ad%&eWbM!` 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 b!S5dFi417Nm4!hAehAXnF-E=6a*q2itq#&l literal 24366 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 Z`>0=Ec~{5jpg#C8BRx}~M)zLae*xk+AkqK;